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