1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_Vertex.h
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: 47511 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_CTR_GR_VERTEX_H_
17 #define NN_GR_CTR_GR_VERTEX_H_
18 
19 #include <nn/gr/CTR/gr_Utility.h>
20 #include <nn/gr/CTR/gr_BindSymbol.h>
21 
22 namespace nn
23 {
24     namespace gr
25     {
26         namespace CTR
27         {
28 
29             /* Please see man pages for details
30 
31              */
32             class Vertex
33             {
34             public :
35                 //
36                 static const u32 VERTEX_ATTRIBUTE_MAX           = 12;
37 
38                 //
39                 static const u32 VERTEX_ATTRIBUTE_DIMENSION_MAX = 4;
40 
41                 //
42                 static const u32 VERTEX_ENABLE_COMMAND_MAX = 12 + VERTEX_ATTRIBUTE_MAX * 6;
43 
44                 /* Please see man pages for details
45 
46                 */
47                 class InterleaveInfo
48                 {
49                 public:
50                     /* Please see man pages for details
51 
52                     */
InterleaveInfo()53                     InterleaveInfo()
54                     {
55                         dataNum = 0;
56 
57                         for ( u32 index = 0; index < VERTEX_ATTRIBUTE_MAX; index++ )
58                         {
59                             // Initialize with 0x0.
60                             dataType[ index ] = PICA_DATA_SIZE_1_BYTE;
61                         }
62 
63                         for ( u32 index = 0; index < VERTEX_ATTRIBUTE_MAX; index++ )
64                         {
65                             // Initialize with NULL.
66                             symbol[ index ] = NULL;
67                         }
68                     }
69 
70                     /* Please see man pages for details
71 
72                     */
73                     u8                            dataNum;
74                     NN_PADDING3;
75 
76                     /* Please see man pages for details
77 
78 
79                     */
80                     PicaDataVertexAttrType       dataType[ VERTEX_ATTRIBUTE_MAX ];
81 
82                     /* Please see man pages for details
83 
84 
85                     */
86                     const nn::gr::CTR::BindSymbolVSInput* symbol[ VERTEX_ATTRIBUTE_MAX ];
87                 };
88 
89             public :
90                 /* Please see man pages for details
91 
92                  */
93                 class IndexStream
94                 {
95                 public :
96                     /* Please see man pages for details
97 
98                     */
IndexStream()99                     IndexStream() :
100                     physicalAddr( 0 ),
101                     drawVtxNum( 0 ),
102                     isUnsignedByte( false )
103                     {
104                     }
105 
106                     /* Please see man pages for details
107 
108                     */
109                     uptr  physicalAddr;
110 
111                     /* Please see man pages for details
112 
113                     */
114                     u32  drawVtxNum;
115 
116                     /* Please see man pages for details
117 
118                     */
119                     bool isUnsignedByte;
120                     NN_PADDING3;
121                 };
122 
123             public: // Set vertex attributes
124                 /* Please see man pages for details
125 
126 
127 
128 
129 
130                  */
131                 void EnableAttrAsArray( const nn::gr::CTR::BindSymbolVSInput& symbol, const uptr physical_addr, const PicaDataVertexAttrType type );
132 
133                 /* Please see man pages for details
134 
135 
136 
137 
138 
139 
140 
141 
142                 */
143                 void EnableAttrAsConst( const nn::gr::CTR::BindSymbolVSInput& symbol, const u8 dimension, const f32 param[] );
144 
145                 /* Please see man pages for details
146 
147 
148 
149 
150                 */
151                 void EnableInterleavedArray( const nn::gr::CTR::Vertex::InterleaveInfo& interleave_info, const uptr physical_addr );
152 
153             public : // Generate commands from settings
154                 /* Please see man pages for details
155 
156 
157 
158 
159 
160                  */
161 
MakeEnableAttrCommand(bit32 * command)162                 bit32* MakeEnableAttrCommand( bit32* command ) const
163                 {
164                     if ( m_CmdCacheVertexNum == 0 )
165                     {
166                         // Generate cache
167                         m_CmdCacheVertexNum = MakeEnableAttrCommand_( m_CmdCacheVertex ) - m_CmdCacheVertex;
168                     }
169 
170                     std::memcpy( command, m_CmdCacheVertex, m_CmdCacheVertexNum * sizeof( bit32 ) );
171                     return command + m_CmdCacheVertexNum;
172                 }
173 
174                 /* Please see man pages for details
175 
176 
177 
178 
179 
180 
181                  */
182                 bit32* MakeDrawCommand( bit32* command, const IndexStream& index_stream ) const;
183 
184                 /* Please see man pages for details
185 
186 
187 
188 
189 
190                  */
MakeDisableAttrCommand(bit32 * command)191                 bit32* MakeDisableAttrCommand( bit32* command ) const
192                 {
193                     for ( int index = 0; index < VERTEX_ATTRIBUTE_MAX; ++index )
194                     {
195                         // Generate commands to disable valid load arrays
196                         if ( m_LoadArray[ index ].IsEnable() )
197                         {
198                             // 0x203 + 3N, Generate commands to disable load array address offsets
199                             *command++ = 0;
200                             *command++ =
201                                 PICA_CMD_HEADER_BURSTSEQ( PICA_REG_LOAD_ARRAY0_ATTR_OFFSET + 3 * index, 0x3 );
202                             // 0x204 + 3N, Generate commands to disable load array 0th - 7th elements
203                             *command++ = 0;
204                             // 0x205 + 3N [15: 0] Generate commands to disable load array 8th - 11th elements
205                             //            [23:16] Generate command to disable one-vertex byte count for the load array
206                             //            [31:28] Generate command to disable the load array element count
207                             *command++ = 0;
208                         }
209                         else
210                         {
211                             *command++ = 0;
212                             // 0x205 + 3N [23:16] Generate command to disable one-vertex byte count for the load array
213                             //            [31:28] Generate command to disable the load array element count
214                             *command++ =
215                                 PICA_CMD_HEADER_SINGLE( PICA_REG_LOAD_ARRAY0_ELEMENT1 + 3 * index );
216                         }
217 
218                         // Generate commands to disable valid fixed vertex attributes
219                         if ( m_AttrConst[ index ].IsEnable() )
220                         {
221                             *command++ = index;
222                             *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_VS_FIXED_ATTR, 4 );
223                             *command++ = 0;
224                             *command++ = 0;
225                             *command++ = 0;
226                             // Padding
227                             *command++ = 0;
228                         }
229                     }
230 
231                     return command;
232                 }
233 
234                 /* Please see man pages for details
235 
236 
237 
238 
239 
240                  */
MakeDisableCommand(bit32 * command)241                 static bit32* MakeDisableCommand( bit32* command )
242                 {
243                     *command++ = 0;
244                     *command++ = PICA_CMD_HEADER_SINGLE( 0x201 );
245 
246                     *command++ = 0;
247                     *command++ = PICA_CMD_HEADER_SINGLE( 0x202 );
248 
249                     // Generate commands to disable all 0x203 + 3N, 0x204 + 3N, 0x205 + 3N (N = 0-11)
250                     const int size = ( 2 + 3 * VERTEX_ATTRIBUTE_MAX ) * sizeof( bit32 );
251                     std::memset( command, 0, size );
252                     command[ 1 ] = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_LOAD_ARRAY0_ATTR_OFFSET, VERTEX_ATTRIBUTE_MAX * 3 );
253                     command += size / sizeof( bit32 );
254 
255                     for ( int i = 0; i < VERTEX_ATTRIBUTE_MAX; ++i )
256                     {
257                         // 0x232
258                         *command++ = i;
259                         *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_VS_FIXED_ATTR, 4 );
260 
261                         // 0x233
262                         *command++ = 0;
263                         // 0x234
264                         *command++ = 0;
265 
266                         // 0x235
267                         *command++ = 0;
268                         // Padding
269                         *command++ = 0;
270                     }
271 
272                     return command;
273                 }
274 
275             public : // disable
276 
277                 /* Please see man pages for details
278 
279 
280 
281                  */
DisableAttr(const nn::gr::CTR::BindSymbolVSInput & symbol)282                 void DisableAttr( const nn::gr::CTR::BindSymbolVSInput& symbol )
283                 {
284                     DisableAttr_( symbol.start );
285                 }
286 
287                 /* Please see man pages for details
288 
289                  */
DisableAll()290                 void DisableAll()
291                 {
292                     m_CmdCacheVertexNum = 0;
293 
294                     for ( u32 index = 0; index < VERTEX_ENABLE_COMMAND_MAX; index++ )
295                     {
296                         m_CmdCacheVertex[ index ] = 0;
297                     }
298 
299                     for ( u32 index = 0; index < VERTEX_ATTRIBUTE_MAX; index++ )
300                     {
301                         m_IsEnableReg[ index ] = false;
302                         m_LoadArray[ index ].DisableAll();
303                         m_AttrConst[ index ].DisableAll();
304                     }
305                 }
306 
307             public :
308                 /* Please see man pages for details
309 
310                  */
Vertex()311                 explicit Vertex()
312                 {
313                     DisableAll();
314                 }
315 
316             protected :
317                 /* Please see man pages for details
318 
319                  */
320                 class LoadArray
321                 {
322                 public:
LoadArray()323                     LoadArray() :
324                     physicalAddr( 0 )
325                     {
326                     }
327 
328                     /* Please see man pages for details
329 
330                     */
331                     uptr physicalAddr;
332 
333                     /* Please see man pages for details
334 
335 
336                     */
337                     PicaDataVertexAttrType type[ VERTEX_ATTRIBUTE_MAX ];
338 
339                     /* Please see man pages for details
340 
341 
342 
343                     */
344                     u32 byte[ VERTEX_ATTRIBUTE_MAX ];
345 
346                     /* Please see man pages for details
347 
348 
349 
350                     */
351                     s32 bind[ VERTEX_ATTRIBUTE_MAX ];
352 
353                     /* Please see man pages for details
354 
355 
356 
357                     */
IsEnable()358                     bool IsEnable() const { return physicalAddr != 0; }
359 
360                     /* Please see man pages for details
361 
362                     */
363                     void CheckDisable();
364 
365                     /* Please see man pages for details
366 
367                     */
368                     void DisableAll();
369                 };
370 
371                 /* Please see man pages for details
372 
373                  */
374                 class AttrConst
375                 {
376                 public :
377                     /* Please see man pages for details
378 
379                     */
AttrConst()380                     AttrConst() :
381                     dimension( 0 )
382                     {
383                     }
384 
385                     /* Please see man pages for details
386 
387 
388                     */
389                     u8 dimension;
390                     NN_PADDING3;
391 
392                     /* Please see man pages for details
393 
394 
395                     */
396                     f32 param[ VERTEX_ATTRIBUTE_DIMENSION_MAX ];
397 
398                     /* Please see man pages for details
399 
400                     */
IsEnable()401                     bool IsEnable() const { return dimension != 0; }
402 
403                     /* Please see man pages for details
404 
405                     */
Disable()406                     void Disable()
407                     {
408                         dimension = 0;
409                     }
410 
411                     /* Please see man pages for details
412 
413                     */
DisableAll()414                     void DisableAll()
415                     {
416                         dimension = 0;
417 
418                         for ( u32 index = 0; index < VERTEX_ATTRIBUTE_DIMENSION_MAX; index++ )
419                         {
420                             param[ index ] = 0;
421                         }
422                     }
423                 };
424 
425             protected :
426                 /* Please see man pages for details
427 
428 
429 
430                 */
431                 void DisableAttr_( const bit32 bind_reg );
432 
433                 /* Please see man pages for details
434 
435 
436 
437 
438 
439                 */
440                 bit32* MakeEnableAttrCommand_( bit32* command ) const;
441 
442             protected :
443                 mutable u32 m_CmdCacheVertexNum;
444                 mutable bit32 m_CmdCacheVertex[ VERTEX_ENABLE_COMMAND_MAX ];
445 
446                 bool        m_IsEnableReg[ VERTEX_ATTRIBUTE_MAX ];
447 
448                 LoadArray   m_LoadArray[ VERTEX_ATTRIBUTE_MAX ];
449                 AttrConst   m_AttrConst[ VERTEX_ATTRIBUTE_MAX ];
450             };
451 
452         }  // namespace CTR
453     }  // namespace gr
454 } // namespace nn
455 
456 
457 #endif // NN_GR_CTR_GR_VERTEX_H_
458