1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     ut_CmdCache.cpp
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  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   $Revision: 22599 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 
18 #include <nn/assert.h>
19 #include <nw/ut/ut_Inlines.h>
20 #include <nw/ut/ut_CmdCache.h>
21 
22 namespace nw {
23 namespace ut {
24 namespace internal {
25 
26 namespace {
27 
28 #if !defined(NW_RELEASE)
29 struct PicaRegMnemonic
30 {
31     u16 address;
32     const char* mnemonic;
33 };
34 
35 const PicaRegMnemonic s_PicaRegMnemonic[] =
36 {
37     { 0x040, "PICA_REG_CULL_FACE" },
38     { 0x041, "PICA_REG_VIEWPORT_WIDTH1" },
39     { 0x042, "PICA_REG_VIEWPORT_WIDTH2" },
40     { 0x043, "PICA_REG_VIEWPORT_HEIGHT1" },
41     { 0x044, "PICA_REG_VIEWPORT_HEIGHT2" },
42     { 0x047, "PICA_REG_FRAG_OP_CLIP" },
43     { 0x048, "PICA_REG_FRAG_OP_CLIP_DATA1" },
44     { 0x049, "PICA_REG_FRAG_OP_CLIP_DATA2" },
45     { 0x04a, "PICA_REG_FRAG_OP_CLIP_DATA3" },
46     { 0x04b, "PICA_REG_FRAG_OP_CLIP_DATA4" },
47     { 0x04d, "PICA_REG_FRAG_OP_WSCALE_DATA1" },
48     { 0x04e, "PICA_REG_FRAG_OP_WSCALE_DATA2" },
49     { 0x04f, "PICA_REG_GS_OUT_REG_NUM0" },
50     { 0x04f, "PICA_REG_VS_OUT_REG_NUM0" },
51     { 0x050, "PICA_REG_GS_OUT_ATTR0" },
52     { 0x050, "PICA_REG_VS_OUT_ATTR0" },
53     { 0x051, "PICA_REG_GS_OUT_ATTR1" },
54     { 0x051, "PICA_REG_VS_OUT_ATTR1" },
55     { 0x052, "PICA_REG_GS_OUT_ATTR2" },
56     { 0x052, "PICA_REG_VS_OUT_ATTR2" },
57     { 0x053, "PICA_REG_GS_OUT_ATTR3" },
58     { 0x053, "PICA_REG_VS_OUT_ATTR3" },
59     { 0x054, "PICA_REG_GS_OUT_ATTR4" },
60     { 0x054, "PICA_REG_VS_OUT_ATTR4" },
61     { 0x055, "PICA_REG_GS_OUT_ATTR5" },
62     { 0x055, "PICA_REG_VS_OUT_ATTR5" },
63     { 0x056, "PICA_REG_GS_OUT_ATTR6" },
64     { 0x056, "PICA_REG_VS_OUT_ATTR6" },
65     { 0x061, "PICA_REG_EARLY_DEPTH_FUNC" },
66     { 0x062, "PICA_REG_EARLY_DEPTH_TEST1" },
67     { 0x064, "PICA_REG_GS_OUT_ATTR_MODE" },
68     { 0x064, "PICA_REG_VS_OUT_ATTR_MODE" },
69     { 0x065, "PICA_REG_SCISSOR" },
70     { 0x066, "PICA_REG_SCISSOR_XY" },
71     { 0x067, "PICA_REG_SCISSOR_SIZE" },
72     { 0x068, "PICA_REG_VIEWPORT_XY" },
73     { 0x06a, "PICA_REG_EARLY_DEPTH_DATA" },
74     { 0x06d, "PICA_REG_FRAG_OP_WSCALE" },
75     { 0x06e, "PICA_REG_RENDER_BUF_RESOLUTION1" },
76     { 0x06f, "PICA_REG_GS_OUT_ATTR_CLK" },
77     { 0x06f, "PICA_REG_VS_OUT_ATTR_CLK" },
78     { 0x080, "PICA_REG_TEXTURE_FUNC" },
79     { 0x081, "PICA_REG_TEXTURE0_BORDER_COLOR" },
80     { 0x082, "PICA_REG_TEXTURE0_SIZE" },
81     { 0x083, "PICA_REG_TEXTURE0_WRAP_FILTER" },
82     { 0x084, "PICA_REG_TEXTURE0_LOD" },
83     { 0x085, "PICA_REG_TEXTURE0_ADDR1" },
84     { 0x086, "PICA_REG_TEXTURE0_ADDR2" },
85     { 0x087, "PICA_REG_TEXTURE0_ADDR3" },
86     { 0x088, "PICA_REG_TEXTURE0_ADDR4" },
87     { 0x089, "PICA_REG_TEXTURE0_ADDR5" },
88     { 0x08a, "PICA_REG_TEXTURE0_ADDR6" },
89     { 0x08b, "PICA_REG_TEXTURE0_SHADOW" },
90     { 0x08e, "PICA_REG_TEXTURE0_FORMAT" },
91     { 0x08f, "PICA_REG_FRAG_LIGHT_EN0" },
92     { 0x091, "PICA_REG_TEXTURE1_BORDER_COLOR" },
93     { 0x092, "PICA_REG_TEXTURE1_SIZE" },
94     { 0x093, "PICA_REG_TEXTURE1_WRAP_FILTER" },
95     { 0x094, "PICA_REG_TEXTURE1_LOD" },
96     { 0x095, "PICA_REG_TEXTURE1_ADDR" },
97     { 0x096, "PICA_REG_TEXTURE1_FORMAT" },
98     { 0x099, "PICA_REG_TEXTURE2_BORDER_COLOR" },
99     { 0x09a, "PICA_REG_TEXTURE2_SIZE" },
100     { 0x09b, "PICA_REG_TEXTURE2_WRAP_FILTER" },
101     { 0x09c, "PICA_REG_TEXTURE2_LOD" },
102     { 0x09d, "PICA_REG_TEXTURE2_ADDR" },
103     { 0x09e, "PICA_REG_TEXTURE2_FORMAT" },
104     { 0x0a8, "PICA_REG_TEXTURE3_PROTEX0" },
105     { 0x0a9, "PICA_REG_TEXTURE3_PROTEX1" },
106     { 0x0aa, "PICA_REG_TEXTURE3_PROTEX2" },
107     { 0x0ab, "PICA_REG_TEXTURE3_PROTEX3" },
108     { 0x0ac, "PICA_REG_TEXTURE3_PROTEX4" },
109     { 0x0ad, "PICA_REG_TEXTURE3_PROTEX5" },
110     { 0x0af, "PICA_REG_PROTEX_LUT" },
111     { 0x0b0, "PICA_REG_PROTEX_LUT_DATA0" },
112     { 0x0b1, "PICA_REG_PROTEX_LUT_DATA1" },
113     { 0x0b2, "PICA_REG_PROTEX_LUT_DATA2" },
114     { 0x0b3, "PICA_REG_PROTEX_LUT_DATA3" },
115     { 0x0b4, "PICA_REG_PROTEX_LUT_DATA4" },
116     { 0x0b5, "PICA_REG_PROTEX_LUT_DATA5" },
117     { 0x0b6, "PICA_REG_PROTEX_LUT_DATA6" },
118     { 0x0b7, "PICA_REG_PROTEX_LUT_DATA7" },
119     { 0x0c0, "PICA_REG_TEX_ENV_0" },
120     { 0x0c1, "PICA_REG_TEX_ENV_0_OPERAND" },
121     { 0x0c2, "PICA_REG_TEX_ENV_0_COMBINE" },
122     { 0x0c3, "PICA_REG_TEX_ENV_0_COLOR" },
123     { 0x0c4, "PICA_REG_TEX_ENV_0_SCALE" },
124     { 0x0c8, "PICA_REG_TEX_ENV_1" },
125     { 0x0c9, "PICA_REG_TEX_ENV_1_OPERAND" },
126     { 0x0ca, "PICA_REG_TEX_ENV_1_COMBINE" },
127     { 0x0cb, "PICA_REG_TEX_ENV_1_COLOR" },
128     { 0x0cc, "PICA_REG_TEX_ENV_1_SCALE" },
129     { 0x0d0, "PICA_REG_TEX_ENV_2" },
130     { 0x0d1, "PICA_REG_TEX_ENV_2_OPERAND" },
131     { 0x0d2, "PICA_REG_TEX_ENV_2_COMBINE" },
132     { 0x0d3, "PICA_REG_TEX_ENV_2_COLOR" },
133     { 0x0d4, "PICA_REG_TEX_ENV_2_SCALE" },
134     { 0x0d8, "PICA_REG_TEX_ENV_3" },
135     { 0x0d9, "PICA_REG_TEX_ENV_3_OPERAND" },
136     { 0x0da, "PICA_REG_TEX_ENV_3_COMBINE" },
137     { 0x0db, "PICA_REG_TEX_ENV_3_COLOR" },
138     { 0x0dc, "PICA_REG_TEX_ENV_3_SCALE" },
139     { 0x0e0, "PICA_REG_GAS_FOG_MODE" },
140     { 0x0e0, "PICA_REG_TEX_ENV_BUF_INPUT" },
141     { 0x0e1, "PICA_REG_FOG_COLOR" },
142     { 0x0e4, "PICA_REG_GAS_ATTENUATION" },
143     { 0x0e5, "PICA_REG_GAS_ACCMAX" },
144     { 0x0e6, "PICA_REG_FOG_LUT_INDEX" },
145     { 0x0e8, "PICA_REG_FOG_LUT_DATA0" },
146     { 0x0e9, "PICA_REG_FOG_LUT_DATA1" },
147     { 0x0ea, "PICA_REG_FOG_LUT_DATA2" },
148     { 0x0eb, "PICA_REG_FOG_LUT_DATA3" },
149     { 0x0ec, "PICA_REG_FOG_LUT_DATA4" },
150     { 0x0ed, "PICA_REG_FOG_LUT_DATA5" },
151     { 0x0ee, "PICA_REG_FOG_LUT_DATA6" },
152     { 0x0ef, "PICA_REG_FOG_LUT_DATA7" },
153     { 0x0f0, "PICA_REG_TEX_ENV_4" },
154     { 0x0f1, "PICA_REG_TEX_ENV_4_OPERAND" },
155     { 0x0f2, "PICA_REG_TEX_ENV_4_COMBINE" },
156     { 0x0f3, "PICA_REG_TEX_ENV_4_COLOR" },
157     { 0x0f4, "PICA_REG_TEX_ENV_4_SCALE" },
158     { 0x0f8, "PICA_REG_TEX_ENV_5" },
159     { 0x0f9, "PICA_REG_TEX_ENV_5_OPERAND" },
160     { 0x0fa, "PICA_REG_TEX_ENV_5_COMBINE" },
161     { 0x0fb, "PICA_REG_TEX_ENV_5_COLOR" },
162     { 0x0fc, "PICA_REG_TEX_ENV_5_SCALE" },
163     { 0x0fd, "PICA_REG_TEX_ENV_BUF_COLOR" },
164     { 0x100, "PICA_REG_COLOR_OPERATION" },
165     { 0x101, "PICA_REG_BLEND_FUNC" },
166     { 0x102, "PICA_REG_LOGIC_OP" },
167     { 0x103, "PICA_REG_BLEND_COLOR" },
168     { 0x104, "PICA_REG_FRAG_OP_ALPHA_TEST" },
169     { 0x105, "PICA_REG_STENCIL_TEST" },
170     { 0x106, "PICA_REG_STENCIL_OP" },
171     { 0x107, "PICA_REG_DEPTH_COLOR_MASK" },
172     { 0x110, "PICA_REG_COLOR_BUFFER_CLEAR0" },
173     { 0x111, "PICA_REG_COLOR_BUFFER_CLEAR1" },
174     { 0x112, "PICA_REG_COLOR_BUFFER_READ" },
175     { 0x113, "PICA_REG_COLOR_BUFFER_WRITE" },
176     { 0x114, "PICA_REG_DEPTH_STENCIL_READ" },
177     { 0x115, "PICA_REG_DEPTH_STENCIL_WRITE" },
178     { 0x116, "PICA_REG_RENDER_BUF_DEPTH_MODE" },
179     { 0x117, "PICA_REG_RENDER_BUF_COLOR_MODE" },
180     { 0x118, "PICA_REG_EARLY_DEPTH_TEST2" },
181     { 0x11b, "PICA_REG_RENDER_BLOCK_FORMAT" },
182     { 0x11c, "PICA_REG_RENDER_BUF_DEPTH_ADDR" },
183     { 0x11d, "PICA_REG_RENDER_BUF_COLOR_ADDR" },
184     { 0x11e, "PICA_REG_RENDER_BUF_RESOLUTION0" },
185     { 0x120, "PICA_REG_GAS_LIGHT_XY" },
186     { 0x121, "PICA_REG_GAS_LIGHT_Z" },
187     { 0x122, "PICA_REG_GAS_LIGHT_Z_COLOR" },
188     { 0x123, "PICA_REG_GAS_LUT_INDEX" },
189     { 0x124, "PICA_REG_GAS_LUT_DATA" },
190     { 0x126, "PICA_REG_GAS_DELTAZ_DEPTH" },
191     { 0x130, "PICA_REG_FRAG_OP_SHADOW" },
192     { 0x140, "PICA_REG_FRAG_LIGHT0_SPECULAR0" },
193     { 0x140, "PICA_REG_FRAG_LIGHT_START" },
194     { 0x141, "PICA_REG_FRAG_LIGHT0_SPECULAR1" },
195     { 0x142, "PICA_REG_FRAG_LIGHT0_DIFFUSE" },
196     { 0x143, "PICA_REG_FRAG_LIGHT0_AMBIENT" },
197     { 0x144, "PICA_REG_FRAG_LIGHT0_POSITION_XY" },
198     { 0x145, "PICA_REG_FRAG_LIGHT0_POSITION_Z" },
199     { 0x146, "PICA_REG_FRAG_LIGHT0_SPOT_XY" },
200     { 0x147, "PICA_REG_FRAG_LIGHT0_SPOT_Z" },
201     { 0x149, "PICA_REG_FRAG_LIGHT0_TYPE" },
202     { 0x14a, "PICA_REG_FRAG_LIGHT0_DIST_ATTN_BIAS" },
203     { 0x14b, "PICA_REG_FRAG_LIGHT0_DIST_ATTN_SCALE" },
204     { 0x150, "PICA_REG_FRAG_LIGHT1_SPECULAR0" },
205     { 0x151, "PICA_REG_FRAG_LIGHT1_SPECULAR1" },
206     { 0x152, "PICA_REG_FRAG_LIGHT1_DIFFUSE" },
207     { 0x153, "PICA_REG_FRAG_LIGHT1_AMBIENT" },
208     { 0x154, "PICA_REG_FRAG_LIGHT1_POSITION_XY" },
209     { 0x155, "PICA_REG_FRAG_LIGHT1_POSITION_Z" },
210     { 0x156, "PICA_REG_FRAG_LIGHT1_SPOT_XY" },
211     { 0x157, "PICA_REG_FRAG_LIGHT1_SPOT_Z" },
212     { 0x159, "PICA_REG_FRAG_LIGHT1_TYPE" },
213     { 0x15a, "PICA_REG_FRAG_LIGHT1_DIST_ATTN_BIAS" },
214     { 0x15b, "PICA_REG_FRAG_LIGHT1_DIST_ATTN_SCALE" },
215     { 0x160, "PICA_REG_FRAG_LIGHT2_SPECULAR0" },
216     { 0x161, "PICA_REG_FRAG_LIGHT2_SPECULAR1" },
217     { 0x162, "PICA_REG_FRAG_LIGHT2_DIFFUSE" },
218     { 0x163, "PICA_REG_FRAG_LIGHT2_AMBIENT" },
219     { 0x164, "PICA_REG_FRAG_LIGHT2_POSITION_XY" },
220     { 0x165, "PICA_REG_FRAG_LIGHT2_POSITION_Z" },
221     { 0x166, "PICA_REG_FRAG_LIGHT2_SPOT_XY" },
222     { 0x167, "PICA_REG_FRAG_LIGHT2_SPOT_Z" },
223     { 0x169, "PICA_REG_FRAG_LIGHT2_TYPE" },
224     { 0x16a, "PICA_REG_FRAG_LIGHT2_DIST_ATTN_BIAS" },
225     { 0x16b, "PICA_REG_FRAG_LIGHT2_DIST_ATTN_SCALE" },
226     { 0x170, "PICA_REG_FRAG_LIGHT3_SPECULAR0" },
227     { 0x171, "PICA_REG_FRAG_LIGHT3_SPECULAR1" },
228     { 0x172, "PICA_REG_FRAG_LIGHT3_DIFFUSE" },
229     { 0x173, "PICA_REG_FRAG_LIGHT3_AMBIENT" },
230     { 0x174, "PICA_REG_FRAG_LIGHT3_POSITION_XY" },
231     { 0x175, "PICA_REG_FRAG_LIGHT3_POSITION_Z" },
232     { 0x176, "PICA_REG_FRAG_LIGHT3_SPOT_XY" },
233     { 0x177, "PICA_REG_FRAG_LIGHT3_SPOT_Z" },
234     { 0x179, "PICA_REG_FRAG_LIGHT3_TYPE" },
235     { 0x17a, "PICA_REG_FRAG_LIGHT3_DIST_ATTN_BIAS" },
236     { 0x17b, "PICA_REG_FRAG_LIGHT3_DIST_ATTN_SCALE" },
237     { 0x180, "PICA_REG_FRAG_LIGHT4_SPECULAR0" },
238     { 0x181, "PICA_REG_FRAG_LIGHT4_SPECULAR1" },
239     { 0x182, "PICA_REG_FRAG_LIGHT4_DIFFUSE" },
240     { 0x183, "PICA_REG_FRAG_LIGHT4_AMBIENT" },
241     { 0x184, "PICA_REG_FRAG_LIGHT4_POSITION_XY" },
242     { 0x185, "PICA_REG_FRAG_LIGHT4_POSITION_Z" },
243     { 0x186, "PICA_REG_FRAG_LIGHT4_SPOT_XY" },
244     { 0x187, "PICA_REG_FRAG_LIGHT4_SPOT_Z" },
245     { 0x189, "PICA_REG_FRAG_LIGHT4_TYPE" },
246     { 0x18a, "PICA_REG_FRAG_LIGHT4_DIST_ATTN_BIAS" },
247     { 0x18b, "PICA_REG_FRAG_LIGHT4_DIST_ATTN_SCALE" },
248     { 0x190, "PICA_REG_FRAG_LIGHT5_SPECULAR0" },
249     { 0x191, "PICA_REG_FRAG_LIGHT5_SPECULAR1" },
250     { 0x192, "PICA_REG_FRAG_LIGHT5_DIFFUSE" },
251     { 0x193, "PICA_REG_FRAG_LIGHT5_AMBIENT" },
252     { 0x194, "PICA_REG_FRAG_LIGHT5_POSITION_XY" },
253     { 0x195, "PICA_REG_FRAG_LIGHT5_POSITION_Z" },
254     { 0x196, "PICA_REG_FRAG_LIGHT5_SPOT_XY" },
255     { 0x197, "PICA_REG_FRAG_LIGHT5_SPOT_Z" },
256     { 0x199, "PICA_REG_FRAG_LIGHT5_TYPE" },
257     { 0x19a, "PICA_REG_FRAG_LIGHT5_DIST_ATTN_BIAS" },
258     { 0x19b, "PICA_REG_FRAG_LIGHT5_DIST_ATTN_SCALE" },
259     { 0x1a0, "PICA_REG_FRAG_LIGHT6_SPECULAR0" },
260     { 0x1a1, "PICA_REG_FRAG_LIGHT6_SPECULAR1" },
261     { 0x1a2, "PICA_REG_FRAG_LIGHT6_DIFFUSE" },
262     { 0x1a3, "PICA_REG_FRAG_LIGHT6_AMBIENT" },
263     { 0x1a4, "PICA_REG_FRAG_LIGHT6_POSITION_XY" },
264     { 0x1a5, "PICA_REG_FRAG_LIGHT6_POSITION_Z" },
265     { 0x1a6, "PICA_REG_FRAG_LIGHT6_SPOT_XY" },
266     { 0x1a7, "PICA_REG_FRAG_LIGHT6_SPOT_Z" },
267     { 0x1a9, "PICA_REG_FRAG_LIGHT6_TYPE" },
268     { 0x1aa, "PICA_REG_FRAG_LIGHT6_DIST_ATTN_BIAS" },
269     { 0x1ab, "PICA_REG_FRAG_LIGHT6_DIST_ATTN_SCALE" },
270     { 0x1b0, "PICA_REG_FRAG_LIGHT7_SPECULAR0" },
271     { 0x1b1, "PICA_REG_FRAG_LIGHT7_SPECULAR1" },
272     { 0x1b2, "PICA_REG_FRAG_LIGHT7_DIFFUSE" },
273     { 0x1b3, "PICA_REG_FRAG_LIGHT7_AMBIENT" },
274     { 0x1b4, "PICA_REG_FRAG_LIGHT7_POSITION_XY" },
275     { 0x1b5, "PICA_REG_FRAG_LIGHT7_POSITION_Z" },
276     { 0x1b6, "PICA_REG_FRAG_LIGHT7_SPOT_XY" },
277     { 0x1b7, "PICA_REG_FRAG_LIGHT7_SPOT_Z" },
278     { 0x1b9, "PICA_REG_FRAG_LIGHT7_TYPE" },
279     { 0x1ba, "PICA_REG_FRAG_LIGHT7_DIST_ATTN_BIAS" },
280     { 0x1bb, "PICA_REG_FRAG_LIGHT7_DIST_ATTN_SCALE" },
281     { 0x1c0, "PICA_REG_FRAG_LIGHT_AMBIENT" },
282     { 0x1c2, "PICA_REG_FRAG_LIGHT_SRC_NUM" },
283     { 0x1c3, "PICA_REG_FRAG_LIGHT_FUNC_MODE0" },
284     { 0x1c4, "PICA_REG_FRAG_LIGHT_FUNC_MODE1" },
285     { 0x1c5, "PICA_REG_FRAG_LIGHT_LUT" },
286     { 0x1c6, "PICA_REG_FRAG_LIGHT_EN1" },
287     { 0x1c8, "PICA_REG_FRAG_LIGHT_LUT_DATA0" },
288     { 0x1c9, "PICA_REG_FRAG_LIGHT_LUT_DATA1" },
289     { 0x1ca, "PICA_REG_FRAG_LIGHT_LUT_DATA2" },
290     { 0x1cb, "PICA_REG_FRAG_LIGHT_LUT_DATA3" },
291     { 0x1cc, "PICA_REG_FRAG_LIGHT_LUT_DATA4" },
292     { 0x1cd, "PICA_REG_FRAG_LIGHT_LUT_DATA5" },
293     { 0x1ce, "PICA_REG_FRAG_LIGHT_LUT_DATA6" },
294     { 0x1cf, "PICA_REG_FRAG_LIGHT_LUT_DATA7" },
295     { 0x1d0, "PICA_REG_FRAG_LIGHT_ABSLUTINPUT" },
296     { 0x1d1, "PICA_REG_FRAG_LIGHT_LUTINPUT" },
297     { 0x1d2, "PICA_REG_FRAG_LIGHT_LUTSCALE" },
298     { 0x1d9, "PICA_REG_FRAG_LIGHT_SRC_EN_ID" },
299     { 0x200, "PICA_REG_VTX_ATTR_ARRAYS_BASE_ADDR" },
300     { 0x201, "PICA_REG_VTX_ATTR_ARRAYS0" },
301     { 0x202, "PICA_REG_VTX_ATTR_ARRAYS1" },
302     { 0x203, "PICA_REG_LOAD_ARRAY0_ATTR_OFFSET" },
303     { 0x204, "PICA_REG_LOAD_ARRAY0_ELEMENT0" },
304     { 0x205, "PICA_REG_LOAD_ARRAY0_ELEMENT1" },
305     { 0x227, "PICA_REG_INDEX_ARRAY_ADDR_OFFSET" },
306     { 0x228, "PICA_REG_DRAW_VERTEX_NUM" },
307     { 0x229, "PICA_REG_DRAW_MODE0" },
308     { 0x22a, "PICA_REG_DRAW_VERTEX_OFFSET" },
309     { 0x22e, "PICA_REG_START_DRAW_ARRAY" },
310     { 0x22f, "PICA_REG_START_DRAW_ELEMENT" },
311     { 0x231, "PICA_REG_VTX_FUNC" },
312     { 0x232, "PICA_REG_VS_FIXED_ATTR" },
313     { 0x233, "PICA_REG_VS_FIXED_ATTR_DATA0" },
314     { 0x234, "PICA_REG_VS_FIXED_ATTR_DATA1" },
315     { 0x235, "PICA_REG_VS_FIXED_ATTR_DATA2" },
316     { 0x242, "PICA_REG_VS_ATTR_NUM1" },
317     { 0x244, "PICA_REG_VS_COM_MODE" },
318     { 0x245, "PICA_REG_START_DRAW_FUNC0" },
319     { 0x24a, "PICA_REG_VS_OUT_REG_NUM1" },
320     { 0x251, "PICA_REG_VS_OUT_REG_NUM2" },
321     { 0x252, "PICA_REG_GS_MISC_REG0" },
322     { 0x253, "PICA_REG_DRAW_MODE1" },
323     { 0x254, "PICA_REG_GS_MISC_REG1" },
324     { 0x25e, "PICA_REG_GS_OUT_REG_NUM3" },
325     { 0x25e, "PICA_REG_VS_OUT_REG_NUM3" },
326     { 0x25f, "PICA_REG_START_DRAW_FUNC1" },
327     { 0x280, "PICA_REG_GS_BOOL" },
328     { 0x281, "PICA_REG_GS_INT0" },
329     { 0x282, "PICA_REG_GS_INT1" },
330     { 0x283, "PICA_REG_GS_INT2" },
331     { 0x284, "PICA_REG_GS_INT3" },
332     { 0x289, "PICA_REG_GS_ATTR_NUM" },
333     { 0x28a, "PICA_REG_GS_START_ADDR" },
334     { 0x28b, "PICA_REG_GS_ATTR_IN_REG_MAP0" },
335     { 0x28c, "PICA_REG_GS_ATTR_IN_REG_MAP1" },
336     { 0x28d, "PICA_REG_GS_OUT_REG_MASK" },
337     { 0x28f, "PICA_REG_GS_PROG_RENEWAL_END" },
338     { 0x290, "PICA_REG_GS_FLOAT_ADDR" },
339     { 0x291, "PICA_REG_GS_FLOAT_DATA1" },
340     { 0x292, "PICA_REG_GS_FLOAT_DATA2" },
341     { 0x293, "PICA_REG_GS_FLOAT_DATA3" },
342     { 0x294, "PICA_REG_GS_FLOAT_DATA4" },
343     { 0x295, "PICA_REG_GS_FLOAT_DATA5" },
344     { 0x296, "PICA_REG_GS_FLOAT_DATA6" },
345     { 0x297, "PICA_REG_GS_FLOAT_DATA7" },
346     { 0x298, "PICA_REG_GS_FLOAT_DATA8" },
347     { 0x29b, "PICA_REG_GS_PROG_ADDR" },
348     { 0x29c, "PICA_REG_GS_PROG_DATA0" },
349     { 0x29d, "PICA_REG_GS_PROG_DATA1" },
350     { 0x29e, "PICA_REG_GS_PROG_DATA2" },
351     { 0x29f, "PICA_REG_GS_PROG_DATA3" },
352     { 0x2a0, "PICA_REG_GS_PROG_DATA4" },
353     { 0x2a1, "PICA_REG_GS_PROG_DATA5" },
354     { 0x2a2, "PICA_REG_GS_PROG_DATA6" },
355     { 0x2a3, "PICA_REG_GS_PROG_DATA7" },
356     { 0x2a5, "PICA_REG_GS_PROG_SWIZZLE_ADDR" },
357     { 0x2a6, "PICA_REG_GS_PROG_SWIZZLE_DATA0" },
358     { 0x2a7, "PICA_REG_GS_PROG_SWIZZLE_DATA1" },
359     { 0x2a8, "PICA_REG_GS_PROG_SWIZZLE_DATA2" },
360     { 0x2a9, "PICA_REG_GS_PROG_SWIZZLE_DATA3" },
361     { 0x2aa, "PICA_REG_GS_PROG_SWIZZLE_DATA4" },
362     { 0x2ab, "PICA_REG_GS_PROG_SWIZZLE_DATA5" },
363     { 0x2ac, "PICA_REG_GS_PROG_SWIZZLE_DATA6" },
364     { 0x2ad, "PICA_REG_GS_PROG_SWIZZLE_DATA7" },
365     { 0x2b0, "PICA_REG_VS_BOOL" },
366     { 0x2b1, "PICA_REG_VS_INT0" },
367     { 0x2b2, "PICA_REG_VS_INT1" },
368     { 0x2b3, "PICA_REG_VS_INT2" },
369     { 0x2b4, "PICA_REG_VS_INT3" },
370     { 0x2b9, "PICA_REG_VS_ATTR_NUM0" },
371     { 0x2ba, "PICA_REG_VS_START_ADDR" },
372     { 0x2bb, "PICA_REG_VS_ATTR_IN_REG_MAP0" },
373     { 0x2bc, "PICA_REG_VS_ATTR_IN_REG_MAP1" },
374     { 0x2bd, "PICA_REG_VS_OUT_REG_MASK" },
375     { 0x2bf, "PICA_REG_VS_PROG_RENEWAL_END" },
376     { 0x2c0, "PICA_REG_VS_FLOAT_ADDR" },
377     { 0x2c1, "PICA_REG_VS_FLOAT_DATA1" },
378     { 0x2c2, "PICA_REG_VS_FLOAT_DATA2" },
379     { 0x2c3, "PICA_REG_VS_FLOAT_DATA3" },
380     { 0x2c4, "PICA_REG_VS_FLOAT_DATA4" },
381     { 0x2c5, "PICA_REG_VS_FLOAT_DATA5" },
382     { 0x2c6, "PICA_REG_VS_FLOAT_DATA6" },
383     { 0x2c7, "PICA_REG_VS_FLOAT_DATA7" },
384     { 0x2c8, "PICA_REG_VS_FLOAT_DATA8" },
385     { 0x2cb, "PICA_REG_VS_PROG_ADDR" },
386     { 0x2cc, "PICA_REG_VS_PROG_DATA0" },
387     { 0x2cd, "PICA_REG_VS_PROG_DATA1" },
388     { 0x2ce, "PICA_REG_VS_PROG_DATA2" },
389     { 0x2cf, "PICA_REG_VS_PROG_DATA3" },
390     { 0x2d0, "PICA_REG_VS_PROG_DATA4" },
391     { 0x2d1, "PICA_REG_VS_PROG_DATA5" },
392     { 0x2d2, "PICA_REG_VS_PROG_DATA6" },
393     { 0x2d3, "PICA_REG_VS_PROG_DATA7" },
394     { 0x2d5, "PICA_REG_VS_PROG_SWIZZLE_ADDR" },
395     { 0x2d6, "PICA_REG_VS_PROG_SWIZZLE_DATA0" },
396     { 0x2d7, "PICA_REG_VS_PROG_SWIZZLE_DATA1" },
397     { 0x2d8, "PICA_REG_VS_PROG_SWIZZLE_DATA2" },
398     { 0x2d9, "PICA_REG_VS_PROG_SWIZZLE_DATA3" },
399     { 0x2da, "PICA_REG_VS_PROG_SWIZZLE_DATA4" },
400     { 0x2db, "PICA_REG_VS_PROG_SWIZZLE_DATA5" },
401     { 0x2dc, "PICA_REG_VS_PROG_SWIZZLE_DATA6" },
402     { 0x2dd, "PICA_REG_VS_PROG_SWIZZLE_DATA7" },
403 };
404 #endif
405 
406 } // namespace {anonymous}
407 
CmdCache()408 CmdCache::CmdCache()
409 :   m_CmdBuffer(NULL),
410     m_CmdBufferSize(0),
411     m_CmdMaxBufferSize(0),
412     m_IsCopy(false)
413 {
414 }
415 
416 void
Init(void * buffer,u32 size,bool isCopy)417 CmdCache::Init(
418     void*   buffer,
419     u32     size,
420     bool    isCopy
421 )
422 {
423     NW_ASSERT(ut::RoundDown(size, 8) == size);
424 
425     m_CmdBuffer = static_cast<u8*>(ut::RoundUp(buffer, 4));
426     void *const bufferEnd = AddOffsetToPtr(buffer, size);
427     m_CmdMaxBufferSize = RoundDown(GetOffsetFromPtr(m_CmdBuffer, bufferEnd), 8);
428     m_IsCopy = isCopy;
429 
430     Clear();
431 }
432 
433 void
Use() const434 CmdCache::Use() const
435 {
436 #if defined(NW_PLATFORM_CTR)
437     //nngxUseSavedCmdlist(m_CmdListID, 0, m_CmdBufferSize, m_RequestId, m_RequestSize, 0, m_IsCopy ? GL_TRUE: GL_FALSE);
438     nngxAdd3DCommand(m_CmdBuffer, m_CmdBufferSize, m_IsCopy ? GL_TRUE: GL_FALSE);
439 #endif
440     NW_GL_ASSERT();
441 }
442 
443 void
Add(const u32 * command,u32 size)444 CmdCache::Add(
445     const u32*  command,
446     u32         size
447 )
448 {
449     NW_ASSERT(m_CmdBuffer != NULL);
450     NW_ASSERT(static_cast<GLsizei>(size) + m_CmdBufferSize <= m_CmdMaxBufferSize);
451 
452     std::memcpy(m_CmdBuffer + m_CmdBufferSize,
453                  command,
454                  size);
455 
456     m_CmdBufferSize += size;
457 }
458 
459 void
RoundUp(u8 align)460 CmdCache::RoundUp(u8 align)
461 {
462     NW_ASSERT(m_CmdBuffer != NULL);
463 
464     const u32 alignedBufferSize = ut::RoundUp(m_CmdBufferSize, align);
465     NW_ASSERT(alignedBufferSize <= m_CmdMaxBufferSize);
466 
467     std::memset(m_CmdBuffer + m_CmdBufferSize, 0, alignedBufferSize - m_CmdBufferSize);
468     m_CmdBufferSize = alignedBufferSize;
469 }
470 
471 #if !defined(NW_RELEASE)
472 void
DumpCommon(const void * from,const void * to,bool asF32,bool showMnemonic)473 CmdCache::DumpCommon(
474     const void* from,
475     const void* to,
476     bool asF32,
477     bool showMnemonic )
478 {
479     int dataCount = 0;
480 
481     const u8* fromPtr = (const u8 *) from;
482     const u8* toPtr = (const u8 *) to;
483 
484     for (; fromPtr < toPtr; fromPtr += 8)
485     {
486         const u32 *const command = reinterpret_cast<const u32*>(fromPtr);
487 
488         if (showMnemonic)
489         {
490             if (dataCount <= 0)
491             {
492                 // コマンドヘッダを解析
493                 const u32 address = internal::GetBits(command[1], 0, 16);
494                 dataCount = static_cast<int>(internal::GetBits(command[1], 20, 7));
495                 const bool seq = internal::TestBit(command[1], 31);
496 
497                 u32 addressEnd = address + 1;
498                 if (seq && dataCount > 0)
499                 {
500                     addressEnd = address + dataCount + 1;
501                 }
502 
503                 const u32 num = sizeof(s_PicaRegMnemonic) / sizeof(s_PicaRegMnemonic[0]);
504                 bool shown = false;
505                 for (u32 i = 0; i < num; ++i)
506                 {
507                     if ( address <= s_PicaRegMnemonic[i].address &&
508                           s_PicaRegMnemonic[i].address < addressEnd )
509                     {
510                         shown = true;
511                         NN_LOG("// (0x%03x) %s\n",
512                                 s_PicaRegMnemonic[i].address,
513                                 s_PicaRegMnemonic[i].mnemonic);
514                     }
515                 }
516 
517                 if (! shown)
518                 {
519                         NN_LOG("// (0x%03x) ???\n", address);
520                 }
521             }
522             else
523             {
524                 dataCount -= 2;
525             }
526         }
527 
528         if (asF32)
529         {
530             NN_LOG("%f, %f,\n",
531                     math::U32AsF32(command[0]),
532                     math::U32AsF32(command[1]));
533         }
534         else
535         {
536             NN_LOG("0x%08x, 0x%08x,\n",
537                     command[0],
538                     command[1]);
539         }
540     }
541 }
542 #endif
543 
544 #if !defined(NW_RELEASE)
545 void
Dump(bool asF32,bool showMnemonic) const546 CmdCache::Dump(
547     bool    asF32,
548     bool    showMnemonic
549 ) const
550 {
551     NN_LOG("--- 0x%x %4d ---\n", m_CmdBuffer, m_CmdBufferSize);
552     DumpCommon(m_CmdBuffer, m_CmdBuffer + m_CmdBufferSize, asF32, showMnemonic);
553     NN_LOG("--- 0x%x %4d ---\n", m_CmdBuffer, m_CmdBufferSize);
554 }
555 #endif  // #if !defined(NW_RELEASE)
556 
557 #if !defined(NW_RELEASE)
558 void
Dump(const void * from,const void * to,bool asF32,bool showMnemonic)559 CmdCache::Dump(
560     const void* from,
561     const void* to,
562     bool    asF32,
563     bool    showMnemonic )
564 {
565     NN_LOG("--- from 0x%p to 0x%p ---\n", from, to);
566     DumpCommon(from, to, asF32, showMnemonic);
567     NN_LOG("--- from 0x%p to 0x%p ---\n", from, to);
568 }
569 #endif  // #if !defined(NW_RELEASE)
570 
571 }   // namespace internal
572 }   // namespace ut
573 }   // namespace nw
574