ShaderProgramBinary.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. // Copyright (C) 2009-2022, 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. /// Storage or uniform variable.
  12. class ShaderProgramBinaryVariable
  13. {
  14. public:
  15. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  16. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  17. template<typename TSerializer, typename TClass>
  18. static void serializeCommon(TSerializer& s, TClass self)
  19. {
  20. s.doArray("m_name", offsetof(ShaderProgramBinaryVariable, m_name), &self.m_name[0], self.m_name.getSize());
  21. s.doValue("m_type", offsetof(ShaderProgramBinaryVariable, m_type), self.m_type);
  22. }
  23. template<typename TDeserializer>
  24. void deserialize(TDeserializer& deserializer)
  25. {
  26. serializeCommon<TDeserializer, ShaderProgramBinaryVariable&>(deserializer, *this);
  27. }
  28. template<typename TSerializer>
  29. void serialize(TSerializer& serializer) const
  30. {
  31. serializeCommon<TSerializer, const ShaderProgramBinaryVariable&>(serializer, *this);
  32. }
  33. };
  34. /// Storage or uniform variable per variant.
  35. class ShaderProgramBinaryVariableInstance
  36. {
  37. public:
  38. /// Points to ShaderProgramBinaryBlock::m_variables.
  39. U32 m_index = MAX_U32;
  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. /// Points to ShaderProgramBinary::m_uniformBlocks or m_storageBlocks.
  90. U32 m_index = MAX_U32;
  91. WeakArray<ShaderProgramBinaryVariableInstance> m_variableInstances;
  92. U32 m_size = MAX_U32;
  93. template<typename TSerializer, typename TClass>
  94. static void serializeCommon(TSerializer& s, TClass self)
  95. {
  96. s.doValue("m_index", offsetof(ShaderProgramBinaryBlockInstance, m_index), self.m_index);
  97. s.doValue("m_variableInstances", offsetof(ShaderProgramBinaryBlockInstance, m_variableInstances),
  98. self.m_variableInstances);
  99. s.doValue("m_size", offsetof(ShaderProgramBinaryBlockInstance, m_size), self.m_size);
  100. }
  101. template<typename TDeserializer>
  102. void deserialize(TDeserializer& deserializer)
  103. {
  104. serializeCommon<TDeserializer, ShaderProgramBinaryBlockInstance&>(deserializer, *this);
  105. }
  106. template<typename TSerializer>
  107. void serialize(TSerializer& serializer) const
  108. {
  109. serializeCommon<TSerializer, const ShaderProgramBinaryBlockInstance&>(serializer, *this);
  110. }
  111. };
  112. /// Sampler or texture or image.
  113. class ShaderProgramBinaryOpaque
  114. {
  115. public:
  116. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  117. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  118. U32 m_binding = MAX_U32;
  119. U32 m_set = MAX_U32;
  120. template<typename TSerializer, typename TClass>
  121. static void serializeCommon(TSerializer& s, TClass self)
  122. {
  123. s.doArray("m_name", offsetof(ShaderProgramBinaryOpaque, m_name), &self.m_name[0], self.m_name.getSize());
  124. s.doValue("m_type", offsetof(ShaderProgramBinaryOpaque, m_type), self.m_type);
  125. s.doValue("m_binding", offsetof(ShaderProgramBinaryOpaque, m_binding), self.m_binding);
  126. s.doValue("m_set", offsetof(ShaderProgramBinaryOpaque, m_set), self.m_set);
  127. }
  128. template<typename TDeserializer>
  129. void deserialize(TDeserializer& deserializer)
  130. {
  131. serializeCommon<TDeserializer, ShaderProgramBinaryOpaque&>(deserializer, *this);
  132. }
  133. template<typename TSerializer>
  134. void serialize(TSerializer& serializer) const
  135. {
  136. serializeCommon<TSerializer, const ShaderProgramBinaryOpaque&>(serializer, *this);
  137. }
  138. };
  139. /// Sampler or texture or image per variant.
  140. class ShaderProgramBinaryOpaqueInstance
  141. {
  142. public:
  143. /// Points to ShaderProgramBinary::m_opaques.
  144. U32 m_index = MAX_U32;
  145. U32 m_arraySize = MAX_U32;
  146. template<typename TSerializer, typename TClass>
  147. static void serializeCommon(TSerializer& s, TClass self)
  148. {
  149. s.doValue("m_index", offsetof(ShaderProgramBinaryOpaqueInstance, m_index), self.m_index);
  150. s.doValue("m_arraySize", offsetof(ShaderProgramBinaryOpaqueInstance, m_arraySize), self.m_arraySize);
  151. }
  152. template<typename TDeserializer>
  153. void deserialize(TDeserializer& deserializer)
  154. {
  155. serializeCommon<TDeserializer, ShaderProgramBinaryOpaqueInstance&>(deserializer, *this);
  156. }
  157. template<typename TSerializer>
  158. void serialize(TSerializer& serializer) const
  159. {
  160. serializeCommon<TSerializer, const ShaderProgramBinaryOpaqueInstance&>(serializer, *this);
  161. }
  162. };
  163. /// Specialization constant.
  164. class ShaderProgramBinaryConstant
  165. {
  166. public:
  167. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name;
  168. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  169. U32 m_constantId = MAX_U32;
  170. template<typename TSerializer, typename TClass>
  171. static void serializeCommon(TSerializer& s, TClass self)
  172. {
  173. s.doArray("m_name", offsetof(ShaderProgramBinaryConstant, m_name), &self.m_name[0], self.m_name.getSize());
  174. s.doValue("m_type", offsetof(ShaderProgramBinaryConstant, m_type), self.m_type);
  175. s.doValue("m_constantId", offsetof(ShaderProgramBinaryConstant, m_constantId), self.m_constantId);
  176. }
  177. template<typename TDeserializer>
  178. void deserialize(TDeserializer& deserializer)
  179. {
  180. serializeCommon<TDeserializer, ShaderProgramBinaryConstant&>(deserializer, *this);
  181. }
  182. template<typename TSerializer>
  183. void serialize(TSerializer& serializer) const
  184. {
  185. serializeCommon<TSerializer, const ShaderProgramBinaryConstant&>(serializer, *this);
  186. }
  187. };
  188. /// Specialization constant per variant.
  189. class ShaderProgramBinaryConstantInstance
  190. {
  191. public:
  192. /// Points to ShaderProgramBinary::m_constants.
  193. U32 m_index = MAX_U32;
  194. template<typename TSerializer, typename TClass>
  195. static void serializeCommon(TSerializer& s, TClass self)
  196. {
  197. s.doValue("m_index", offsetof(ShaderProgramBinaryConstantInstance, m_index), self.m_index);
  198. }
  199. template<typename TDeserializer>
  200. void deserialize(TDeserializer& deserializer)
  201. {
  202. serializeCommon<TDeserializer, ShaderProgramBinaryConstantInstance&>(deserializer, *this);
  203. }
  204. template<typename TSerializer>
  205. void serialize(TSerializer& serializer) const
  206. {
  207. serializeCommon<TSerializer, const ShaderProgramBinaryConstantInstance&>(serializer, *this);
  208. }
  209. };
  210. /// A member of a ShaderProgramBinaryStruct.
  211. class ShaderProgramBinaryStructMember
  212. {
  213. public:
  214. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  215. /// If the value is ShaderVariableDataType::NONE then it's a struct.
  216. ShaderVariableDataType m_type = ShaderVariableDataType::NONE;
  217. /// If the type is another struct then this points to ShaderProgramBinary::m_structs.
  218. U32 m_structIndex = MAX_U32;
  219. /// It points to a ShaderProgramBinary::m_mutators. This mutator will turn on or off this member.
  220. U32 m_dependentMutator = MAX_U32;
  221. /// The value of the m_dependentMutator.
  222. MutatorValue m_dependentMutatorValue = 0;
  223. template<typename TSerializer, typename TClass>
  224. static void serializeCommon(TSerializer& s, TClass self)
  225. {
  226. s.doArray("m_name", offsetof(ShaderProgramBinaryStructMember, m_name), &self.m_name[0], self.m_name.getSize());
  227. s.doValue("m_type", offsetof(ShaderProgramBinaryStructMember, m_type), self.m_type);
  228. s.doValue("m_structIndex", offsetof(ShaderProgramBinaryStructMember, m_structIndex), self.m_structIndex);
  229. s.doValue("m_dependentMutator", offsetof(ShaderProgramBinaryStructMember, m_dependentMutator),
  230. self.m_dependentMutator);
  231. s.doValue("m_dependentMutatorValue", offsetof(ShaderProgramBinaryStructMember, m_dependentMutatorValue),
  232. self.m_dependentMutatorValue);
  233. }
  234. template<typename TDeserializer>
  235. void deserialize(TDeserializer& deserializer)
  236. {
  237. serializeCommon<TDeserializer, ShaderProgramBinaryStructMember&>(deserializer, *this);
  238. }
  239. template<typename TSerializer>
  240. void serialize(TSerializer& serializer) const
  241. {
  242. serializeCommon<TSerializer, const ShaderProgramBinaryStructMember&>(serializer, *this);
  243. }
  244. };
  245. /// Struct member per variant.
  246. class ShaderProgramBinaryStructMemberInstance
  247. {
  248. public:
  249. /// Points to ShaderProgramBinary::m_structs.
  250. U32 m_index = MAX_U32;
  251. /// The offset of the member in the struct.
  252. U32 m_offset = MAX_U32;
  253. U32 m_arraySize = MAX_U32;
  254. template<typename TSerializer, typename TClass>
  255. static void serializeCommon(TSerializer& s, TClass self)
  256. {
  257. s.doValue("m_index", offsetof(ShaderProgramBinaryStructMemberInstance, m_index), self.m_index);
  258. s.doValue("m_offset", offsetof(ShaderProgramBinaryStructMemberInstance, m_offset), self.m_offset);
  259. s.doValue("m_arraySize", offsetof(ShaderProgramBinaryStructMemberInstance, m_arraySize), self.m_arraySize);
  260. }
  261. template<typename TDeserializer>
  262. void deserialize(TDeserializer& deserializer)
  263. {
  264. serializeCommon<TDeserializer, ShaderProgramBinaryStructMemberInstance&>(deserializer, *this);
  265. }
  266. template<typename TSerializer>
  267. void serialize(TSerializer& serializer) const
  268. {
  269. serializeCommon<TSerializer, const ShaderProgramBinaryStructMemberInstance&>(serializer, *this);
  270. }
  271. };
  272. /// A type that is a structure.
  273. class ShaderProgramBinaryStruct
  274. {
  275. public:
  276. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name;
  277. WeakArray<ShaderProgramBinaryStructMember> m_members;
  278. template<typename TSerializer, typename TClass>
  279. static void serializeCommon(TSerializer& s, TClass self)
  280. {
  281. s.doArray("m_name", offsetof(ShaderProgramBinaryStruct, m_name), &self.m_name[0], self.m_name.getSize());
  282. s.doValue("m_members", offsetof(ShaderProgramBinaryStruct, m_members), self.m_members);
  283. }
  284. template<typename TDeserializer>
  285. void deserialize(TDeserializer& deserializer)
  286. {
  287. serializeCommon<TDeserializer, ShaderProgramBinaryStruct&>(deserializer, *this);
  288. }
  289. template<typename TSerializer>
  290. void serialize(TSerializer& serializer) const
  291. {
  292. serializeCommon<TSerializer, const ShaderProgramBinaryStruct&>(serializer, *this);
  293. }
  294. };
  295. /// Structure type per variant.
  296. class ShaderProgramBinaryStructInstance
  297. {
  298. public:
  299. /// Points to ShaderProgramBinary::m_structs.
  300. U32 m_index;
  301. WeakArray<ShaderProgramBinaryStructMemberInstance> m_memberInstances;
  302. U32 m_size = MAX_U32;
  303. template<typename TSerializer, typename TClass>
  304. static void serializeCommon(TSerializer& s, TClass self)
  305. {
  306. s.doValue("m_index", offsetof(ShaderProgramBinaryStructInstance, m_index), self.m_index);
  307. s.doValue("m_memberInstances", offsetof(ShaderProgramBinaryStructInstance, m_memberInstances),
  308. self.m_memberInstances);
  309. s.doValue("m_size", offsetof(ShaderProgramBinaryStructInstance, m_size), self.m_size);
  310. }
  311. template<typename TDeserializer>
  312. void deserialize(TDeserializer& deserializer)
  313. {
  314. serializeCommon<TDeserializer, ShaderProgramBinaryStructInstance&>(deserializer, *this);
  315. }
  316. template<typename TSerializer>
  317. void serialize(TSerializer& serializer) const
  318. {
  319. serializeCommon<TSerializer, const ShaderProgramBinaryStructInstance&>(serializer, *this);
  320. }
  321. };
  322. /// ShaderProgramBinaryVariant class.
  323. class ShaderProgramBinaryVariant
  324. {
  325. public:
  326. /// Index in ShaderProgramBinary::m_codeBlocks. MAX_U32 means no shader.
  327. Array<U32, U32(ShaderType::COUNT)> m_codeBlockIndices = {};
  328. WeakArray<ShaderProgramBinaryBlockInstance> m_uniformBlocks;
  329. WeakArray<ShaderProgramBinaryBlockInstance> m_storageBlocks;
  330. ShaderProgramBinaryBlockInstance* m_pushConstantBlock = nullptr;
  331. WeakArray<ShaderProgramBinaryOpaqueInstance> m_opaques;
  332. WeakArray<ShaderProgramBinaryConstantInstance> m_constants;
  333. WeakArray<ShaderProgramBinaryStructInstance> m_structs;
  334. Array<U32, 3> m_workgroupSizes = {MAX_U32, MAX_U32, MAX_U32};
  335. /// Indices to ShaderProgramBinary::m_constants.
  336. Array<U32, 3> m_workgroupSizesConstants = {MAX_U32, MAX_U32, MAX_U32};
  337. template<typename TSerializer, typename TClass>
  338. static void serializeCommon(TSerializer& s, TClass self)
  339. {
  340. s.doArray("m_codeBlockIndices", offsetof(ShaderProgramBinaryVariant, m_codeBlockIndices),
  341. &self.m_codeBlockIndices[0], self.m_codeBlockIndices.getSize());
  342. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinaryVariant, m_uniformBlocks), self.m_uniformBlocks);
  343. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinaryVariant, m_storageBlocks), self.m_storageBlocks);
  344. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinaryVariant, m_pushConstantBlock),
  345. self.m_pushConstantBlock);
  346. s.doValue("m_opaques", offsetof(ShaderProgramBinaryVariant, m_opaques), self.m_opaques);
  347. s.doValue("m_constants", offsetof(ShaderProgramBinaryVariant, m_constants), self.m_constants);
  348. s.doValue("m_structs", offsetof(ShaderProgramBinaryVariant, m_structs), self.m_structs);
  349. s.doArray("m_workgroupSizes", offsetof(ShaderProgramBinaryVariant, m_workgroupSizes), &self.m_workgroupSizes[0],
  350. self.m_workgroupSizes.getSize());
  351. s.doArray("m_workgroupSizesConstants", offsetof(ShaderProgramBinaryVariant, m_workgroupSizesConstants),
  352. &self.m_workgroupSizesConstants[0], self.m_workgroupSizesConstants.getSize());
  353. }
  354. template<typename TDeserializer>
  355. void deserialize(TDeserializer& deserializer)
  356. {
  357. serializeCommon<TDeserializer, ShaderProgramBinaryVariant&>(deserializer, *this);
  358. }
  359. template<typename TSerializer>
  360. void serialize(TSerializer& serializer) const
  361. {
  362. serializeCommon<TSerializer, const ShaderProgramBinaryVariant&>(serializer, *this);
  363. }
  364. };
  365. /// Shader program mutator.
  366. class ShaderProgramBinaryMutator
  367. {
  368. public:
  369. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  370. WeakArray<MutatorValue> m_values;
  371. template<typename TSerializer, typename TClass>
  372. static void serializeCommon(TSerializer& s, TClass self)
  373. {
  374. s.doArray("m_name", offsetof(ShaderProgramBinaryMutator, m_name), &self.m_name[0], self.m_name.getSize());
  375. s.doValue("m_values", offsetof(ShaderProgramBinaryMutator, m_values), self.m_values);
  376. }
  377. template<typename TDeserializer>
  378. void deserialize(TDeserializer& deserializer)
  379. {
  380. serializeCommon<TDeserializer, ShaderProgramBinaryMutator&>(deserializer, *this);
  381. }
  382. template<typename TSerializer>
  383. void serialize(TSerializer& serializer) const
  384. {
  385. serializeCommon<TSerializer, const ShaderProgramBinaryMutator&>(serializer, *this);
  386. }
  387. };
  388. /// Contains the IR (SPIR-V).
  389. class ShaderProgramBinaryCodeBlock
  390. {
  391. public:
  392. WeakArray<U8> m_binary;
  393. U64 m_hash = 0;
  394. template<typename TSerializer, typename TClass>
  395. static void serializeCommon(TSerializer& s, TClass self)
  396. {
  397. s.doValue("m_binary", offsetof(ShaderProgramBinaryCodeBlock, m_binary), self.m_binary);
  398. s.doValue("m_hash", offsetof(ShaderProgramBinaryCodeBlock, m_hash), self.m_hash);
  399. }
  400. template<typename TDeserializer>
  401. void deserialize(TDeserializer& deserializer)
  402. {
  403. serializeCommon<TDeserializer, ShaderProgramBinaryCodeBlock&>(deserializer, *this);
  404. }
  405. template<typename TSerializer>
  406. void serialize(TSerializer& serializer) const
  407. {
  408. serializeCommon<TSerializer, const ShaderProgramBinaryCodeBlock&>(serializer, *this);
  409. }
  410. };
  411. /// A mutation is a unique combination of mutator values.
  412. class ShaderProgramBinaryMutation
  413. {
  414. public:
  415. WeakArray<MutatorValue> m_values;
  416. /// Points to ShaderProgramBinary::m_variants.
  417. U32 m_variantIndex = MAX_U32;
  418. /// Mutation hash.
  419. U64 m_hash = 0;
  420. template<typename TSerializer, typename TClass>
  421. static void serializeCommon(TSerializer& s, TClass self)
  422. {
  423. s.doValue("m_values", offsetof(ShaderProgramBinaryMutation, m_values), self.m_values);
  424. s.doValue("m_variantIndex", offsetof(ShaderProgramBinaryMutation, m_variantIndex), self.m_variantIndex);
  425. s.doValue("m_hash", offsetof(ShaderProgramBinaryMutation, m_hash), self.m_hash);
  426. }
  427. template<typename TDeserializer>
  428. void deserialize(TDeserializer& deserializer)
  429. {
  430. serializeCommon<TDeserializer, ShaderProgramBinaryMutation&>(deserializer, *this);
  431. }
  432. template<typename TSerializer>
  433. void serialize(TSerializer& serializer) const
  434. {
  435. serializeCommon<TSerializer, const ShaderProgramBinaryMutation&>(serializer, *this);
  436. }
  437. };
  438. /// ShaderProgramBinary class.
  439. class ShaderProgramBinary
  440. {
  441. public:
  442. Array<U8, 8> m_magic = {};
  443. WeakArray<ShaderProgramBinaryMutator> m_mutators;
  444. WeakArray<ShaderProgramBinaryCodeBlock> m_codeBlocks;
  445. WeakArray<ShaderProgramBinaryVariant> m_variants;
  446. /// It's sorted using the mutation's hash.
  447. WeakArray<ShaderProgramBinaryMutation> m_mutations;
  448. WeakArray<ShaderProgramBinaryBlock> m_uniformBlocks;
  449. WeakArray<ShaderProgramBinaryBlock> m_storageBlocks;
  450. ShaderProgramBinaryBlock* m_pushConstantBlock = nullptr;
  451. WeakArray<ShaderProgramBinaryOpaque> m_opaques;
  452. WeakArray<ShaderProgramBinaryConstant> m_constants;
  453. WeakArray<ShaderProgramBinaryStruct> m_structs;
  454. ShaderTypeBit m_presentShaderTypes = ShaderTypeBit::NONE;
  455. /// The name of the shader library. Mainly for RT shaders.
  456. Array<char, 64> m_libraryName = {};
  457. /// An arbitary number indicating the type of the ray.
  458. U32 m_rayType = MAX_U32;
  459. template<typename TSerializer, typename TClass>
  460. static void serializeCommon(TSerializer& s, TClass self)
  461. {
  462. s.doArray("m_magic", offsetof(ShaderProgramBinary, m_magic), &self.m_magic[0], self.m_magic.getSize());
  463. s.doValue("m_mutators", offsetof(ShaderProgramBinary, m_mutators), self.m_mutators);
  464. s.doValue("m_codeBlocks", offsetof(ShaderProgramBinary, m_codeBlocks), self.m_codeBlocks);
  465. s.doValue("m_variants", offsetof(ShaderProgramBinary, m_variants), self.m_variants);
  466. s.doValue("m_mutations", offsetof(ShaderProgramBinary, m_mutations), self.m_mutations);
  467. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinary, m_uniformBlocks), self.m_uniformBlocks);
  468. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinary, m_storageBlocks), self.m_storageBlocks);
  469. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinary, m_pushConstantBlock),
  470. self.m_pushConstantBlock);
  471. s.doValue("m_opaques", offsetof(ShaderProgramBinary, m_opaques), self.m_opaques);
  472. s.doValue("m_constants", offsetof(ShaderProgramBinary, m_constants), self.m_constants);
  473. s.doValue("m_structs", offsetof(ShaderProgramBinary, m_structs), self.m_structs);
  474. s.doValue("m_presentShaderTypes", offsetof(ShaderProgramBinary, m_presentShaderTypes),
  475. self.m_presentShaderTypes);
  476. s.doArray("m_libraryName", offsetof(ShaderProgramBinary, m_libraryName), &self.m_libraryName[0],
  477. self.m_libraryName.getSize());
  478. s.doValue("m_rayType", offsetof(ShaderProgramBinary, m_rayType), self.m_rayType);
  479. }
  480. template<typename TDeserializer>
  481. void deserialize(TDeserializer& deserializer)
  482. {
  483. serializeCommon<TDeserializer, ShaderProgramBinary&>(deserializer, *this);
  484. }
  485. template<typename TSerializer>
  486. void serialize(TSerializer& serializer) const
  487. {
  488. serializeCommon<TSerializer, const ShaderProgramBinary&>(serializer, *this);
  489. }
  490. };
  491. } // end namespace anki