1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_ProcedureTexture.h
4   Copyright (C)2010 Nintendo Co., Ltd.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Rev: 33950 $
11  *---------------------------------------------------------------------------
12 
13 
14 */
15 
16 #ifndef NN_GR_PROCEDURE_TEXTURE_H_
17 #define NN_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_PROCEDURE_TEXTURE_H_
639