ShaderProgramBinary.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  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. /// 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. template<typename TSerializer, typename TClass>
  220. static void serializeCommon(TSerializer& s, TClass self)
  221. {
  222. s.doArray("m_name", offsetof(ShaderProgramBinaryStructMember, m_name), &self.m_name[0], self.m_name.getSize());
  223. s.doValue("m_type", offsetof(ShaderProgramBinaryStructMember, m_type), self.m_type);
  224. s.doValue("m_structIndex", offsetof(ShaderProgramBinaryStructMember, m_structIndex), self.m_structIndex);
  225. }
  226. template<typename TDeserializer>
  227. void deserialize(TDeserializer& deserializer)
  228. {
  229. serializeCommon<TDeserializer, ShaderProgramBinaryStructMember&>(deserializer, *this);
  230. }
  231. template<typename TSerializer>
  232. void serialize(TSerializer& serializer) const
  233. {
  234. serializeCommon<TSerializer, const ShaderProgramBinaryStructMember&>(serializer, *this);
  235. }
  236. };
  237. /// Struct member per variant.
  238. class ShaderProgramBinaryStructMemberInstance
  239. {
  240. public:
  241. /// Points to ShaderProgramBinary::m_structs.
  242. U32 m_index = MAX_U32;
  243. /// The offset of the member in the struct.
  244. U32 m_offset = MAX_U32;
  245. U32 m_arraySize = MAX_U32;
  246. template<typename TSerializer, typename TClass>
  247. static void serializeCommon(TSerializer& s, TClass self)
  248. {
  249. s.doValue("m_index", offsetof(ShaderProgramBinaryStructMemberInstance, m_index), self.m_index);
  250. s.doValue("m_offset", offsetof(ShaderProgramBinaryStructMemberInstance, m_offset), self.m_offset);
  251. s.doValue("m_arraySize", offsetof(ShaderProgramBinaryStructMemberInstance, m_arraySize), self.m_arraySize);
  252. }
  253. template<typename TDeserializer>
  254. void deserialize(TDeserializer& deserializer)
  255. {
  256. serializeCommon<TDeserializer, ShaderProgramBinaryStructMemberInstance&>(deserializer, *this);
  257. }
  258. template<typename TSerializer>
  259. void serialize(TSerializer& serializer) const
  260. {
  261. serializeCommon<TSerializer, const ShaderProgramBinaryStructMemberInstance&>(serializer, *this);
  262. }
  263. };
  264. /// A type that is a structure.
  265. class ShaderProgramBinaryStruct
  266. {
  267. public:
  268. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name;
  269. WeakArray<ShaderProgramBinaryStructMember> m_members;
  270. template<typename TSerializer, typename TClass>
  271. static void serializeCommon(TSerializer& s, TClass self)
  272. {
  273. s.doArray("m_name", offsetof(ShaderProgramBinaryStruct, m_name), &self.m_name[0], self.m_name.getSize());
  274. s.doValue("m_members", offsetof(ShaderProgramBinaryStruct, m_members), self.m_members);
  275. }
  276. template<typename TDeserializer>
  277. void deserialize(TDeserializer& deserializer)
  278. {
  279. serializeCommon<TDeserializer, ShaderProgramBinaryStruct&>(deserializer, *this);
  280. }
  281. template<typename TSerializer>
  282. void serialize(TSerializer& serializer) const
  283. {
  284. serializeCommon<TSerializer, const ShaderProgramBinaryStruct&>(serializer, *this);
  285. }
  286. };
  287. /// Structure type per variant.
  288. class ShaderProgramBinaryStructInstance
  289. {
  290. public:
  291. /// Points to ShaderProgramBinary::m_structs.
  292. U32 m_index;
  293. WeakArray<ShaderProgramBinaryStructMemberInstance> m_memberInstances;
  294. U32 m_size = MAX_U32;
  295. template<typename TSerializer, typename TClass>
  296. static void serializeCommon(TSerializer& s, TClass self)
  297. {
  298. s.doValue("m_index", offsetof(ShaderProgramBinaryStructInstance, m_index), self.m_index);
  299. s.doValue("m_memberInstances", offsetof(ShaderProgramBinaryStructInstance, m_memberInstances),
  300. self.m_memberInstances);
  301. s.doValue("m_size", offsetof(ShaderProgramBinaryStructInstance, m_size), self.m_size);
  302. }
  303. template<typename TDeserializer>
  304. void deserialize(TDeserializer& deserializer)
  305. {
  306. serializeCommon<TDeserializer, ShaderProgramBinaryStructInstance&>(deserializer, *this);
  307. }
  308. template<typename TSerializer>
  309. void serialize(TSerializer& serializer) const
  310. {
  311. serializeCommon<TSerializer, const ShaderProgramBinaryStructInstance&>(serializer, *this);
  312. }
  313. };
  314. /// ShaderProgramBinaryVariant class.
  315. class ShaderProgramBinaryVariant
  316. {
  317. public:
  318. /// Index in ShaderProgramBinary::m_codeBlocks. MAX_U32 means no shader.
  319. Array<U32, U32(ShaderType::COUNT)> m_codeBlockIndices = {};
  320. WeakArray<ShaderProgramBinaryBlockInstance> m_uniformBlocks;
  321. WeakArray<ShaderProgramBinaryBlockInstance> m_storageBlocks;
  322. ShaderProgramBinaryBlockInstance* m_pushConstantBlock = nullptr;
  323. WeakArray<ShaderProgramBinaryOpaqueInstance> m_opaques;
  324. WeakArray<ShaderProgramBinaryConstantInstance> m_constants;
  325. WeakArray<ShaderProgramBinaryStructInstance> m_structs;
  326. Array<U32, 3> m_workgroupSizes = {MAX_U32, MAX_U32, MAX_U32};
  327. /// Indices to ShaderProgramBinary::m_constants.
  328. Array<U32, 3> m_workgroupSizesConstants = {MAX_U32, MAX_U32, MAX_U32};
  329. template<typename TSerializer, typename TClass>
  330. static void serializeCommon(TSerializer& s, TClass self)
  331. {
  332. s.doArray("m_codeBlockIndices", offsetof(ShaderProgramBinaryVariant, m_codeBlockIndices),
  333. &self.m_codeBlockIndices[0], self.m_codeBlockIndices.getSize());
  334. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinaryVariant, m_uniformBlocks), self.m_uniformBlocks);
  335. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinaryVariant, m_storageBlocks), self.m_storageBlocks);
  336. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinaryVariant, m_pushConstantBlock),
  337. self.m_pushConstantBlock);
  338. s.doValue("m_opaques", offsetof(ShaderProgramBinaryVariant, m_opaques), self.m_opaques);
  339. s.doValue("m_constants", offsetof(ShaderProgramBinaryVariant, m_constants), self.m_constants);
  340. s.doValue("m_structs", offsetof(ShaderProgramBinaryVariant, m_structs), self.m_structs);
  341. s.doArray("m_workgroupSizes", offsetof(ShaderProgramBinaryVariant, m_workgroupSizes), &self.m_workgroupSizes[0],
  342. self.m_workgroupSizes.getSize());
  343. s.doArray("m_workgroupSizesConstants", offsetof(ShaderProgramBinaryVariant, m_workgroupSizesConstants),
  344. &self.m_workgroupSizesConstants[0], self.m_workgroupSizesConstants.getSize());
  345. }
  346. template<typename TDeserializer>
  347. void deserialize(TDeserializer& deserializer)
  348. {
  349. serializeCommon<TDeserializer, ShaderProgramBinaryVariant&>(deserializer, *this);
  350. }
  351. template<typename TSerializer>
  352. void serialize(TSerializer& serializer) const
  353. {
  354. serializeCommon<TSerializer, const ShaderProgramBinaryVariant&>(serializer, *this);
  355. }
  356. };
  357. /// Shader program mutator.
  358. class ShaderProgramBinaryMutator
  359. {
  360. public:
  361. Array<char, MAX_SHADER_BINARY_NAME_LENGTH + 1> m_name = {};
  362. WeakArray<MutatorValue> m_values;
  363. template<typename TSerializer, typename TClass>
  364. static void serializeCommon(TSerializer& s, TClass self)
  365. {
  366. s.doArray("m_name", offsetof(ShaderProgramBinaryMutator, m_name), &self.m_name[0], self.m_name.getSize());
  367. s.doValue("m_values", offsetof(ShaderProgramBinaryMutator, m_values), self.m_values);
  368. }
  369. template<typename TDeserializer>
  370. void deserialize(TDeserializer& deserializer)
  371. {
  372. serializeCommon<TDeserializer, ShaderProgramBinaryMutator&>(deserializer, *this);
  373. }
  374. template<typename TSerializer>
  375. void serialize(TSerializer& serializer) const
  376. {
  377. serializeCommon<TSerializer, const ShaderProgramBinaryMutator&>(serializer, *this);
  378. }
  379. };
  380. /// Contains the IR (SPIR-V).
  381. class ShaderProgramBinaryCodeBlock
  382. {
  383. public:
  384. WeakArray<U8> m_binary;
  385. U64 m_hash = 0;
  386. template<typename TSerializer, typename TClass>
  387. static void serializeCommon(TSerializer& s, TClass self)
  388. {
  389. s.doValue("m_binary", offsetof(ShaderProgramBinaryCodeBlock, m_binary), self.m_binary);
  390. s.doValue("m_hash", offsetof(ShaderProgramBinaryCodeBlock, m_hash), self.m_hash);
  391. }
  392. template<typename TDeserializer>
  393. void deserialize(TDeserializer& deserializer)
  394. {
  395. serializeCommon<TDeserializer, ShaderProgramBinaryCodeBlock&>(deserializer, *this);
  396. }
  397. template<typename TSerializer>
  398. void serialize(TSerializer& serializer) const
  399. {
  400. serializeCommon<TSerializer, const ShaderProgramBinaryCodeBlock&>(serializer, *this);
  401. }
  402. };
  403. /// A mutation is a unique combination of mutator values.
  404. class ShaderProgramBinaryMutation
  405. {
  406. public:
  407. WeakArray<MutatorValue> m_values;
  408. /// Points to ShaderProgramBinary::m_variants.
  409. U32 m_variantIndex = MAX_U32;
  410. /// Mutation hash.
  411. U64 m_hash = 0;
  412. template<typename TSerializer, typename TClass>
  413. static void serializeCommon(TSerializer& s, TClass self)
  414. {
  415. s.doValue("m_values", offsetof(ShaderProgramBinaryMutation, m_values), self.m_values);
  416. s.doValue("m_variantIndex", offsetof(ShaderProgramBinaryMutation, m_variantIndex), self.m_variantIndex);
  417. s.doValue("m_hash", offsetof(ShaderProgramBinaryMutation, m_hash), self.m_hash);
  418. }
  419. template<typename TDeserializer>
  420. void deserialize(TDeserializer& deserializer)
  421. {
  422. serializeCommon<TDeserializer, ShaderProgramBinaryMutation&>(deserializer, *this);
  423. }
  424. template<typename TSerializer>
  425. void serialize(TSerializer& serializer) const
  426. {
  427. serializeCommon<TSerializer, const ShaderProgramBinaryMutation&>(serializer, *this);
  428. }
  429. };
  430. /// ShaderProgramBinary class.
  431. class ShaderProgramBinary
  432. {
  433. public:
  434. Array<U8, 8> m_magic = {};
  435. WeakArray<ShaderProgramBinaryMutator> m_mutators;
  436. WeakArray<ShaderProgramBinaryCodeBlock> m_codeBlocks;
  437. WeakArray<ShaderProgramBinaryVariant> m_variants;
  438. /// It's sorted using the mutation's hash.
  439. WeakArray<ShaderProgramBinaryMutation> m_mutations;
  440. WeakArray<ShaderProgramBinaryBlock> m_uniformBlocks;
  441. WeakArray<ShaderProgramBinaryBlock> m_storageBlocks;
  442. ShaderProgramBinaryBlock* m_pushConstantBlock = nullptr;
  443. WeakArray<ShaderProgramBinaryOpaque> m_opaques;
  444. WeakArray<ShaderProgramBinaryConstant> m_constants;
  445. WeakArray<ShaderProgramBinaryStruct> m_structs;
  446. ShaderTypeBit m_presentShaderTypes = ShaderTypeBit::NONE;
  447. /// The name of the shader library. Mainly for RT shaders.
  448. Array<char, 64> m_libraryName = {};
  449. /// An arbitary number indicating the type of the ray.
  450. U32 m_rayType = MAX_U32;
  451. template<typename TSerializer, typename TClass>
  452. static void serializeCommon(TSerializer& s, TClass self)
  453. {
  454. s.doArray("m_magic", offsetof(ShaderProgramBinary, m_magic), &self.m_magic[0], self.m_magic.getSize());
  455. s.doValue("m_mutators", offsetof(ShaderProgramBinary, m_mutators), self.m_mutators);
  456. s.doValue("m_codeBlocks", offsetof(ShaderProgramBinary, m_codeBlocks), self.m_codeBlocks);
  457. s.doValue("m_variants", offsetof(ShaderProgramBinary, m_variants), self.m_variants);
  458. s.doValue("m_mutations", offsetof(ShaderProgramBinary, m_mutations), self.m_mutations);
  459. s.doValue("m_uniformBlocks", offsetof(ShaderProgramBinary, m_uniformBlocks), self.m_uniformBlocks);
  460. s.doValue("m_storageBlocks", offsetof(ShaderProgramBinary, m_storageBlocks), self.m_storageBlocks);
  461. s.doPointer("m_pushConstantBlock", offsetof(ShaderProgramBinary, m_pushConstantBlock),
  462. self.m_pushConstantBlock);
  463. s.doValue("m_opaques", offsetof(ShaderProgramBinary, m_opaques), self.m_opaques);
  464. s.doValue("m_constants", offsetof(ShaderProgramBinary, m_constants), self.m_constants);
  465. s.doValue("m_structs", offsetof(ShaderProgramBinary, m_structs), self.m_structs);
  466. s.doValue("m_presentShaderTypes", offsetof(ShaderProgramBinary, m_presentShaderTypes),
  467. self.m_presentShaderTypes);
  468. s.doArray("m_libraryName", offsetof(ShaderProgramBinary, m_libraryName), &self.m_libraryName[0],
  469. self.m_libraryName.getSize());
  470. s.doValue("m_rayType", offsetof(ShaderProgramBinary, m_rayType), self.m_rayType);
  471. }
  472. template<typename TDeserializer>
  473. void deserialize(TDeserializer& deserializer)
  474. {
  475. serializeCommon<TDeserializer, ShaderProgramBinary&>(deserializer, *this);
  476. }
  477. template<typename TSerializer>
  478. void serialize(TSerializer& serializer) const
  479. {
  480. serializeCommon<TSerializer, const ShaderProgramBinary&>(serializer, *this);
  481. }
  482. };
  483. } // end namespace anki