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