1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_BindSymbol.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd.  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   $Rev: 26168 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_BIND_SYMBOL_H_
17 #define NN_GR_BIND_SYMBOL_H_
18 
19 #include <nn/gr/CTR/gr_Prefix.h>
20 #include <nn/gr/CTR/gr_Utility.h>
21 
22 namespace nn
23 {
24     namespace gr
25     {
26         namespace CTR
27         {
28 
29             /*!
30                 @brief 各シンボルについての情報をやり取りするためのクラスです。
31             */
32             class BindSymbol
33             {
34             public :
35                 /*!
36                     @brief シンボルの型情報を表します。
37                  */
38                 enum SymbolType
39                 {
40                     //! 無効な型です。
41                     SYMBOL_TYPE_INVALID,
42                     //! シェーダーへの入力を表します。v0 ... v15 に対応します。
43                     SYMBOL_TYPE_INPUT,
44                     //! 浮動小数レジスタです。 c0 ... c95に対応します。
45                     SYMBOL_TYPE_FLOAT,
46                     //! 整数レジスタです。i0 ... i3に対応します。
47                     SYMBOL_TYPE_INTEGER,
48                     //! ブールレジスタです。b0 ... b15に対応します。
49                     SYMBOL_TYPE_BOOL
50                 };
51 
52                 /*!
53                     @brief シェーダの種類を表します。
54                  */
55                 enum ShaderType
56                 {
57                     //! 頂点シェーダーを表します。
58                     SHADER_TYPE_VERTEX,
59                     //! ジオメトリシェーダーを表します。
60                     SHADER_TYPE_GEOMETRY
61                 };
62 
63                 /*!
64                     @brief バインドされているシェーダーの種類です。
65                            型は nn::gr::CTR::BindSymbol::ShaderType です。
66                  */
67                 const ShaderType shaderType;
68 
69                 /*!
70                     @brief シンボルの型情報です。
71                            型は nn::gr::CTR::BindSymbol::SymbolType です。
72                  */
73                 const SymbolType symbolType;
74 
75                 /*!
76                     @brief バインドされている先頭のレジスタ番号です。
77                            型は u8 です。
78                 */
79                 u8 start;
80 
81                 /*!
82                     @brief バインドされている最終のレジスタ番号です。
83                            型は u8 です。
84                 */
85                 u8 end;
86 
87                 /*!
88                     @brief バインド名が格納されている、シェーダーバイナリデータ内のアドレス指すポインタです。
89                            型は const char* です。
90                 */
91                 const char* name;
92 
93             protected :
94                 /*!
95                     @brief コンストラクタです。直接生成することを禁止します。
96 
97                     @param[in] shader_type シェーダの種類です。
98                     @param[in] symbol_type シンボルの型情報です。
99                 */
BindSymbol(const ShaderType shader_type,const SymbolType symbol_type)100                 explicit BindSymbol( const ShaderType shader_type, const SymbolType symbol_type )
101                     : shaderType( shader_type ),
102                       symbolType( symbol_type ),
103                       start( 0xff ),
104                       end( 0xff ),
105                       name( NULL )
106                 {
107                 }
108             };
109 
110             /*!
111                 @brief 頂点シェーダーの入力レジスタシンボルについての情報をやり取りするためのクラスです。
112              */
113             class BindSymbolVSInput : public BindSymbol
114             {
115             public :
116                 /*!
117                     @brief コンストラクタです。
118                 */
BindSymbolVSInput()119                 explicit BindSymbolVSInput() :
120                 BindSymbol( SHADER_TYPE_VERTEX, SYMBOL_TYPE_INPUT )
121                 {
122                 }
123             };
124 
125             /*!
126                 @brief 頂点シェーダーの浮動小数レジスタシンボルについての情報をやり取りするためのクラスです。
127              */
128             class BindSymbolVSFloat : public BindSymbol
129             {
130             public :
131                 /*!
132                     @brief コンストラクタです。
133                 */
BindSymbolVSFloat()134                 explicit BindSymbolVSFloat() :
135                 BindSymbol( SHADER_TYPE_VERTEX, SYMBOL_TYPE_FLOAT )
136                 {
137                 }
138 
139                 /*!
140                     @brief 34行列を頂点シェーダのユニフォームにセットするコマンドを生成します。
141 
142                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
143                     @param[in] mtx34   34行列です。
144 
145                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
146                  */
MakeUniformCommand(u32 * command,const nn::math::MTX34 & mtx34)147                 u32* MakeUniformCommand( u32* command, const nn::math::MTX34& mtx34 ) const
148                 {
149                     return MakeUniformCommandVS( command, start, mtx34 );
150                 }
151 
152                 /*!
153                     @brief 44行列を頂点シェーダのユニフォームにセットするコマンドを生成します。
154 
155                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
156                     @param[in] mtx44   44行列です。
157 
158                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
159                  */
MakeUniformCommand(u32 * command,const nn::math::MTX44 & mtx44)160                 u32* MakeUniformCommand( u32* command, const nn::math::MTX44& mtx44 ) const
161                 {
162                     return MakeUniformCommandVS( command, start, mtx44 );
163                 }
164 
165                 /*!
166                     @brief 4次元のベクトルを頂点シェーダのユニフォームにセットするコマンドを生成します。
167 
168                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
169                     @param[in] vec4    4次元のベクトルです。
170 
171                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
172                  */
MakeUniformCommand(u32 * command,const nn::math::VEC4 & vec4)173                 u32* MakeUniformCommand( u32* command, const nn::math::VEC4& vec4 ) const
174                 {
175                     return MakeUniformCommandVS( command, start, vec4 );
176                 }
177 
178                 /*!
179                     @brief 4次元のベクトルの配列を頂点シェーダのユニフォームにセットするコマンドを生成します.
180 
181                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
182 
183                     @param[in] vec4[]  設定する4次元ベクトルの配列です。
184                     @param[in] num     設定するベクトルの数です。( 2以上を設定するようにして下さい。)
185 
186                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
187                  */
MakeUniformCommand(u32 * command,const nn::math::VEC4 vec4[],const int num)188                 u32* MakeUniformCommand( u32* command, const nn::math::VEC4 vec4[], const int num ) const
189                 {
190                     return MakeUniformCommandVS( command, start, vec4, num );
191                 }
192             };
193 
194             /*!
195                 @brief 整数レジスタシンボルについての情報をやり取りするためのクラスです。
196              */
197             class BindSymbolVSInteger : public BindSymbol
198             {
199             public :
BindSymbolVSInteger()200                 explicit BindSymbolVSInteger() :
201                 BindSymbol( SHADER_TYPE_VERTEX, SYMBOL_TYPE_INTEGER )
202                 {
203                 }
204 
205                 /*!
206                     @brief 整数を頂点シェーダのユニフォームにセットするコマンドを生成します。
207 
208                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
209                     @param[in] x       x座標の値です。
210                     @param[in] y       y座標の値です。
211                     @param[in] z       z座標の値です。
212 
213                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
214                  */
MakeUniformCommand(u32 * command,u8 x,u8 y,u8 z)215                 u32* MakeUniformCommand( u32* command, u8 x, u8 y, u8 z ) const
216                 {
217                     return MakeUniformCommandVS( command, start, x, y, z );
218                 }
219             };
220 
221             /*!
222                 @brief ブールレジスタシンボルについての情報をやり取りするためのクラスです。
223              */
224             class BindSymbolVSBool : public BindSymbol
225             {
226             public :
227                 /*!
228                     @brief コンストラクタです。
229                 */
BindSymbolVSBool(void)230                 explicit BindSymbolVSBool( void ) :
231                 BindSymbol( SHADER_TYPE_VERTEX, SYMBOL_TYPE_BOOL )
232                 {
233                 }
234             };
235 
236             /*!
237                 @brief ジオメトリシェーダーの浮動小数レジスタシンボルについての情報をやり取りするためのクラスです。
238              */
239             class BindSymbolGSFloat : public BindSymbol
240             {
241             public :
242                 /*!
243                     @brief コンストラクタです。
244                 */
BindSymbolGSFloat(void)245                 explicit BindSymbolGSFloat( void ) :
246                 BindSymbol( SHADER_TYPE_GEOMETRY, SYMBOL_TYPE_FLOAT )
247                 {
248                 }
249 
250                 /*!
251                     @brief 34行列をジオメトリシェーダのユニフォームにセットするコマンドを生成します。
252 
253                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
254                     @param[in] mtx34   34行列です。
255 
256                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
257                  */
MakeUniformCommand(u32 * command,const nn::math::MTX34 & mtx34)258                 u32* MakeUniformCommand( u32* command, const nn::math::MTX34& mtx34 ) const
259                 {
260                     return MakeUniformCommandGS( command, start, mtx34 );
261                 }
262 
263                 /*!
264                     @brief 44行列をジオメトリシェーダのユニフォームにセットするコマンドを生成します。
265 
266                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
267                     @param[in] mtx44   44行列です。
268 
269                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
270                  */
MakeUniformCommand(u32 * command,const nn::math::MTX44 & mtx44)271                 u32* MakeUniformCommand( u32* command, const nn::math::MTX44& mtx44 ) const
272                 {
273                     return MakeUniformCommandGS( command, start, mtx44 );
274                 }
275 
276                 /*!
277                     @brief ベクトルをジオメトリシェーダのユニフォームにセットするコマンドを生成します。
278 
279                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
280                     @param[in] vec4    4次元のベクトルです。
281 
282                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
283                  */
MakeUniformCommand(u32 * command,const nn::math::VEC4 & vec4)284                 u32* MakeUniformCommand( u32* command, const nn::math::VEC4& vec4 ) const
285                 {
286                     return MakeUniformCommandGS( command, start, vec4 );
287                 }
288 
289                 /*!
290                     @brief 4次元ベクトルの配列をジオメトリシェーダのユニフォームにセットするコマンドを生成します。
291 
292                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
293                     @param[in] vec4[]  設定する値の配列です。
294                     @param[in] num     設定するベクトルの数です。( 2以上を設定して下さい。)
295 
296                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
297                  */
MakeUniformCommand(u32 * command,const nn::math::VEC4 vec4[],const int num)298                 u32* MakeUniformCommand( u32* command, const nn::math::VEC4 vec4[], const int num ) const
299                 {
300                     return MakeUniformCommandGS( command, start, vec4, num );
301                 }
302 
303                 /*!
304                     @brief 整数をジオメトリシェーダのユニフォームにセットするコマンドを生成します。
305 
306                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
307                     @param[in] x       x座標の値です。
308                     @param[in] y       y座標の値です。
309                     @param[in] z       z座標の値です。
310 
311                     @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
312                  */
MakeUniformCommand(u32 * command,u8 x,u8 y,u8 z)313                 u32* MakeUniformCommand( u32* command, u8 x, u8 y, u8 z ) const
314                 {
315                     return MakeUniformCommandGS( command, start, x, y, z );
316                 }
317             };
318 
319             /*!
320                 @brief ブールレジスタシンボルについての情報をやり取りするためのクラスです。
321              */
322             class BindSymbolGSBool : public BindSymbol
323             {
324             public :
325                 /*!
326                     @brief コンストラクタです。
327                 */
BindSymbolGSBool()328                 explicit BindSymbolGSBool() :
329                 BindSymbol( SHADER_TYPE_GEOMETRY, SYMBOL_TYPE_BOOL )
330                 {
331                 }
332             };
333 
334         } // namespace CTR
335     } // namespace gr
336 } // namespace nn
337 
338 #endif // NN_GR_BIND_SYMBOL_H_
339