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