1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_Combiner.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: 29908 $
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