3
0

SrgLayoutUtility.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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 "SrgLayoutUtility.h"
  9. #include <Atom/RHI.Edit/Utils.h>
  10. namespace AZ
  11. {
  12. namespace ShaderBuilder
  13. {
  14. namespace SrgLayoutUtility
  15. {
  16. RHI::ShaderInputImageType ToShaderInputImageType(TextureType textureType)
  17. {
  18. switch (textureType)
  19. {
  20. case TextureType::Texture1D:
  21. return RHI::ShaderInputImageType::Image1D;
  22. case TextureType::Texture1DArray:
  23. return RHI::ShaderInputImageType::Image1DArray;
  24. case TextureType::Texture2D:
  25. return RHI::ShaderInputImageType::Image2D;
  26. case TextureType::Texture2DArray:
  27. return RHI::ShaderInputImageType::Image2DArray;
  28. case TextureType::Texture2DMS:
  29. return RHI::ShaderInputImageType::Image2DMultisample;
  30. case TextureType::Texture2DMSArray:
  31. return RHI::ShaderInputImageType::Image2DMultisampleArray;
  32. case TextureType::Texture3D:
  33. return RHI::ShaderInputImageType::Image3D;
  34. case TextureType::TextureCube:
  35. return RHI::ShaderInputImageType::ImageCube;
  36. case TextureType::RwTexture1D:
  37. return RHI::ShaderInputImageType::Image1D;
  38. case TextureType::RwTexture1DArray:
  39. return RHI::ShaderInputImageType::Image1DArray;
  40. case TextureType::RwTexture2D:
  41. return RHI::ShaderInputImageType::Image2D;
  42. case TextureType::RwTexture2DArray:
  43. return RHI::ShaderInputImageType::Image2DArray;
  44. case TextureType::RwTexture3D:
  45. return RHI::ShaderInputImageType::Image3D;
  46. case TextureType::RasterizerOrderedTexture1D:
  47. return RHI::ShaderInputImageType::Image1D;
  48. case TextureType::RasterizerOrderedTexture1DArray:
  49. return RHI::ShaderInputImageType::Image1DArray;
  50. case TextureType::RasterizerOrderedTexture2D:
  51. return RHI::ShaderInputImageType::Image2D;
  52. case TextureType::RasterizerOrderedTexture2DArray:
  53. return RHI::ShaderInputImageType::Image2DArray;
  54. case TextureType::RasterizerOrderedTexture3D:
  55. return RHI::ShaderInputImageType::Image3D;
  56. case TextureType::SubpassInput:
  57. return RHI::ShaderInputImageType::SubpassInput;
  58. default:
  59. AZ_Assert(false, "Unhandled TextureType");
  60. return RHI::ShaderInputImageType::Unknown;
  61. }
  62. }
  63. RHI::ShaderInputBufferType ToShaderInputBufferType(BufferType bufferType)
  64. {
  65. switch (bufferType)
  66. {
  67. case BufferType::Buffer:
  68. case BufferType::RwBuffer:
  69. case BufferType::RasterizerOrderedBuffer:
  70. return RHI::ShaderInputBufferType::Typed;
  71. case BufferType::AppendStructuredBuffer:
  72. case BufferType::ConsumeStructuredBuffer:
  73. case BufferType::RasterizerOrderedStructuredBuffer:
  74. case BufferType::RwStructuredBuffer:
  75. case BufferType::StructuredBuffer:
  76. return RHI::ShaderInputBufferType::Structured;
  77. case BufferType::RasterizerOrderedByteAddressBuffer:
  78. case BufferType::ByteAddressBuffer:
  79. case BufferType::RwByteAddressBuffer:
  80. return RHI::ShaderInputBufferType::Raw;
  81. case BufferType::RaytracingAccelerationStructure:
  82. return RHI::ShaderInputBufferType::AccelerationStructure;
  83. default:
  84. AZ_Assert(false, "Unhandled BufferType");
  85. return RHI::ShaderInputBufferType::Unknown;
  86. }
  87. }
  88. bool LoadShaderResourceGroupLayouts(
  89. [[maybe_unused]] const char* builderName,
  90. const SrgDataContainer& resourceGroups,
  91. RPI::ShaderResourceGroupLayoutList& srgLayoutList)
  92. {
  93. // Load all SRGs included in source file
  94. for (const SrgData& srgData : resourceGroups)
  95. {
  96. RHI::Ptr<RHI::ShaderResourceGroupLayout> newSrgLayout = RHI::ShaderResourceGroupLayout::Create();
  97. newSrgLayout->SetName(AZ::Name{srgData.m_name.c_str()});
  98. newSrgLayout->SetUniqueId(srgData.m_containingFileName);
  99. newSrgLayout->SetBindingSlot(srgData.m_bindingSlot.m_index);
  100. // Samplers
  101. for (const SamplerSrgData& samplerData : srgData.m_samplers)
  102. {
  103. if (samplerData.m_isDynamic)
  104. {
  105. newSrgLayout->AddShaderInput({ samplerData.m_nameId,
  106. samplerData.m_count,
  107. samplerData.m_registerId,
  108. samplerData.m_spaceId });
  109. }
  110. else
  111. {
  112. newSrgLayout->AddStaticSampler({ samplerData.m_nameId,
  113. samplerData.m_descriptor,
  114. samplerData.m_registerId,
  115. samplerData.m_spaceId });
  116. }
  117. }
  118. // Images
  119. for (const TextureSrgData& textureData : srgData.m_textures)
  120. {
  121. const RHI::ShaderInputImageAccess imageAccess =
  122. textureData.m_isReadOnlyType ? RHI::ShaderInputImageAccess::Read : RHI::ShaderInputImageAccess::ReadWrite;
  123. const RHI::ShaderInputImageType imageType = SrgLayoutUtility::ToShaderInputImageType(textureData.m_type);
  124. if (imageType != RHI::ShaderInputImageType::Unknown)
  125. {
  126. if (textureData.m_count != aznumeric_cast<uint32_t>(-1))
  127. {
  128. newSrgLayout->AddShaderInput(RHI::ShaderInputImageDescriptor{
  129. textureData.m_nameId, imageAccess, imageType, textureData.m_count,
  130. textureData.m_registerId, textureData.m_spaceId });
  131. }
  132. else
  133. {
  134. // unbounded array
  135. newSrgLayout->AddShaderInput(RHI::ShaderInputImageUnboundedArrayDescriptor{
  136. textureData.m_nameId, imageAccess, imageType,
  137. textureData.m_registerId, textureData.m_spaceId });
  138. }
  139. }
  140. else
  141. {
  142. AZ_Error(
  143. builderName, false, "Failed to build Shader Resource Group Asset: Image %s has an unknown type.",
  144. textureData.m_nameId.GetCStr());
  145. return false;
  146. }
  147. }
  148. // Buffers
  149. {
  150. for (const ConstantBufferData& cbData : srgData.m_constantBuffers)
  151. {
  152. newSrgLayout->AddShaderInput(RHI::ShaderInputBufferDescriptor{
  153. cbData.m_nameId, RHI::ShaderInputBufferAccess::Constant, RHI::ShaderInputBufferType::Constant,
  154. cbData.m_count, cbData.m_strideSize, cbData.m_registerId, cbData.m_spaceId });
  155. }
  156. for (const BufferSrgData& bufferData : srgData.m_buffers)
  157. {
  158. const RHI::ShaderInputBufferAccess bufferAccess =
  159. bufferData.m_isReadOnlyType ? RHI::ShaderInputBufferAccess::Read : RHI::ShaderInputBufferAccess::ReadWrite;
  160. const RHI::ShaderInputBufferType bufferType = SrgLayoutUtility::ToShaderInputBufferType(bufferData.m_type);
  161. if (bufferType != RHI::ShaderInputBufferType::Unknown)
  162. {
  163. if (bufferData.m_count != aznumeric_cast<uint32_t>(-1))
  164. {
  165. newSrgLayout->AddShaderInput(RHI::ShaderInputBufferDescriptor{
  166. bufferData.m_nameId, bufferAccess, bufferType, bufferData.m_count, bufferData.m_strideSize,
  167. bufferData.m_registerId, bufferData.m_spaceId });
  168. }
  169. else
  170. {
  171. // unbounded array
  172. newSrgLayout->AddShaderInput(RHI::ShaderInputBufferUnboundedArrayDescriptor{
  173. bufferData.m_nameId, bufferAccess, bufferType, bufferData.m_strideSize,
  174. bufferData.m_registerId, bufferData.m_spaceId });
  175. }
  176. }
  177. else
  178. {
  179. AZ_Error(
  180. builderName, false,
  181. "Failed to build Shader Resource Group Asset: Buffer %s has un unknown type.",
  182. bufferData.m_nameId.GetCStr());
  183. return false;
  184. }
  185. }
  186. }
  187. // SRG Constants
  188. for (const SrgConstantData& srgConstants : srgData.m_srgConstantData)
  189. {
  190. newSrgLayout->AddShaderInput({ srgConstants.m_nameId, srgConstants.m_constantByteOffset,
  191. srgConstants.m_constantByteSize, srgData.m_srgConstantDataRegisterId,
  192. srgData.m_srgConstantDataSpaceId });
  193. }
  194. // Shader Variant Key fallback
  195. if (srgData.m_fallbackSize > 0)
  196. {
  197. // Designates this SRG as a ShaderVariantKey fallback
  198. newSrgLayout->SetShaderVariantKeyFallback(srgData.m_fallbackName, srgData.m_fallbackSize);
  199. }
  200. srgLayoutList.push_back(newSrgLayout);
  201. }
  202. return true;
  203. }
  204. } // namespace SrgLayoutUtility
  205. } // namespace ShaderBuilder
  206. } // AZ