ShaderProgramBinary.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. // WARNING: This file is auto generated.
  6. #pragma once
  7. #include <AnKi/ShaderCompiler/Common.h>
  8. #include <AnKi/ShaderCompiler/ShaderProgramBinaryExtra.h>
  9. #include <AnKi/Gr/Enums.h>
  10. namespace anki
  11. {
  12. /// Storage or uniform variable.
  13. class ShaderProgramBinaryVariable
  14. {
  15. public:
  16. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  17. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  18. template<typename TSerializer, typename TClass>
  19. static void serializeCommon(TSerializer& s, TClass self)
  20. {
  21. s.doArray("m_name", offsetof(ShaderProgramBinaryVariable, m_name), &self.m_name[0], self.m_name.getSize());
  22. s.doValue("m_type", offsetof(ShaderProgramBinaryVariable, m_type), self.m_type);
  23. }
  24. template<typename TDeserializer>
  25. void deserialize(TDeserializer& deserializer)
  26. {
  27. serializeCommon<TDeserializer, ShaderProgramBinaryVariable&>(deserializer, *this);
  28. }
  29. template<typename TSerializer>
  30. void serialize(TSerializer& serializer) const
  31. {
  32. serializeCommon<TSerializer, const ShaderProgramBinaryVariable&>(serializer, *this);
  33. }
  34. };
  35. /// Storage or uniform variable per variant.
  36. class ShaderProgramBinaryVariableInstance
  37. {
  38. public:
  39. U32 m_index = MAX_U32; ///< Points to ShaderProgramBinaryBlock::m_variables.
  40. ShaderVariableBlockInfo m_blockInfo;
  41. template<typename TSerializer, typename TClass>
  42. static void serializeCommon(TSerializer& s, TClass self)
  43. {
  44. s.doValue("m_index", offsetof(ShaderProgramBinaryVariableInstance, m_index), self.m_index);
  45. s.doValue("m_blockInfo", offsetof(ShaderProgramBinaryVariableInstance, m_blockInfo), self.m_blockInfo);
  46. }
  47. template<typename TDeserializer>
  48. void deserialize(TDeserializer& deserializer)
  49. {
  50. serializeCommon<TDeserializer, ShaderProgramBinaryVariableInstance&>(deserializer, *this);
  51. }
  52. template<typename TSerializer>
  53. void serialize(TSerializer& serializer) const
  54. {
  55. serializeCommon<TSerializer, const ShaderProgramBinaryVariableInstance&>(serializer, *this);
  56. }
  57. };
  58. /// Storage or uniform block.
  59. class ShaderProgramBinaryBlock
  60. {
  61. public:
  62. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  63. WeakArray<ShaderProgramBinaryVariable> m_variables;
  64. U32 m_binding = MAX_U32;
  65. U32 m_set = MAX_U32;
  66. template<typename TSerializer, typename TClass>
  67. static void serializeCommon(TSerializer& s, TClass self)
  68. {
  69. s.doArray("m_name", offsetof(ShaderProgramBinaryBlock, m_name), &self.m_name[0], self.m_name.getSize());
  70. s.doValue("m_variables", offsetof(ShaderProgramBinaryBlock, m_variables), self.m_variables);
  71. s.doValue("m_binding", offsetof(ShaderProgramBinaryBlock, m_binding), self.m_binding);
  72. s.doValue("m_set", offsetof(ShaderProgramBinaryBlock, m_set), self.m_set);
  73. }
  74. template<typename TDeserializer>
  75. void deserialize(TDeserializer& deserializer)
  76. {
  77. serializeCommon<TDeserializer, ShaderProgramBinaryBlock&>(deserializer, *this);
  78. }
  79. template<typename TSerializer>
  80. void serialize(TSerializer& serializer) const
  81. {
  82. serializeCommon<TSerializer, const ShaderProgramBinaryBlock&>(serializer, *this);
  83. }
  84. };
  85. /// Storage or uniform block per variant.
  86. class ShaderProgramBinaryBlockInstance
  87. {
  88. public:
  89. U32 m_index = MAX_U32; ///< Points to ShaderProgramBinary::m_uniformBlocks or m_storageBlocks.
  90. WeakArray<ShaderProgramBinaryVariableInstance> m_variables;
  91. U32 m_size = MAX_U32;
  92. template<typename TSerializer, typename TClass>
  93. static void serializeCommon(TSerializer& s, TClass self)
  94. {
  95. s.doValue("m_index", offsetof(ShaderProgramBinaryBlockInstance, m_index), self.m_index);
  96. s.doValue("m_variables", offsetof(ShaderProgramBinaryBlockInstance, m_variables), self.m_variables);
  97. s.doValue("m_size", offsetof(ShaderProgramBinaryBlockInstance, m_size), self.m_size);
  98. }
  99. template<typename TDeserializer>
  100. void deserialize(TDeserializer& deserializer)
  101. {
  102. serializeCommon<TDeserializer, ShaderProgramBinaryBlockInstance&>(deserializer, *this);
  103. }
  104. template<typename TSerializer>
  105. void serialize(TSerializer& serializer) const
  106. {
  107. serializeCommon<TSerializer, const ShaderProgramBinaryBlockInstance&>(serializer, *this);
  108. }
  109. };
  110. /// Sampler or texture or image.
  111. class ShaderProgramBinaryOpaque
  112. {
  113. public:
  114. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  115. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  116. U32 m_binding = MAX_U32;
  117. U32 m_set = MAX_U32;
  118. template<typename TSerializer, typename TClass>
  119. static void serializeCommon(TSerializer& s, TClass self)
  120. {
  121. s.doArray("m_name", offsetof(ShaderProgramBinaryOpaque, m_name), &self.m_name[0], self.m_name.getSize());
  122. s.doValue("m_type", offsetof(ShaderProgramBinaryOpaque, m_type), self.m_type);
  123. s.doValue("m_binding", offsetof(ShaderProgramBinaryOpaque, m_binding), self.m_binding);
  124. s.doValue("m_set", offsetof(ShaderProgramBinaryOpaque, m_set), self.m_set);
  125. }
  126. template<typename TDeserializer>
  127. void deserialize(TDeserializer& deserializer)
  128. {
  129. serializeCommon<TDeserializer, ShaderProgramBinaryOpaque&>(deserializer, *this);
  130. }
  131. template<typename TSerializer>
  132. void serialize(TSerializer& serializer) const
  133. {
  134. serializeCommon<TSerializer, const ShaderProgramBinaryOpaque&>(serializer, *this);
  135. }
  136. };
  137. /// Sampler or texture or image per variant.
  138. class ShaderProgramBinaryOpaqueInstance
  139. {
  140. public:
  141. U32 m_index = MAX_U32; ///< Points to ShaderProgramBinary::m_opaques.
  142. U32 m_arraySize = MAX_U32;
  143. template<typename TSerializer, typename TClass>
  144. static void serializeCommon(TSerializer& s, TClass self)
  145. {
  146. s.doValue("m_index", offsetof(ShaderProgramBinaryOpaqueInstance, m_index), self.m_index);
  147. s.doValue("m_arraySize", offsetof(ShaderProgramBinaryOpaqueInstance, m_arraySize), self.m_arraySize);
  148. }
  149. template<typename TDeserializer>
  150. void deserialize(TDeserializer& deserializer)
  151. {
  152. serializeCommon<TDeserializer, ShaderProgramBinaryOpaqueInstance&>(deserializer, *this);
  153. }
  154. template<typename TSerializer>
  155. void serialize(TSerializer& serializer) const
  156. {
  157. serializeCommon<TSerializer, const ShaderProgramBinaryOpaqueInstance&>(serializer, *this);
  158. }
  159. };
  160. /// Specialization constant.
  161. class ShaderProgramBinaryConstant
  162. {
  163. public:
  164. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name;
  165. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  166. U32 m_constantId = MAX_U32;
  167. template<typename TSerializer, typename TClass>
  168. static void serializeCommon(TSerializer& s, TClass self)
  169. {
  170. s.doArray("m_name", offsetof(ShaderProgramBinaryConstant, m_name), &self.m_name[0], self.m_name.getSize());
  171. s.doValue("m_type", offsetof(ShaderProgramBinaryConstant, m_type), self.m_type);
  172. s.doValue("m_constantId", offsetof(ShaderProgramBinaryConstant, m_constantId), self.m_constantId);
  173. }
  174. template<typename TDeserializer>
  175. void deserialize(TDeserializer& deserializer)
  176. {
  177. serializeCommon<TDeserializer, ShaderProgramBinaryConstant&>(deserializer, *this);
  178. }
  179. template<typename TSerializer>
  180. void serialize(TSerializer& serializer) const
  181. {
  182. serializeCommon<TSerializer, const ShaderProgramBinaryConstant&>(serializer, *this);
  183. }
  184. };
  185. /// Specialization constant per variant.
  186. class ShaderProgramBinaryConstantInstance
  187. {
  188. public:
  189. U32 m_index = MAX_U32; ///< Points to ShaderProgramBinary::m_constants.
  190. template<typename TSerializer, typename TClass>
  191. static void serializeCommon(TSerializer& s, TClass self)
  192. {
  193. s.doValue("m_index", offsetof(ShaderProgramBinaryConstantInstance, m_index), self.m_index);
  194. }
  195. template<typename TDeserializer>
  196. void deserialize(TDeserializer& deserializer)
  197. {
  198. serializeCommon<TDeserializer, ShaderProgramBinaryConstantInstance&>(deserializer, *this);
  199. }
  200. template<typename TSerializer>
  201. void serialize(TSerializer& serializer) const
  202. {
  203. serializeCommon<TSerializer, const ShaderProgramBinaryConstantInstance&>(serializer, *this);
  204. }
  205. };
  206. /// A member of a ShaderProgramBinaryStruct.
  207. class ShaderProgramBinaryStructMember
  208. {
  209. public:
  210. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  211. ShaderVariableDataType m_type =
  212. ShaderVariableDataType::NONE; ///< If the value is ShaderVariableDataType::NONE then it's a struct.
  213. U32 m_structIndex = MAX_U32;
  214. U32 m_offset = MAX_U32;
  215. U32 m_arraySize = MAX_U32;
  216. template<typename TSerializer, typename TClass>
  217. static void serializeCommon(TSerializer& s, TClass self)
  218. {
  219. s.doArray("m_name", offsetof(ShaderProgramBinaryStructMember, m_name), &self.m_name[0], self.m_name.getSize());
  220. s.doValue("m_type", offsetof(ShaderProgramBinaryStructMember, m_type), self.m_type);
  221. s.doValue("m_structIndex", offsetof(ShaderProgramBinaryStructMember, m_structIndex), self.m_structIndex);
  222. s.doValue("m_offset", offsetof(ShaderProgramBinaryStructMember, m_offset), self.m_offset);
  223. s.doValue("m_arraySize", offsetof(ShaderProgramBinaryStructMember, m_arraySize), self.m_arraySize);
  224. }
  225. template<typename TDeserializer>
  226. void deserialize(TDeserializer& deserializer)
  227. {
  228. serializeCommon<TDeserializer, ShaderProgramBinaryStructMember&>(deserializer, *this);
  229. }
  230. template<typename TSerializer>
  231. void serialize(TSerializer& serializer) const
  232. {
  233. serializeCommon<TSerializer, const ShaderProgramBinaryStructMember&>(serializer, *this);
  234. }
  235. };
  236. /// Structures.
  237. class ShaderProgramBinaryStruct
  238. {
  239. public:
  240. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name;
  241. WeakArray<ShaderProgramBinaryStructMember> m_members;
  242. U32 m_size = MAX_U32;
  243. template<typename TSerializer, typename TClass>
  244. static void serializeCommon(TSerializer& s, TClass self)
  245. {
  246. s.doArray("m_name", offsetof(ShaderProgramBinaryStruct, m_name), &self.m_name[0], self.m_name.getSize());
  247. s.doValue("m_members", offsetof(ShaderProgramBinaryStruct, m_members), self.m_members);
  248. s.doValue("m_size", offsetof(ShaderProgramBinaryStruct, m_size), self.m_size);
  249. }
  250. template<typename TDeserializer>
  251. void deserialize(TDeserializer& deserializer)
  252. {
  253. serializeCommon<TDeserializer, ShaderProgramBinaryStruct&>(deserializer, *this);
  254. }
  255. template<typename TSerializer>
  256. void serialize(TSerializer& serializer) const
  257. {
  258. serializeCommon<TSerializer, const ShaderProgramBinaryStruct&>(serializer, *this);
  259. }
  260. };
  261. /// ShaderProgramBinaryVariant class.
  262. class ShaderProgramBinaryVariant
  263. {
  264. public:
  265. Array<U32, U32(ShaderType::COUNT)> m_codeBlockIndices =
  266. {}; ///< Index in ShaderProgramBinary::m_codeBlocks. MAX_U32 means no shader.
  267. WeakArray<ShaderProgramBinaryBlockInstance> m_uniformBlocks;
  268. WeakArray<ShaderProgramBinaryBlockInstance> m_storageBlocks;
  269. ShaderProgramBinaryBlockInstance* m_pushConstantBlock = nullptr;
  270. WeakArray<ShaderProgramBinaryOpaqueInstance> m_opaques;
  271. WeakArray<ShaderProgramBinaryConstantInstance> m_constants;
  272. Array<U32, 3> m_workgroupSizes = {MAX_U32, MAX_U32, MAX_U32};
  273. Array<U32, 3> m_workgroupSizesConstants = {MAX_U32, MAX_U32,
  274. MAX_U32}; ///< Indices to ShaderProgramBinary::m_constants.
  275. template<typename TSerializer, typename TClass>
  276. static void serializeCommon(TSerializer& s, TClass self)
  277. {
  278. s.doArray("m_codeBlockIndices", offsetof(ShaderProgramBinaryVariant, m_codeBlockIndices),
  279. &self.m_codeBlockIndices[0], self.m_codeBlockIndices.getSize());
  280. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinaryVariant, m_uniformBlocks), self.m_uniformBlocks);
  281. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinaryVariant, m_storageBlocks), self.m_storageBlocks);
  282. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinaryVariant, m_pushConstantBlock),
  283. self.m_pushConstantBlock);
  284. s.doValue("m_opaques", offsetof(ShaderProgramBinaryVariant, m_opaques), self.m_opaques);
  285. s.doValue("m_constants", offsetof(ShaderProgramBinaryVariant, m_constants), self.m_constants);
  286. s.doArray("m_workgroupSizes", offsetof(ShaderProgramBinaryVariant, m_workgroupSizes), &self.m_workgroupSizes[0],
  287. self.m_workgroupSizes.getSize());
  288. s.doArray("m_workgroupSizesConstants", offsetof(ShaderProgramBinaryVariant, m_workgroupSizesConstants),
  289. &self.m_workgroupSizesConstants[0], self.m_workgroupSizesConstants.getSize());
  290. }
  291. template<typename TDeserializer>
  292. void deserialize(TDeserializer& deserializer)
  293. {
  294. serializeCommon<TDeserializer, ShaderProgramBinaryVariant&>(deserializer, *this);
  295. }
  296. template<typename TSerializer>
  297. void serialize(TSerializer& serializer) const
  298. {
  299. serializeCommon<TSerializer, const ShaderProgramBinaryVariant&>(serializer, *this);
  300. }
  301. };
  302. /// Shader program mutator.
  303. class ShaderProgramBinaryMutator
  304. {
  305. public:
  306. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  307. WeakArray<MutatorValue> m_values;
  308. template<typename TSerializer, typename TClass>
  309. static void serializeCommon(TSerializer& s, TClass self)
  310. {
  311. s.doArray("m_name", offsetof(ShaderProgramBinaryMutator, m_name), &self.m_name[0], self.m_name.getSize());
  312. s.doValue("m_values", offsetof(ShaderProgramBinaryMutator, m_values), self.m_values);
  313. }
  314. template<typename TDeserializer>
  315. void deserialize(TDeserializer& deserializer)
  316. {
  317. serializeCommon<TDeserializer, ShaderProgramBinaryMutator&>(deserializer, *this);
  318. }
  319. template<typename TSerializer>
  320. void serialize(TSerializer& serializer) const
  321. {
  322. serializeCommon<TSerializer, const ShaderProgramBinaryMutator&>(serializer, *this);
  323. }
  324. };
  325. /// Contains the IR (SPIR-V).
  326. class ShaderProgramBinaryCodeBlock
  327. {
  328. public:
  329. WeakArray<U8> m_binary;
  330. U64 m_hash = 0;
  331. template<typename TSerializer, typename TClass>
  332. static void serializeCommon(TSerializer& s, TClass self)
  333. {
  334. s.doValue("m_binary", offsetof(ShaderProgramBinaryCodeBlock, m_binary), self.m_binary);
  335. s.doValue("m_hash", offsetof(ShaderProgramBinaryCodeBlock, m_hash), self.m_hash);
  336. }
  337. template<typename TDeserializer>
  338. void deserialize(TDeserializer& deserializer)
  339. {
  340. serializeCommon<TDeserializer, ShaderProgramBinaryCodeBlock&>(deserializer, *this);
  341. }
  342. template<typename TSerializer>
  343. void serialize(TSerializer& serializer) const
  344. {
  345. serializeCommon<TSerializer, const ShaderProgramBinaryCodeBlock&>(serializer, *this);
  346. }
  347. };
  348. /// ShaderProgramBinaryMutation class.
  349. class ShaderProgramBinaryMutation
  350. {
  351. public:
  352. WeakArray<MutatorValue> m_values;
  353. U32 m_variantIndex = MAX_U32;
  354. U64 m_hash = 0; ///< Mutation hash.
  355. template<typename TSerializer, typename TClass>
  356. static void serializeCommon(TSerializer& s, TClass self)
  357. {
  358. s.doValue("m_values", offsetof(ShaderProgramBinaryMutation, m_values), self.m_values);
  359. s.doValue("m_variantIndex", offsetof(ShaderProgramBinaryMutation, m_variantIndex), self.m_variantIndex);
  360. s.doValue("m_hash", offsetof(ShaderProgramBinaryMutation, m_hash), self.m_hash);
  361. }
  362. template<typename TDeserializer>
  363. void deserialize(TDeserializer& deserializer)
  364. {
  365. serializeCommon<TDeserializer, ShaderProgramBinaryMutation&>(deserializer, *this);
  366. }
  367. template<typename TSerializer>
  368. void serialize(TSerializer& serializer) const
  369. {
  370. serializeCommon<TSerializer, const ShaderProgramBinaryMutation&>(serializer, *this);
  371. }
  372. };
  373. /// ShaderProgramBinary class.
  374. class ShaderProgramBinary
  375. {
  376. public:
  377. Array<U8, 8> m_magic = {};
  378. WeakArray<ShaderProgramBinaryMutator> m_mutators;
  379. WeakArray<ShaderProgramBinaryCodeBlock> m_codeBlocks;
  380. WeakArray<ShaderProgramBinaryVariant> m_variants;
  381. WeakArray<ShaderProgramBinaryMutation> m_mutations; ///< It's sorted using the mutation's hash.
  382. WeakArray<ShaderProgramBinaryBlock> m_uniformBlocks;
  383. WeakArray<ShaderProgramBinaryBlock> m_storageBlocks;
  384. ShaderProgramBinaryBlock* m_pushConstantBlock = nullptr;
  385. WeakArray<ShaderProgramBinaryOpaque> m_opaques;
  386. WeakArray<ShaderProgramBinaryConstant> m_constants;
  387. WeakArray<ShaderProgramBinaryStruct> m_structs;
  388. ShaderTypeBit m_presentShaderTypes = ShaderTypeBit::NONE;
  389. Array<char, 64> m_libraryName = {}; ///< The name of the shader library. Mainly for RT shaders.
  390. U32 m_rayType = MAX_U32; ///< An arbitary number indicating the type of the ray.
  391. template<typename TSerializer, typename TClass>
  392. static void serializeCommon(TSerializer& s, TClass self)
  393. {
  394. s.doArray("m_magic", offsetof(ShaderProgramBinary, m_magic), &self.m_magic[0], self.m_magic.getSize());
  395. s.doValue("m_mutators", offsetof(ShaderProgramBinary, m_mutators), self.m_mutators);
  396. s.doValue("m_codeBlocks", offsetof(ShaderProgramBinary, m_codeBlocks), self.m_codeBlocks);
  397. s.doValue("m_variants", offsetof(ShaderProgramBinary, m_variants), self.m_variants);
  398. s.doValue("m_mutations", offsetof(ShaderProgramBinary, m_mutations), self.m_mutations);
  399. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinary, m_uniformBlocks), self.m_uniformBlocks);
  400. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinary, m_storageBlocks), self.m_storageBlocks);
  401. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinary, m_pushConstantBlock),
  402. self.m_pushConstantBlock);
  403. s.doValue("m_opaques", offsetof(ShaderProgramBinary, m_opaques), self.m_opaques);
  404. s.doValue("m_constants", offsetof(ShaderProgramBinary, m_constants), self.m_constants);
  405. s.doValue("m_structs", offsetof(ShaderProgramBinary, m_structs), self.m_structs);
  406. s.doValue("m_presentShaderTypes", offsetof(ShaderProgramBinary, m_presentShaderTypes),
  407. self.m_presentShaderTypes);
  408. s.doArray("m_libraryName", offsetof(ShaderProgramBinary, m_libraryName), &self.m_libraryName[0],
  409. self.m_libraryName.getSize());
  410. s.doValue("m_rayType", offsetof(ShaderProgramBinary, m_rayType), self.m_rayType);
  411. }
  412. template<typename TDeserializer>
  413. void deserialize(TDeserializer& deserializer)
  414. {
  415. serializeCommon<TDeserializer, ShaderProgramBinary&>(deserializer, *this);
  416. }
  417. template<typename TSerializer>
  418. void serialize(TSerializer& serializer) const
  419. {
  420. serializeCommon<TSerializer, const ShaderProgramBinary&>(serializer, *this);
  421. }
  422. };
  423. } // end namespace anki