ShaderProgramBinary.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  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. /// ShaderProgramBinaryVariant class.
  207. class ShaderProgramBinaryVariant
  208. {
  209. public:
  210. Array<U32, U32(ShaderType::COUNT)> m_codeBlockIndices =
  211. {}; ///< Index in ShaderProgramBinary::m_codeBlocks. MAX_U32 means no shader.
  212. WeakArray<ShaderProgramBinaryBlockInstance> m_uniformBlocks;
  213. WeakArray<ShaderProgramBinaryBlockInstance> m_storageBlocks;
  214. ShaderProgramBinaryBlockInstance* m_pushConstantBlock = nullptr;
  215. WeakArray<ShaderProgramBinaryOpaqueInstance> m_opaques;
  216. WeakArray<ShaderProgramBinaryConstantInstance> m_constants;
  217. Array<U32, 3> m_workgroupSizes = {MAX_U32, MAX_U32, MAX_U32};
  218. Array<U32, 3> m_workgroupSizesConstants = {MAX_U32, MAX_U32,
  219. MAX_U32}; ///< Indices to ShaderProgramBinary::m_constants.
  220. template<typename TSerializer, typename TClass>
  221. static void serializeCommon(TSerializer& s, TClass self)
  222. {
  223. s.doArray("m_codeBlockIndices", offsetof(ShaderProgramBinaryVariant, m_codeBlockIndices),
  224. &self.m_codeBlockIndices[0], self.m_codeBlockIndices.getSize());
  225. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinaryVariant, m_uniformBlocks), self.m_uniformBlocks);
  226. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinaryVariant, m_storageBlocks), self.m_storageBlocks);
  227. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinaryVariant, m_pushConstantBlock),
  228. self.m_pushConstantBlock);
  229. s.doValue("m_opaques", offsetof(ShaderProgramBinaryVariant, m_opaques), self.m_opaques);
  230. s.doValue("m_constants", offsetof(ShaderProgramBinaryVariant, m_constants), self.m_constants);
  231. s.doArray("m_workgroupSizes", offsetof(ShaderProgramBinaryVariant, m_workgroupSizes), &self.m_workgroupSizes[0],
  232. self.m_workgroupSizes.getSize());
  233. s.doArray("m_workgroupSizesConstants", offsetof(ShaderProgramBinaryVariant, m_workgroupSizesConstants),
  234. &self.m_workgroupSizesConstants[0], self.m_workgroupSizesConstants.getSize());
  235. }
  236. template<typename TDeserializer>
  237. void deserialize(TDeserializer& deserializer)
  238. {
  239. serializeCommon<TDeserializer, ShaderProgramBinaryVariant&>(deserializer, *this);
  240. }
  241. template<typename TSerializer>
  242. void serialize(TSerializer& serializer) const
  243. {
  244. serializeCommon<TSerializer, const ShaderProgramBinaryVariant&>(serializer, *this);
  245. }
  246. };
  247. /// Shader program mutator.
  248. class ShaderProgramBinaryMutator
  249. {
  250. public:
  251. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  252. WeakArray<MutatorValue> m_values;
  253. template<typename TSerializer, typename TClass>
  254. static void serializeCommon(TSerializer& s, TClass self)
  255. {
  256. s.doArray("m_name", offsetof(ShaderProgramBinaryMutator, m_name), &self.m_name[0], self.m_name.getSize());
  257. s.doValue("m_values", offsetof(ShaderProgramBinaryMutator, m_values), self.m_values);
  258. }
  259. template<typename TDeserializer>
  260. void deserialize(TDeserializer& deserializer)
  261. {
  262. serializeCommon<TDeserializer, ShaderProgramBinaryMutator&>(deserializer, *this);
  263. }
  264. template<typename TSerializer>
  265. void serialize(TSerializer& serializer) const
  266. {
  267. serializeCommon<TSerializer, const ShaderProgramBinaryMutator&>(serializer, *this);
  268. }
  269. };
  270. /// Contains the IR (SPIR-V).
  271. class ShaderProgramBinaryCodeBlock
  272. {
  273. public:
  274. WeakArray<U8> m_binary;
  275. U64 m_hash = 0;
  276. template<typename TSerializer, typename TClass>
  277. static void serializeCommon(TSerializer& s, TClass self)
  278. {
  279. s.doValue("m_binary", offsetof(ShaderProgramBinaryCodeBlock, m_binary), self.m_binary);
  280. s.doValue("m_hash", offsetof(ShaderProgramBinaryCodeBlock, m_hash), self.m_hash);
  281. }
  282. template<typename TDeserializer>
  283. void deserialize(TDeserializer& deserializer)
  284. {
  285. serializeCommon<TDeserializer, ShaderProgramBinaryCodeBlock&>(deserializer, *this);
  286. }
  287. template<typename TSerializer>
  288. void serialize(TSerializer& serializer) const
  289. {
  290. serializeCommon<TSerializer, const ShaderProgramBinaryCodeBlock&>(serializer, *this);
  291. }
  292. };
  293. /// ShaderProgramBinaryMutation class.
  294. class ShaderProgramBinaryMutation
  295. {
  296. public:
  297. WeakArray<MutatorValue> m_values;
  298. U32 m_variantIndex = MAX_U32;
  299. U64 m_hash = 0; ///< Mutation hash.
  300. template<typename TSerializer, typename TClass>
  301. static void serializeCommon(TSerializer& s, TClass self)
  302. {
  303. s.doValue("m_values", offsetof(ShaderProgramBinaryMutation, m_values), self.m_values);
  304. s.doValue("m_variantIndex", offsetof(ShaderProgramBinaryMutation, m_variantIndex), self.m_variantIndex);
  305. s.doValue("m_hash", offsetof(ShaderProgramBinaryMutation, m_hash), self.m_hash);
  306. }
  307. template<typename TDeserializer>
  308. void deserialize(TDeserializer& deserializer)
  309. {
  310. serializeCommon<TDeserializer, ShaderProgramBinaryMutation&>(deserializer, *this);
  311. }
  312. template<typename TSerializer>
  313. void serialize(TSerializer& serializer) const
  314. {
  315. serializeCommon<TSerializer, const ShaderProgramBinaryMutation&>(serializer, *this);
  316. }
  317. };
  318. /// ShaderProgramBinary class.
  319. class ShaderProgramBinary
  320. {
  321. public:
  322. Array<U8, 8> m_magic = {};
  323. WeakArray<ShaderProgramBinaryMutator> m_mutators;
  324. WeakArray<ShaderProgramBinaryCodeBlock> m_codeBlocks;
  325. WeakArray<ShaderProgramBinaryVariant> m_variants;
  326. WeakArray<ShaderProgramBinaryMutation> m_mutations; ///< It's sorted using the mutation's hash.
  327. WeakArray<ShaderProgramBinaryBlock> m_uniformBlocks;
  328. WeakArray<ShaderProgramBinaryBlock> m_storageBlocks;
  329. ShaderProgramBinaryBlock* m_pushConstantBlock = nullptr;
  330. WeakArray<ShaderProgramBinaryOpaque> m_opaques;
  331. WeakArray<ShaderProgramBinaryConstant> m_constants;
  332. ShaderTypeBit m_presentShaderTypes = ShaderTypeBit::NONE;
  333. Array<char, 64> m_libraryName = {}; ///< The name of the shader library. Mainly for RT shaders.
  334. U32 m_rayType = MAX_U32; ///< An arbitary number indicating the type of the ray.
  335. template<typename TSerializer, typename TClass>
  336. static void serializeCommon(TSerializer& s, TClass self)
  337. {
  338. s.doArray("m_magic", offsetof(ShaderProgramBinary, m_magic), &self.m_magic[0], self.m_magic.getSize());
  339. s.doValue("m_mutators", offsetof(ShaderProgramBinary, m_mutators), self.m_mutators);
  340. s.doValue("m_codeBlocks", offsetof(ShaderProgramBinary, m_codeBlocks), self.m_codeBlocks);
  341. s.doValue("m_variants", offsetof(ShaderProgramBinary, m_variants), self.m_variants);
  342. s.doValue("m_mutations", offsetof(ShaderProgramBinary, m_mutations), self.m_mutations);
  343. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinary, m_uniformBlocks), self.m_uniformBlocks);
  344. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinary, m_storageBlocks), self.m_storageBlocks);
  345. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinary, m_pushConstantBlock),
  346. self.m_pushConstantBlock);
  347. s.doValue("m_opaques", offsetof(ShaderProgramBinary, m_opaques), self.m_opaques);
  348. s.doValue("m_constants", offsetof(ShaderProgramBinary, m_constants), self.m_constants);
  349. s.doValue("m_presentShaderTypes", offsetof(ShaderProgramBinary, m_presentShaderTypes),
  350. self.m_presentShaderTypes);
  351. s.doArray("m_libraryName", offsetof(ShaderProgramBinary, m_libraryName), &self.m_libraryName[0],
  352. self.m_libraryName.getSize());
  353. s.doValue("m_rayType", offsetof(ShaderProgramBinary, m_rayType), self.m_rayType);
  354. }
  355. template<typename TDeserializer>
  356. void deserialize(TDeserializer& deserializer)
  357. {
  358. serializeCommon<TDeserializer, ShaderProgramBinary&>(deserializer, *this);
  359. }
  360. template<typename TSerializer>
  361. void serialize(TSerializer& serializer) const
  362. {
  363. serializeCommon<TSerializer, const ShaderProgramBinary&>(serializer, *this);
  364. }
  365. };
  366. } // end namespace anki