1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_Texture.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: 26253 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_TEXTURE_H_
17 #define NN_GR_TEXTURE_H_
18 
19 #include <nn/gr/CTR/gr_Prefix.h>
20 
21 namespace nn
22 {
23     namespace gr
24     {
25         namespace CTR
26         {
27 
28             /*!
29                 @brief テクスチャ設定のためのクラスです。
30              */
31             class Texture
32             {
33             public :
34 
35                 /*!
36                     @brief 各テクスチャユニットの共通設定のためのクラスです。
37                  */
38                 class UnitBase
39                 {
40                 public :
41                     /*!
42                         @brief テクスチャの物理アドレスの設定です。型は u32 です。
43                      */
44                     u32 physicalAddr;
45 
46 
47                     /*!
48                         @brief テクスチャの幅の設定です。型は u16 です。
49                      */
50                     u16 width;
51 
52 
53                     /*!
54                         @brief テクスチャの高さの設定です。型は u16 です。
55                      */
56                     u16 height;
57 
58                     /*!
59                         @brief テクスチャのフォーマットの設定です。
60                                型は PicaDataTextureFormat です。
61                                値には PICA マクロヘッダの列挙型の名前が
62                                PicaDataTextureFormat の列挙定数を使って下さい。
63                     */
64                     /*
65                         値は、
66                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_BYTE
67                         PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_BYTE
68                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_5_5_5_1
69                         PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_SHORT_5_6_5
70                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_4_4_4_4
71                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE
72                         PICA_DATA_TEXTURE_FORMAT_HILO8_DMP_UNSIGNED_BYTE
73                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_BYTE
74                         PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_BYTE
75                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE_4_4_DMP
76                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_4BITS_DMP
77                         PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_4BITS_DMP
78                         PICA_DATA_TEXTURE_FORMAT_ETC1_RGB8_NATIVE_DMP
79                         PICA_DATA_TEXTURE_FORMAT_ETC1_ALPHA_RGB8_A4_NATIVE_DMP
80                         のいずれかを設定します。
81                     */
82                     PicaDataTextureFormat format;
83 
84                     /*!
85                         @brief テクスチャ座標 s の設定です。
86                                型は PicaDataTextureWrap です。
87                                値には PICA マクロヘッダの列挙型の名前が
88                                PicaDataTextureWrap の列挙定数を使って下さい。
89                                初期値はPICA_DATA_TEXTURE_WRAP_REPEATです。
90                      */
91                     /*
92                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_EDGE
93                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_BORDER
94                         PICA_DATA_TEXTURE_WRAP_REPEAT
95                         PICA_DATA_TEXTURE_WRAP_MIRRORED_REPEAT
96                         のいずれかを設定します。
97                     */
98                     PicaDataTextureWrap wrapT;
99 
100                     /*!
101                         @brief テクスチャ座標 s の設定です。
102                                型は PicaDataTextureWrap です。
103                                値には PICA マクロヘッダの列挙型の名前が
104                                PicaDataTextureFormat の列挙定数を使って下さい。
105                                初期値はPICA_DATA_TEXTURE_WRAP_REPEATです。
106                     */
107                     /*
108                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_EDGE
109                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_BORDER
110                         PICA_DATA_TEXTURE_WRAP_REPEAT
111                         PICA_DATA_TEXTURE_WRAP_MIRRORED_REPEAT
112                         のいずれかを設定します。
113                     */
114                     PicaDataTextureWrap wrapS;
115 
116                     /*!
117                         @brief テクスチャ拡大フィルタの設定です。
118                                型は PicaDataTextureMagFilter です。
119                                値には PICA マクロヘッダの列挙型の名前が
120                                PicaDataTextureMagFilter の列挙定数を使って下さい。
121                                初期値はPICA_DATA_TEXTURE_MAG_FILTER_NEARESTです。
122                     */
123                     /*
124                         PICA_DATA_TEXTURE_MAG_FILTER_NEAREST
125                         PICA_DATA_TEXTURE_MAG_FILTER_LINEAR
126                         のいずれかを設定します。
127                     */
128                     PicaDataTextureMagFilter magFilter;
129 
130 
131                     /*!
132                         @brief テクスチャ縮小フィルタの設定です。
133                                型は PicaDataTextureMinFilter です。
134                                値には PICA マクロヘッダの列挙型の名前が
135                                PicaDataTextureMinFilter の列挙定数を使って下さい。
136                                初期値は PICA_DATA_TEXTURE_MIN_FILTER_NEAREST です。
137                     */
138                     /*
139                         値は、
140                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST
141                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
142                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
143                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR
144                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
145                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
146                         のいずれかを設定します。
147                         MipMapを有効にしたい場合は
148                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
149                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
150                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
151                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
152                         のいずれかを設定してください。
153                     */
154                     PicaDataTextureMinFilter minFilter;
155                     NN_PADDING3;
156 
157                     /*!
158                         @brief LODバイアスの設定です。
159                                型は f32 です。
160                                初期値は0.fです。
161                                [-16.f : 16.f]の範囲で設定してください。
162                         @see IsEnableMipMap()
163                     */
164                     /*
165                         コマンド生成時には13bit固定小数(fraction8)に変換されます。
166                         MipMapが有効でないときは、無視されます。
167                     */
168                     f32 lodBias;
169 
170                     /*!
171                         @brief 最小LODレベルを設定します。値は u8 です。
172                                初期値は0です。
173                                0以上の値で設定します。
174                         @see IsEnableMipMap()
175                      */
176                     /*
177                         MipMapが有効でないときは、無視されます。
178                     */
179                     u8 minLodLevel;
180 
181 
182                     /*!
183                         @brief 最大LODレベルを設定します。値は u8 です。
184                                初期値は0です。
185                         @see IsEnableMipMap()
186                     */
187                     /*
188                         ロードしたMipMapの段数-1を設定してください。
189                         MipMapが有効でないときは、無視されます。
190                     */
191                     u8 maxLodLevel;
192 
193 
194                     /*!
195                         @brief ボーダーカラーの赤成分です。
196                                値は u8 です。
197                                初期値は0です。
198                      */
199                     u8 borderColorR;
200 
201                     /*!
202                         @brief ボーダーカラーの緑成分です。
203                                値は u8 です。
204                                初期値は0です。
205                      */
206                     u8 borderColorG;
207 
208 
209                     /*!
210                         @brief ボーダーカラーの青成分です。
211                                値は u8 です。
212                                初期値は0です。
213                      */
214                     u8 borderColorB;
215 
216 
217                     /*!
218                         @brief ボーダーカラーのアルファ成分です。
219                                値は u8 です。
220                                初期値は0です。
221                      */
222                     u8 borderColorA;
223 
224                     NN_PADDING2;
225 
226                 protected :
227                     /*!
228                         @brief MipMapが有効かどうかを判定します。
229                     */
230                     /*
231                      MipMapを有効にしたい場合は、minFilterに
232                      PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
233                      PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
234                      PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
235                      PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
236                      のいずれかを設定してください。
237                      */
IsEnableMipMap()238                     bool IsEnableMipMap() const
239                     {
240                         if ( minFilter == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR  ) return false;
241                         if ( minFilter == PICA_DATA_TEXTURE_MIN_FILTER_NEAREST ) return false;
242                         return true;
243                     }
244 
245                     /*!
246                         @brief 初期値を設定します。
247                      */
248                     UnitBase();
249                 };
250 
251             public :
252 
253                 /*!
254                     @brief テクスチャユニット0の設定のためのクラスです。
255                  */
256                 class Unit0 : public UnitBase
257                 {
258                 public :
259                      /*!
260                         @brief テクスチャユニット0のサンプラータイプの設定です。
261                                型は PicaDataTexture0SamplerType です。
262                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture0SamplerType
263                                の列挙定数を使って下さい。
264                                初期値はPICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSEです。
265                      */
266 
267                     /*
268                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_2D
269                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_CUBE_MAP
270                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_2D_DMP
271                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_PROJECTION_DMP
272                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_CUBE_DMP
273                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE
274                      のいずれかを設定します。
275                      */
276                     PicaDataTexture0SamplerType texType;
277                     NN_PADDING3;
278 
279                     /*!
280                         @brief キューブマップ[ +x ]テクスチャの物理アドレスの設定です。
281                                型は u32 です。
282                     */
283                     u32 cubeMapAddrPosX;
284 
285                     /*!
286                         @brief キューブマップ[ -x ]テクスチャの物理アドレスの設定です。
287                                型は u32 です。
288                     */
289                     u32 cubeMapAddrNegX;
290 
291                     /*!
292                         @brief キューブマップ[ +y ]テクスチャの物理アドレスの設定です。
293                                型は u32 です。
294                     */
295                     u32 cubeMapAddrPosY;
296 
297                     /*!
298                         @brief キューブマップ[ -Y ]テクスチャの物理アドレスの設定です。
299                                型は u32 です。
300                     */
301                     u32 cubeMapAddrNegY;
302 
303                     /*!
304                         @brief キューブマップ[ +Z ]テクスチャの物理アドレスの設定です。
305                                型は u32 です。
306                     */
307                     u32 cubeMapAddrPosZ;
308 
309                     /*!
310                         @brief キューブマップ[ -Z ]テクスチャの物理アドレスの設定です。
311                                型は u32 です。
312                     */
313                     u32 cubeMapAddrNegZ;
314 
315                 public :
316                     /*!
317                         @brief 設定された情報をもとに、テクスチャユニット0の設定コマンドを生成します。
318 
319                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
320                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
321 
322                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
323                      */
324                     u32* MakeCommand( u32* command, bool is_update_texture_func = true ) const;
325 
326                     /*!
327                         @brief 初期値を設定します。
328 
329                         @param[in] texture_ テクスチャです。
330                      */
331                     explicit Unit0( const Texture& texture_ );
332 
333                 private :
334                     const Texture& m_Texture;
335                 };
336 
337                 /*!
338                     @brief テクスチャユニット1の設定のためのクラスです。
339                  */
340                 class Unit1 : private UnitBase
341                 {
342                 public :
343                     /*!
344                         @brief テクスチャユニット1のサンプラータイプの設定です。
345                                型は PicaDataTexture1SamplerType です。
346                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture1SamplerType
347                                の列挙定数を使って下さい。
348                                初期値はPICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSEです。
349                      */
350                     /*
351                      PICA_DATA_TEXTURE1_SAMPLER_TYPE_TEXTURE_2D
352                      PICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSE
353                      のいずれかを設定します。
354                      */
355                     PicaDataTexture1SamplerType texType;
356                     NN_PADDING3;
357 
358                 public :
359                     /*!
360                         @brief 設定された情報をもとに、テクスチャユニット1の設定コマンドを生成します。
361 
362                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
363                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
364 
365                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
366                      */
367                     u32* MakeCommand( u32* command, bool is_update_texture_func = true ) const;
368 
369                     /*!
370                         @brief 初期値を設定します。
371 
372                         @param[in] texture_ テクスチャです。
373                      */
374                     explicit Unit1( const Texture& texture_ );
375 
376                 private :
377                     const Texture& m_Texture;
378                 };
379 
380                 /*!
381                     @brief テクスチャユニット2の設定のためのクラスです。
382                  */
383                 class Unit2 : private UnitBase
384                 {
385                 public :
386                     /*!
387                         @brief テクスチャユニット2のサンプラータイプの設定です。
388                                型は PicaDataTexture2SamplerType です。
389                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture2SamplerType
390                                の列挙定数を使って下さい。
391                      */
392                     /*
393                         値は、
394                         PICA_DATA_TEXTURE2_SAMPLER_TYPE_TEXTURE_2D
395                         PICA_DATA_TEXTURE2_SAMPLER_TYPE_FALSE
396                         のいずれかを設定します。
397                      */
398                     PicaDataTexture2SamplerType texType;
399 
400                     /*
401                         @brief テクスチャユニット2のテクスチャ座標選択の設定です。
402                                型は PicaDataTexture2TexCoord です。
403                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture2TexCoord
404                                の列挙定数を使って下さい。
405                                初期値は PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2 です。
406                      */
407                     /*
408                         値は、
409                         PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE1
410                         PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2
411                         のいずれかを設定します。
412                      */
413                     PicaDataTexture2TexCoord    texCoord;
414 
415                     NN_PADDING2;
416 
417                 public :
418                     /*!
419                         @brief 設定された情報をもとに、テクスチャユニット2の設定コマンドを生成します。
420 
421                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
422                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
423 
424                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
425                      */
426                      u32* MakeCommand( u32* command, bool is_update_texture_func = true ) const;
427 
428                     /*!
429                         @brief 初期値を設定します。
430 
431                         @param[in] texture_ テクスチャです。
432                      */
433                     explicit Unit2( const Texture& texture_ );
434 
435                 private :
436                     const Texture& m_Texture;
437                 };
438 
439                 /*!
440                     @brief テクスチャユニット3の設定のためのクラスです。
441                  */
442                 class Unit3 : private UnitBase
443                 {
444                 public :
445                     /*!
446                         @brief テクスチャユニット3のサンプラータイプの設定です。
447                                型は PicaDataTexture3SamplerType です。
448                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture3Sampler
449                                の列挙定数を使って下さい。
450                                初期値は PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE です。
451                      */
452                     /*
453                         値は、
454                         PICA_DATA_TEXTURE3_SAMPLER_TYPE_TEXTURE_PROCEDURAL_DMP
455                         PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE
456                         のいずれかを設定します。
457                      */
458                     PicaDataTexture3SamplerType texType;
459 
460                      /*!
461                         @brief テクスチャユニット3のテクスチャ座標選択の設定です。
462                                型は PicaDataTexture3TexCoord です。
463                                値には PICA マクロヘッダの列挙型の名前が PicaDataTexture3TexCoord
464                                の列挙定数を使って下さい。
465                                初期値はPICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0です。
466                      */
467                     /*
468                         値は、
469                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0
470                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE1
471                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE2
472                         のいずれかを設定します。
473                      */
474                     PicaDataTexture3TexCoord    texCoord;
475 
476                     NN_PADDING2;
477 
478                 public :
479                     /*!
480                         @brief 設定された情報をもとに、テクスチャユニット3の設定コマンドを生成します。
481 
482                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
483                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
484 
485                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
486                      */
487                     u32* MakeCommand( u32* command, bool is_update_texture_func = true ) const;
488 
489                     /*!
490                         @brief 初期値を設定します。
491 
492                         @param[in] texture_ テクスチャです。
493                      */
494                     explicit Unit3( const Texture& texture_ );
495 
496                 private :
497                     const Texture& m_Texture;
498                 };
499 
500             public :
501                 /*!
502                     @brief テクスチャユニット0についての設定です。
503                            型は nn::gr::CTR::Texture::Unit0 です。
504                 */
505                 Unit0 unit0;
506 
507                 /*!
508                     @brief テクスチャユニット1についての設定です。
509                            型は nn::gr::CTR::Texture::Unit1 です。
510                 */
511                 Unit1 unit1;
512 
513                 /*!
514                     @brief テクスチャユニット2についての設定です。
515                            型は nn::gr::CTR::Texture::Unit2 です。
516                 */
517                 Unit2 unit2;
518 
519                 /*!
520                     @brief テクスチャユニット3についての設定です。
521                            型は nn::gr::CTR::Texture::Unit3 です。
522                 */
523                 Unit3 unit3;
524 
525             public :
526                 /*!
527                     @brief 各設定の初期値を設定します。
528                 */
529                 Texture();
530 
531                 /*!
532                     @brief 設定された情報をもとに、すべてのテクスチャの設定コマンドを生成します。
533 
534                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
535 
536                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
537                  */
538                 u32* MakeCommand( u32* command ) const;
539 
540                 /*!
541                     @brief 設定された情報をもとに、テクスチャユニットの有効/無効コマンドなどを生成します。
542 
543                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
544 
545                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
546                  */
547                 u32* MakeFuncCommand( u32* command ) const;
548             };
549 
550         } // namespace CTR
551     } // namespace gr
552 } // namespace nn
553 
554 #endif // NN_GR_TEXTURE_H_
555