1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_ProcedureTexture.h
4 
5   Copyright (C)2009-2012 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: 46347 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_CTR_GR_PROCEDURE_TEXTURE_H_
17 #define NN_GR_CTR_GR_PROCEDURE_TEXTURE_H_
18 
19 #include <nn/gr/CTR/gr_Utility.h>
20 
21 namespace nn
22 {
23     namespace gr
24     {
25         namespace CTR
26         {
27 
28             /* Please see man pages for details
29 
30              */
31             class ProcedureTexture
32             {
33             public:
34                 static const u32 PROCTEX_LOOKUP_TABLE_ELEMENT_NUM       = 128; //
35                 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM = 256; //
36 
37             public :
38                 /* Please see man pages for details
39 
40 
41 
42                 */
43                 PicaDataProcTexMap rgbMap;
44 
45                 /* Please see man pages for details
46 
47 
48 
49                 */
50 
51                 PicaDataProcTexMap alphaMap;
52 
53                 /* Please see man pages for details
54 
55 
56 
57                 */
58                 bool alphaSeparate;
59 
60                 /* Please see man pages for details
61 
62 
63 
64                 */
65                 PicaDataProcTexClamp clampU;
66 
67                 /* Please see man pages for details
68 
69 
70 
71                 */
72                 PicaDataProcTexClamp clampV;
73 
74                 /* Please see man pages for details
75 
76 
77 
78                 */
79                 PicaDataProcTexShift shiftU;
80 
81                 /* Please see man pages for details
82 
83 
84 
85                 */
86                 PicaDataProcTexShift shiftV;
87 
88                 /* Please see man pages for details
89 
90 
91 
92                 */
93                 PicaDataProcTexFilter minFilter;
94 
95                 /* Please see man pages for details
96 
97 
98 
99                 */
100                 f32 texBias;
101 
102                 /* Please see man pages for details
103 
104 
105 
106                 */
107                 u8  texOffset;
108 
109                 /* Please see man pages for details
110 
111 
112 
113                 */
114                 u8  texWidth;
115 
116                 /* Please see man pages for details
117 
118 
119 
120                 */
121                 bool isEnableNoise;
122                 NN_PADDING1;
123 
124                 /* Please see man pages for details
125 
126 
127 
128                 */
129                 f32 noiseUAmplitude;
130 
131                 /* Please see man pages for details
132 
133 
134 
135                 */
136                 f32 noiseVAmplitude;
137 
138                 /* Please see man pages for details
139 
140 
141 
142                 */
143                 f32 noiseUFrequency;
144 
145                 /* Please see man pages for details
146 
147 
148 
149                 */
150                 f32 noiseVFrequency;
151 
152                 /* Please see man pages for details
153 
154 
155 
156                 */
157                 f32 noiseUPhase;
158 
159                 /* Please see man pages for details
160 
161 
162 
163                 */
164                 f32 noiseVPhase;
165 
166             public :
167                 /* Please see man pages for details
168 
169 
170 
171 
172 
173                 */
174                 void SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
175                                           const u32 lookUpTableIndex = 0,
176                                           const f32 lastDiffValue    = 0.0f );
177 
178                 /* Please see man pages for details
179 
180 
181 
182 
183 
184                 */
185                 void SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
186                                           const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
187                                           const u32 lookUpTableIndex = 0 );
188 
189                 /* Please see man pages for details
190 
191 
192 
193 
194 
195                 */
196                 void SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
197                                            const u32 lookUpTableIndex = 0,
198                                            const f32 lastDiffValue    = 0.0f );
199 
200                 /* Please see man pages for details
201 
202 
203 
204 
205 
206                 */
207                 void SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
208                                            const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
209                                            const u32 lookUpTableIndex = 0 );
210 
211                 /* Please see man pages for details
212 
213 
214 
215 
216 
217                 */
218                 void SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
219                                              const u32 lookUpTableIndex = 0,
220                                              const f32 lastDiffValue    = 0.0f );
221 
222                 /* Please see man pages for details
223 
224 
225 
226 
227 
228                 */
229                 void SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
230                                              const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
231                                              const u32 lookUpTableIndex = 0 );
232 
233                 /* Please see man pages for details
234 
235 
236 
237 
238                 */
239                 void SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
240                                         const u32 lookUpTableIndex = 0 );
241 
242                 /* Please see man pages for details
243 
244 
245 
246 
247 
248 
249                 */
250                 void SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
251                                         const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
252                                         const u32 lookUpTableIndex = 0,
253                                         const u32 diffLookUpTableIndex = 0 );
254 
255                 /* Please see man pages for details
256 
257 
258 
259 
260                 */
261                 void SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
262                                           const u32 lookUpTableIndex = 0 );
263 
264                 /* Please see man pages for details
265 
266 
267 
268 
269 
270 
271                 */
272                 void SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
273                                           const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
274                                           const u32 lookUpTableIndex = 0,
275                                           const u32 diffLookUpTableIndex = 0 );
276 
277                 /* Please see man pages for details
278 
279 
280 
281 
282                 */
283                 void SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
284                                          const u32 lookUpTableIndex = 0 );
285 
286                 /* Please see man pages for details
287 
288 
289 
290 
291 
292 
293                 */
294                 void SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
295                                          const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
296                                          const u32 lookUpTableIndex = 0,
297                                          const u32 diffLookUpTableIndex = 0 );
298 
299                /* Please see man pages for details
300 
301 
302 
303 
304                 */
305                 void SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
306                                           const u32 lookUpTableIndex = 0 );
307 
308                 /* Please see man pages for details
309 
310 
311 
312 
313 
314 
315                 */
316                 void SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
317                                           const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
318                                           const u32 lookUpTableIndex = 0,
319                                           const u32 diffLookUpTableIndex = 0 );
320 
321                 /* Please see man pages for details
322 
323 
324 
325 
326 
327 
328 */
329                 bit32* MakeAllCommand( bit32* command, bool isAddDummyCommand = true ) const
330                 {
331                     // Set command
332                     command = MakeConfigCommand( command, isAddDummyCommand );
333 
334                     // Procedural texture lookup table command
335                     command = MakeTableCommand( command );
336 
337                     return command;
338                 }
339 
340                 /* Please see man pages for details
341 
342 
343 
344 
345 
346 
347 */
348                 bit32* MakeConfigCommand( bit32* command, bool isAddDummyCommand = true ) const
349                 {
350                     command = MakeProcedureTextureModeCommand( command, isAddDummyCommand );
351                     command = MakeTextureCommand( command, false, false );
352                     command = MakeNoiseCommand( command, false, false );
353 
354                     return command;
355                 }
356 
357                 /* Please see man pages for details
358 
359 
360 
361 
362 
363 
364 */
365                 bit32* MakeProcedureTextureModeCommand( bit32* command, bool isAddDummyCommand = true ) const
366                 {
367                     if ( isAddDummyCommand )
368                     {
369                         command = MakeDummyCommand( command );
370                     }
371 
372                     // f32 -> f16
373                     u16 texBiasFloat16 = Float32ToFloat16( texBias );
374                     u8  texBiasFloat16Low8 = ( texBiasFloat16          & 0xFF );
375 
376                     // 0x0a8
377                     *command++ = PICA_CMD_DATA_PROCTEX0( clampU, clampV,
378                                                          rgbMap, alphaMap,
379                                                          ( alphaSeparate ? 1 : 0),
380                                                          ( isEnableNoise ? 1 : 0 ),
381                                                          shiftU, shiftV,
382                                                          texBiasFloat16Low8 );
383                     *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE3_PROCTEX0 );
384 
385                     return command;
386                 }
387 
388                 /* Please see man pages for details
389 
390 
391 
392 
393 
394 
395 
396 */
397                 bit32* MakeTextureCommand( bit32* command, bool isAddProcedureTextureModeCommand = true, bool isAddDummyCommand = true ) const
398                 {
399                     if ( isAddProcedureTextureModeCommand )
400                     {
401                         command = MakeProcedureTextureModeCommand( command, isAddDummyCommand );
402                     }
403                     else if ( isAddDummyCommand )
404                     {
405                         command = MakeDummyCommand( command );
406                     }
407 
408                     // f32 -> f16
409                     u16 texBiasFloat16 = Float32ToFloat16( texBias );
410                     u8  texBiasFloat16Hi8 =  ( ( texBiasFloat16 >> 8 ) & 0xFF );
411 
412                     // 0x0ac
413                     *command++ = PICA_CMD_DATA_PROCTEX4( minFilter, texWidth, texBiasFloat16Hi8 );
414                     *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEXTURE3_PROCTEX4, 0x2 );
415 
416                     // 0x0ad
417                     *command++ = PICA_CMD_DATA_PROCTEX5( texOffset );
418                     // Padding
419                     *command++ = 0x0;
420 
421                     return command;
422                 }
423 
424                 /* Please see man pages for details
425 
426 
427 
428 
429 
430 
431 
432 */
433                 bit32* MakeNoiseCommand( bit32* command, bool isAddProcedureTextureModeCommand = true, bool isAddDummyCommand = true ) const
434                 {
435                     if ( isAddProcedureTextureModeCommand )
436                     {
437                         command = MakeProcedureTextureModeCommand( command, isAddDummyCommand );
438                     }
439                     else if ( isAddDummyCommand )
440                     {
441                         command = MakeDummyCommand( command );
442                     }
443 
444                     // 0x0a9
445                     *command++ = PICA_CMD_DATA_PROCTEX1( Float32ToFloat16( noiseUPhase ),
446                                                          Float32ToFix16( noiseUAmplitude ) );
447                     *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEXTURE3_PROCTEX1, 0x3 );
448 
449                     // 0x0aa
450                     *command++ = PICA_CMD_DATA_PROCTEX2( Float32ToFloat16( noiseVPhase ),
451                                                          Float32ToFix16( noiseVAmplitude ) );
452                     // 0x0ab
453                     *command++ = PICA_CMD_DATA_PROCTEX3( Float32ToFloat16( noiseUFrequency ),
454                                                          Float32ToFloat16( noiseVFrequency ) );
455 
456                     return command;
457                 }
458 
459                 /* Please see man pages for details
460 
461 
462 
463 
464 
465                  */
466                 bit32* MakeTableCommand( bit32* command ) const;
467 
468 
469                 /* Please see man pages for details
470 
471 
472 
473 
474 
475                  */
MakeDummyCommand(bit32 * command)476                 static bit32* MakeDummyCommand( bit32* command )
477                 {
478                     *command++ = 0x0;
479                     *command++ = PICA_CMD_HEADER_BURST_BE( PICA_REG_TEXTURE_FUNC, 0x3, 0x0 );
480 
481                     *command++ = 0x0;
482                     *command++ = 0x0;
483 
484                     return command;
485                 }
486 
487             public :
488                 /* Please see man pages for details
489 
490                 */
ProcedureTexture()491                 ProcedureTexture() :
492                    rgbMap( PICA_DATA_PROCTEX_U_DMP ),
493                    alphaMap( PICA_DATA_PROCTEX_U_DMP ),
494                    alphaSeparate( false ),
495                    clampU( PICA_DATA_PROCTEX_CLAMP_TO_EDGE ), clampV( PICA_DATA_PROCTEX_CLAMP_TO_EDGE ),
496                    shiftU( PICA_DATA_PROCTEX_NONE_DMP ), shiftV( PICA_DATA_PROCTEX_NONE_DMP ),
497                    minFilter( PICA_DATA_PROCTEX_LINEAR ),
498                    texBias( 0.5f ), texOffset( 0 ), texWidth( 0 ),
499                    isEnableNoise( false ),
500                    noiseUAmplitude( 0.0f ), noiseVAmplitude( 0.0f ),
501                    noiseUFrequency( 0.0f ), noiseVFrequency( 0.0f ),
502                    noiseUPhase( 0.0f ), noiseVPhase( 0.0f )
503                    {
504                    }
505 
506             protected:
507                 /* Please see man pages for details
508 
509 
510 
511 
512 
513 
514 
515 */
516                 void SetLookUpDualTables_( bit32* command,
517                                            PicaDataProcTexRefTable procTexLookUpTable,
518                                            const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
519                                            const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
520                                            const u32 lookUpTableIndex = 0 );
521 
522                 /* Please see man pages for details
523 
524 
525 
526 
527 
528 */
529                 void SetColorLookUpDualTables_( const u32 colorShiftNum,
530                                                 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
531                                                 const u32 lookUpTableIndex = 0 );
532 
533                 /* Please see man pages for details
534 
535 
536 
537 
538 
539 */
540                 void SetColorLookUpTable_( const u32 colorShiftNum,
541                                            const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
542                                            const u32 lookUpTableIndex = 0 );
543 
544                 /* Please see man pages for details
545 
546 
547 
548 
549 
550 */
551                 void SetColorDiffLookUpTable_( const u32 colorShiftNum,
552                                                const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
553                                                const u32 diffLookUpTableIndex = 0 );
554 
555                 /* Please see man pages for details
556 
557 
558 
559 
560                 */
561                 void GetColorDiffLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
562                                               f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ] );
563 
564                 /* Please see man pages for details
565 
566 
567 
568 
569 
570                 */
571                 void GetDiffLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
572                                          f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
573                                          const f32 lastDiffValue = 0.0f );
574 
575             protected :
576                 //
577                 static const u32  PROCTEX_LOOKUP_TABLE_OPTION_CMD_NUM      = 4;
578 
579                 //
580                 static const u32 PROCTEX_LOOKUP_TABLE_CMD_NUM              = PROCTEX_LOOKUP_TABLE_ELEMENT_NUM  + PROCTEX_LOOKUP_TABLE_OPTION_CMD_NUM;
581 
582                 //
583                 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_OPTION_CMD_NUM = 6;
584 
585                 //
586                 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM        = PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM + PROCTEX_COLOR_LOOKUP_TABLE_OPTION_CMD_NUM;
587 
588                 /* Please see man pages for details
589 
590                 */
591                 enum ProcedureTextureColorShift
592                 {
593                     //
594                     PROCTEX_RED_COLOR_SHIFT_NUM   =  0,
595                     //
596                     PROCTEX_GREEN_COLOR_SHIFT_NUM =  8,
597                     //
598                     PROCTEX_BLUE_COLOR_SHIFT_NUM  = 16,
599                     //
600                     PROCTEX_ALPHA_COLOR_SHIFT_NUM = 24
601                 };
602 
603                 /* Please see man pages for details
604 
605 
606                 */
607                 u32 m_NoiseLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ];
608 
609                 /* Please see man pages for details
610 
611 
612                 */
613                 u32 m_RgbMapLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ];
614 
615                 /* Please see man pages for details
616 
617 
618                 */
619                 u32 m_AlphaMapLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ];
620 
621                 /* Please see man pages for details
622 
623 
624                 */
625                 u32 m_ColorLookUpTableCommand[ PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM ];
626 
627                 /* Please see man pages for details
628 
629 
630                 */
631                 u32 m_ColorDiffLookUpTableCommand[ PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM ];
632             };
633 
634         } // namespace CTR
635     } // namespace gr
636 } //namespace nn
637 
638 #endif // NN_GR_CTR_GR_PROCEDURE_TEXTURE_H_
639