Browse Source

Use the BindlessSrg in the BindlessPrototype sample (#630)

* Use the BindlessSrg in the BindlessPrototype sample

Signed-off-by: Martin Sattlecker <[email protected]>

* Removed a commented out line

Signed-off-by: Martin Sattlecker <[email protected]>

---------

Signed-off-by: Martin Sattlecker <[email protected]>
msat-huawei 2 years ago
parent
commit
b9e9692c04

+ 14 - 0
Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.cpp

@@ -344,11 +344,20 @@ namespace AtomSampleViewer
             const uint32_t lodModel = 0u;
             const ModelLod::Mesh& mesh = m_model->GetLods()[lodModel]->GetMeshes()[subMeshIdx];
 
+            auto uvAssetBufferView{ m_model->GetModelAsset()->GetLodAssets()[lodModel]->GetMeshes()[subMeshIdx].GetSemanticBufferAssetView(
+                AZ::Name{ "UV" }) };
+            auto rpiUVBuffer{ AZ::RPI::Buffer::FindOrCreate(uvAssetBufferView->GetBufferAsset()) };
+            const RHI::BufferView* uvBufferView = rpiUVBuffer->GetBufferView();
+            uint32_t uvBufferByteOffset =
+                uvAssetBufferView->GetBufferViewDescriptor().m_elementSize * uvAssetBufferView->GetBufferViewDescriptor().m_elementOffset;
+
             m_subMeshInstanceArray.resize(m_subMeshInstanceArray.size() + 1);
             SubMeshInstance& subMeshInstance = m_subMeshInstanceArray.back();
 
             subMeshInstance.m_perSubMeshSrg = CreateShaderResourceGroup(m_shader, "HandleSrg", InternalBP::SampleName);
             subMeshInstance.m_mesh = &mesh;
+            subMeshInstance.m_uvBufferIndex = uvBufferView->GetBindlessReadIndex();
+            subMeshInstance.m_uvBufferByteOffset = uvBufferByteOffset;
 
             // Set the buffer stream
             RHI::InputStreamLayout layout;
@@ -1226,6 +1235,11 @@ namespace AtomSampleViewer
                         set = subMesh.m_perSubMeshSrg->SetConstant(subMesh.m_materialHandleIndex, materialHandle);
                         AZ_Assert(set, "Failed to set the material constant");
 
+                        set = subMesh.m_perSubMeshSrg->SetConstant(subMesh.m_uvBufferHandleIndex, subMesh.m_uvBufferIndex);
+                        AZ_Assert(set, "Failed to set the UV buffer index");
+                        set = subMesh.m_perSubMeshSrg->SetConstant(subMesh.m_uvBufferByteOffsetHandleIndex, subMesh.m_uvBufferByteOffset);
+                        AZ_Assert(set, "Failed to set the UV buffer byte index");
+
                         subMesh.m_perSubMeshSrg->Compile();
                     }
                 }

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

@@ -126,6 +126,8 @@ namespace AtomSampleViewer
             AZ::RHI::ShaderInputNameIndex m_objecHandleIndex = "m_perObjectHandle";
             AZ::RHI::ShaderInputNameIndex m_materialHandleIndex = "m_materialHandle";
             AZ::RHI::ShaderInputNameIndex m_lightHandleIndex = "m_lightHandle";
+            AZ::RHI::ShaderInputNameIndex m_uvBufferHandleIndex = "m_uvBufferIndex";
+            AZ::RHI::ShaderInputNameIndex m_uvBufferByteOffsetHandleIndex = "m_uvBufferByteOffset";
 
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_perSubMeshSrg;
 
@@ -133,6 +135,9 @@ namespace AtomSampleViewer
             AZ::RPI::ModelLod::StreamBufferViewList bufferStreamViewArray;
 
             AZ::Matrix4x4 m_modelMatrix;
+
+            uint32_t m_uvBufferIndex = 0;
+            uint32_t m_uvBufferByteOffset = 0;
         };
 
     public:

+ 6 - 1
Shaders/RHI/BindlessPrototype.azsl

@@ -61,6 +61,9 @@ ShaderResourceGroup HandleSrg : PerSubMesh
     uint m_perObjectHandle;
     uint m_materialHandle;
     uint m_lightHandle;
+
+    uint m_uvBufferIndex;
+    uint m_uvBufferByteOffset;
 };
 
 struct VertexInput
@@ -70,6 +73,7 @@ struct VertexInput
     float3 m_tangent : TANGENT;
     float3 m_bitangent : BITANGENT;
     float2 m_uv : UV0;
+    uint m_vertexId : SV_VertexID;
 };
 
 struct VertexOutput
@@ -102,7 +106,8 @@ VertexOutput MainVS(VertexInput vsInput)
 
     const float4 worldPosition = mul(perObject.m_localToWorldMatrix,  float4(vsInput.m_position, 1.0));
     OUT.m_position = mul(worldToClipMatrix, worldPosition);
-    OUT.m_uv = vsInput.m_uv;
+    OUT.m_uv =
+        asfloat(Bindless::GetByteAddressBuffer(HandleSrg::m_uvBufferIndex).Load2(HandleSrg::m_uvBufferByteOffset + vsInput.m_vertexId * 8));
     OUT.m_normal = normalize(vsInput.m_normal);
 
     return OUT;

+ 2 - 0
Shaders/RHI/BindlessPrototypeSrg.azsli

@@ -35,6 +35,8 @@ ShaderResourceGroupSemantic NonBindlessTextureSemanticId
     FrequencyId = 3;
 };
 
+#include <Atom/Features/Bindless.azsli>
+
 ShaderResourceGroup FloatBufferSrg : FloatBufferSemanticId
 {
     StructuredBuffer<FloatBuffer> m_floatBuffer;