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