1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_ProcedureTexture.cpp
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 #include <nn/gr/CTR/gr_ProcedureTexture.h>
17 
18 namespace nn
19 {
20     namespace gr
21     {
22         namespace CTR
23         {
24 
SetNoiseLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)25             void ProcedureTexture::SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
26                                                         const u32 lookUpTableIndex,
27                                                         const f32 lastDiffValue )
28             {
29                 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ];
30                 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue );
31 
32                 SetNoiseLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex );
33             }
34 
SetNoiseLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)35             void ProcedureTexture::SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
36                                                         const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
37                                                         const u32 lookUpTableIndex )
38             {
39                 SetLookUpDualTables_( m_NoiseLookUpTableCommand, PICA_DATA_PROCTEX_NOISE_REF_TABLE,
40                                       lookUpTable, diffLookUpTable, lookUpTableIndex );
41             }
42 
SetRgbMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)43             void ProcedureTexture::SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
44                                                          const u32 lookUpTableIndex,
45                                                          const f32 lastDiffValue )
46             {
47                 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ];
48                 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue );
49 
50                 SetRgbMapLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex );
51             }
52 
SetRgbMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)53             void ProcedureTexture::SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
54                                                          const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
55                                                          const u32 lookUpTableIndex )
56             {
57                 SetLookUpDualTables_( m_RgbMapLookUpTableCommand, PICA_DATA_PROCTEX_RGB_MAP_REF_TABLE,
58                                    lookUpTable, diffLookUpTable, lookUpTableIndex );
59             }
60 
SetAlphaMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)61             void ProcedureTexture::SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
62                                                            const u32 lookUpTableIndex,
63                                                            const f32 lastDiffValue )
64             {
65                 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ];
66                 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue );
67 
68                 SetAlphaMapLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex );
69             }
70 
SetAlphaMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)71              void ProcedureTexture::SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
72                                                             const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
73                                                             const u32 lookUpTableIndex )
74             {
75                 SetLookUpDualTables_( m_AlphaMapLookUpTableCommand, PICA_DATA_PROCTEX_ALPHA_MAP_REF_TABLE,
76                                    lookUpTable, diffLookUpTable, lookUpTableIndex );
77             }
78 
SetRedLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)79             void ProcedureTexture::SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
80                                                       const u32 lookUpTableIndex )
81             {
82                 SetColorLookUpDualTables_( PROCTEX_RED_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
83             }
84 
SetRedLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)85             void ProcedureTexture::SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
86                                                       const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
87                                                       const u32 lookUpTableIndex, const u32 diffLookUpTableIndex )
88             {
89                 SetColorLookUpTable_( PROCTEX_RED_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
90                 SetColorDiffLookUpTable_( PROCTEX_RED_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex );
91             }
92 
SetGreenLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)93             void ProcedureTexture::SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
94                                                         const u32 lookUpTableIndex )
95             {
96                 SetColorLookUpDualTables_( PROCTEX_GREEN_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
97             }
98 
SetGreenLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)99             void ProcedureTexture::SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
100                                                         const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
101                                                         const u32 lookUpTableIndex, const u32 diffLookUpTableIndex )
102             {
103                 SetColorLookUpTable_( PROCTEX_GREEN_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
104                 SetColorDiffLookUpTable_( PROCTEX_GREEN_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex );
105             }
106 
SetBlueLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)107             void ProcedureTexture::SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
108                                                        const u32 lookUpTableIndex )
109             {
110                 SetColorLookUpDualTables_( PROCTEX_BLUE_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
111             }
112 
SetBlueLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)113             void ProcedureTexture::SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
114                                                        const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
115                                                        const u32 lookUpTableIndex, const u32 diffLookUpTableIndex )
116             {
117                 SetColorLookUpTable_( PROCTEX_BLUE_COLOR_SHIFT_NUM, lookUpTable,  lookUpTableIndex );
118                 SetColorDiffLookUpTable_( PROCTEX_BLUE_COLOR_SHIFT_NUM, diffLookUpTable,  diffLookUpTableIndex );
119             }
120 
SetAlphaLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)121             void ProcedureTexture::SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
122                                                         const u32 lookUpTableIndex )
123             {
124                 SetColorLookUpDualTables_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
125             }
126 
SetAlphaLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)127             void ProcedureTexture::SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
128                                                         const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
129                                                         const u32 lookUpTableIndex, const u32 diffLookUpTableIndex )
130             {
131                 SetColorLookUpTable_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex );
132                 SetColorDiffLookUpTable_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex );
133             }
134 
MakeTableCommand(bit32 * command) const135             bit32* ProcedureTexture::MakeTableCommand( bit32* command ) const
136             {
137                 if ( isEnableNoise )
138                 {
139                     std::memcpy( command, m_NoiseLookUpTableCommand, sizeof( m_NoiseLookUpTableCommand ) );
140                     command += PROCTEX_LOOKUP_TABLE_CMD_NUM;
141                 }
142 
143                 std::memcpy( command, m_RgbMapLookUpTableCommand, sizeof( m_RgbMapLookUpTableCommand ) );
144                 command += PROCTEX_LOOKUP_TABLE_CMD_NUM;
145 
146                 if ( alphaSeparate )
147                 {
148                     std::memcpy( command, m_AlphaMapLookUpTableCommand, sizeof( m_AlphaMapLookUpTableCommand ) );
149                     command += PROCTEX_LOOKUP_TABLE_CMD_NUM;
150                 }
151 
152                 std::memcpy( command, m_ColorLookUpTableCommand, sizeof( m_ColorLookUpTableCommand ) );
153                 command += PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM;
154 
155                 std::memcpy( command, m_ColorDiffLookUpTableCommand, sizeof( m_ColorDiffLookUpTableCommand ) );
156                 command += PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM;
157 
158                 return command;
159             }
160 
SetLookUpDualTables_(bit32 * command,PicaDataProcTexRefTable procTexLookUpTable,const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)161             void ProcedureTexture::SetLookUpDualTables_( bit32* command, PicaDataProcTexRefTable procTexLookUpTable,
162                                                          const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
163                                                          const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
164                                                          const u32 lookUpTableIndex )
165             {
166                 *command++ = PICA_CMD_DATA_PROCTEX_LUT( lookUpTableIndex, procTexLookUpTable );
167 
168                 // 0xaf
169                 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT );
170 
171                 u32 index = 0;
172                 // [11: 0] Converts to a 12-bit fixed-point number (the decimal part is unsigned 12 bits)
173                 // [23:12] Converts to a 12-bit fixed-point number (the decimal part is signed 12 bits)
174                 *command++ = Float32ToUnsignedFix12( lookUpTable[ index ] ) |
175                              ( Float32ToFix12Fraction11( diffLookUpTable[ index ] ) << 12 );
176 
177                 *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 );
178 
179                 for ( index = 1; index < 0x80; index++ )
180                 {
181                     // [11: 0] Converts to a 12-bit fixed-point number (the decimal part is unsigned 12 bits)
182                     // [23:12] Converts to a 12-bit fixed-point number (the decimal part is signed 12 bits)
183                     *command++ = Float32ToUnsignedFix12( lookUpTable[ index ] ) |
184                                  ( Float32ToFix12Fraction11( diffLookUpTable[ index ] ) << 12 );
185                 }
186 
187                 // Padding
188                 *command++ = 0;
189             }
190 
SetColorLookUpDualTables_(const u32 colorShiftNum,const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)191             void ProcedureTexture::SetColorLookUpDualTables_( const u32 colorShiftNum,
192                                                               const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
193                                                               const u32 lookUpTableIndex )
194             {
195                 // Sets the color reference table
196                 SetColorLookUpTable_( colorShiftNum, lookUpTable, lookUpTableIndex );
197 
198                 // Sets the difference value for the color reference table.
199                 f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ];
200                 GetColorDiffLookUpTable( lookUpTable, diffLookUpTable );
201                 SetColorDiffLookUpTable_( colorShiftNum, diffLookUpTable, lookUpTableIndex );
202             }
203 
SetColorLookUpTable_(const u32 colorShiftNum,const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)204             void ProcedureTexture::SetColorLookUpTable_( const u32 colorShiftNum,
205                                                          const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
206                                                          const u32 lookUpTableIndex )
207             {
208                 bit32* command = m_ColorLookUpTableCommand;
209 
210                 *command++ = PICA_CMD_DATA_PROCTEX_LUT( lookUpTableIndex, PICA_DATA_PROCTEX_COLOR_REF_TABLE );
211                 // 0xaf
212                 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT );
213 
214                 u32 index = 0;
215                 bit32 clearMask = ~(0xff << colorShiftNum);
216                 for ( u32 burstIndex = 0; burstIndex < 2; burstIndex++ )
217                 {
218                     // Converts from float32 to unsigned int8
219                     *command   &= clearMask;
220                     *command++ |= ( FloatToUnsignedByte( lookUpTable[ index ] ) << colorShiftNum );
221                     index++;
222 
223                     // 0xb0
224                     *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 );
225 
226                     for ( u32 burstDataIndex = 0; burstDataIndex < 0x7F; burstDataIndex++ )
227                     {
228                         // Converts from float32 to unsigned int8
229                         *command   &= clearMask;
230                         *command++ |= ( FloatToUnsignedByte( lookUpTable[ index ] ) << colorShiftNum );
231                         index++;
232                     }
233 
234                     // Padding
235                     *command++ = 0;
236                 }
237             }
238 
SetColorDiffLookUpTable_(const u32 colorShiftNum,const f32 diffLookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 diffLookUpTableIndex)239             void ProcedureTexture::SetColorDiffLookUpTable_( const u32 colorShiftNum,
240                                                              const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
241                                                              const u32 diffLookUpTableIndex )
242             {
243                 bit32* command = m_ColorDiffLookUpTableCommand;
244 
245                 *command++ = PICA_CMD_DATA_PROCTEX_LUT( diffLookUpTableIndex, PICA_DATA_PROCTEX_COLOR_DIFF_REF_TABLE );
246                 // 0xaf
247                 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT );
248 
249                 u32 index = 0;
250                 bit32 clearMask = ~(0xff << colorShiftNum);
251                 for ( u32 burstIndex = 0; burstIndex < 2; burstIndex++ )
252                 {
253                     // Converts from float32 to signed fixed8 (7-bit fraction)
254                     *command   &= clearMask;
255                     *command++ |= ( ( Float32ToFix8Fraction7( diffLookUpTable[ index ] )) << colorShiftNum );
256                     index++;
257 
258                     // 0xb0
259                     *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 );
260 
261                     for ( u32 burstDataIndex = 0; burstDataIndex < 0x7F; burstDataIndex++ )
262                     {
263                         // Converts from float32 to signed fixed8 (7-bit fraction)
264                         *command   &= clearMask;
265                         *command++ |= ( Float32ToFix8Fraction7( diffLookUpTable[ index ] ) << colorShiftNum );
266 
267                         index++;
268                     }
269 
270                     // Padding
271                     *command++ = 0;
272                 }
273             }
274 
GetColorDiffLookUpTable(const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],f32 diffLookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM])275             void ProcedureTexture::GetColorDiffLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ],
276                                                             f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ] )
277             {
278                 for (u32 index = 0; index < ( PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM - 1); index++)
279                 {
280                     diffLookUpTable[ index ] = lookUpTable[ index + 1 ] - lookUpTable[ index ];
281                 }
282 
283                 // Since the last difference value in the procedural texture color reference table is not used, it is set to 0.0f.
284                 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM - 1 ] = 0.0f;
285             }
286 
GetDiffLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 lastDiffValue)287             void ProcedureTexture::GetDiffLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
288                                                        f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ],
289                                                        const f32 lastDiffValue )
290             {
291                 for (u32 index = 0; index < ( PROCTEX_LOOKUP_TABLE_ELEMENT_NUM - 1); index++)
292                 {
293                     diffLookUpTable[ index ] = lookUpTable[ index + 1 ] - lookUpTable[ index ];
294                 }
295 
296                 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM - 1 ] = lastDiffValue;
297             }
298 
299 
300         } // namespace CTR
301     } // namespace gr
302 } // namespace nn
303