1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_Combiner.h
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: 26256 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_COMBINER_H_
17 #define NN_GR_COMBINER_H_
18 
19 #include <nn/gr/CTR/gr_Prefix.h>
20 
21 namespace nn
22 {
23     namespace gr
24     {
25         namespace CTR
26         {
27 
28             /*!
29                 @brief コンバイナ設定のためのクラスです。
30              */
31             class Combiner
32             {
33             public :
34                 /*!
35                     @brief コンバイナのステージ設定のためのクラスです。
36                  */
37                 class Stage
38                 {
39                 public :
40                     /*!
41                         @brief コンバイン関数の入出力設定をあらわす構造体です。
42                      */
43                     struct CombineFunction
44                     {
45                         /*!
46                             @brief コンバイン関数の設定です。
47                                    型は PicaDataTexEnvCombine です。
48                                    値には PICA マクロヘッダの列挙型の名前が
49                                    PicaDataTexEnvCombine の列挙定数を使って下さい。
50                                    初期値はPICA_DATA_TEX_ENV_COMBINE_REPLACEです。
51                         */
52                         /*
53                            値は、
54                            PICA_DATA_TEX_ENV_COMBINE_REPLACE、
55                                    PICA_DATA_TEX_ENV_COMBINE_MODULATE、
56                                    PICA_DATA_TEX_ENV_COMBINE_ADD、
57                                    PICA_DATA_TEX_ENV_COMBINE_ADD_SIGNED、
58                                    PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE、
59                                    PICA_DATA_TEX_ENV_COMBINE_SUBTRACT、
60                                    PICA_DATA_TEX_ENV_COMBINE_DOT3_RGB、
61                                    PICA_DATA_TEX_ENV_COMBINE_DOT3_RGBA、
62                                    PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP、
63                                    PICA_DATA_TEX_ENV_COMBINE_ADD_MULT_DMP
64                                    のいずれかです。
65                         */
66                         PicaDataTexEnvCombine combine;
67 
68                         /*!
69                             @brief オペランドの設定です。
70                                    型は PicaDataTexEnvOperand[] です。
71                                    値にはPICAマクロヘッダの列挙型の名前が
72                                    PicaDataTexEnvOperand
73                                    の列挙定数を使って下さい。
74                                    カラーのオペランドは、デフォルトはPICA_DATA_OPE_RGB_SRC_COLORです。
75                         */
76                         /*
77                                    カラーのオペランドには、
78                                    PICA_DATA_OPE_RGB_SRC_COLOR、
79                                    PICA_DATA_OPE_RGB_ONE_MINUS_SRC_COLOR、
80                                    PICA_DATA_OPE_RGB_SRC_ALPHA、
81                                    PICA_DATA_OPE_RGB_ONE_MINUS_SRC_ALPHA、
82                                    PICA_DATA_OPE_RGB_SRC_R_DMP、
83                                    PICA_DATA_OPE_RGB_ONE_MINUS_SRC_R_DMP、
84                                    PICA_DATA_OPE_RGB_SRC_G_DMP、
85                                    PICA_DATA_OPE_RGB_ONE_MINUS_SRC_G_DMP、
86                                    PICA_DATA_OPE_RGB_SRC_B_DMP、
87                                    PICA_DATA_OPE_RGB_ONE_MINUS_SRC_B_DMP
88                                    のいずれかを設定します。
89                                    デフォルトはPICA_DATA_OPE_RGB_SRC_COLORです。
90                                    アルファのオペランドには、
91                                    PICA_DATA_OPE_ALPHA_SRC_ALPHA、
92                                    PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_ALPHA、
93                                    PICA_DATA_OPE_ALPHA_SRC_R_DMP、
94                                    PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_R_DMP、
95                                    PICA_DATA_OPE_ALPHA_SRC_G_DMP、
96                                    PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_G_DMP、
97                                    PICA_DATA_OPE_ALPHA_SRC_B_DMP、
98                                    PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_B_DMP
99                                    のいずれかを設定します。
100                                    デフォルトはPICA_DATA_OPE_ALPHA_SRC_ALPHAです。
101                         */
102                         PicaDataTexEnvOperand operand[3];
103 
104                         /*!
105                             @brief ソース0、ソース1、ソース2の設定です。
106                                    型は PicaDataTexEnvSrc です。
107                                    値にはPICAマクロヘッダの列挙型の名前が
108                                    PicaDataTexEnvSrc
109                                    の列挙定数を使って下さい。
110                                    ステージ0についての設定の場合、
111                                    デフォルトはPICA_DATA_TEX_ENV_SRC_RGBA_CONSTANTです。
112                                    ステージ0以外についての設定の場合は、デフォルトはPICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUSです。
113                         */
114                         /*
115                                    ステージ0についての設定の場合、
116                                    PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR、
117                                    PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP、
118                                    PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_SECONDARY_COLOR_DMP、
119                                    PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0、
120                                    PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1、
121                                    PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE2、
122                                    PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE3、
123                                    PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT
124                                    のいずれかを設定します。
125                                    デフォルトはPICA_DATA_TEX_ENV_SRC_RGBA_CONSTANTです。
126                                    ステージ0以外についての設定の場合は、上記に加えて、
127                                    PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS,
128                                    PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP
129                                    を設定できます。また、source[3]のうちのいずれかが、
130                                    これら2つのどちらかである必要があります。
131                                    デフォルトはPICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUSです。
132                         */
133                         PicaDataTexEnvSrc source[3];
134 
135                         /*!
136                             @brief スケールの設定です。
137                                    型は PicaDataTexEnvScale です。
138                                    値にはPICAマクロヘッダの列挙型の名前が
139                                    PicaDataTexEnvScale
140                                    の列挙定数を使って下さい。
141                                    デフォルトはPICA_DATA_TEX_ENV_SCALE_1です。
142                         */
143                         /*
144                                    値は、PICA_DATA_TEX_ENV_SCALE_1、
145                                    PICA_DATA_TEX_ENV_SCALE_2、
146                                    PICA_DATA_TEX_ENV_SCALE_4
147                                    のいずれかを設定します。
148                         */
149                         PicaDataTexEnvScale scale;
150 
151                         /*!
152                             @brief コンバイナバッファのソースの設定です。
153                                    型は nn::gr::CTR::PicaDataTexEnvBufferInput です。
154                                    値にはPICAマクロヘッダの列挙型の名前が
155                                    PicaDataTexEnvBufferInput
156                                    の列挙定数を使って下さい。
157                                    デフォルトはPICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMPです。
158                         */
159                         /*
160                                    PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP、
161                                    PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS
162                                    のいずれかを設定します。
163                         */
164                         PicaDataTexEnvBufferInput bufferInput;
165 
166                         /*!
167                             @brief コンバイン関数の設定について、初期値を設定します。
168 
169                             @param[in] stage_index コンバイン関数が使われるステージのインデックスです。
170                             @param[in] is_rgb      コンバイン関数がカラーが対象であればtrue、アルファが対象であればfalseです。
171                         */
172                         explicit CombineFunction( const u8 stage_index, bool is_rgb );
173 
174                     private :
175                         /*!
176                             @brief Stage クラスを friend に設定しています。
177                         */
178                         friend class Stage;
179 
180                         /*!
181                             @brief デフォルトコンストラクタを呼べるのは、Stageクラスのみです。
182                         */
CombineFunctionCombineFunction183                         explicit CombineFunction(){};
184                     };
185 
186                     /*!
187                         @brief カラーについてのコンバイン関数です。
188                                型は nn::gr::CTR::Combiner::Stage::CombineFunction です。
189                     */
190                     CombineFunction rgb;
191 
192                     /*!
193                         @brief アルファについてのコンバイン関数です。
194                                型は nn::gr::CTR::Combiner::Stage::CombineFunction です。
195                     */
196                     CombineFunction alpha;
197 
198                     /*!
199                         @brief コンスタントカラーの赤成分です。
200                                型は u8 です。
201                     */
202                     u8 constColorR;
203 
204                     /*!
205                         @brief コンスタントカラーの青成分です。
206                                型は u8 です。
207                     */
208                     u8 constColorG;
209 
210                     /*!
211                         @brief コンスタントカラーの緑成分です。
212                                型は u8 です。
213                     */
214                     u8 constColorB;
215 
216                     /*!
217                         @brief コンスタントカラーのアルファ成分です。
218                                型は u8 です。
219                     */
220                     u8 constColorA;
221 
222                     /*!
223                         @brief 設定するステージの先頭レジスタを設定します。
224                                型は PicaReg です。
225                     */
226                     /*
227                         値は、PICA_REG_TEX_ENV0、
228                                PICA_REG_TEX_ENV1、
229                                PICA_REG_TEX_ENV2、
230                                PICA_REG_TEX_ENV3、
231                                PICA_REG_TEX_ENV4、
232                                PICA_REG_TEX_ENV5
233                                のいずれかを設定します。
234                     */
235                     PicaReg headRegister;
236 
237                 public :
238                     /*!
239                         @brief PRIMARY_COLORで置き換える設定にします。
240                     */
241                     void SetupPrimary( void );
242 
243                     /*!
244                         @brief FRAGMENT_PRIMARY_COLORで置き換える設定にします.
245                     */
246                     void SetupFragmentPrimary( void );
247 
248                     /*!
249                         @brief TEXTURE0で置き換える設定にします。
250                     */
251                     void SetupTexture0( void );
252 
253                     /*!
254                         @brief 前ステージの色でスルーする設定にします。
255                     */
256                     void SetupPrevious( void );
257 
258                     /*!
259                         @brief PRIMARY_COLORとTEXTURE0との乗算の設定にします。
260                     */
261                     void SetupPrimaryModulateTexture0( void );
262 
263                     /*!
264                         @brief FRAGMENT_PRIMARY_COLORとTEXTURE0との乗算の設定にします。
265                     */
266                     void SetupFragmentPrimaryModulateTexture0( void );
267 
268                     /*!
269                         @brief     ステージの初期値を設定します。
270 
271                         @param[in] stage_index コンバイナステージインデックスです(値は、0 から6 です)
272                     */
273                     explicit Stage( const int stage_index );
274 
275                     /*!
276                         @brief 設定された情報をもとに、コンバイナステージの設定コマンドを生成します。
277                                コンバイナバッファについてのコマンドは含まれませんので、注意して下さい。
278 
279                         @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
280 
281                         @return            書き込まれた描画コマンドの終端の次のアドレスを返します。
282                         @see               Combiner::MakeCombinerBufferCommand()
283                     */
284                     u32* MakeCommand( u32* command ) const;
285 
286 
287                 private :
288                     /*!
289                         @brief デフォルトコンストラクタを呼べるのは、Combinerクラスのみです。
290                     */
291                     friend class Combiner;
292 
293                     /*!
294                         @brief デフォルトコンストラクタを呼べるのは、Combinerクラスのみです。
295                     */
Stage(void)296                     explicit Stage( void )
297                     {
298                     };
299                 };
300 
301             public :
302                 enum
303                 {
304                     //! コンバイナは 6 つのステージから構成されます。
305                     COMBINER_STAGE_MAX = 6
306                 };
307 
308                 /*!
309                     @brief 各ステージのコンバイナ設定を保持します。
310                            型は nn::gr::CTR::Combiner::Stage です。
311                 */
312                 Stage stage[ COMBINER_STAGE_MAX ];
313 
314             public :
315                 /*!
316                     @brief 先頭ステージのコンバイナバッファの出力の赤成分です。
317                            型は u8 です。
318                 */
319                 u8 bufferColorR;
320 
321                 /*!
322                      @brief 先頭ステージのコンバイナバッファの出力の緑成分です。
323                             型は u8 です。
324                  */
325                 u8 bufferColorG;
326 
327                 /*!
328                      @brief 先頭ステージのコンバイナバッファの出力の青成分です。
329                             型は u8 です。
330                  */
331                 u8 bufferColorB;
332 
333                 /*!
334                      @brief 先頭ステージのコンバイナバッファの出力のアルファ成分です。
335                             型は u8 です。
336                  */
337                 u8 bufferColorA;
338 
339                 /*!
340                      @brief 各ステージの初期値を設定します。
341                  */
342                 explicit Combiner();
343 
344                 /*!
345                     @brief 設定された情報をもとに、すべてのコンバイナステージの設定コマンドを生成します。
346                            コンバイナバッファのコマンドも同時に生成されます。
347 
348                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
349 
350                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
351 
352                     @see       MakeBufferInputCommand()
353                 */
354                 u32* MakeCommand( u32* command ) const;
355 
356 
357                 /*!
358                     @brief 設定された情報をもとに、コンバイナバッファの設定コマンドを生成します。
359 
360                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
361 
362                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
363                  */
364                 u32* MakeCombinerBufferCommand( u32* command ) const;
365             };
366 
367         } // namespace CTR
368     } // namespace gr
369 } // namespace nn
370 
371 #endif // NN_GR_COMBINER_H_
372