attribute.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <fmt/format.h>
  5. #include "shader_recompiler/exception.h"
  6. #include "shader_recompiler/frontend/ir/attribute.h"
  7. namespace Shader::IR {
  8. bool IsGeneric(Attribute attribute) noexcept {
  9. return attribute >= Attribute::Generic0X && attribute <= Attribute::Generic31X;
  10. }
  11. u32 GenericAttributeIndex(Attribute attribute) {
  12. if (!IsGeneric(attribute)) {
  13. throw InvalidArgument("Attribute is not generic {}", attribute);
  14. }
  15. return (static_cast<u32>(attribute) - static_cast<u32>(Attribute::Generic0X)) / 4u;
  16. }
  17. u32 GenericAttributeElement(Attribute attribute) {
  18. if (!IsGeneric(attribute)) {
  19. throw InvalidArgument("Attribute is not generic {}", attribute);
  20. }
  21. return static_cast<u32>(attribute) % 4;
  22. }
  23. std::string NameOf(Attribute attribute) {
  24. switch (attribute) {
  25. case Attribute::PrimitiveId:
  26. return "PrimitiveId";
  27. case Attribute::Layer:
  28. return "Layer";
  29. case Attribute::ViewportIndex:
  30. return "ViewportIndex";
  31. case Attribute::PointSize:
  32. return "PointSize";
  33. case Attribute::PositionX:
  34. return "Position.X";
  35. case Attribute::PositionY:
  36. return "Position.Y";
  37. case Attribute::PositionZ:
  38. return "Position.Z";
  39. case Attribute::PositionW:
  40. return "Position.W";
  41. case Attribute::Generic0X:
  42. return "Generic[0].X";
  43. case Attribute::Generic0Y:
  44. return "Generic[0].Y";
  45. case Attribute::Generic0Z:
  46. return "Generic[0].Z";
  47. case Attribute::Generic0W:
  48. return "Generic[0].W";
  49. case Attribute::Generic1X:
  50. return "Generic[1].X";
  51. case Attribute::Generic1Y:
  52. return "Generic[1].Y";
  53. case Attribute::Generic1Z:
  54. return "Generic[1].Z";
  55. case Attribute::Generic1W:
  56. return "Generic[1].W";
  57. case Attribute::Generic2X:
  58. return "Generic[2].X";
  59. case Attribute::Generic2Y:
  60. return "Generic[2].Y";
  61. case Attribute::Generic2Z:
  62. return "Generic[2].Z";
  63. case Attribute::Generic2W:
  64. return "Generic[2].W";
  65. case Attribute::Generic3X:
  66. return "Generic[3].X";
  67. case Attribute::Generic3Y:
  68. return "Generic[3].Y";
  69. case Attribute::Generic3Z:
  70. return "Generic[3].Z";
  71. case Attribute::Generic3W:
  72. return "Generic[3].W";
  73. case Attribute::Generic4X:
  74. return "Generic[4].X";
  75. case Attribute::Generic4Y:
  76. return "Generic[4].Y";
  77. case Attribute::Generic4Z:
  78. return "Generic[4].Z";
  79. case Attribute::Generic4W:
  80. return "Generic[4].W";
  81. case Attribute::Generic5X:
  82. return "Generic[5].X";
  83. case Attribute::Generic5Y:
  84. return "Generic[5].Y";
  85. case Attribute::Generic5Z:
  86. return "Generic[5].Z";
  87. case Attribute::Generic5W:
  88. return "Generic[5].W";
  89. case Attribute::Generic6X:
  90. return "Generic[6].X";
  91. case Attribute::Generic6Y:
  92. return "Generic[6].Y";
  93. case Attribute::Generic6Z:
  94. return "Generic[6].Z";
  95. case Attribute::Generic6W:
  96. return "Generic[6].W";
  97. case Attribute::Generic7X:
  98. return "Generic[7].X";
  99. case Attribute::Generic7Y:
  100. return "Generic[7].Y";
  101. case Attribute::Generic7Z:
  102. return "Generic[7].Z";
  103. case Attribute::Generic7W:
  104. return "Generic[7].W";
  105. case Attribute::Generic8X:
  106. return "Generic[8].X";
  107. case Attribute::Generic8Y:
  108. return "Generic[8].Y";
  109. case Attribute::Generic8Z:
  110. return "Generic[8].Z";
  111. case Attribute::Generic8W:
  112. return "Generic[8].W";
  113. case Attribute::Generic9X:
  114. return "Generic[9].X";
  115. case Attribute::Generic9Y:
  116. return "Generic[9].Y";
  117. case Attribute::Generic9Z:
  118. return "Generic[9].Z";
  119. case Attribute::Generic9W:
  120. return "Generic[9].W";
  121. case Attribute::Generic10X:
  122. return "Generic[10].X";
  123. case Attribute::Generic10Y:
  124. return "Generic[10].Y";
  125. case Attribute::Generic10Z:
  126. return "Generic[10].Z";
  127. case Attribute::Generic10W:
  128. return "Generic[10].W";
  129. case Attribute::Generic11X:
  130. return "Generic[11].X";
  131. case Attribute::Generic11Y:
  132. return "Generic[11].Y";
  133. case Attribute::Generic11Z:
  134. return "Generic[11].Z";
  135. case Attribute::Generic11W:
  136. return "Generic[11].W";
  137. case Attribute::Generic12X:
  138. return "Generic[12].X";
  139. case Attribute::Generic12Y:
  140. return "Generic[12].Y";
  141. case Attribute::Generic12Z:
  142. return "Generic[12].Z";
  143. case Attribute::Generic12W:
  144. return "Generic[12].W";
  145. case Attribute::Generic13X:
  146. return "Generic[13].X";
  147. case Attribute::Generic13Y:
  148. return "Generic[13].Y";
  149. case Attribute::Generic13Z:
  150. return "Generic[13].Z";
  151. case Attribute::Generic13W:
  152. return "Generic[13].W";
  153. case Attribute::Generic14X:
  154. return "Generic[14].X";
  155. case Attribute::Generic14Y:
  156. return "Generic[14].Y";
  157. case Attribute::Generic14Z:
  158. return "Generic[14].Z";
  159. case Attribute::Generic14W:
  160. return "Generic[14].W";
  161. case Attribute::Generic15X:
  162. return "Generic[15].X";
  163. case Attribute::Generic15Y:
  164. return "Generic[15].Y";
  165. case Attribute::Generic15Z:
  166. return "Generic[15].Z";
  167. case Attribute::Generic15W:
  168. return "Generic[15].W";
  169. case Attribute::Generic16X:
  170. return "Generic[16].X";
  171. case Attribute::Generic16Y:
  172. return "Generic[16].Y";
  173. case Attribute::Generic16Z:
  174. return "Generic[16].Z";
  175. case Attribute::Generic16W:
  176. return "Generic[16].W";
  177. case Attribute::Generic17X:
  178. return "Generic[17].X";
  179. case Attribute::Generic17Y:
  180. return "Generic[17].Y";
  181. case Attribute::Generic17Z:
  182. return "Generic[17].Z";
  183. case Attribute::Generic17W:
  184. return "Generic[17].W";
  185. case Attribute::Generic18X:
  186. return "Generic[18].X";
  187. case Attribute::Generic18Y:
  188. return "Generic[18].Y";
  189. case Attribute::Generic18Z:
  190. return "Generic[18].Z";
  191. case Attribute::Generic18W:
  192. return "Generic[18].W";
  193. case Attribute::Generic19X:
  194. return "Generic[19].X";
  195. case Attribute::Generic19Y:
  196. return "Generic[19].Y";
  197. case Attribute::Generic19Z:
  198. return "Generic[19].Z";
  199. case Attribute::Generic19W:
  200. return "Generic[19].W";
  201. case Attribute::Generic20X:
  202. return "Generic[20].X";
  203. case Attribute::Generic20Y:
  204. return "Generic[20].Y";
  205. case Attribute::Generic20Z:
  206. return "Generic[20].Z";
  207. case Attribute::Generic20W:
  208. return "Generic[20].W";
  209. case Attribute::Generic21X:
  210. return "Generic[21].X";
  211. case Attribute::Generic21Y:
  212. return "Generic[21].Y";
  213. case Attribute::Generic21Z:
  214. return "Generic[21].Z";
  215. case Attribute::Generic21W:
  216. return "Generic[21].W";
  217. case Attribute::Generic22X:
  218. return "Generic[22].X";
  219. case Attribute::Generic22Y:
  220. return "Generic[22].Y";
  221. case Attribute::Generic22Z:
  222. return "Generic[22].Z";
  223. case Attribute::Generic22W:
  224. return "Generic[22].W";
  225. case Attribute::Generic23X:
  226. return "Generic[23].X";
  227. case Attribute::Generic23Y:
  228. return "Generic[23].Y";
  229. case Attribute::Generic23Z:
  230. return "Generic[23].Z";
  231. case Attribute::Generic23W:
  232. return "Generic[23].W";
  233. case Attribute::Generic24X:
  234. return "Generic[24].X";
  235. case Attribute::Generic24Y:
  236. return "Generic[24].Y";
  237. case Attribute::Generic24Z:
  238. return "Generic[24].Z";
  239. case Attribute::Generic24W:
  240. return "Generic[24].W";
  241. case Attribute::Generic25X:
  242. return "Generic[25].X";
  243. case Attribute::Generic25Y:
  244. return "Generic[25].Y";
  245. case Attribute::Generic25Z:
  246. return "Generic[25].Z";
  247. case Attribute::Generic25W:
  248. return "Generic[25].W";
  249. case Attribute::Generic26X:
  250. return "Generic[26].X";
  251. case Attribute::Generic26Y:
  252. return "Generic[26].Y";
  253. case Attribute::Generic26Z:
  254. return "Generic[26].Z";
  255. case Attribute::Generic26W:
  256. return "Generic[26].W";
  257. case Attribute::Generic27X:
  258. return "Generic[27].X";
  259. case Attribute::Generic27Y:
  260. return "Generic[27].Y";
  261. case Attribute::Generic27Z:
  262. return "Generic[27].Z";
  263. case Attribute::Generic27W:
  264. return "Generic[27].W";
  265. case Attribute::Generic28X:
  266. return "Generic[28].X";
  267. case Attribute::Generic28Y:
  268. return "Generic[28].Y";
  269. case Attribute::Generic28Z:
  270. return "Generic[28].Z";
  271. case Attribute::Generic28W:
  272. return "Generic[28].W";
  273. case Attribute::Generic29X:
  274. return "Generic[29].X";
  275. case Attribute::Generic29Y:
  276. return "Generic[29].Y";
  277. case Attribute::Generic29Z:
  278. return "Generic[29].Z";
  279. case Attribute::Generic29W:
  280. return "Generic[29].W";
  281. case Attribute::Generic30X:
  282. return "Generic[30].X";
  283. case Attribute::Generic30Y:
  284. return "Generic[30].Y";
  285. case Attribute::Generic30Z:
  286. return "Generic[30].Z";
  287. case Attribute::Generic30W:
  288. return "Generic[30].W";
  289. case Attribute::Generic31X:
  290. return "Generic[31].X";
  291. case Attribute::Generic31Y:
  292. return "Generic[31].Y";
  293. case Attribute::Generic31Z:
  294. return "Generic[31].Z";
  295. case Attribute::Generic31W:
  296. return "Generic[31].W";
  297. case Attribute::ColorFrontDiffuseR:
  298. return "ColorFrontDiffuse.R";
  299. case Attribute::ColorFrontDiffuseG:
  300. return "ColorFrontDiffuse.G";
  301. case Attribute::ColorFrontDiffuseB:
  302. return "ColorFrontDiffuse.B";
  303. case Attribute::ColorFrontDiffuseA:
  304. return "ColorFrontDiffuse.A";
  305. case Attribute::ColorFrontSpecularR:
  306. return "ColorFrontSpecular.R";
  307. case Attribute::ColorFrontSpecularG:
  308. return "ColorFrontSpecular.G";
  309. case Attribute::ColorFrontSpecularB:
  310. return "ColorFrontSpecular.B";
  311. case Attribute::ColorFrontSpecularA:
  312. return "ColorFrontSpecular.A";
  313. case Attribute::ColorBackDiffuseR:
  314. return "ColorBackDiffuse.R";
  315. case Attribute::ColorBackDiffuseG:
  316. return "ColorBackDiffuse.G";
  317. case Attribute::ColorBackDiffuseB:
  318. return "ColorBackDiffuse.B";
  319. case Attribute::ColorBackDiffuseA:
  320. return "ColorBackDiffuse.A";
  321. case Attribute::ColorBackSpecularR:
  322. return "ColorBackSpecular.R";
  323. case Attribute::ColorBackSpecularG:
  324. return "ColorBackSpecular.G";
  325. case Attribute::ColorBackSpecularB:
  326. return "ColorBackSpecular.B";
  327. case Attribute::ColorBackSpecularA:
  328. return "ColorBackSpecular.A";
  329. case Attribute::ClipDistance0:
  330. return "ClipDistance[0]";
  331. case Attribute::ClipDistance1:
  332. return "ClipDistance[1]";
  333. case Attribute::ClipDistance2:
  334. return "ClipDistance[2]";
  335. case Attribute::ClipDistance3:
  336. return "ClipDistance[3]";
  337. case Attribute::ClipDistance4:
  338. return "ClipDistance[4]";
  339. case Attribute::ClipDistance5:
  340. return "ClipDistance[5]";
  341. case Attribute::ClipDistance6:
  342. return "ClipDistance[6]";
  343. case Attribute::ClipDistance7:
  344. return "ClipDistance[7]";
  345. case Attribute::PointSpriteS:
  346. return "PointSprite.S";
  347. case Attribute::PointSpriteT:
  348. return "PointSprite.T";
  349. case Attribute::FogCoordinate:
  350. return "FogCoordinate";
  351. case Attribute::TessellationEvaluationPointU:
  352. return "TessellationEvaluationPoint.U";
  353. case Attribute::TessellationEvaluationPointV:
  354. return "TessellationEvaluationPoint.V";
  355. case Attribute::InstanceId:
  356. return "InstanceId";
  357. case Attribute::VertexId:
  358. return "VertexId";
  359. case Attribute::FixedFncTexture0S:
  360. return "FixedFncTexture[0].S";
  361. case Attribute::FixedFncTexture0T:
  362. return "FixedFncTexture[0].T";
  363. case Attribute::FixedFncTexture0R:
  364. return "FixedFncTexture[0].R";
  365. case Attribute::FixedFncTexture0Q:
  366. return "FixedFncTexture[0].Q";
  367. case Attribute::FixedFncTexture1S:
  368. return "FixedFncTexture[1].S";
  369. case Attribute::FixedFncTexture1T:
  370. return "FixedFncTexture[1].T";
  371. case Attribute::FixedFncTexture1R:
  372. return "FixedFncTexture[1].R";
  373. case Attribute::FixedFncTexture1Q:
  374. return "FixedFncTexture[1].Q";
  375. case Attribute::FixedFncTexture2S:
  376. return "FixedFncTexture[2].S";
  377. case Attribute::FixedFncTexture2T:
  378. return "FixedFncTexture[2].T";
  379. case Attribute::FixedFncTexture2R:
  380. return "FixedFncTexture[2].R";
  381. case Attribute::FixedFncTexture2Q:
  382. return "FixedFncTexture[2].Q";
  383. case Attribute::FixedFncTexture3S:
  384. return "FixedFncTexture[3].S";
  385. case Attribute::FixedFncTexture3T:
  386. return "FixedFncTexture[3].T";
  387. case Attribute::FixedFncTexture3R:
  388. return "FixedFncTexture[3].R";
  389. case Attribute::FixedFncTexture3Q:
  390. return "FixedFncTexture[3].Q";
  391. case Attribute::FixedFncTexture4S:
  392. return "FixedFncTexture[4].S";
  393. case Attribute::FixedFncTexture4T:
  394. return "FixedFncTexture[4].T";
  395. case Attribute::FixedFncTexture4R:
  396. return "FixedFncTexture[4].R";
  397. case Attribute::FixedFncTexture4Q:
  398. return "FixedFncTexture[4].Q";
  399. case Attribute::FixedFncTexture5S:
  400. return "FixedFncTexture[5].S";
  401. case Attribute::FixedFncTexture5T:
  402. return "FixedFncTexture[5].T";
  403. case Attribute::FixedFncTexture5R:
  404. return "FixedFncTexture[5].R";
  405. case Attribute::FixedFncTexture5Q:
  406. return "FixedFncTexture[5].Q";
  407. case Attribute::FixedFncTexture6S:
  408. return "FixedFncTexture[6].S";
  409. case Attribute::FixedFncTexture6T:
  410. return "FixedFncTexture[6].T";
  411. case Attribute::FixedFncTexture6R:
  412. return "FixedFncTexture[6].R";
  413. case Attribute::FixedFncTexture6Q:
  414. return "FixedFncTexture[6].Q";
  415. case Attribute::FixedFncTexture7S:
  416. return "FixedFncTexture[7].S";
  417. case Attribute::FixedFncTexture7T:
  418. return "FixedFncTexture[7].T";
  419. case Attribute::FixedFncTexture7R:
  420. return "FixedFncTexture[7].R";
  421. case Attribute::FixedFncTexture7Q:
  422. return "FixedFncTexture[7].Q";
  423. case Attribute::FixedFncTexture8S:
  424. return "FixedFncTexture[8].S";
  425. case Attribute::FixedFncTexture8T:
  426. return "FixedFncTexture[8].T";
  427. case Attribute::FixedFncTexture8R:
  428. return "FixedFncTexture[8].R";
  429. case Attribute::FixedFncTexture8Q:
  430. return "FixedFncTexture[8].Q";
  431. case Attribute::FixedFncTexture9S:
  432. return "FixedFncTexture[9].S";
  433. case Attribute::FixedFncTexture9T:
  434. return "FixedFncTexture[9].T";
  435. case Attribute::FixedFncTexture9R:
  436. return "FixedFncTexture[9].R";
  437. case Attribute::FixedFncTexture9Q:
  438. return "FixedFncTexture[9].Q";
  439. case Attribute::ViewportMask:
  440. return "ViewportMask";
  441. case Attribute::FrontFace:
  442. return "FrontFace";
  443. }
  444. return fmt::format("<reserved attribute {}>", static_cast<int>(attribute));
  445. }
  446. } // namespace Shader::IR