/ src / video_core / pica / regs_internal.cpp
regs_internal.cpp
  1  // Copyright 2015 Citra Emulator Project
  2  // Licensed under GPLv2 or any later version
  3  // Refer to the license.txt file included.
  4  
  5  #include <algorithm>
  6  #include <iterator>
  7  #include <utility>
  8  
  9  #include "common/common_types.h"
 10  #include "video_core/pica/regs_internal.h"
 11  
 12  namespace Pica {
 13  
 14  static constexpr std::pair<u16, const char*> register_names[] = {
 15      {0x010, "GPUREG_FINALIZE"},
 16  
 17      {0x040, "GPUREG_FACECULLING_CONFIG"},
 18      {0x041, "GPUREG_VIEWPORT_WIDTH"},
 19      {0x042, "GPUREG_VIEWPORT_INVW"},
 20      {0x043, "GPUREG_VIEWPORT_HEIGHT"},
 21      {0x044, "GPUREG_VIEWPORT_INVH"},
 22  
 23      {0x047, "GPUREG_FRAGOP_CLIP"},
 24      {0x048, "GPUREG_FRAGOP_CLIP_DATA0"},
 25      {0x049, "GPUREG_FRAGOP_CLIP_DATA1"},
 26      {0x04A, "GPUREG_FRAGOP_CLIP_DATA2"},
 27      {0x04B, "GPUREG_FRAGOP_CLIP_DATA3"},
 28  
 29      {0x04D, "GPUREG_DEPTHMAP_SCALE"},
 30      {0x04E, "GPUREG_DEPTHMAP_OFFSET"},
 31      {0x04F, "GPUREG_SH_OUTMAP_TOTAL"},
 32      {0x050, "GPUREG_SH_OUTMAP_O0"},
 33      {0x051, "GPUREG_SH_OUTMAP_O1"},
 34      {0x052, "GPUREG_SH_OUTMAP_O2"},
 35      {0x053, "GPUREG_SH_OUTMAP_O3"},
 36      {0x054, "GPUREG_SH_OUTMAP_O4"},
 37      {0x055, "GPUREG_SH_OUTMAP_O5"},
 38      {0x056, "GPUREG_SH_OUTMAP_O6"},
 39  
 40      {0x061, "GPUREG_EARLYDEPTH_FUNC"},
 41      {0x062, "GPUREG_EARLYDEPTH_TEST1"},
 42      {0x063, "GPUREG_EARLYDEPTH_CLEAR"},
 43      {0x064, "GPUREG_SH_OUTATTR_MODE"},
 44      {0x065, "GPUREG_SCISSORTEST_MODE"},
 45      {0x066, "GPUREG_SCISSORTEST_POS"},
 46      {0x067, "GPUREG_SCISSORTEST_DIM"},
 47      {0x068, "GPUREG_VIEWPORT_XY"},
 48  
 49      {0x06A, "GPUREG_EARLYDEPTH_DATA"},
 50  
 51      {0x06D, "GPUREG_DEPTHMAP_ENABLE"},
 52      {0x06E, "GPUREG_RENDERBUF_DIM"},
 53      {0x06F, "GPUREG_SH_OUTATTR_CLOCK"},
 54  
 55      {0x080, "GPUREG_TEXUNIT_CONFIG"},
 56      {0x081, "GPUREG_TEXUNIT0_BORDER_COLOR"},
 57      {0x082, "GPUREG_TEXUNIT0_DIM"},
 58      {0x083, "GPUREG_TEXUNIT0_PARAM"},
 59      {0x084, "GPUREG_TEXUNIT0_LOD"},
 60      {0x085, "GPUREG_TEXUNIT0_ADDR1"},
 61      {0x086, "GPUREG_TEXUNIT0_ADDR2"},
 62      {0x087, "GPUREG_TEXUNIT0_ADDR3"},
 63      {0x088, "GPUREG_TEXUNIT0_ADDR4"},
 64      {0x089, "GPUREG_TEXUNIT0_ADDR5"},
 65      {0x08A, "GPUREG_TEXUNIT0_ADDR6"},
 66      {0x08B, "GPUREG_TEXUNIT0_SHADOW"},
 67  
 68      {0x08E, "GPUREG_TEXUNIT0_TYPE"},
 69      {0x08F, "GPUREG_LIGHTING_ENABLE0"},
 70  
 71      {0x091, "GPUREG_TEXUNIT1_BORDER_COLOR"},
 72      {0x092, "GPUREG_TEXUNIT1_DIM"},
 73      {0x093, "GPUREG_TEXUNIT1_PARAM"},
 74      {0x094, "GPUREG_TEXUNIT1_LOD"},
 75      {0x095, "GPUREG_TEXUNIT1_ADDR"},
 76      {0x096, "GPUREG_TEXUNIT1_TYPE"},
 77  
 78      {0x099, "GPUREG_TEXUNIT2_BORDER_COLOR"},
 79      {0x09A, "GPUREG_TEXUNIT2_DIM"},
 80      {0x09B, "GPUREG_TEXUNIT2_PARAM"},
 81      {0x09C, "GPUREG_TEXUNIT2_LOD"},
 82      {0x09D, "GPUREG_TEXUNIT2_ADDR"},
 83      {0x09E, "GPUREG_TEXUNIT2_TYPE"},
 84  
 85      {0x0A8, "GPUREG_TEXUNIT3_PROCTEX0"},
 86      {0x0A9, "GPUREG_TEXUNIT3_PROCTEX1"},
 87      {0x0AA, "GPUREG_TEXUNIT3_PROCTEX2"},
 88      {0x0AB, "GPUREG_TEXUNIT3_PROCTEX3"},
 89      {0x0AC, "GPUREG_TEXUNIT3_PROCTEX4"},
 90      {0x0AD, "GPUREG_TEXUNIT3_PROCTEX5"},
 91  
 92      {0x0AF, "GPUREG_PROCTEX_LUT"},
 93      {0x0B0, "GPUREG_PROCTEX_LUT_DATA0"},
 94      {0x0B1, "GPUREG_PROCTEX_LUT_DATA1"},
 95      {0x0B2, "GPUREG_PROCTEX_LUT_DATA2"},
 96      {0x0B3, "GPUREG_PROCTEX_LUT_DATA3"},
 97      {0x0B4, "GPUREG_PROCTEX_LUT_DATA4"},
 98      {0x0B5, "GPUREG_PROCTEX_LUT_DATA5"},
 99      {0x0B6, "GPUREG_PROCTEX_LUT_DATA6"},
100      {0x0B7, "GPUREG_PROCTEX_LUT_DATA7"},
101  
102      {0x0C0, "GPUREG_TEXENV0_SOURCE"},
103      {0x0C1, "GPUREG_TEXENV0_OPERAND"},
104      {0x0C2, "GPUREG_TEXENV0_COMBINER"},
105      {0x0C3, "GPUREG_TEXENV0_COLOR"},
106      {0x0C4, "GPUREG_TEXENV0_SCALE"},
107  
108      {0x0C8, "GPUREG_TEXENV1_SOURCE"},
109      {0x0C9, "GPUREG_TEXENV1_OPERAND"},
110      {0x0CA, "GPUREG_TEXENV1_COMBINER"},
111      {0x0CB, "GPUREG_TEXENV1_COLOR"},
112      {0x0CC, "GPUREG_TEXENV1_SCALE"},
113  
114      {0x0D0, "GPUREG_TEXENV2_SOURCE"},
115      {0x0D1, "GPUREG_TEXENV2_OPERAND"},
116      {0x0D2, "GPUREG_TEXENV2_COMBINER"},
117      {0x0D3, "GPUREG_TEXENV2_COLOR"},
118      {0x0D4, "GPUREG_TEXENV2_SCALE"},
119  
120      {0x0D8, "GPUREG_TEXENV3_SOURCE"},
121      {0x0D9, "GPUREG_TEXENV3_OPERAND"},
122      {0x0DA, "GPUREG_TEXENV3_COMBINER"},
123      {0x0DB, "GPUREG_TEXENV3_COLOR"},
124      {0x0DC, "GPUREG_TEXENV3_SCALE"},
125  
126      {0x0E0, "GPUREG_TEXENV_UPDATE_BUFFER"},
127      {0x0E1, "GPUREG_FOG_COLOR"},
128  
129      {0x0E4, "GPUREG_GAS_ATTENUATION"},
130      {0x0E5, "GPUREG_GAS_ACCMAX"},
131      {0x0E6, "GPUREG_FOG_LUT_INDEX"},
132  
133      {0x0E8, "GPUREG_FOG_LUT_DATA0"},
134      {0x0E9, "GPUREG_FOG_LUT_DATA1"},
135      {0x0EA, "GPUREG_FOG_LUT_DATA2"},
136      {0x0EB, "GPUREG_FOG_LUT_DATA3"},
137      {0x0EC, "GPUREG_FOG_LUT_DATA4"},
138      {0x0ED, "GPUREG_FOG_LUT_DATA5"},
139      {0x0EE, "GPUREG_FOG_LUT_DATA6"},
140      {0x0EF, "GPUREG_FOG_LUT_DATA7"},
141      {0x0F0, "GPUREG_TEXENV4_SOURCE"},
142      {0x0F1, "GPUREG_TEXENV4_OPERAND"},
143      {0x0F2, "GPUREG_TEXENV4_COMBINER"},
144      {0x0F3, "GPUREG_TEXENV4_COLOR"},
145      {0x0F4, "GPUREG_TEXENV4_SCALE"},
146  
147      {0x0F8, "GPUREG_TEXENV5_SOURCE"},
148      {0x0F9, "GPUREG_TEXENV5_OPERAND"},
149      {0x0FA, "GPUREG_TEXENV5_COMBINER"},
150      {0x0FB, "GPUREG_TEXENV5_COLOR"},
151      {0x0FC, "GPUREG_TEXENV5_SCALE"},
152      {0x0FD, "GPUREG_TEXENV_BUFFER_COLOR"},
153  
154      {0x100, "GPUREG_COLOR_OPERATION"},
155      {0x101, "GPUREG_BLEND_FUNC"},
156      {0x102, "GPUREG_LOGIC_OP"},
157      {0x103, "GPUREG_BLEND_COLOR"},
158      {0x104, "GPUREG_FRAGOP_ALPHA_TEST"},
159      {0x105, "GPUREG_STENCIL_TEST"},
160      {0x106, "GPUREG_STENCIL_OP"},
161      {0x107, "GPUREG_DEPTH_COLOR_MASK"},
162  
163      {0x110, "GPUREG_FRAMEBUFFER_INVALIDATE"},
164      {0x111, "GPUREG_FRAMEBUFFER_FLUSH"},
165      {0x112, "GPUREG_COLORBUFFER_READ"},
166      {0x113, "GPUREG_COLORBUFFER_WRITE"},
167      {0x114, "GPUREG_DEPTHBUFFER_READ"},
168      {0x115, "GPUREG_DEPTHBUFFER_WRITE"},
169      {0x116, "GPUREG_DEPTHBUFFER_FORMAT"},
170      {0x117, "GPUREG_COLORBUFFER_FORMAT"},
171      {0x118, "GPUREG_EARLYDEPTH_TEST2"},
172  
173      {0x11B, "GPUREG_FRAMEBUFFER_BLOCK32"},
174      {0x11C, "GPUREG_DEPTHBUFFER_LOC"},
175      {0x11D, "GPUREG_COLORBUFFER_LOC"},
176      {0x11E, "GPUREG_FRAMEBUFFER_DIM"},
177  
178      {0x120, "GPUREG_GAS_LIGHT_XY"},
179      {0x121, "GPUREG_GAS_LIGHT_Z"},
180      {0x122, "GPUREG_GAS_LIGHT_Z_COLOR"},
181      {0x123, "GPUREG_GAS_LUT_INDEX"},
182      {0x124, "GPUREG_GAS_LUT_DATA"},
183  
184      {0x126, "GPUREG_GAS_DELTAZ_DEPTH"},
185  
186      {0x130, "GPUREG_FRAGOP_SHADOW"},
187  
188      {0x140, "GPUREG_LIGHT0_SPECULAR0"},
189      {0x141, "GPUREG_LIGHT0_SPECULAR1"},
190      {0x142, "GPUREG_LIGHT0_DIFFUSE"},
191      {0x143, "GPUREG_LIGHT0_AMBIENT"},
192      {0x144, "GPUREG_LIGHT0_XY"},
193      {0x145, "GPUREG_LIGHT0_Z"},
194      {0x146, "GPUREG_LIGHT0_SPOTDIR_XY"},
195      {0x147, "GPUREG_LIGHT0_SPOTDIR_Z"},
196  
197      {0x149, "GPUREG_LIGHT0_CONFIG"},
198      {0x14A, "GPUREG_LIGHT0_ATTENUATION_BIAS"},
199      {0x14B, "GPUREG_LIGHT0_ATTENUATION_SCALE"},
200  
201      {0x150, "GPUREG_LIGHT1_SPECULAR0"},
202      {0x151, "GPUREG_LIGHT1_SPECULAR1"},
203      {0x152, "GPUREG_LIGHT1_DIFFUSE"},
204      {0x153, "GPUREG_LIGHT1_AMBIENT"},
205      {0x154, "GPUREG_LIGHT1_XY"},
206      {0x155, "GPUREG_LIGHT1_Z"},
207      {0x156, "GPUREG_LIGHT1_SPOTDIR_XY"},
208      {0x157, "GPUREG_LIGHT1_SPOTDIR_Z"},
209  
210      {0x159, "GPUREG_LIGHT1_CONFIG"},
211      {0x15A, "GPUREG_LIGHT1_ATTENUATION_BIAS"},
212      {0x15B, "GPUREG_LIGHT1_ATTENUATION_SCALE"},
213  
214      {0x160, "GPUREG_LIGHT2_SPECULAR0"},
215      {0x161, "GPUREG_LIGHT2_SPECULAR1"},
216      {0x162, "GPUREG_LIGHT2_DIFFUSE"},
217      {0x163, "GPUREG_LIGHT2_AMBIENT"},
218      {0x164, "GPUREG_LIGHT2_XY"},
219      {0x165, "GPUREG_LIGHT2_Z"},
220      {0x166, "GPUREG_LIGHT2_SPOTDIR_XY"},
221      {0x167, "GPUREG_LIGHT2_SPOTDIR_Z"},
222  
223      {0x169, "GPUREG_LIGHT2_CONFIG"},
224      {0x16A, "GPUREG_LIGHT2_ATTENUATION_BIAS"},
225      {0x16B, "GPUREG_LIGHT2_ATTENUATION_SCALE"},
226  
227      {0x170, "GPUREG_LIGHT3_SPECULAR0"},
228      {0x171, "GPUREG_LIGHT3_SPECULAR1"},
229      {0x172, "GPUREG_LIGHT3_DIFFUSE"},
230      {0x173, "GPUREG_LIGHT3_AMBIENT"},
231      {0x174, "GPUREG_LIGHT3_XY"},
232      {0x175, "GPUREG_LIGHT3_Z"},
233      {0x176, "GPUREG_LIGHT3_SPOTDIR_XY"},
234      {0x177, "GPUREG_LIGHT3_SPOTDIR_Z"},
235  
236      {0x179, "GPUREG_LIGHT3_CONFIG"},
237      {0x17A, "GPUREG_LIGHT3_ATTENUATION_BIAS"},
238      {0x17B, "GPUREG_LIGHT3_ATTENUATION_SCALE"},
239  
240      {0x180, "GPUREG_LIGHT4_SPECULAR0"},
241      {0x181, "GPUREG_LIGHT4_SPECULAR1"},
242      {0x182, "GPUREG_LIGHT4_DIFFUSE"},
243      {0x183, "GPUREG_LIGHT4_AMBIENT"},
244      {0x184, "GPUREG_LIGHT4_XY"},
245      {0x185, "GPUREG_LIGHT4_Z"},
246      {0x186, "GPUREG_LIGHT4_SPOTDIR_XY"},
247      {0x187, "GPUREG_LIGHT4_SPOTDIR_Z"},
248  
249      {0x189, "GPUREG_LIGHT4_CONFIG"},
250      {0x18A, "GPUREG_LIGHT4_ATTENUATION_BIAS"},
251      {0x18B, "GPUREG_LIGHT4_ATTENUATION_SCALE"},
252  
253      {0x190, "GPUREG_LIGHT5_SPECULAR0"},
254      {0x191, "GPUREG_LIGHT5_SPECULAR1"},
255      {0x192, "GPUREG_LIGHT5_DIFFUSE"},
256      {0x193, "GPUREG_LIGHT5_AMBIENT"},
257      {0x194, "GPUREG_LIGHT5_XY"},
258      {0x195, "GPUREG_LIGHT5_Z"},
259      {0x196, "GPUREG_LIGHT5_SPOTDIR_XY"},
260      {0x197, "GPUREG_LIGHT5_SPOTDIR_Z"},
261  
262      {0x199, "GPUREG_LIGHT5_CONFIG"},
263      {0x19A, "GPUREG_LIGHT5_ATTENUATION_BIAS"},
264      {0x19B, "GPUREG_LIGHT5_ATTENUATION_SCALE"},
265  
266      {0x1A0, "GPUREG_LIGHT6_SPECULAR0"},
267      {0x1A1, "GPUREG_LIGHT6_SPECULAR1"},
268      {0x1A2, "GPUREG_LIGHT6_DIFFUSE"},
269      {0x1A3, "GPUREG_LIGHT6_AMBIENT"},
270      {0x1A4, "GPUREG_LIGHT6_XY"},
271      {0x1A5, "GPUREG_LIGHT6_Z"},
272      {0x1A6, "GPUREG_LIGHT6_SPOTDIR_XY"},
273      {0x1A7, "GPUREG_LIGHT6_SPOTDIR_Z"},
274  
275      {0x1A9, "GPUREG_LIGHT6_CONFIG"},
276      {0x1AA, "GPUREG_LIGHT6_ATTENUATION_BIAS"},
277      {0x1AB, "GPUREG_LIGHT6_ATTENUATION_SCALE"},
278  
279      {0x1B0, "GPUREG_LIGHT7_SPECULAR0"},
280      {0x1B1, "GPUREG_LIGHT7_SPECULAR1"},
281      {0x1B2, "GPUREG_LIGHT7_DIFFUSE"},
282      {0x1B3, "GPUREG_LIGHT7_AMBIENT"},
283      {0x1B4, "GPUREG_LIGHT7_XY"},
284      {0x1B5, "GPUREG_LIGHT7_Z"},
285      {0x1B6, "GPUREG_LIGHT7_SPOTDIR_XY"},
286      {0x1B7, "GPUREG_LIGHT7_SPOTDIR_Z"},
287  
288      {0x1B9, "GPUREG_LIGHT7_CONFIG"},
289      {0x1BA, "GPUREG_LIGHT7_ATTENUATION_BIAS"},
290      {0x1BB, "GPUREG_LIGHT7_ATTENUATION_SCALE"},
291  
292      {0x1C0, "GPUREG_LIGHTING_AMBIENT"},
293  
294      {0x1C2, "GPUREG_LIGHTING_NUM_LIGHTS"},
295      {0x1C3, "GPUREG_LIGHTING_CONFIG0"},
296      {0x1C4, "GPUREG_LIGHTING_CONFIG1"},
297      {0x1C5, "GPUREG_LIGHTING_LUT_INDEX"},
298      {0x1C6, "GPUREG_LIGHTING_ENABLE1"},
299  
300      {0x1C8, "GPUREG_LIGHTING_LUT_DATA0"},
301      {0x1C9, "GPUREG_LIGHTING_LUT_DATA1"},
302      {0x1CA, "GPUREG_LIGHTING_LUT_DATA2"},
303      {0x1CB, "GPUREG_LIGHTING_LUT_DATA3"},
304      {0x1CC, "GPUREG_LIGHTING_LUT_DATA4"},
305      {0x1CD, "GPUREG_LIGHTING_LUT_DATA5"},
306      {0x1CE, "GPUREG_LIGHTING_LUT_DATA6"},
307      {0x1CF, "GPUREG_LIGHTING_LUT_DATA7"},
308      {0x1D0, "GPUREG_LIGHTING_LUTINPUT_ABS"},
309      {0x1D1, "GPUREG_LIGHTING_LUTINPUT_SELECT"},
310      {0x1D2, "GPUREG_LIGHTING_LUTINPUT_SCALE"},
311  
312      {0x1D9, "GPUREG_LIGHTING_LIGHT_PERMUTATION"},
313  
314      {0x200, "GPUREG_ATTRIBBUFFERS_LOC"},
315      {0x201, "GPUREG_ATTRIBBUFFERS_FORMAT_LOW"},
316      {0x202, "GPUREG_ATTRIBBUFFERS_FORMAT_HIGH"},
317      {0x203, "GPUREG_ATTRIBBUFFER0_OFFSET"},
318      {0x204, "GPUREG_ATTRIBBUFFER0_CONFIG1"},
319      {0x205, "GPUREG_ATTRIBBUFFER0_CONFIG2"},
320      {0x206, "GPUREG_ATTRIBBUFFER1_OFFSET"},
321      {0x207, "GPUREG_ATTRIBBUFFER1_CONFIG1"},
322      {0x208, "GPUREG_ATTRIBBUFFER1_CONFIG2"},
323      {0x209, "GPUREG_ATTRIBBUFFER2_OFFSET"},
324      {0x20A, "GPUREG_ATTRIBBUFFER2_CONFIG1"},
325      {0x20B, "GPUREG_ATTRIBBUFFER2_CONFIG2"},
326      {0x20C, "GPUREG_ATTRIBBUFFER3_OFFSET"},
327      {0x20D, "GPUREG_ATTRIBBUFFER3_CONFIG1"},
328      {0x20E, "GPUREG_ATTRIBBUFFER3_CONFIG2"},
329      {0x20F, "GPUREG_ATTRIBBUFFER4_OFFSET"},
330      {0x210, "GPUREG_ATTRIBBUFFER4_CONFIG1"},
331      {0x211, "GPUREG_ATTRIBBUFFER4_CONFIG2"},
332      {0x212, "GPUREG_ATTRIBBUFFER5_OFFSET"},
333      {0x213, "GPUREG_ATTRIBBUFFER5_CONFIG1"},
334      {0x214, "GPUREG_ATTRIBBUFFER5_CONFIG2"},
335      {0x215, "GPUREG_ATTRIBBUFFER6_OFFSET"},
336      {0x216, "GPUREG_ATTRIBBUFFER6_CONFIG1"},
337      {0x217, "GPUREG_ATTRIBBUFFER6_CONFIG2"},
338      {0x218, "GPUREG_ATTRIBBUFFER7_OFFSET"},
339      {0x219, "GPUREG_ATTRIBBUFFER7_CONFIG1"},
340      {0x21A, "GPUREG_ATTRIBBUFFER7_CONFIG2"},
341      {0x21B, "GPUREG_ATTRIBBUFFER8_OFFSET"},
342      {0x21C, "GPUREG_ATTRIBBUFFER8_CONFIG1"},
343      {0x21D, "GPUREG_ATTRIBBUFFER8_CONFIG2"},
344      {0x21E, "GPUREG_ATTRIBBUFFER9_OFFSET"},
345      {0x21F, "GPUREG_ATTRIBBUFFER9_CONFIG1"},
346      {0x220, "GPUREG_ATTRIBBUFFER9_CONFIG2"},
347      {0x221, "GPUREG_ATTRIBBUFFER10_OFFSET"},
348      {0x222, "GPUREG_ATTRIBBUFFER10_CONFIG1"},
349      {0x223, "GPUREG_ATTRIBBUFFER10_CONFIG2"},
350      {0x224, "GPUREG_ATTRIBBUFFER11_OFFSET"},
351      {0x225, "GPUREG_ATTRIBBUFFER11_CONFIG1"},
352      {0x226, "GPUREG_ATTRIBBUFFER11_CONFIG2"},
353      {0x227, "GPUREG_INDEXBUFFER_CONFIG"},
354      {0x228, "GPUREG_NUMVERTICES"},
355      {0x229, "GPUREG_GEOSTAGE_CONFIG"},
356      {0x22A, "GPUREG_VERTEX_OFFSET"},
357  
358      {0x22D, "GPUREG_POST_VERTEX_CACHE_NUM"},
359      {0x22E, "GPUREG_DRAWARRAYS"},
360      {0x22F, "GPUREG_DRAWELEMENTS"},
361  
362      {0x231, "GPUREG_VTX_FUNC"},
363      {0x232, "GPUREG_FIXEDATTRIB_INDEX"},
364      {0x233, "GPUREG_FIXEDATTRIB_DATA0"},
365      {0x234, "GPUREG_FIXEDATTRIB_DATA1"},
366      {0x235, "GPUREG_FIXEDATTRIB_DATA2"},
367  
368      {0x238, "GPUREG_CMDBUF_SIZE0"},
369      {0x239, "GPUREG_CMDBUF_SIZE1"},
370      {0x23A, "GPUREG_CMDBUF_ADDR0"},
371      {0x23B, "GPUREG_CMDBUF_ADDR1"},
372      {0x23C, "GPUREG_CMDBUF_JUMP0"},
373      {0x23D, "GPUREG_CMDBUF_JUMP1"},
374  
375      {0x242, "GPUREG_VSH_NUM_ATTR"},
376  
377      {0x244, "GPUREG_VSH_COM_MODE"},
378      {0x245, "GPUREG_START_DRAW_FUNC0"},
379  
380      {0x24A, "GPUREG_VSH_OUTMAP_TOTAL1"},
381  
382      {0x251, "GPUREG_VSH_OUTMAP_TOTAL2"},
383      {0x252, "GPUREG_GSH_MISC0"},
384      {0x253, "GPUREG_GEOSTAGE_CONFIG2"},
385      {0x254, "GPUREG_GSH_MISC1"},
386  
387      {0x25E, "GPUREG_PRIMITIVE_CONFIG"},
388      {0x25F, "GPUREG_RESTART_PRIMITIVE"},
389  
390      {0x280, "GPUREG_GSH_BOOLUNIFORM"},
391      {0x281, "GPUREG_GSH_INTUNIFORM_I0"},
392      {0x282, "GPUREG_GSH_INTUNIFORM_I1"},
393      {0x283, "GPUREG_GSH_INTUNIFORM_I2"},
394      {0x284, "GPUREG_GSH_INTUNIFORM_I3"},
395  
396      {0x289, "GPUREG_GSH_INPUTBUFFER_CONFIG"},
397      {0x28A, "GPUREG_GSH_ENTRYPOINT"},
398      {0x28B, "GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW"},
399      {0x28C, "GPUREG_GSH_ATTRIBUTES_PERMUTATION_HIGH"},
400      {0x28D, "GPUREG_GSH_OUTMAP_MASK"},
401  
402      {0x28F, "GPUREG_GSH_CODETRANSFER_END"},
403      {0x290, "GPUREG_GSH_FLOATUNIFORM_INDEX"},
404      {0x291, "GPUREG_GSH_FLOATUNIFORM_DATA0"},
405      {0x292, "GPUREG_GSH_FLOATUNIFORM_DATA1"},
406      {0x293, "GPUREG_GSH_FLOATUNIFORM_DATA2"},
407      {0x294, "GPUREG_GSH_FLOATUNIFORM_DATA3"},
408      {0x295, "GPUREG_GSH_FLOATUNIFORM_DATA4"},
409      {0x296, "GPUREG_GSH_FLOATUNIFORM_DATA5"},
410      {0x297, "GPUREG_GSH_FLOATUNIFORM_DATA6"},
411      {0x298, "GPUREG_GSH_FLOATUNIFORM_DATA7"},
412  
413      {0x29B, "GPUREG_GSH_CODETRANSFER_INDEX"},
414      {0x29C, "GPUREG_GSH_CODETRANSFER_DATA0"},
415      {0x29D, "GPUREG_GSH_CODETRANSFER_DATA1"},
416      {0x29E, "GPUREG_GSH_CODETRANSFER_DATA2"},
417      {0x29F, "GPUREG_GSH_CODETRANSFER_DATA3"},
418      {0x2A0, "GPUREG_GSH_CODETRANSFER_DATA4"},
419      {0x2A1, "GPUREG_GSH_CODETRANSFER_DATA5"},
420      {0x2A2, "GPUREG_GSH_CODETRANSFER_DATA6"},
421      {0x2A3, "GPUREG_GSH_CODETRANSFER_DATA7"},
422  
423      {0x2A5, "GPUREG_GSH_OPDESCS_INDEX"},
424      {0x2A6, "GPUREG_GSH_OPDESCS_DATA0"},
425      {0x2A7, "GPUREG_GSH_OPDESCS_DATA1"},
426      {0x2A8, "GPUREG_GSH_OPDESCS_DATA2"},
427      {0x2A9, "GPUREG_GSH_OPDESCS_DATA3"},
428      {0x2AA, "GPUREG_GSH_OPDESCS_DATA4"},
429      {0x2AB, "GPUREG_GSH_OPDESCS_DATA5"},
430      {0x2AC, "GPUREG_GSH_OPDESCS_DATA6"},
431      {0x2AD, "GPUREG_GSH_OPDESCS_DATA7"},
432  
433      {0x2B0, "GPUREG_VSH_BOOLUNIFORM"},
434      {0x2B1, "GPUREG_VSH_INTUNIFORM_I0"},
435      {0x2B2, "GPUREG_VSH_INTUNIFORM_I1"},
436      {0x2B3, "GPUREG_VSH_INTUNIFORM_I2"},
437      {0x2B4, "GPUREG_VSH_INTUNIFORM_I3"},
438  
439      {0x2B9, "GPUREG_VSH_INPUTBUFFER_CONFIG"},
440      {0x2BA, "GPUREG_VSH_ENTRYPOINT"},
441      {0x2BB, "GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW"},
442      {0x2BC, "GPUREG_VSH_ATTRIBUTES_PERMUTATION_HIGH"},
443      {0x2BD, "GPUREG_VSH_OUTMAP_MASK"},
444  
445      {0x2BF, "GPUREG_VSH_CODETRANSFER_END"},
446      {0x2C0, "GPUREG_VSH_FLOATUNIFORM_INDEX"},
447      {0x2C1, "GPUREG_VSH_FLOATUNIFORM_DATA0"},
448      {0x2C2, "GPUREG_VSH_FLOATUNIFORM_DATA1"},
449      {0x2C3, "GPUREG_VSH_FLOATUNIFORM_DATA2"},
450      {0x2C4, "GPUREG_VSH_FLOATUNIFORM_DATA3"},
451      {0x2C5, "GPUREG_VSH_FLOATUNIFORM_DATA4"},
452      {0x2C6, "GPUREG_VSH_FLOATUNIFORM_DATA5"},
453      {0x2C7, "GPUREG_VSH_FLOATUNIFORM_DATA6"},
454      {0x2C8, "GPUREG_VSH_FLOATUNIFORM_DATA7"},
455  
456      {0x2CB, "GPUREG_VSH_CODETRANSFER_INDEX"},
457      {0x2CC, "GPUREG_VSH_CODETRANSFER_DATA0"},
458      {0x2CD, "GPUREG_VSH_CODETRANSFER_DATA1"},
459      {0x2CE, "GPUREG_VSH_CODETRANSFER_DATA2"},
460      {0x2CF, "GPUREG_VSH_CODETRANSFER_DATA3"},
461      {0x2D0, "GPUREG_VSH_CODETRANSFER_DATA4"},
462      {0x2D1, "GPUREG_VSH_CODETRANSFER_DATA5"},
463      {0x2D2, "GPUREG_VSH_CODETRANSFER_DATA6"},
464      {0x2D3, "GPUREG_VSH_CODETRANSFER_DATA7"},
465  
466      {0x2D5, "GPUREG_VSH_OPDESCS_INDEX"},
467      {0x2D6, "GPUREG_VSH_OPDESCS_DATA0"},
468      {0x2D7, "GPUREG_VSH_OPDESCS_DATA1"},
469      {0x2D8, "GPUREG_VSH_OPDESCS_DATA2"},
470      {0x2D9, "GPUREG_VSH_OPDESCS_DATA3"},
471      {0x2DA, "GPUREG_VSH_OPDESCS_DATA4"},
472      {0x2DB, "GPUREG_VSH_OPDESCS_DATA5"},
473      {0x2DC, "GPUREG_VSH_OPDESCS_DATA6"},
474      {0x2DD, "GPUREG_VSH_OPDESCS_DATA7"},
475  };
476  
477  const char* RegsInternal::GetRegisterName(u16 index) {
478      const auto it = std::lower_bound(std::begin(register_names), std::end(register_names), index,
479                                       [](auto p, auto i) { return p.first < i; });
480      if (it->first == index) {
481          return it->second;
482      }
483  
484      // Return empty string if no match is found
485      return "";
486  }
487  
488  } // namespace Pica