CPMemory.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // Copyright 2008 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "Common/BitSet.h"
  6. #include "Common/CommonTypes.h"
  7. // Vertex array numbers
  8. enum
  9. {
  10. ARRAY_POSITION = 0,
  11. ARRAY_NORMAL = 1,
  12. ARRAY_COLOR = 2,
  13. ARRAY_COLOR2 = 3,
  14. ARRAY_TEXCOORD0 = 4,
  15. };
  16. // Vertex components
  17. enum
  18. {
  19. NOT_PRESENT = 0,
  20. DIRECT = 1,
  21. INDEX8 = 2,
  22. INDEX16 = 3,
  23. MASK_INDEXED = 2,
  24. };
  25. enum
  26. {
  27. FORMAT_UBYTE = 0, // 2 Cmp
  28. FORMAT_BYTE = 1, // 3 Cmp
  29. FORMAT_USHORT = 2,
  30. FORMAT_SHORT = 3,
  31. FORMAT_FLOAT = 4,
  32. };
  33. enum
  34. {
  35. FORMAT_16B_565 = 0, // NA
  36. FORMAT_24B_888 = 1,
  37. FORMAT_32B_888x = 2,
  38. FORMAT_16B_4444 = 3,
  39. FORMAT_24B_6666 = 4,
  40. FORMAT_32B_8888 = 5,
  41. };
  42. #pragma pack(4)
  43. union TVtxDesc
  44. {
  45. u64 Hex;
  46. struct
  47. {
  48. // 0: not present
  49. // 1: present
  50. u64 PosMatIdx : 1;
  51. u64 Tex0MatIdx : 1;
  52. u64 Tex1MatIdx : 1;
  53. u64 Tex2MatIdx : 1;
  54. u64 Tex3MatIdx : 1;
  55. u64 Tex4MatIdx : 1;
  56. u64 Tex5MatIdx : 1;
  57. u64 Tex6MatIdx : 1;
  58. u64 Tex7MatIdx : 1;
  59. // 00: not present
  60. // 01: direct
  61. // 10: 8 bit index
  62. // 11: 16 bit index
  63. u64 Position : 2;
  64. u64 Normal : 2;
  65. u64 Color0 : 2;
  66. u64 Color1 : 2;
  67. u64 Tex0Coord : 2;
  68. u64 Tex1Coord : 2;
  69. u64 Tex2Coord : 2;
  70. u64 Tex3Coord : 2;
  71. u64 Tex4Coord : 2;
  72. u64 Tex5Coord : 2;
  73. u64 Tex6Coord : 2;
  74. u64 Tex7Coord : 2;
  75. u64 :31;
  76. };
  77. struct
  78. {
  79. u32 Hex0, Hex1;
  80. };
  81. // Easily index into the Position..Tex7Coord fields.
  82. u32 GetVertexArrayStatus(int idx)
  83. {
  84. return (Hex >> (9 + idx * 2)) & 0x3;
  85. }
  86. };
  87. union UVAT_group0
  88. {
  89. u32 Hex;
  90. struct
  91. {
  92. // 0:8
  93. u32 PosElements : 1;
  94. u32 PosFormat : 3;
  95. u32 PosFrac : 5;
  96. // 9:12
  97. u32 NormalElements : 1;
  98. u32 NormalFormat : 3;
  99. // 13:16
  100. u32 Color0Elements : 1;
  101. u32 Color0Comp : 3;
  102. // 17:20
  103. u32 Color1Elements : 1;
  104. u32 Color1Comp : 3;
  105. // 21:29
  106. u32 Tex0CoordElements : 1;
  107. u32 Tex0CoordFormat : 3;
  108. u32 Tex0Frac : 5;
  109. // 30:31
  110. u32 ByteDequant : 1;
  111. u32 NormalIndex3 : 1;
  112. };
  113. };
  114. union UVAT_group1
  115. {
  116. u32 Hex;
  117. struct
  118. {
  119. // 0:8
  120. u32 Tex1CoordElements : 1;
  121. u32 Tex1CoordFormat : 3;
  122. u32 Tex1Frac : 5;
  123. // 9:17
  124. u32 Tex2CoordElements : 1;
  125. u32 Tex2CoordFormat : 3;
  126. u32 Tex2Frac : 5;
  127. // 18:26
  128. u32 Tex3CoordElements : 1;
  129. u32 Tex3CoordFormat : 3;
  130. u32 Tex3Frac : 5;
  131. // 27:30
  132. u32 Tex4CoordElements : 1;
  133. u32 Tex4CoordFormat : 3;
  134. //
  135. u32 : 1;
  136. };
  137. };
  138. union UVAT_group2
  139. {
  140. u32 Hex;
  141. struct
  142. {
  143. // 0:4
  144. u32 Tex4Frac : 5;
  145. // 5:13
  146. u32 Tex5CoordElements : 1;
  147. u32 Tex5CoordFormat : 3;
  148. u32 Tex5Frac : 5;
  149. // 14:22
  150. u32 Tex6CoordElements : 1;
  151. u32 Tex6CoordFormat : 3;
  152. u32 Tex6Frac : 5;
  153. // 23:31
  154. u32 Tex7CoordElements : 1;
  155. u32 Tex7CoordFormat : 3;
  156. u32 Tex7Frac : 5;
  157. };
  158. };
  159. struct ColorAttr
  160. {
  161. u8 Elements;
  162. u8 Comp;
  163. };
  164. struct TexAttr
  165. {
  166. u8 Elements;
  167. u8 Format;
  168. u8 Frac;
  169. };
  170. struct TVtxAttr
  171. {
  172. u8 PosElements;
  173. u8 PosFormat;
  174. u8 PosFrac;
  175. u8 NormalElements;
  176. u8 NormalFormat;
  177. ColorAttr color[2];
  178. TexAttr texCoord[8];
  179. bool ByteDequant;
  180. u8 NormalIndex3;
  181. };
  182. // Matrix indices
  183. union TMatrixIndexA
  184. {
  185. struct
  186. {
  187. u32 PosNormalMtxIdx : 6;
  188. u32 Tex0MtxIdx : 6;
  189. u32 Tex1MtxIdx : 6;
  190. u32 Tex2MtxIdx : 6;
  191. u32 Tex3MtxIdx : 6;
  192. };
  193. struct
  194. {
  195. u32 Hex : 30;
  196. u32 unused : 2;
  197. };
  198. };
  199. union TMatrixIndexB
  200. {
  201. struct
  202. {
  203. u32 Tex4MtxIdx : 6;
  204. u32 Tex5MtxIdx : 6;
  205. u32 Tex6MtxIdx : 6;
  206. u32 Tex7MtxIdx : 6;
  207. };
  208. struct
  209. {
  210. u32 Hex : 24;
  211. u32 unused : 8;
  212. };
  213. };
  214. #pragma pack()
  215. struct VAT
  216. {
  217. UVAT_group0 g0;
  218. UVAT_group1 g1;
  219. UVAT_group2 g2;
  220. };
  221. class VertexLoaderBase;
  222. // STATE_TO_SAVE
  223. struct CPState final
  224. {
  225. u32 array_bases[16];
  226. u32 array_strides[16];
  227. TMatrixIndexA matrix_index_a;
  228. TMatrixIndexB matrix_index_b;
  229. TVtxDesc vtx_desc;
  230. // Most games only use the first VtxAttr and simply reconfigure it all the time as needed.
  231. VAT vtx_attr[8];
  232. // Attributes that actually belong to VertexLoaderManager:
  233. BitSet32 attr_dirty;
  234. bool bases_dirty;
  235. VertexLoaderBase* vertex_loaders[8];
  236. };
  237. class PointerWrap;
  238. extern void DoCPState(PointerWrap& p);
  239. extern void CopyPreprocessCPStateFromMain();
  240. extern CPState g_main_cp_state;
  241. extern CPState g_preprocess_cp_state;
  242. // Might move this into its own file later.
  243. void LoadCPReg(u32 SubCmd, u32 Value, bool is_preprocess = false);
  244. // Fills memory with data from CP regs
  245. void FillCPMemoryArray(u32 *memory);