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