pica.cpp 17 KB

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