1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gr_Combiner.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_Combiner.h> 17 18 namespace nn 19 { 20 namespace gr 21 { 22 namespace CTR 23 { 24 MakeCommand(bit32 * command) const25 bit32* Combiner::MakeCommand( bit32* command ) const 26 { 27 for ( int stage_index = 0; stage_index < COMBINER_STAGE_MAX; ++ stage_index ) 28 { 29 command = stage[ stage_index ].MakeCommand( command ); 30 } 31 32 return MakeCombinerBufferCommand( command ); 33 } 34 35 //------------------------------------------------------------------------------ 36 MakeCombinerBufferCommand(bit32 * command) const37 bit32* Combiner::MakeCombinerBufferCommand( bit32* command ) const 38 { 39 // 0x0e0 40 *command++ =PICA_CMD_SET_TEX_ENV_BUFFER_INPUT( 41 stage[ 1 ].rgb.bufferInput, stage[ 1 ].alpha.bufferInput, 42 stage[ 2 ].rgb.bufferInput, stage[ 2 ].alpha.bufferInput, 43 stage[ 3 ].rgb.bufferInput, stage[ 3 ].alpha.bufferInput, 44 stage[ 4 ].rgb.bufferInput, stage[ 4 ].alpha.bufferInput ); 45 *command++ = PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEX_ENV_BUFFER_INPUT, 0x2 ); 46 47 // 0x0fd 48 *command++ = bufferColorR | bufferColorG << 8 | bufferColorB << 16 | bufferColorA << 24; 49 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ); 50 return command; 51 } 52 53 //------------------------------------------------------------------------------ 54 MakeCommand(bit32 * command) const55 bit32* Combiner::Stage::MakeCommand( bit32* command ) const 56 { 57 NN_GR_ASSERT( PICA_REG_TEX_ENV0 <= headRegister && 58 PICA_REG_TEX_ENV5 >= headRegister ); 59 60 *command++ = PICA_CMD_DATA_TEX_ENV_SRC( 61 rgb.source[0], rgb.source[1], rgb.source[2], 62 alpha.source[0], alpha.source[1], alpha.source[2] ); 63 64 *command++ = PICA_CMD_HEADER_BURSTSEQ( 65 headRegister, 66 5 ); 67 68 *command++ = PICA_CMD_DATA_TEX_ENV_OPERAND( 69 rgb.operand[0], rgb.operand[1], rgb.operand[2], 70 alpha.operand[0], alpha.operand[1], alpha.operand[2] ); 71 72 *command++ = PICA_CMD_DATA_TEX_ENV_COMBINE( 73 rgb.combine, 74 alpha.combine ); 75 76 *command++ = PICA_CMD_DATA_TEX_ENV_CONST( 77 constColorR, constColorG, constColorB, 78 constColorA ); 79 80 *command++ = PICA_CMD_DATA_TEX_ENV_SCALE( 81 rgb.scale, 82 alpha.scale ); 83 84 return command; 85 } 86 87 //------------------------------------------------------------------------------ 88 SetupPrimary()89 void Combiner::Stage::SetupPrimary() 90 { 91 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 92 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 93 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 94 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 95 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 96 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 97 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 98 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 99 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 100 101 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 102 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 103 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 104 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 105 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 106 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 107 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 108 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 109 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 110 } 111 112 //------------------------------------------------------------------------------ 113 SetupFragmentPrimary()114 void Combiner::Stage::SetupFragmentPrimary() 115 { 116 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 117 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 118 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 119 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 120 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 121 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 122 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 123 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 124 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 125 126 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 127 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 128 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 129 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 130 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 131 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 132 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 133 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 134 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 135 } 136 SetupTexture0()137 void Combiner::Stage::SetupTexture0() 138 { 139 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 140 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 141 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 142 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 143 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 144 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 145 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 146 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 147 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 148 149 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 150 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 151 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 152 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 153 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 154 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 155 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 156 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 157 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 158 } 159 160 //------------------------------------------------------------------------------ 161 SetupPrevious()162 void Combiner::Stage::SetupPrevious() 163 { 164 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 165 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 166 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 167 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 168 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 169 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 170 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 171 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 172 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 173 174 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_REPLACE; 175 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 176 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 177 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 178 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 179 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 180 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 181 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 182 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 183 } 184 185 //------------------------------------------------------------------------------ 186 SetupPrimaryModulateTexture0()187 void Combiner::Stage::SetupPrimaryModulateTexture0() 188 { 189 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_MODULATE; 190 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 191 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 192 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 193 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 194 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 195 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 196 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 197 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 198 199 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_MODULATE; 200 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 201 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 202 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 203 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR; 204 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 205 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 206 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 207 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 208 } 209 210 //------------------------------------------------------------------------------ 211 SetupFragmentPrimaryModulateTexture0()212 void Combiner::Stage::SetupFragmentPrimaryModulateTexture0() 213 { 214 rgb.combine = PICA_DATA_TEX_ENV_COMBINE_MODULATE; 215 rgb.operand[0] = PICA_DATA_OPE_RGB_SRC_COLOR; 216 rgb.operand[1] = PICA_DATA_OPE_RGB_SRC_COLOR; 217 rgb.operand[2] = PICA_DATA_OPE_RGB_SRC_COLOR; 218 rgb.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 219 rgb.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 220 rgb.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 221 rgb.scale = PICA_DATA_TEX_ENV_SCALE_1; 222 rgb.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 223 224 alpha.combine = PICA_DATA_TEX_ENV_COMBINE_MODULATE; 225 alpha.operand[0] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 226 alpha.operand[1] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 227 alpha.operand[2] = PICA_DATA_OPE_ALPHA_SRC_ALPHA; 228 alpha.source[0] = PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP; 229 alpha.source[1] = PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0; 230 alpha.source[2] = PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 231 alpha.scale = PICA_DATA_TEX_ENV_SCALE_1; 232 alpha.bufferInput = PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP; 233 } 234 235 //------------------------------------------------------------------------------ 236 Combiner()237 Combiner::Combiner() 238 : bufferColorR( 0 ), 239 bufferColorG( 0 ), 240 bufferColorB( 0 ), 241 bufferColorA( 0 ) 242 { 243 for ( int stage_index = 0; stage_index < COMBINER_STAGE_MAX; ++stage_index ) 244 { 245 stage[ stage_index ] = Stage( stage_index ); 246 } 247 } 248 249 //------------------------------------------------------------------------------ 250 Stage(const int stage_index)251 Combiner::Stage::Stage( const int stage_index ) 252 : rgb ( stage_index, true ), 253 alpha( stage_index, false ), 254 constColorR( 0 ), 255 constColorG( 0 ), 256 constColorB( 0 ), 257 constColorA( 0 ) 258 { 259 switch( stage_index ) 260 { 261 case 0 : headRegister = PICA_REG_TEX_ENV0; break; 262 case 1 : headRegister = PICA_REG_TEX_ENV1; break; 263 case 2 : headRegister = PICA_REG_TEX_ENV2; break; 264 case 3 : headRegister = PICA_REG_TEX_ENV3; break; 265 case 4 : headRegister = PICA_REG_TEX_ENV4; break; 266 case 5 : headRegister = PICA_REG_TEX_ENV5; break; 267 } 268 } 269 //------------------------------------------------------------------------------ 270 CombineFunction(const u8 stage_index,bool is_rgb)271 Combiner::Stage::CombineFunction::CombineFunction( const u8 stage_index, bool is_rgb ) 272 : combine( PICA_DATA_TEX_ENV_COMBINE_REPLACE ), 273 scale( PICA_DATA_TEX_ENV_SCALE_1 ), 274 bufferInput( PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP ) 275 { 276 operand[ 0 ] = operand[ 1 ] = operand[ 2 ] = 277 ( is_rgb ) 278 ? PICA_DATA_OPE_RGB_SRC_COLOR 279 : PICA_DATA_OPE_ALPHA_SRC_ALPHA; 280 281 source[ 0 ] = source[ 1 ] = source[ 2 ] = 282 ( stage_index == 0 ) 283 ? PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT 284 : PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS; 285 } 286 287 } // namespace CTR 288 } // namespace gr 289 } // namespace nn 290