瀏覽代碼

[ATOM-15472] Updates related with Supervariants

The key changes are due to deprecation of ShaderResourceGroupAsset

Signed-off-by: garrieta <[email protected]>
garrieta 4 年之前
父節點
當前提交
b23336375b

+ 8 - 7
Gem/Code/Source/BloomExampleComponent.cpp

@@ -317,8 +317,9 @@ namespace AtomSampleViewer
     void BloomExampleComponent::PrepareRenderData()
     {
         const auto CreatePipeline = [](const char* shaderFilepath,
-            const char* srgFilepath,
-            Data::Asset<AZ::RPI::ShaderResourceGroupAsset>& srgAsset,
+            const char* srgName,
+            Data::Asset<AZ::RPI::ShaderAsset>& shaderAsset,
+            RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout>& srgLayout,
             RHI::ConstPtr<RHI::PipelineState>& pipelineState,
             RHI::DrawListTag& drawListTag)
         {
@@ -326,7 +327,7 @@ namespace AtomSampleViewer
             // Also, the index buffer is not needed with DrawLinear.
             RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
 
-            Data::Asset<RPI::ShaderAsset> shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
+            shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
             Data::Instance<RPI::Shader> shader = RPI::Shader::FindOrCreate(shaderAsset);
 
             if (!shader)
@@ -351,13 +352,13 @@ namespace AtomSampleViewer
                 AZ_Error("Render", false, "Failed to acquire default pipeline state for shader %s", shaderFilepath);
             }
 
-            // Load shader resource group asset
-            srgAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderResourceGroupAsset>(srgFilepath, RPI::AssetUtils::TraceLevel::Error);
+            // Load shader resource group layout
+            srgLayout = shaderAsset->FindShaderResourceGroupLayout(AZ::Name(srgName));
         };
 
         // Create the example's main pipeline object
         {
-            CreatePipeline("Shaders/tonemappingexample/renderimage.azshader", "Shaders/tonemappingexample/renderimage_renderimagesrg.azsrg", m_srgAsset, m_pipelineState, m_drawListTag);
+            CreatePipeline("Shaders/tonemappingexample/renderimage.azshader", "RenderImageSrg", m_shaderAsset, m_srgLayout, m_pipelineState, m_drawListTag);
 
             // Set the input indices
             m_imageInputIndex.Reset();
@@ -366,7 +367,7 @@ namespace AtomSampleViewer
             m_colorSpaceIndex.Reset();
         }
 
-        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_srgAsset);
+        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
         m_drawImage.m_wasStreamed = false;
 
         // Set the image to occupy the full screen.

+ 2 - 1
Gem/Code/Source/BloomExampleComponent.h

@@ -100,7 +100,8 @@ namespace AtomSampleViewer
         // render related data
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::DrawListTag m_drawListTag;
-        AZ::Data::Asset<AZ::RPI::ShaderResourceGroupAsset> m_srgAsset;
+        AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
+        AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_srgLayout;
 
         // shader input indices
         AZ::RHI::ShaderInputNameIndex m_imageInputIndex = "m_texture";

+ 1 - 5
Gem/Code/Source/Passes/RayTracingAmbientOcclusionPass.cpp

@@ -89,11 +89,7 @@ namespace AZ
             AZ_Assert(m_globalPipelineState, "Failed to acquire ray tracing global pipeline state");
 
             //Get pass srg
-            auto srgAsset = m_rayGenerationShader->FindShaderResourceGroupAsset(Name{"RayTracingGlobalSrg"});
-            AZ_Error("RayTracingAmbientOcclusionPass", srgAsset.GetId().IsValid(), "Failed to find PassSrg asset for shader [%s]", rayGenerationShaderFilePath);
-            AZ_Error("RayTracingAmbientOcclusionPass", srgAsset.IsReady(), "RayTracingGlobalSrg asset is not loaded for shader [%s]", rayGenerationShaderFilePath);
-
-            m_shaderResourceGroup = RPI::ShaderResourceGroup::Create(srgAsset);
+            m_shaderResourceGroup = RPI::ShaderResourceGroup::Create(m_rayGenerationShader->GetAsset(), AZ::RPI::DefaultSupervariantIndex, Name { "RayTracingGlobalSrg" });
             AZ_Assert(m_shaderResourceGroup, "[RayTracingAmbientOcclusionPass '%s']: Failed to create SRG from shader asset '%s'",
                 GetPathName().GetCStr(), rayGenerationShaderFilePath);
                         

+ 1 - 2
Gem/Code/Source/Passes/RayTracingAmbientOcclusionPass.h

@@ -71,8 +71,7 @@ namespace AZ
             // ray tracing shader table
             RHI::Ptr<RHI::RayTracingShaderTable> m_rayTracingShaderTable;
 
-            // ray tracing global shader resource group asset and pipeline state
-            Data::Asset<RPI::ShaderResourceGroupAsset> m_globalSrgAsset;
+            // ray tracing global pipeline state
             RHI::ConstPtr<RHI::PipelineState> m_globalPipelineState;
 
             Render::RayTracingFeatureProcessor* m_rayTracingFeatureProcessor = nullptr;

+ 2 - 2
Gem/Code/Source/RHI/AsyncComputeExampleComponent.cpp

@@ -344,7 +344,7 @@ namespace AtomSampleViewer
                     pipelineDesc.m_inputStreamLayout,
                     m_modelStreamBufferViews[ShadowScope],
                     nullptr,
-                    variant.GetInputContract(),
+                    shader->GetInputContract(),
                     0);
 
                 m_modelPipelineStates[ShadowScope] = shader->AcquirePipelineState(pipelineDesc);
@@ -404,7 +404,7 @@ namespace AtomSampleViewer
                     pipelineDesc.m_inputStreamLayout,
                     m_modelStreamBufferViews[ForwardScope],
                     nullptr,
-                    variant.GetInputContract(),
+                    shader->GetInputContract(),
                     0);
 
                 m_modelPipelineStates[ForwardScope] = shader->AcquirePipelineState(pipelineDesc);

+ 1 - 13
Gem/Code/Source/RHI/BasicRHIComponent.cpp

@@ -462,19 +462,7 @@ namespace AtomSampleViewer
 
     AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> BasicRHIComponent::CreateShaderResourceGroup(AZ::Data::Instance<AZ::RPI::Shader> shader, const char* shaderResourceGroupId, [[maybe_unused]] const char* sampleName)
     {
-        auto perInstanceSrgAsset = shader->FindShaderResourceGroupAsset(AZ::Name{ shaderResourceGroupId });
-        if (!perInstanceSrgAsset.GetId().IsValid())
-        {
-            AZ_Error(sampleName, false, "Could not find shader resource group asset '%s'", shaderResourceGroupId);
-            return nullptr;
-        }
-        else if (!perInstanceSrgAsset.IsReady())
-        {
-            AZ_Error(sampleName, false, "Shader resource group asset is not loaded");
-            return nullptr;
-        }
-
-        auto srg = AZ::RPI::ShaderResourceGroup::Create(perInstanceSrgAsset);
+        auto srg = AZ::RPI::ShaderResourceGroup::Create(shader->GetAsset(), AZ::RPI::DefaultSupervariantIndex, AZ::Name { shaderResourceGroupId });
         if (!srg)
         {
             AZ_Error(sampleName, false, "Failed to create shader resource group");

+ 5 - 28
Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.cpp

@@ -276,8 +276,7 @@ namespace AtomSampleViewer
 
             // Set the buffer stream
             RHI::InputStreamLayout layout;
-            const ShaderVariant& shaderVariant = m_shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId);
-            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.bufferStreamViewArray, nullptr, shaderVariant.GetInputContract(), subMeshIdx);
+            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.bufferStreamViewArray, nullptr, m_shader->GetInputContract(), subMeshIdx);
         }
     }
 
@@ -393,14 +392,10 @@ namespace AtomSampleViewer
 
         // Set up the SRGs
         {
-            const char* floatBufferSrgPath = "shaders/rhi/bindlessprototypesrg_floatbuffersrg.azsrg";
-            const char* imageSrgPath = "shaders/rhi/bindlessprototypesrg_imagesrg.azsrg";
-
             // Set the FloatBufferSrg
-            m_bindlessSrg = std::make_unique<BindlessSrg>(BindlessSrg({
-                {floatBufferSrgPath, m_floatBufferSrgName},
-                {imageSrgPath, m_imageSrgName}
-                }));
+            m_bindlessSrg = std::make_unique<BindlessSrg>(
+                BindlessSrg(m_shader, {m_floatBufferSrgName, m_imageSrgName})
+            );
         }
 
         // Create the BufferPool
@@ -429,8 +424,7 @@ namespace AtomSampleViewer
             const uint32_t meshIndex = 0u;
             RHI::InputStreamLayout layout;
             ModelLod::StreamBufferViewList streamBufferView;
-            const ShaderVariant& shaderVariant = m_shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId);
-            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferView, nullptr, shaderVariant.GetInputContract(), meshIndex);
+            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferView, nullptr, m_shader->GetInputContract(), meshIndex);
             // Set the pipeline state
             {
                 RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
@@ -702,23 +696,6 @@ namespace AtomSampleViewer
         }
     }
 
-    BindlessPrototypeExampleComponent::BindlessSrg::BindlessSrg(AZStd::vector<SrgPathId> srgPathIdArray)
-    {
-        for (const SrgPathId& srgPathId : srgPathIdArray)
-        {
-            Data::AssetId srgAssetId;
-            Data::AssetCatalogRequestBus::BroadcastResult(
-                srgAssetId, &Data::AssetCatalogRequestBus::Events::GetAssetIdByPath,
-                srgPathId.first, azrtti_typeid<ShaderResourceGroupAsset>(), false);
-            AZ_Assert(srgAssetId.IsValid(), "Failed to get model asset id: %s", srgPathId.first);
-
-            AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> srg = InternalBP::CreateResourceImmediate<ShaderResourceGroupAsset, ShaderResourceGroup>(srgAssetId);
-
-            AZ::Name id(srgPathId.second);
-            m_srgMap[id] = srg;
-        }
-    }
-
     BindlessPrototypeExampleComponent::BindlessSrg::~BindlessSrg()
     {
         m_srgMap.clear();

+ 0 - 2
Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.h

@@ -55,9 +55,7 @@ namespace AtomSampleViewer
         // Helper structure to manage multiple SRGs
         struct BindlessSrg 
         {
-            using SrgPathId = AZStd::pair<const char*, const char*>;
             BindlessSrg(AZ::Data::Instance<AZ::RPI::Shader> shader, AZStd::vector<const char*> srgArray);
-            BindlessSrg(AZStd::vector<SrgPathId> srgPathIdArray);
             ~BindlessSrg();
 
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> GetSrg(const AZStd::string srgName);

+ 3 - 8
Gem/Code/Source/RHI/MultiThreadComponent.cpp

@@ -243,15 +243,10 @@ namespace AtomSampleViewer
             return;
         }
 
-        auto perInstanceSrgAsset = shader->FindShaderResourceGroupAsset(AZ::Name{ "MultiThreadInstanceSrg" });
-        if (!perInstanceSrgAsset.GetId().IsValid())
+        auto perInstanceSrgLayout = shader->FindShaderResourceGroupLayout(AZ::Name{ "MultiThreadInstanceSrg" });
+        if (!perInstanceSrgLayout)
         {
-            AZ_Error("MultiThreadComponent", false, "Failed to get shader resource group asset");
-            return;
-        }
-        else if (!perInstanceSrgAsset.IsReady())
-        {
-            AZ_Error("MultiThreadComponent", false, "Shader resource group asset is not loaded");
+            AZ_Error("MultiThreadComponent", false, "Failed to get shader resource group layout");
             return;
         }
 

+ 1 - 1
Gem/Code/Source/RHI/SubpassExampleComponent.cpp

@@ -266,7 +266,7 @@ namespace AtomSampleViewer
                     pipelineDesc.m_inputStreamLayout,
                     modelData.m_streamBufferList,
                     nullptr,
-                    variant.GetInputContract(),
+                    shader->GetInputContract(),
                     0);
 
                 pipelineDesc.m_renderStates.m_rasterState.m_cullMode = modelData.m_modelType == ModelType_Plane ? RHI::CullMode::None : RHI::CullMode::Back;

+ 3 - 4
Gem/Code/Source/RootConstantsExampleComponent.cpp

@@ -143,15 +143,14 @@ namespace AtomSampleViewer
             m_rootConstantData = RHI::ConstantsData(rootConstantsLayout);
 
             // Load shader resource group asset
-            auto srgAsset = shader->FindShaderResourceGroupAsset(Name{ "MaterialGroupSrg" });
-            m_srg = AZ::RPI::ShaderResourceGroup::Create(srgAsset);
+            m_srg = AZ::RPI::ShaderResourceGroup::Create(shaderAsset, AZ::RPI::DefaultSupervariantIndex, Name { "MaterialGroupSrg" });
             if (!m_srg)
             {
                 AZ_Error("Render", false, "Failed to create shader resource group");
                 return;
             }
 
-            auto materialsInputIndex = srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_materials"));
+            auto materialsInputIndex = m_srg->FindShaderInputConstantIndex(Name("m_materials"));
 
             struct MaterialInfo
             {
@@ -185,7 +184,7 @@ namespace AtomSampleViewer
                     for (uint32_t j = 0; j < m_modelStreamBufferViews[i].size(); ++j)
                     {
                         modelLod->GetStreamsForMesh(
-                            pipelineStateDescriptor.m_inputStreamLayout, m_modelStreamBufferViews[i][j], nullptr, shaderVariant.GetInputContract(),
+                            pipelineStateDescriptor.m_inputStreamLayout, m_modelStreamBufferViews[i][j], nullptr, shader->GetInputContract(),
                             j);
                     }
                 }

+ 27 - 23
Gem/Code/Source/StreamingImageExampleComponent.cpp

@@ -53,8 +53,9 @@ namespace AtomSampleViewer
     void StreamingImageExampleComponent::PrepareRenderData()
     {
         const auto CreatePipeline = [](const char* shaderFilepath,
-            const char* srgFilepath,
-            Data::Asset<AZ::RPI::ShaderResourceGroupAsset>& srgAsset,
+            const char* srgName,
+            Data::Asset<AZ::RPI::ShaderAsset>& shaderAsset,
+            RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout>& srgLayout,
             RHI::ConstPtr<RHI::PipelineState>& pipelineState,
             RHI::DrawListTag& drawListTag)
         {
@@ -62,7 +63,7 @@ namespace AtomSampleViewer
             // Also, the index buffer is not needed with DrawLinear.
             RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
 
-            Data::Asset<RPI::ShaderAsset> shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
+            shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
             Data::Instance<RPI::Shader> shader = RPI::Shader::FindOrCreate(shaderAsset);
 
             if (!shader)
@@ -73,10 +74,10 @@ namespace AtomSampleViewer
 
             const RPI::ShaderVariant& shaderVariant = shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId);
             shaderVariant.ConfigurePipelineState(pipelineStateDescriptor);
-
             drawListTag = shader->GetDrawListTag();
+
             RPI::Scene* scene = RPI::RPISystemInterface::Get()->GetDefaultScene().get();
-            scene->ConfigurePipelineState(drawListTag, pipelineStateDescriptor);
+            scene->ConfigurePipelineState(shader->GetDrawListTag(), pipelineStateDescriptor);
 
             pipelineStateDescriptor.m_inputStreamLayout.SetTopology(AZ::RHI::PrimitiveTopology::TriangleStrip);
             pipelineStateDescriptor.m_inputStreamLayout.Finalize();
@@ -87,27 +88,28 @@ namespace AtomSampleViewer
                 AZ_Error("Render", false, "Failed to acquire default pipeline state for shader %s", shaderFilepath);
             }
 
-            // Load shader resource group asset
-            srgAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderResourceGroupAsset>(srgFilepath, RPI::AssetUtils::TraceLevel::Error);
+            // Load shader resource group layout
+            srgLayout = shaderAsset->FindShaderResourceGroupLayout(AZ::Name(srgName));
         };
 
         // Create the example's main pipeline object
         {
-            CreatePipeline("Shaders/streamingimageexample/imagemips.azshader", "Shaders/streamingimageexample/imagemips_imagemipssrg.azsrg", m_srgAsset, m_pipelineState, m_drawListTag);
+            CreatePipeline("Shaders/streamingimageexample/imagemips.azshader", "ImageMipsSrg", m_shaderAsset, m_srgLayout, m_pipelineState, m_drawListTag);
 
             // Set the input indices
-            m_imageInputIndex = m_srgAsset->GetLayout()->FindShaderInputImageIndex(Name("m_texture"));
-            m_positionInputIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_position"));
-            m_sizeInputIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_size"));
-            m_residentMipInputIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_residentMip"));
+            m_imageInputIndex = m_srgLayout->FindShaderInputImageIndex(Name("m_texture"));
+            m_positionInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_position"));
+            m_sizeInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_size"));
+            m_residentMipInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_residentMip"));
 
             // Create an SRG instance for the hot reloaded image
-            m_imageHotReload.m_srg = RPI::ShaderResourceGroup::Create(m_srgAsset);
+            m_imageHotReload.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
         }
 
         // Create the 3D pipeline object
         {
-            CreatePipeline("Shaders/streamingimageexample/image3d.azshader", "Shaders/streamingimageexample/image3d_imagesrg.azsrg", m_image3dSrgAsset, m_image3dPipelineState, m_image3dDrawListTag);
+            CreatePipeline("Shaders/streamingimageexample/image3d.azshader", "ImageSrg", m_image3dShaderAsset, m_image3dSrgLayout, m_image3dPipelineState,
+                m_image3dDrawListTag);
         }
 
     }
@@ -313,10 +315,12 @@ namespace AtomSampleViewer
 
         m_pipelineState = nullptr;
         m_drawListTag.Reset();
-        m_srgAsset = {};
+        m_shaderAsset = {};
+        m_srgLayout = nullptr;
 
         m_3dImages.clear();
-        m_image3dSrgAsset = {};
+        m_image3dShaderAsset = {};
+        m_image3dSrgLayout = nullptr;
         m_image3dPipelineState = nullptr;
         m_image3dDrawListTag.Reset();
     }
@@ -597,7 +601,7 @@ namespace AtomSampleViewer
             m_numImageAssetQueued++;
             ImageToDraw img;
             img.m_asset = AZ::Data::AssetManager::Instance().GetAsset<AZ::RPI::StreamingImageAsset>(imageAssetId, AZ::Data::AssetLoadBehavior::PreLoad);
-            img.m_srg = RPI::ShaderResourceGroup::Create(m_srgAsset);
+            img.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
             img.m_assetId = imageAssetId;
             m_images.push_back(img);
 
@@ -611,10 +615,10 @@ namespace AtomSampleViewer
         const Data::Instance<RPI::StreamingImagePool>& imagePool = RPI::ImageSystemInterface::Get()->GetSystemStreamingPool();
 
         // Fetch the shader input indices
-        const RHI::ShaderInputImageIndex image3DInputIndex = m_image3dSrgAsset->GetLayout()->FindShaderInputImageIndex(Name("m_texture3D"));
-        const RHI::ShaderInputConstantIndex sliceCountInputIndex = m_image3dSrgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_sliceCount"));
-        const RHI::ShaderInputConstantIndex positionInputIndex = m_image3dSrgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_position"));
-        const RHI::ShaderInputConstantIndex sizeInputIndex = m_image3dSrgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_size"));
+        const RHI::ShaderInputImageIndex image3DInputIndex = m_image3dSrgLayout->FindShaderInputImageIndex(Name("m_texture3D"));
+        const RHI::ShaderInputConstantIndex sliceCountInputIndex = m_image3dSrgLayout->FindShaderInputConstantIndex(Name("m_sliceCount"));
+        const RHI::ShaderInputConstantIndex positionInputIndex = m_image3dSrgLayout->FindShaderInputConstantIndex(Name("m_position"));
+        const RHI::ShaderInputConstantIndex sizeInputIndex = m_image3dSrgLayout->FindShaderInputConstantIndex(Name("m_size"));
 
         // Create a small 3D image, where the row count of an image isn't the same as the height (e.g BC formats). A single slice of the image
         // will be uploaded with a single command
@@ -638,7 +642,7 @@ namespace AtomSampleViewer
 
             // Create the srg
             Image3dToDraw image3d;
-            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dSrgAsset);
+            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, AZ::RPI::DefaultSupervariantIndex, m_image3dSrgLayout->GetName());
             image3d.m_srg->SetImage(image3DInputIndex, image.get(), 0);
             image3d.m_sliceCount = layout.m_size.m_depth;
 
@@ -683,7 +687,7 @@ namespace AtomSampleViewer
 
             // Create the srg
             Image3dToDraw image3d;
-            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dSrgAsset);
+            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, AZ::RPI::DefaultSupervariantIndex, m_image3dSrgLayout->GetName());
             image3d.m_srg->SetImage(image3DInputIndex, image.get(), 0);
             image3d.m_sliceCount = depth;
 

+ 5 - 2
Gem/Code/Source/StreamingImageExampleComponent.h

@@ -178,8 +178,11 @@ namespace AtomSampleViewer
         AZ::RHI::DrawListTag m_drawListTag;
         AZ::RHI::DrawListTag m_image3dDrawListTag;
 
-        AZ::Data::Asset<AZ::RPI::ShaderResourceGroupAsset> m_srgAsset;
-        AZ::Data::Asset<AZ::RPI::ShaderResourceGroupAsset> m_image3dSrgAsset;
+        AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
+        AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_srgLayout;
+
+        AZ::Data::Asset<AZ::RPI::ShaderAsset> m_image3dShaderAsset;
+        AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_image3dSrgLayout;
 
         // shader input indices
         AZ::RHI::ShaderInputImageIndex m_imageInputIndex;

+ 12 - 11
Gem/Code/Source/TonemappingExampleComponent.cpp

@@ -208,8 +208,9 @@ namespace AtomSampleViewer
     void TonemappingExampleComponent::PrepareRenderData()
     {
         const auto CreatePipeline = [](const char* shaderFilepath,
-            const char* srgFilepath,
-            Data::Asset<AZ::RPI::ShaderResourceGroupAsset>& srgAsset,
+            const char* srgName,
+            Data::Asset<AZ::RPI::ShaderAsset>& shaderAsset,
+            RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout>& srgLayout,
             RHI::ConstPtr<RHI::PipelineState>& pipelineState,
             RHI::DrawListTag& drawListTag)
         {
@@ -217,7 +218,7 @@ namespace AtomSampleViewer
             // Also, the index buffer is not needed with DrawLinear.
             RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
 
-            Data::Asset<RPI::ShaderAsset> shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
+            shaderAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderAsset>(shaderFilepath, RPI::AssetUtils::TraceLevel::Error);
             Data::Instance<RPI::Shader> shader = RPI::Shader::FindOrCreate(shaderAsset);
 
             if (!shader)
@@ -242,22 +243,22 @@ namespace AtomSampleViewer
                 AZ_Error("Render", false, "Failed to acquire default pipeline state for shader %s", shaderFilepath);
             }
 
-            // Load shader resource group asset
-            srgAsset = RPI::AssetUtils::LoadAssetByProductPath<RPI::ShaderResourceGroupAsset>(srgFilepath, RPI::AssetUtils::TraceLevel::Error);
+            // Load shader resource group layout
+            srgLayout = shaderAsset->FindShaderResourceGroupLayout(AZ::Name(srgName));
         };
 
         // Create the example's main pipeline object
         {
-            CreatePipeline("Shaders/tonemappingexample/renderimage.azshader", "Shaders/tonemappingexample/renderimage_renderimagesrg.azsrg", m_srgAsset, m_pipelineState, m_drawListTag);
+            CreatePipeline("Shaders/tonemappingexample/renderimage.azshader", "RenderImageSrg", m_shaderAsset, m_srgLayout, m_pipelineState, m_drawListTag);
 
             // Set the input indices
-            m_imageInputIndex = m_srgAsset->GetLayout()->FindShaderInputImageIndex(Name("m_texture"));
-            m_positionInputIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_position"));
-            m_sizeInputIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_size"));
-            m_colorSpaceIndex = m_srgAsset->GetLayout()->FindShaderInputConstantIndex(Name("m_colorSpace"));
+            m_imageInputIndex = m_srgLayout->FindShaderInputImageIndex(Name("m_texture"));
+            m_positionInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_position"));
+            m_sizeInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_size"));
+            m_colorSpaceIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_colorSpace"));
         }
 
-        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_srgAsset);
+        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
         m_drawImage.m_wasStreamed = false;
 
         // Set the image to occupy the full screen.

+ 2 - 1
Gem/Code/Source/TonemappingExampleComponent.h

@@ -92,7 +92,8 @@ namespace AtomSampleViewer
         // render related data
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::DrawListTag m_drawListTag;
-        AZ::Data::Asset<AZ::RPI::ShaderResourceGroupAsset> m_srgAsset;
+        AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
+        AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_srgLayout;
 
         // shader input indices
         AZ::RHI::ShaderInputImageIndex m_imageInputIndex;