ShaderResourceGroupLayoutDescriptor.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
  9. #include <AzCore/Serialization/SerializeContext.h>
  10. #include <AzCore/Utils/TypeHash.h>
  11. namespace AZ::RHI
  12. {
  13. void ShaderInputBufferDescriptor::Reflect(ReflectContext* context)
  14. {
  15. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  16. {
  17. serializeContext->Class<ShaderInputBufferDescriptor>()
  18. ->Version(5)
  19. ->Field("m_name", &ShaderInputBufferDescriptor::m_name)
  20. ->Field("m_type", &ShaderInputBufferDescriptor::m_type)
  21. ->Field("m_access", &ShaderInputBufferDescriptor::m_access)
  22. ->Field("m_count", &ShaderInputBufferDescriptor::m_count)
  23. ->Field("m_strideSize", &ShaderInputBufferDescriptor::m_strideSize)
  24. ->Field("m_registerId", &ShaderInputBufferDescriptor::m_registerId)
  25. ->Field("m_spaceId", &ShaderInputBufferDescriptor::m_spaceId);
  26. }
  27. ShaderInputBufferIndex::Reflect(context);
  28. }
  29. ShaderInputBufferDescriptor::ShaderInputBufferDescriptor(
  30. const Name& name,
  31. ShaderInputBufferAccess access,
  32. ShaderInputBufferType type,
  33. uint32_t bufferCount,
  34. uint32_t strideSize,
  35. uint32_t registerId,
  36. uint32_t spaceId)
  37. : m_name{ name }
  38. , m_access{ access }
  39. , m_type{ type }
  40. , m_count{ bufferCount }
  41. , m_strideSize{ strideSize }
  42. , m_registerId{ registerId }
  43. , m_spaceId{ spaceId }
  44. {}
  45. HashValue64 ShaderInputBufferDescriptor::GetHash(HashValue64 seed) const
  46. {
  47. seed = TypeHash64(m_name.GetHash(), seed);
  48. seed = TypeHash64(m_access, seed);
  49. seed = TypeHash64(m_type, seed);
  50. seed = TypeHash64(m_count, seed);
  51. seed = TypeHash64(m_strideSize, seed);
  52. seed = TypeHash64(m_registerId, seed);
  53. return seed;
  54. }
  55. void ShaderInputImageDescriptor::Reflect(ReflectContext* context)
  56. {
  57. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  58. {
  59. serializeContext->Class<ShaderInputImageDescriptor>()
  60. ->Version(4)
  61. ->Field("m_name", &ShaderInputImageDescriptor::m_name)
  62. ->Field("m_type", &ShaderInputImageDescriptor::m_type)
  63. ->Field("m_access", &ShaderInputImageDescriptor::m_access)
  64. ->Field("m_count", &ShaderInputImageDescriptor::m_count)
  65. ->Field("m_registerId", &ShaderInputImageDescriptor::m_registerId)
  66. ->Field("m_spaceId", &ShaderInputImageDescriptor::m_spaceId);
  67. }
  68. ShaderInputImageIndex::Reflect(context);
  69. }
  70. ShaderInputImageDescriptor::ShaderInputImageDescriptor(
  71. const Name& name,
  72. ShaderInputImageAccess access,
  73. ShaderInputImageType type,
  74. uint32_t imageCount,
  75. uint32_t registerId,
  76. uint32_t spaceId)
  77. : m_name{ name }
  78. , m_access{ access }
  79. , m_type{ type }
  80. , m_count{ imageCount }
  81. , m_registerId{ registerId }
  82. , m_spaceId{ spaceId }
  83. {}
  84. HashValue64 ShaderInputImageDescriptor::GetHash(HashValue64 seed) const
  85. {
  86. seed = TypeHash64(m_name.GetHash(), seed);
  87. seed = TypeHash64(m_access, seed);
  88. seed = TypeHash64(m_type, seed);
  89. seed = TypeHash64(m_count, seed);
  90. seed = TypeHash64(m_registerId, seed);
  91. return seed;
  92. }
  93. void ShaderInputBufferUnboundedArrayDescriptor::Reflect(ReflectContext* context)
  94. {
  95. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  96. {
  97. serializeContext->Class<ShaderInputBufferUnboundedArrayDescriptor>()
  98. ->Version(2)
  99. ->Field("m_name", &ShaderInputBufferUnboundedArrayDescriptor::m_name)
  100. ->Field("m_type", &ShaderInputBufferUnboundedArrayDescriptor::m_type)
  101. ->Field("m_access", &ShaderInputBufferUnboundedArrayDescriptor::m_access)
  102. ->Field("m_strideSize", &ShaderInputBufferUnboundedArrayDescriptor::m_strideSize)
  103. ->Field("m_registerId", &ShaderInputBufferUnboundedArrayDescriptor::m_registerId)
  104. ->Field("m_spaceId", &ShaderInputBufferUnboundedArrayDescriptor::m_spaceId);
  105. }
  106. ShaderInputBufferUnboundedArrayIndex::Reflect(context);
  107. }
  108. ShaderInputBufferUnboundedArrayDescriptor::ShaderInputBufferUnboundedArrayDescriptor(
  109. const Name& name,
  110. ShaderInputBufferAccess access,
  111. ShaderInputBufferType type,
  112. uint32_t strideSize,
  113. uint32_t registerId,
  114. uint32_t spaceId)
  115. : m_name{ name }
  116. , m_access{ access }
  117. , m_type{ type }
  118. , m_strideSize { strideSize }
  119. , m_registerId{ registerId }
  120. , m_spaceId{ spaceId }
  121. {}
  122. HashValue64 ShaderInputBufferUnboundedArrayDescriptor::GetHash(HashValue64 seed) const
  123. {
  124. seed = TypeHash64(m_name.GetHash(), seed);
  125. seed = TypeHash64(m_access, seed);
  126. seed = TypeHash64(m_type, seed);
  127. seed = TypeHash64(m_strideSize, seed);
  128. seed = TypeHash64(m_registerId, seed);
  129. return seed;
  130. }
  131. void ShaderInputImageUnboundedArrayDescriptor::Reflect(ReflectContext* context)
  132. {
  133. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  134. {
  135. serializeContext->Class<ShaderInputImageUnboundedArrayDescriptor>()
  136. ->Version(2)
  137. ->Field("m_name", &ShaderInputImageUnboundedArrayDescriptor::m_name)
  138. ->Field("m_type", &ShaderInputImageUnboundedArrayDescriptor::m_type)
  139. ->Field("m_access", &ShaderInputImageUnboundedArrayDescriptor::m_access)
  140. ->Field("m_registerId", &ShaderInputImageUnboundedArrayDescriptor::m_registerId)
  141. ->Field("m_spaceId", &ShaderInputImageUnboundedArrayDescriptor::m_spaceId);
  142. }
  143. ShaderInputImageUnboundedArrayIndex::Reflect(context);
  144. }
  145. ShaderInputImageUnboundedArrayDescriptor::ShaderInputImageUnboundedArrayDescriptor(
  146. const Name& name,
  147. ShaderInputImageAccess access,
  148. ShaderInputImageType type,
  149. uint32_t registerId,
  150. uint32_t spaceId)
  151. : m_name{ name }
  152. , m_access{ access }
  153. , m_type { type }
  154. , m_registerId{ registerId }
  155. , m_spaceId{ spaceId }
  156. {}
  157. HashValue64 ShaderInputImageUnboundedArrayDescriptor::GetHash(HashValue64 seed) const
  158. {
  159. seed = TypeHash64(m_name.GetHash(), seed);
  160. seed = TypeHash64(m_access, seed);
  161. seed = TypeHash64(m_type, seed);
  162. seed = TypeHash64(m_registerId, seed);
  163. return seed;
  164. }
  165. void ShaderInputSamplerDescriptor::Reflect(ReflectContext* context)
  166. {
  167. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  168. {
  169. serializeContext->Class<ShaderInputSamplerDescriptor>()
  170. ->Version(4)
  171. ->Field("m_name", &ShaderInputSamplerDescriptor::m_name)
  172. ->Field("m_count", &ShaderInputSamplerDescriptor::m_count)
  173. ->Field("m_registerId", &ShaderInputSamplerDescriptor::m_registerId)
  174. ->Field("m_spaceId", &ShaderInputSamplerDescriptor::m_spaceId);
  175. }
  176. ShaderInputSamplerIndex::Reflect(context);
  177. }
  178. ShaderInputSamplerDescriptor::ShaderInputSamplerDescriptor(
  179. const Name& name,
  180. uint32_t samplerCount,
  181. uint32_t registerId,
  182. uint32_t spaceId)
  183. : m_name{ name }
  184. , m_count{ samplerCount }
  185. , m_registerId{ registerId }
  186. , m_spaceId{ spaceId }
  187. {}
  188. HashValue64 ShaderInputSamplerDescriptor::GetHash(HashValue64 seed) const
  189. {
  190. seed = TypeHash64(m_name.GetHash(), seed);
  191. seed = TypeHash64(m_count, seed);
  192. seed = TypeHash64(m_registerId, seed);
  193. return seed;
  194. }
  195. void ShaderInputConstantDescriptor::Reflect(ReflectContext* context)
  196. {
  197. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  198. {
  199. serializeContext->Class<ShaderInputConstantDescriptor>()
  200. ->Version(4)
  201. ->Field("m_name", &ShaderInputConstantDescriptor::m_name)
  202. ->Field("m_constantByteOffset", &ShaderInputConstantDescriptor::m_constantByteOffset)
  203. ->Field("m_constantByteCount", &ShaderInputConstantDescriptor::m_constantByteCount)
  204. ->Field("m_registerId", &ShaderInputConstantDescriptor::m_registerId)
  205. ->Field("m_spaceId", &ShaderInputConstantDescriptor::m_spaceId);
  206. }
  207. ShaderInputConstantIndex::Reflect(context);
  208. }
  209. ShaderInputConstantDescriptor::ShaderInputConstantDescriptor(
  210. const Name& name,
  211. uint32_t constantByteOffset,
  212. uint32_t constantByteCount,
  213. uint32_t registerId,
  214. uint32_t spaceId)
  215. : m_name{ name }
  216. , m_constantByteOffset{ constantByteOffset }
  217. , m_constantByteCount{ constantByteCount }
  218. , m_registerId{ registerId }
  219. , m_spaceId{ spaceId }
  220. {}
  221. HashValue64 ShaderInputConstantDescriptor::GetHash(HashValue64 seed) const
  222. {
  223. seed = TypeHash64(m_name.GetHash(), seed);
  224. seed = TypeHash64(m_constantByteOffset, seed);
  225. seed = TypeHash64(m_constantByteCount, seed);
  226. seed = TypeHash64(m_registerId, seed);
  227. return seed;
  228. }
  229. void ShaderInputStaticSamplerDescriptor::Reflect(ReflectContext* context)
  230. {
  231. if (SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context))
  232. {
  233. serializeContext->Class<ShaderInputStaticSamplerDescriptor>()
  234. ->Version(2)
  235. ->Field("m_name", &ShaderInputStaticSamplerDescriptor::m_name)
  236. ->Field("m_samplerState", &ShaderInputStaticSamplerDescriptor::m_samplerState)
  237. ->Field("m_registerId", &ShaderInputStaticSamplerDescriptor::m_registerId)
  238. ->Field("m_spaceId", &ShaderInputStaticSamplerDescriptor::m_spaceId);
  239. }
  240. ShaderInputStaticSamplerIndex::Reflect(context);
  241. }
  242. ShaderInputStaticSamplerDescriptor::ShaderInputStaticSamplerDescriptor(
  243. const Name& name, const SamplerState& samplerState, uint32_t registerId, uint32_t spaceId)
  244. : m_name{name}
  245. , m_samplerState{ samplerState }
  246. , m_registerId{ registerId }
  247. , m_spaceId{ spaceId }
  248. {}
  249. HashValue64 ShaderInputStaticSamplerDescriptor::GetHash(HashValue64 seed) const
  250. {
  251. seed = TypeHash64(m_name.GetHash(), seed);
  252. seed = m_samplerState.GetHash(seed);
  253. seed = TypeHash64(m_registerId, seed);
  254. return seed;
  255. }
  256. const char* GetShaderInputTypeName(ShaderInputBufferType bufferInputType)
  257. {
  258. switch (bufferInputType)
  259. {
  260. case ShaderInputBufferType::Structured:
  261. return "Structured";
  262. case ShaderInputBufferType::Typed:
  263. return "Typed";
  264. case ShaderInputBufferType::Raw:
  265. return "Raw";
  266. case ShaderInputBufferType::AccelerationStructure:
  267. return "AccelerationStructure";
  268. }
  269. return "";
  270. }
  271. const char* GetShaderInputTypeName(ShaderInputImageType imageInputType)
  272. {
  273. switch (imageInputType)
  274. {
  275. case ShaderInputImageType::Image1D:
  276. return "Image1D";
  277. case ShaderInputImageType::Image1DArray:
  278. return "Image1DArray";
  279. case ShaderInputImageType::Image2D:
  280. return "Image2D";
  281. case ShaderInputImageType::Image2DArray:
  282. return "Image2DArray";
  283. case ShaderInputImageType::Image2DMultisample:
  284. return "Image2DMultisample";
  285. case ShaderInputImageType::Image2DMultisampleArray:
  286. return "Image2DMultisampleArray";
  287. case ShaderInputImageType::Image3D:
  288. return "Image3D";
  289. case ShaderInputImageType::ImageCube:
  290. return "ImageCube";
  291. case ShaderInputImageType::ImageCubeArray:
  292. return "ImageCubeArray";
  293. case ShaderInputImageType::SubpassInput:
  294. return "SubpassInput";
  295. }
  296. return "";
  297. }
  298. const char* GetShaderInputAccessName(ShaderInputBufferAccess bufferInputAcces)
  299. {
  300. switch (bufferInputAcces)
  301. {
  302. case ShaderInputBufferAccess::Constant:
  303. return "BufferConstant";
  304. case ShaderInputBufferAccess::Read:
  305. return "BufferRead";
  306. case ShaderInputBufferAccess::ReadWrite:
  307. return "BufferReadWrite";
  308. }
  309. return "";
  310. }
  311. const char* GetShaderInputAccessName(ShaderInputImageAccess imageInputAccess)
  312. {
  313. switch (imageInputAccess)
  314. {
  315. case ShaderInputImageAccess::Read:
  316. return "ImageRead";
  317. case ShaderInputImageAccess::ReadWrite:
  318. return "ImageReadWrite";
  319. }
  320. return "";
  321. }
  322. }