1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     font_RectDrawerCommand.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 25674 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FONT_CTR_FONT_RECT_DRAWER_COMMAND_H_
17 #define NN_FONT_CTR_FONT_RECT_DRAWER_COMMAND_H_
18 
19 #include <nn/util/util_Float24.h>
20 
21 // コマンドリストに積む
22 #define NN_FONT_RECTDRAWER_ADD_COMMAND( command, size )         \
23     std::memcpy( __cb_current_command_buffer, command, size );  \
24     __cb_current_command_buffer += (size) >> 2
25 
26 #define NN_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( header, data )   \
27     *__cb_current_command_buffer++ = (data);                    \
28     *__cb_current_command_buffer++ = (header)
29 
30 
31 //---------------------------------------------------------------------------
32 //! @brief      カリングのモードです。
33 //---------------------------------------------------------------------------
34 enum
35 {
36     NN_FONT_CMD_CULL_FACE_DISABLE,
37     NN_FONT_CMD_CULL_FACE_FRONT,
38     NN_FONT_CMD_CULL_FACE_BACK,
39 
40     NN_FONT_CMD_CULL_FACE_MASK      = 0x3
41 };
42 
43 
44 namespace nn {
45 namespace font {
46 namespace CTR {
47 
48 //---------------------------------------------------------------------------
49 //! @brief      カラーバッファの情報を保持する構造体です。
50 //---------------------------------------------------------------------------
51 struct ColorBufferInfo
52 {
53     u16         width;    //!< 幅
54     u16         height;   //!< 高さ
55     u8          depth;    //!< デプスバッファのフォーマット(PICA_DATA_DEPTH*)
56     NN_PADDING3;
57 };
58 
59 }   // namespace CTR
60 }   // namespace font
61 }   // namespace nn
62 
63 //---------------------------------------------------------------------------
64 //! @brief      コマンド定義開始マクロです。
65 //---------------------------------------------------------------------------
66 #define NN_FONT_CMD_BEGIN_COMMAND_BLOCK                                 \
67     {                                                                   \
68         const u32 commands[] = {
69 
70 //---------------------------------------------------------------------------
71 //! @brief      コマンド定義終了マクロです。
72 //---------------------------------------------------------------------------
73 #define NN_FONT_CMD_END_COMMAND_BLOCK                                   \
74         };                                                              \
75         NN_FONT_RECTDRAWER_ADD_COMMAND( commands, sizeof(commands) );   \
76     }
77 
78 //---------------------------------------------------------------------------
79 //! @brief      ビューポートを設定します。
80 //!             以下のDMPGL呼び出しと同等です。
81 //!
82 //!                 glViewport(x, y, width, height);
83 //!
84 //! @param[in]  x      ビューポートの左の位置
85 //! @param[in]  y      ビューポートの上の位置
86 //! @param[in]  width  ビューポートの幅
87 //! @param[in]  height ビューポートの高さ
88 //---------------------------------------------------------------------------
89 #define NN_FONT_CMD_SET_VIEWPORT( x, y, width, height )                     \
90     nn::util::Float24::Float32ToBits24( (width) / 2.0f ),                   \
91     PICA_CMD_HEADER_BURSTSEQ( PICA_REG_VIEWPORT_WIDTH1, 4 ),                \
92     nn::util::Float31::Float32ToBits31( 2.0f / (width)  ) << 1,             \
93     nn::util::Float24::Float32ToBits24( (height) / 2.0f ),                  \
94     nn::util::Float31::Float32ToBits31( 2.0f / (height) ) << 1,             \
95     0,  /* アライメント調整 */                                              \
96     PICA_CMD_DATA_VIEWPORT_XY( static_cast<u16>(x), static_cast<u16>(y) ),  \
97     PICA_CMD_HEADER_SINGLE( PICA_REG_VIEWPORT_XY )
98 
99 //---------------------------------------------------------------------------
100 //! @brief      カリングを設定します。
101 //!
102 //! @param[in]  mode  カリングのモード(NN_FONT_DEMO_CULL_FACE_*)
103 //---------------------------------------------------------------------------
104 #define NN_FONT_CMD_SET_CULL_FACE( mode )    PICA_CMD_SET_CULL_FACE( mode )
105 
106 
107 #define NN_FONT_CMD_SCISSOR_VAL( s, c )                                \
108             static_cast<u16>( (s) >= (c) ? (c) - 1: ((s) < 0 ? 0: (s)) )
109 
110 //---------------------------------------------------------------------------
111 //! @brief      シザーボックスを設定します。
112 //!             また、同時にシザーテストを有効にします。
113 //!             以下のDMPGL呼び出しと同等です。
114 //!
115 //!                 glEnable(GL_SCISSOR_TEST);
116 //!                 glScissor(x, y, w, h);
117 //!
118 //! @param[in]  x     シザーボックスの左の位置
119 //! @param[in]  y     シザーボックスの上の位置
120 //! @param[in]  w     シザーボックスの幅
121 //! @param[in]  h     シザーボックスの高さ
122 //! @param[in]  cbSz  カラーバッファ情報構造体
123 //---------------------------------------------------------------------------
124 #define NN_FONT_CMD_SET_SCISSOR( x, y, w, h, cbSz )                     \
125     PICA_CMD_DATA_SCISSOR( true ),                                      \
126     PICA_CMD_HEADER_BURSTSEQ( PICA_REG_SCISSOR, 3 ),                    \
127     NN_FONT_CMD_SCISSOR_VAL( x, (cbSz).width )                          \
128         | NN_FONT_CMD_SCISSOR_VAL( y, (cbSz).height ) << 16,            \
129     NN_FONT_CMD_SCISSOR_VAL( (x) + (w) - 1, (cbSz).width )              \
130         | NN_FONT_CMD_SCISSOR_VAL( (y) + (h) - 1, (cbSz).height ) << 16
131 
132 //---------------------------------------------------------------------------
133 //! @brief      シザーテストを無効にします。
134 //!             以下のDMPGL呼び出しと同等です。
135 //!
136 //!                 glDisable(GL_SCISSOR_TEST);
137 //!
138 //! @param[in]  cbSz   カラーバッファ情報構造体
139 //---------------------------------------------------------------------------
140 #define NN_FONT_CMD_SET_DISABLE_SCISSOR( cbSz )         \
141     PICA_CMD_DATA_SCISSOR( false ),                     \
142     PICA_CMD_HEADER_BURSTSEQ( PICA_REG_SCISSOR, 3 ),    \
143     0                  | 0 << 16,                       \
144     ((cbSz).width - 1) | ((cbSz).height - 1) << 16
145 
146 //---------------------------------------------------------------------------
147 //! @brief      wバッファ、デプスの範囲、ポリゴンオフセットを設定します。
148 //!             以下のDMPGL呼び出しと同等です。
149 //!
150 //!                 glUniform1f(予約ユニフォーム "dmp_FragOperation.wScale", wScale);
151 //!                 glDepthRangef(near, far);
152 //!                 glPolygonOffset(factor, units);  ※ factorは設定不可
153 //!
154 //! @param[in]  wScale  wバッファを有効にする値
155 //! @param[in]  near    デプスの範囲のnear値
156 //! @param[in]  far     デプスの範囲のfar値
157 //! @param[in]  units   ポリゴンオフセットのunits値。0 にするとポリゴンオフセットが無効になります。
158 //! @param[in]  cbSz    カラーバッファ情報構造体
159 //---------------------------------------------------------------------------
160 #define NN_FONT_CMD_SET_WBUFFER_DEPTHRANGE_POLYGONOFFSET(                                   \
161             wScale, near, far, units, cbSz )                                                \
162     ((wScale) == 0.0f ? 1: 0) << 0,                                                         \
163     PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE ),                                      \
164     nn::util::Float24::Float32ToBits24(                                                     \
165         (wScale) != 0.0f ? -(wScale): (near) - (far) ),                                     \
166     PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE_DATA1 ),                                \
167     nn::util::Float24::Float32ToBits24(                                                     \
168         (near)                                                                              \
169             - ((near) - (far)) * static_cast<f32>(units)                                    \
170                   / ((1 << ((cbSz).depth == PICA_DATA_DEPTH_COMPONENT16 ? 16: 24)) - 1) ),  \
171     PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE_DATA2 )
172 
173 //---------------------------------------------------------------------------
174 //! @brief      アーリーデプステストの有効/無効を設定します。
175 //!             以下のDMPGL呼び出しと同等です。
176 //!
177 //!                 glEnable/glDisable(GL_EARLY_DEPTH_TEST_DMP)
178 //!
179 //! @param[in]  isEnabled  有効にする場合は真
180 //---------------------------------------------------------------------------
181 #define NN_FONT_CMD_SET_ENABLE_EARLY_DEPTH_TEST( isEnabled )        \
182     PICA_CMD_DATA_EARLY_DEPTH_TEST( isEnabled ),                    \
183     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_EARLY_DEPTH_TEST1, 0x1 ),   \
184     PICA_CMD_DATA_EARLY_DEPTH_TEST( isEnabled ),                    \
185     PICA_CMD_HEADER_SINGLE( PICA_REG_EARLY_DEPTH_TEST2 )
186 
187 //---------------------------------------------------------------------------
188 //! @brief      ステンシルテストの関数とビットマスク値を設定します。
189 //!             また、同時にステンシルテストを有効にします。
190 //!             以下のDMPGL呼び出しと同等です。
191 //!
192 //!                 glEnable(GL_STENCIL_TEST);
193 //!                 glStencilFunc(func, ref, andBits);
194 //!                 glStencilMask(writableBits);
195 //!
196 //! @param[in]  func          比較関数(PICA_DATA_STENCIL_TEST_*)
197 //! @param[in]  ref           参照値
198 //! @param[in]  andBits       論理積をとるビット
199 //! @param[in]  writableBits  書き込み可能ビット
200 //---------------------------------------------------------------------------
201 #define NN_FONT_CMD_SET_STENCIL_FUNC_MASK( func, ref, andBits, writableBits )           \
202     PICA_CMD_DATA_STENCIL_TEST( true/*isEnabled*/, func, writableBits, ref, andBits ),  \
203     PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_TEST )
204 
205 //---------------------------------------------------------------------------
206 //! @brief      ステンシルテストの操作を設定します。
207 //!             以下のDMPGL呼び出しと同等です。
208 //!
209 //!                 glStencilOp(sfail, zfail, zpass)
210 //!
211 //! @param[in]  sfail  ステンシルテストに失敗する場合の演算(PICA_DATA_STENCIL_OP_*)
212 //! @param[in]  zfail  デプステストに失敗する場合の演算(PICA_DATA_STENCIL_OP_*)
213 //! @param[in]  zpass  パスする場合の演算(PICA_DATA_STENCIL_OP_*)
214 //---------------------------------------------------------------------------
215 #define NN_FONT_CMD_SET_STENCIL_OP( sfail, zfail, zpass )       \
216     PICA_CMD_DATA_STENCIL_OP( sfail, zfail, zpass ),            \
217     PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_OP )
218 
219 //---------------------------------------------------------------------------
220 //! @brief      ステンシルテストを無効にします。
221 //!             以下のDMPGL呼び出しと同等です。
222 //!
223 //!                 glDisable(GL_STENCIL_TEST);
224 //---------------------------------------------------------------------------
225 #define NN_FONT_CMD_SET_DISABLE_STENCIL_TEST()                      \
226     PICA_CMD_DATA_STENCIL_TEST( false/*isEnabled*/, 0, 0, 0, 0 ),   \
227     PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_TEST )
228 
229 //---------------------------------------------------------------------------
230 //! @brief      デプステストの関数とマスクおよびカラーマスクを設定します。
231 //!             デプステストの関数は NN_FONT_CMD_SET_DEPTH_FUNC2 と合わせて
232 //!             使用します。
233 //!             以下のDMPGL呼び出しと同等です。
234 //!
235 //!                 glEnable/glDisable(GL_DEPTH_TEST)
236 //!                 glDepthFunc(depthFunc)  ※一部の設定
237 //!                 glDepthMask(depthMask)
238 //!                 glColorMask(red, green, blue, alpha)
239 //!
240 //! @param[in]  isDepthTestEnabled デプステストを有効にする場合は真
241 //! @param[in]  depthFunc          デプス値の比較関数(PICA_DATA_DEPTH_TEST_*)
242 //! @param[in]  depthMask          デプスバッファへの書き込みが可能なら真
243 //! @param[in]  red                カラーバッファへの赤色成分が書き込み可能なら真
244 //! @param[in]  green              カラーバッファへの緑色成分が書き込み可能なら真
245 //! @param[in]  blue               カラーバッファへの青色成分が書き込み可能なら真
246 //! @param[in]  alpha              カラーバッファへのアルファ成分が書き込み可能なら真
247 //---------------------------------------------------------------------------
248 #define NN_FONT_CMD_SET_DEPTH_FUNC_COLOR_MASK(                                  \
249             isDepthTestEnabled, depthFunc, depthMask, red, green, blue, alpha ) \
250     PICA_CMD_DATA_DEPTH_COLOR_MASK( isDepthTestEnabled, depthFunc,              \
251         red, green, blue, alpha, depthMask ),                                   \
252     PICA_CMD_HEADER_SINGLE( PICA_REG_DEPTH_COLOR_MASK )
253 
254 //---------------------------------------------------------------------------
255 //! @brief      デプステストの関数を設定します。
256 //!             NN_FONT_CMD_SET_DEPTH_FUNC_COLOR_MASK と合わせて使用します。
257 //!             以下のDMPGL呼び出しと同等です。
258 //!
259 //!                 glDepthFunc(func)  ※一部の設定
260 //!
261 //! @param[in]  func デプス値の比較関数(PICA_DATA_DEPTH_TEST_*)
262 //---------------------------------------------------------------------------
263 #define NN_FONT_CMD_SET_DEPTH_FUNC2( func )                                                     \
264     PICA_CMD_DATA_GAS_DELTAZ_DEPTH( 0 /*deltaZ*/,                                               \
265         (func) >= PICA_DATA_DEPTH_TEST_GREATER ? PICA_DATA_DEPTH_TEST2_GREATER:                 \
266             ( (func) >= PICA_DATA_DEPTH_TEST_EQUAL ? PICA_DATA_DEPTH_TEST2_OTHER: (func) ) ),   \
267     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_GAS_DELTAZ_DEPTH, 0x4 )
268 
269 //---------------------------------------------------------------------------
270 //! @brief      フレームバッファアクセス制御を設定します。
271 //!
272 //! @param[in]  colorRead     カラーバッファのリードが必要な場合は真
273 //! @param[in]  colorWrite    カラーバッファのライトが必要な場合は真
274 //! @param[in]  depthRead     デプスバッファのリードが必要な場合は真
275 //! @param[in]  depthWrite    デプスバッファのライトが必要な場合は真
276 //! @param[in]  stencilRead   ステンシルバッファのリードが必要な場合は真
277 //! @param[in]  stencilWrite  ステンシルバッファのライトが必要な場合は真
278 //---------------------------------------------------------------------------
279 #define NN_FONT_CMD_SET_FBACCESS(                                                   \
280         colorRead, colorWrite, depthRead, depthWrite, stencilRead, stencilWrite)    \
281     (colorRead ) ? 0xF: 0,                                                          \
282     PICA_CMD_HEADER_BURSTSEQ( PICA_REG_COLOR_BUFFER_READ, 4 ),                      \
283     (colorWrite) ? 0xF: 0,                                                          \
284     ((depthRead ) ? 1: 0) << 1 | ((stencilRead ) ? 1: 0) << 0,                      \
285     ((depthWrite) ? 1: 0) << 1 | ((stencilWrite) ? 1: 0) << 0,                      \
286     0   // アライメント調整
287 
288 
289 #endif //  NN_FONT_CTR_FONT_RECT_DRAWER_COMMAND_H_
290