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