Procházet zdrojové kódy

GeomtryView: Updated AtomSampleViewer to work with new GeometryView changes

Signed-off-by: antonmic <[email protected]>
antonmic před 10 měsíci
rodič
revize
31bac44ca9
62 změnil soubory, kde provedl 525 přidání a 836 odebrání
  1. 2 3
      Gem/Code/Source/BloomExampleComponent.cpp
  2. 1 0
      Gem/Code/Source/BloomExampleComponent.h
  3. 17 24
      Gem/Code/Source/RHI/AlphaToCoverageExampleComponent.cpp
  4. 1 1
      Gem/Code/Source/RHI/AlphaToCoverageExampleComponent.h
  5. 38 98
      Gem/Code/Source/RHI/AsyncComputeExampleComponent.cpp
  6. 2 3
      Gem/Code/Source/RHI/AsyncComputeExampleComponent.h
  7. 6 15
      Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.cpp
  8. 2 2
      Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.h
  9. 11 23
      Gem/Code/Source/RHI/ComputeExampleComponent.cpp
  10. 1 2
      Gem/Code/Source/RHI/ComputeExampleComponent.h
  11. 16 21
      Gem/Code/Source/RHI/CopyQueueComponent.cpp
  12. 1 1
      Gem/Code/Source/RHI/CopyQueueComponent.h
  13. 11 23
      Gem/Code/Source/RHI/DualSourceBlendingComponent.cpp
  14. 1 2
      Gem/Code/Source/RHI/DualSourceBlendingComponent.h
  15. 16 24
      Gem/Code/Source/RHI/IndirectRenderingExampleComponent.cpp
  16. 1 0
      Gem/Code/Source/RHI/IndirectRenderingExampleComponent.h
  17. 9 9
      Gem/Code/Source/RHI/InputAssemblyExampleComponent.cpp
  18. 1 1
      Gem/Code/Source/RHI/InputAssemblyExampleComponent.h
  19. 13 38
      Gem/Code/Source/RHI/MRTExampleComponent.cpp
  20. 1 2
      Gem/Code/Source/RHI/MRTExampleComponent.h
  21. 34 48
      Gem/Code/Source/RHI/MSAAExampleComponent.cpp
  22. 2 2
      Gem/Code/Source/RHI/MSAAExampleComponent.h
  23. 17 23
      Gem/Code/Source/RHI/MatrixAlignmentTestExampleComponent.cpp
  24. 1 1
      Gem/Code/Source/RHI/MatrixAlignmentTestExampleComponent.h
  25. 52 53
      Gem/Code/Source/RHI/MultiGPUExampleComponent.cpp
  26. 2 3
      Gem/Code/Source/RHI/MultiGPUExampleComponent.h
  27. 11 24
      Gem/Code/Source/RHI/MultiThreadComponent.cpp
  28. 1 2
      Gem/Code/Source/RHI/MultiThreadComponent.h
  29. 15 43
      Gem/Code/Source/RHI/MultipleViewsComponent.cpp
  30. 1 2
      Gem/Code/Source/RHI/MultipleViewsComponent.h
  31. 14 17
      Gem/Code/Source/RHI/QueryExampleComponent.cpp
  32. 1 1
      Gem/Code/Source/RHI/QueryExampleComponent.h
  33. 10 22
      Gem/Code/Source/RHI/RayTracingExampleComponent.cpp
  34. 1 2
      Gem/Code/Source/RHI/RayTracingExampleComponent.h
  35. 16 20
      Gem/Code/Source/RHI/SphericalHarmonicsExampleComponent.cpp
  36. 1 1
      Gem/Code/Source/RHI/SphericalHarmonicsExampleComponent.h
  37. 21 29
      Gem/Code/Source/RHI/StencilExampleComponent.cpp
  38. 2 1
      Gem/Code/Source/RHI/StencilExampleComponent.h
  39. 7 21
      Gem/Code/Source/RHI/SubpassExampleComponent.cpp
  40. 3 1
      Gem/Code/Source/RHI/SubpassExampleComponent.h
  41. 3 7
      Gem/Code/Source/RHI/Texture3dExampleComponent.cpp
  42. 1 0
      Gem/Code/Source/RHI/Texture3dExampleComponent.h
  43. 15 21
      Gem/Code/Source/RHI/TextureArrayExampleComponent.cpp
  44. 1 0
      Gem/Code/Source/RHI/TextureArrayExampleComponent.h
  45. 11 20
      Gem/Code/Source/RHI/TextureExampleComponent.cpp
  46. 1 1
      Gem/Code/Source/RHI/TextureExampleComponent.h
  47. 43 39
      Gem/Code/Source/RHI/TextureMapExampleComponent.cpp
  48. 2 2
      Gem/Code/Source/RHI/TextureMapExampleComponent.h
  49. 16 23
      Gem/Code/Source/RHI/TriangleExampleComponent.cpp
  50. 1 1
      Gem/Code/Source/RHI/TriangleExampleComponent.h
  51. 12 23
      Gem/Code/Source/RHI/TrianglesConstantBufferExampleComponent.cpp
  52. 2 1
      Gem/Code/Source/RHI/TrianglesConstantBufferExampleComponent.h
  53. 13 36
      Gem/Code/Source/RHI/VariableRateShadingExampleComponent.cpp
  54. 2 4
      Gem/Code/Source/RHI/VariableRateShadingExampleComponent.h
  55. 11 23
      Gem/Code/Source/RHI/XRExampleComponent.cpp
  56. 1 2
      Gem/Code/Source/RHI/XRExampleComponent.h
  57. 10 11
      Gem/Code/Source/RootConstantsExampleComponent.cpp
  58. 1 1
      Gem/Code/Source/RootConstantsExampleComponent.h
  59. 9 9
      Gem/Code/Source/StreamingImageExampleComponent.cpp
  60. 3 1
      Gem/Code/Source/StreamingImageExampleComponent.h
  61. 3 3
      Gem/Code/Source/TonemappingExampleComponent.cpp
  62. 1 0
      Gem/Code/Source/TonemappingExampleComponent.h

+ 2 - 3
Gem/Code/Source/BloomExampleComponent.cpp

@@ -374,9 +374,8 @@ namespace AtomSampleViewer
         // Build draw packet
         // Build draw packet
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         drawPacketBuilder.Begin(nullptr);
         drawPacketBuilder.Begin(nullptr);
-        RHI::DrawLinear drawLinear;
-        drawLinear.m_vertexCount = 4;
-        drawPacketBuilder.SetDrawArguments(drawLinear);
+        m_geometryView.SetDrawArguments(RHI::DrawLinear(4, 0));
+        drawPacketBuilder.SetGeometryView(&m_geometryView);
 
 
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
         drawRequest.m_listTag = m_drawListTag;
         drawRequest.m_listTag = m_drawListTag;

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

@@ -98,6 +98,7 @@ namespace AtomSampleViewer
         AZ::RHI::DrawListTag m_drawListTag;
         AZ::RHI::DrawListTag m_drawListTag;
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_srgLayout;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_srgLayout;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         // shader input indices
         // shader input indices
         AZ::RHI::ShaderInputNameIndex m_imageInputIndex = "m_texture";
         AZ::RHI::ShaderInputNameIndex m_imageInputIndex = "m_texture";

+ 17 - 24
Gem/Code/Source/RHI/AlphaToCoverageExampleComponent.cpp

@@ -158,22 +158,31 @@ namespace AtomSampleViewer
             AZ_Error(AlphaToCoverage::SampleName, false, "Failed to initialize position buffer with error code %d", result);
             AZ_Error(AlphaToCoverage::SampleName, false, "Failed to initialize position buffer with error code %d", result);
             return;
             return;
         }
         }
-        
-        m_rectangleStreamBufferViews[0] = {
+
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_geometryView.SetIndexBufferView({
+            *m_rectangleInputAssemblyBuffer,
+            offsetof(RectangleBufferData, m_indices),
+            sizeof(RectangleBufferData::m_indices),
+            RHI::IndexFormat::Uint16
+        });
+
+        m_geometryView.AddStreamBufferView({
             *m_rectangleInputAssemblyBuffer,
             *m_rectangleInputAssemblyBuffer,
             offsetof(RectangleBufferData, m_positions),
             offsetof(RectangleBufferData, m_positions),
             sizeof(RectangleBufferData::m_positions),
             sizeof(RectangleBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
         
         
-        m_rectangleStreamBufferViews[1] = {
+        m_geometryView.AddStreamBufferView({
             *m_rectangleInputAssemblyBuffer,
             *m_rectangleInputAssemblyBuffer,
             offsetof(RectangleBufferData, m_uvs),
             offsetof(RectangleBufferData, m_uvs),
             sizeof(RectangleBufferData::m_uvs),
             sizeof(RectangleBufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
         
         
-        RHI::ValidateStreamBufferViews(m_rectangleInputStreamLayout, m_rectangleStreamBufferViews);
+        RHI::ValidateStreamBufferViews(m_rectangleInputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
 
 
         m_shader = LoadShader(AlphaToCoverage::ShaderFilePath, AlphaToCoverage::SampleName);
         m_shader = LoadShader(AlphaToCoverage::ShaderFilePath, AlphaToCoverage::SampleName);
         if (!m_shader)
         if (!m_shader)
@@ -384,10 +393,6 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             for (uint32_t rectIndex = context.GetSubmitRange().m_startIndex; rectIndex < context.GetSubmitRange().m_endIndex; ++rectIndex)
             for (uint32_t rectIndex = context.GetSubmitRange().m_startIndex; rectIndex < context.GetSubmitRange().m_endIndex; ++rectIndex)
             {
             {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[typeIndex][rectIndex]
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[typeIndex][rectIndex]
@@ -397,24 +402,12 @@ namespace AtomSampleViewer
                                                                                      .get() };
                                                                                      .get() };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineStates[typeIndex]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineStates[typeIndex]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = {
-                    *m_rectangleInputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()), offsetof(RectangleBufferData, m_indices),
-                    sizeof(RectangleBufferData::m_indices), RHI::IndexFormat::Uint16
-                };
-                drawItem.m_indexBufferView = &indexBufferView;
-
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> streamBufferViews{
-                    m_rectangleStreamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_rectangleStreamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(streamBufferViews.size());
-                drawItem.m_streamBufferViews = streamBufferViews.data();
-
                 // Submit the rectangle draw item.
                 // Submit the rectangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             }
             }

+ 1 - 1
Gem/Code/Source/RHI/AlphaToCoverageExampleComponent.h

@@ -93,7 +93,7 @@ namespace AtomSampleViewer
         };
         };
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_rectangleInputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_rectangleInputAssemblyBuffer;
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_rectangleStreamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::InputStreamLayout m_rectangleInputStreamLayout;
         AZ::RHI::InputStreamLayout m_rectangleInputStreamLayout;
 
 
         // Shader Resource
         // Shader Resource

+ 38 - 98
Gem/Code/Source/RHI/AsyncComputeExampleComponent.cpp

@@ -227,20 +227,26 @@ namespace AtomSampleViewer
             sizeof(VertexUV)
             sizeof(VertexUV)
         };
         };
 
 
-        m_quadStreamBufferViews[ShadowScope].push_back(positionsBufferView);
-        m_quadStreamBufferViews[ForwardScope].push_back(positionsBufferView);
-        m_quadStreamBufferViews[ForwardScope].push_back(normalsBufferView);
-        m_quadStreamBufferViews[CopyTextureScope].push_back(positionsBufferView);
-        m_quadStreamBufferViews[CopyTextureScope].push_back(uvsBufferView);
-        m_quadStreamBufferViews[LuminanceMapScope] = m_quadStreamBufferViews[CopyTextureScope];
-
-        m_quadIndexBufferView =
+        m_geometryViews[ShadowScope].AddStreamBufferView(positionsBufferView);
+        m_geometryViews[ForwardScope].AddStreamBufferView(positionsBufferView);
+        m_geometryViews[ForwardScope].AddStreamBufferView(normalsBufferView);
+        m_geometryViews[CopyTextureScope].AddStreamBufferView(positionsBufferView);
+        m_geometryViews[CopyTextureScope].AddStreamBufferView(uvsBufferView);
+        m_geometryViews[LuminanceMapScope] = m_geometryViews[CopyTextureScope];
+
+        AZ::RHI::IndexBufferView quadIndexBufferView =
         {
         {
             *m_quadInputAssemblyBuffer,
             *m_quadInputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
         };
         };
+
+        for (u32 i = 0; i < AsyncComputeScopes::NumScopes; ++i)
+        {
+            m_geometryViews[i].SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+            m_geometryViews[i].SetIndexBufferView(quadIndexBufferView);
+        }
     }
     }
 
 
     void AsyncComputeExampleComponent::LoadShaders()
     void AsyncComputeExampleComponent::LoadShaders()
@@ -315,7 +321,8 @@ namespace AtomSampleViewer
 
 
                 if (!RHI::ValidateStreamBufferViews(
                 if (!RHI::ValidateStreamBufferViews(
                         pipelineDesc.m_inputStreamLayout, 
                         pipelineDesc.m_inputStreamLayout, 
-                        m_quadStreamBufferViews[ShadowScope]))
+                        m_geometryViews[ShadowScope],
+                        m_geometryViews[ShadowScope].GetFullStreamBufferIndices()))
                 {
                 {
                     AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for terrain");
                     AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for terrain");
                     return;
                     return;
@@ -334,7 +341,7 @@ namespace AtomSampleViewer
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
                 modelLod->GetStreamsForMesh(
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     pipelineDesc.m_inputStreamLayout,
-                    m_modelStreamBufferViews[ShadowScope],
+                    m_modelStreamBufferIndices[ShadowScope],
                     nullptr,
                     nullptr,
                     shader->GetInputContract(),
                     shader->GetInputContract(),
                     0);
                     0);
@@ -375,7 +382,8 @@ namespace AtomSampleViewer
 
 
                 if (!RHI::ValidateStreamBufferViews(
                 if (!RHI::ValidateStreamBufferViews(
                     pipelineDesc.m_inputStreamLayout, 
                     pipelineDesc.m_inputStreamLayout, 
-                    m_quadStreamBufferViews[ForwardScope]))
+                    m_geometryViews[ForwardScope],
+                    m_geometryViews[ForwardScope].GetFullStreamBufferIndices()))
                 {
                 {
                     AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for terrain");
                     AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for terrain");
                     return;
                     return;
@@ -394,7 +402,7 @@ namespace AtomSampleViewer
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
                 modelLod->GetStreamsForMesh(
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     pipelineDesc.m_inputStreamLayout,
-                    m_modelStreamBufferViews[ForwardScope],
+                    m_modelStreamBufferIndices[ForwardScope],
                     nullptr,
                     nullptr,
                     shader->GetInputContract(),
                     shader->GetInputContract(),
                     0);
                     0);
@@ -435,7 +443,8 @@ namespace AtomSampleViewer
 
 
             if (!RHI::ValidateStreamBufferViews(
             if (!RHI::ValidateStreamBufferViews(
                 pipelineDesc.m_inputStreamLayout,
                 pipelineDesc.m_inputStreamLayout,
-                m_quadStreamBufferViews[CopyTextureScope]))
+                m_geometryViews[CopyTextureScope],
+                m_geometryViews[CopyTextureScope].GetFullStreamBufferIndices()))
             {
             {
                 AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for LuminanceMap");
                 AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for LuminanceMap");
                 return;
                 return;
@@ -470,7 +479,8 @@ namespace AtomSampleViewer
 
 
             if (!RHI::ValidateStreamBufferViews(
             if (!RHI::ValidateStreamBufferViews(
                 pipelineDesc.m_inputStreamLayout,
                 pipelineDesc.m_inputStreamLayout,
-                m_quadStreamBufferViews[LuminanceMapScope]))
+                m_geometryViews[LuminanceMapScope],
+                m_geometryViews[LuminanceMapScope].GetFullStreamBufferIndices()))
             {
             {
                 AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for LuminanceMap");
                 AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for LuminanceMap");
                 return;
                 return;
@@ -600,9 +610,7 @@ namespace AtomSampleViewer
 
 
         m_quadBufferPool = nullptr;
         m_quadBufferPool = nullptr;
         m_quadInputAssemblyBuffer = nullptr;
         m_quadInputAssemblyBuffer = nullptr;
-        m_quadStreamBufferViews.fill(AZStd::vector<AZ::RHI::StreamBufferView>());
         m_terrainPipelineStates.fill(nullptr);
         m_terrainPipelineStates.fill(nullptr);
-        m_modelStreamBufferViews.fill(AZ::RPI::ModelLod::StreamBufferViewList());
         m_modelPipelineStates.fill(nullptr);
         m_modelPipelineStates.fill(nullptr);
         m_model = nullptr;
         m_model = nullptr;
         m_copyTexturePipelineState = nullptr;
         m_copyTexturePipelineState = nullptr;
@@ -803,11 +811,6 @@ namespace AtomSampleViewer
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
             {
             {
-                // Quad
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[CopyTextureScope]
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[CopyTextureScope]
                                                                                      .front()
                                                                                      .front()
                                                                                      ->GetRHIShaderResourceGroup()
                                                                                      ->GetRHIShaderResourceGroup()
@@ -816,19 +819,11 @@ namespace AtomSampleViewer
                                                                                      .get() };
                                                                                      .get() };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryViews[CopyTextureScope].GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryViews[CopyTextureScope].GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_copyTexturePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_copyTexturePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_quadIndexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_quadStreamBufferViews[CopyTextureScope].size());
-                AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                for(const auto& streamBufferView : m_quadStreamBufferViews[CopyTextureScope])
-                {
-                    deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                }
-                drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             }
             }
        };
        };
@@ -884,11 +879,6 @@ namespace AtomSampleViewer
             {
             {
                 if (i == 0)
                 if (i == 0)
                 {
                 {
-                    // Terrain
-                    RHI::DrawIndexed drawIndexed;
-                    drawIndexed.m_indexCount = 6;
-                    drawIndexed.m_instanceCount = 1;
-
                     const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[ShadowScope][0]
                     const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[ShadowScope][0]
                                                                                          ->GetRHIShaderResourceGroup()
                                                                                          ->GetRHIShaderResourceGroup()
                                                                                          ->GetDeviceShaderResourceGroup(
                                                                                          ->GetDeviceShaderResourceGroup(
@@ -896,19 +886,11 @@ namespace AtomSampleViewer
                                                                                          .get() };
                                                                                          .get() };
 
 
                     RHI::DeviceDrawItem drawItem;
                     RHI::DeviceDrawItem drawItem;
-                    drawItem.m_arguments = drawIndexed;
+                    drawItem.m_geometryView = m_geometryViews[ShadowScope].GetDeviceGeometryView(context.GetDeviceIndex());
+                    drawItem.m_streamIndices = m_geometryViews[ShadowScope].GetFullStreamBufferIndices();
                     drawItem.m_pipelineState = m_terrainPipelineStates[ShadowScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                     drawItem.m_pipelineState = m_terrainPipelineStates[ShadowScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                    auto deviceIndexBufferView{m_quadIndexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                    drawItem.m_indexBufferView = &deviceIndexBufferView;
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                    drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_quadStreamBufferViews[ShadowScope].size());
-                    AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                    for(const auto& streamBufferView : m_quadStreamBufferViews[ShadowScope])
-                    {
-                        deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                    }
-                    drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
                     commandList->Submit(drawItem, i);
                     commandList->Submit(drawItem, i);
                 }
                 }
                 else
                 else
@@ -919,22 +901,14 @@ namespace AtomSampleViewer
                                                                                          ->GetDeviceShaderResourceGroup(
                                                                                          ->GetDeviceShaderResourceGroup(
                                                                                              context.GetDeviceIndex())
                                                                                              context.GetDeviceIndex())
                                                                                          .get() };
                                                                                          .get() };
-                    for (const auto& mesh : m_model->GetLods()[0]->GetMeshes())
+                    for (auto& mesh : m_model->GetLods()[0]->GetMeshes())
                     {
                     {
                         RHI::DeviceDrawItem drawItem;
                         RHI::DeviceDrawItem drawItem;
-                        drawItem.m_arguments = mesh.m_drawArguments.GetDeviceDrawArguments(context.GetDeviceIndex());
+                        drawItem.m_geometryView = mesh.GetDeviceGeometryView(context.GetDeviceIndex());
+                        drawItem.m_streamIndices = m_modelStreamBufferIndices[ShadowScope];
                         drawItem.m_pipelineState = m_modelPipelineStates[ShadowScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         drawItem.m_pipelineState = m_modelPipelineStates[ShadowScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                        auto deviceIndexBufferView{mesh.m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                        drawItem.m_indexBufferView = &deviceIndexBufferView;
                         drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                         drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                         drawItem.m_shaderResourceGroups = shaderResourceGroups;
                         drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                        drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_modelStreamBufferViews[ShadowScope].size());
-                        AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                        for(const auto& streamBufferView : m_modelStreamBufferViews[ShadowScope])
-                        {
-                            deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                        }
-                        drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
                         commandList->Submit(drawItem, i);
                         commandList->Submit(drawItem, i);
                     }
                     }
                 }
                 }
@@ -1029,25 +1003,12 @@ namespace AtomSampleViewer
                         m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                         m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     };
                     };
 
 
-                    RHI::DrawIndexed drawIndexed;
-                    drawIndexed.m_indexCount = 6;
-                    drawIndexed.m_instanceCount = 1;
-
                     RHI::DeviceDrawItem drawItem;
                     RHI::DeviceDrawItem drawItem;
-                    drawItem.m_arguments = drawIndexed;
+                    drawItem.m_geometryView = m_geometryViews[ForwardScope].GetDeviceGeometryView(context.GetDeviceIndex());
+                    drawItem.m_streamIndices = m_geometryViews[ForwardScope].GetFullStreamBufferIndices();
                     drawItem.m_pipelineState = m_terrainPipelineStates[ForwardScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                     drawItem.m_pipelineState = m_terrainPipelineStates[ForwardScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                    auto deviceIndexBufferView{m_quadIndexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                    drawItem.m_indexBufferView = &deviceIndexBufferView;
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                    drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_quadStreamBufferViews[ForwardScope].size());
-                    AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                    for(const auto& streamBufferView : m_quadStreamBufferViews[ForwardScope])
-                    {
-                        deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                    }
-                    drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
-
                     commandList->Submit(drawItem, i);
                     commandList->Submit(drawItem, i);
                 }
                 }
                 else
                 else
@@ -1061,23 +1022,14 @@ namespace AtomSampleViewer
                         m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                         m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     };
                     };
 
 
-                    for (const auto& mesh : m_model->GetLods()[0]->GetMeshes())
+                    for (auto& mesh : m_model->GetLods()[0]->GetMeshes())
                     {
                     {
                         RHI::DeviceDrawItem drawItem;
                         RHI::DeviceDrawItem drawItem;
-                        drawItem.m_arguments = mesh.m_drawArguments.GetDeviceDrawArguments(context.GetDeviceIndex());
+                        drawItem.m_geometryView = mesh.GetDeviceGeometryView(context.GetDeviceIndex());
+                        drawItem.m_streamIndices = m_modelStreamBufferIndices[ForwardScope];
                         drawItem.m_pipelineState = m_modelPipelineStates[ForwardScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         drawItem.m_pipelineState = m_modelPipelineStates[ForwardScope]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                        auto deviceIndexBufferView{mesh.m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                        drawItem.m_indexBufferView = &deviceIndexBufferView;
                         drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                         drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                         drawItem.m_shaderResourceGroups = shaderResourceGroups;
                         drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                        drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_modelStreamBufferViews[ForwardScope].size());
-                        AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                        for(const auto& streamBufferView : m_modelStreamBufferViews[ForwardScope])
-                        {
-                            deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                        }
-                        drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
-
                         commandList->Submit(drawItem, i);
                         commandList->Submit(drawItem, i);
                     }
                     }
                 }
                 }
@@ -1216,10 +1168,6 @@ namespace AtomSampleViewer
 
 
             {
             {
                 // Quad
                 // Quad
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[LuminanceMapScope][0]
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_shaderResourceGroups[LuminanceMapScope][0]
                                                                                      ->GetRHIShaderResourceGroup()
                                                                                      ->GetRHIShaderResourceGroup()
                                                                                      ->GetDeviceShaderResourceGroup(
                                                                                      ->GetDeviceShaderResourceGroup(
@@ -1227,19 +1175,11 @@ namespace AtomSampleViewer
                                                                                      .get() };
                                                                                      .get() };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryViews[LuminanceMapScope].GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryViews[LuminanceMapScope].GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_luminancePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_luminancePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_quadIndexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_quadStreamBufferViews[LuminanceMapScope].size());
-                AZStd::vector<AZ::RHI::DeviceStreamBufferView> singleDeviceQuadStreamBufferViews;
-                for(const auto& streamBufferView : m_quadStreamBufferViews[LuminanceMapScope])
-                {
-                    singleDeviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                }
-                drawItem.m_streamBufferViews = singleDeviceQuadStreamBufferViews.data();
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             }
             }
         };
         };

+ 2 - 3
Gem/Code/Source/RHI/AsyncComputeExampleComponent.h

@@ -122,14 +122,13 @@ namespace AtomSampleViewer
         // Quad related variables
         // Quad related variables
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_quadBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_quadBufferPool;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_quadInputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_quadInputAssemblyBuffer;
-        AZ::RHI::IndexBufferView m_quadIndexBufferView;
-        AZStd::array<AZStd::vector<AZ::RHI::StreamBufferView>, NumScopes> m_quadStreamBufferViews;
+        AZStd::array<AZ::RHI::GeometryView, NumScopes> m_geometryViews;
 
 
         // Terrain related variables
         // Terrain related variables
         AZStd::array<AZ::RHI::ConstPtr<AZ::RHI::PipelineState>, NumScopes> m_terrainPipelineStates;
         AZStd::array<AZ::RHI::ConstPtr<AZ::RHI::PipelineState>, NumScopes> m_terrainPipelineStates;
 
 
         // Model related variables
         // Model related variables
-        AZStd::array<AZ::RPI::ModelLod::StreamBufferViewList, NumScopes> m_modelStreamBufferViews;
+        AZStd::array<AZ::RHI::StreamBufferIndices, NumScopes> m_modelStreamBufferIndices;
         AZStd::array<AZ::RHI::ConstPtr<AZ::RHI::PipelineState>, NumScopes> m_modelPipelineStates;
         AZStd::array<AZ::RHI::ConstPtr<AZ::RHI::PipelineState>, NumScopes> m_modelPipelineStates;
         AZ::Data::Instance<AZ::RPI::Model> m_model;
         AZ::Data::Instance<AZ::RPI::Model> m_model;
 
 

+ 6 - 15
Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.cpp

@@ -341,7 +341,7 @@ namespace AtomSampleViewer
             const AZ::Name LightHandleId{ "m_lightHandle" };
             const AZ::Name LightHandleId{ "m_lightHandle" };
 
 
             const uint32_t lodModel = 0u;
             const uint32_t lodModel = 0u;
-            const ModelLod::Mesh& mesh = m_model->GetLods()[lodModel]->GetMeshes()[subMeshIdx];
+            ModelLod::Mesh& mesh = m_model->GetLods()[lodModel]->GetMeshes()[subMeshIdx];
 
 
             auto uvAssetBufferView{ m_model->GetModelAsset()->GetLodAssets()[lodModel]->GetMeshes()[subMeshIdx].GetSemanticBufferAssetView(
             auto uvAssetBufferView{ m_model->GetModelAsset()->GetLodAssets()[lodModel]->GetMeshes()[subMeshIdx].GetSemanticBufferAssetView(
                 AZ::Name{ "UV" }) };
                 AZ::Name{ "UV" }) };
@@ -360,7 +360,7 @@ namespace AtomSampleViewer
 
 
             // Set the buffer stream
             // Set the buffer stream
             RHI::InputStreamLayout layout;
             RHI::InputStreamLayout layout;
-            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.bufferStreamViewArray, nullptr, m_shader->GetInputContract(), subMeshIdx);
+            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.m_streamIndices, nullptr, m_shader->GetInputContract(), subMeshIdx);
         }
         }
     }
     }
 
 
@@ -519,8 +519,8 @@ namespace AtomSampleViewer
         {
         {
             const uint32_t meshIndex = 0u;
             const uint32_t meshIndex = 0u;
             RHI::InputStreamLayout layout;
             RHI::InputStreamLayout layout;
-            ModelLod::StreamBufferViewList streamBufferView;
-            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferView, nullptr, m_shader->GetInputContract(), meshIndex);
+            RHI::StreamBufferIndices streamBufferIndices;
+            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferIndices, nullptr, m_shader->GetInputContract(), meshIndex);
             // Set the pipeline state
             // Set the pipeline state
             {
             {
                 RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
                 RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
@@ -1282,20 +1282,11 @@ namespace AtomSampleViewer
                             .get(),
                             .get(),
                     };
                     };
                     RHI::DeviceDrawItem drawItem;
                     RHI::DeviceDrawItem drawItem;
-                    drawItem.m_arguments = subMesh.m_mesh->m_drawArguments.GetDeviceDrawArguments(context.GetDeviceIndex());
+                    drawItem.m_geometryView = subMesh.m_mesh->GetDeviceGeometryView(context.GetDeviceIndex());
+                    drawItem.m_streamIndices = subMesh.m_streamIndices;
                     drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                     drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                    auto deviceIndexBufferView{subMesh.m_mesh->m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                    drawItem.m_indexBufferView = &deviceIndexBufferView;
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                    drawItem.m_streamBufferViewCount = static_cast<uint8_t>(subMesh.bufferStreamViewArray.size());
-                    AZStd::vector<RHI::DeviceStreamBufferView> deviceQuadStreamBufferViews;
-                    for(const auto& streamBufferView : subMesh.bufferStreamViewArray)
-                    {
-                        deviceQuadStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                    }
-                    drawItem.m_streamBufferViews = deviceQuadStreamBufferViews.data();
-
                     // Submit the triangle draw item.
                     // Submit the triangle draw item.
                     commandList->Submit(drawItem, instanceIdx);
                     commandList->Submit(drawItem, instanceIdx);
                 }
                 }

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

@@ -131,8 +131,8 @@ namespace AtomSampleViewer
 
 
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_perSubMeshSrg;
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_perSubMeshSrg;
 
 
-            const AZ::RPI::ModelLod::Mesh* m_mesh;
-            AZ::RPI::ModelLod::StreamBufferViewList bufferStreamViewArray;
+            AZ::RPI::ModelLod::Mesh* m_mesh;
+            AZ::RHI::StreamBufferIndices m_streamIndices;
 
 
             AZ::Matrix4x4 m_modelMatrix;
             AZ::Matrix4x4 m_modelMatrix;
 
 

+ 11 - 23
Gem/Code/Source/RHI/ComputeExampleComponent.cpp

@@ -119,36 +119,35 @@ namespace AtomSampleViewer
         request.m_initialData = &bufferData;
         request.m_initialData = &bufferData;
         m_inputAssemblyBufferPool->InitBuffer(request);
         m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_positions),
             offsetof(BufferData, m_positions),
             sizeof(BufferData::m_positions),
             sizeof(BufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_uvs),
             offsetof(BufferData, m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         m_inputStreamLayout = layoutBuilder.End();
         m_inputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_streamBufferViews);
+        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void ComputeExampleComponent::LoadComputeShader()
     void ComputeExampleComponent::LoadComputeShader()
@@ -392,26 +391,15 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_drawSRGs[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
                 m_drawSRGs[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
                 m_drawSRGs[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_drawSRGs[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 

+ 1 - 2
Gem/Code/Source/RHI/ComputeExampleComponent.h

@@ -83,8 +83,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
 
 
         // ----------------------------
         // ----------------------------

+ 16 - 21
Gem/Code/Source/RHI/CopyQueueComponent.cpp

@@ -138,26 +138,35 @@ namespace AtomSampleViewer
                 return;
                 return;
             }
             }
 
 
-            m_streamBufferViews[0] = {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_indexBuffer,
+                0,
+                indexBufSize,
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_positionBuffer,
                 *m_positionBuffer,
                 0,
                 0,
                 positionBufSize,
                 positionBufSize,
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] = {
+            m_geometryView.AddStreamBufferView({
                 *m_uvBuffer,
                 *m_uvBuffer,
                 0,
                 0,
                 uvBufSize,
                 uvBufSize,
                 sizeof(VertexUV)
                 sizeof(VertexUV)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -226,30 +235,16 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_indexBuffer->GetDeviceBuffer(context.GetDeviceIndex()), 0,
-                                                                     indexBufSize, RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             };
             };
 
 

+ 1 - 1
Gem/Code/Source/RHI/CopyQueueComponent.h

@@ -93,7 +93,7 @@ namespace AtomSampleViewer
 
 
         BufferData m_bufferData;
         BufferData m_bufferData;
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         static const int numberOfPaths = 3;
         static const int numberOfPaths = 3;
         const char* m_filePaths[numberOfPaths] = {
         const char* m_filePaths[numberOfPaths] = {

+ 11 - 23
Gem/Code/Source/RHI/DualSourceBlendingComponent.cpp

@@ -99,36 +99,35 @@ namespace AtomSampleViewer
         request.m_initialData = &bufferData;
         request.m_initialData = &bufferData;
         m_inputAssemblyBufferPool->InitBuffer(request);
         m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 3, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_positions),
             offsetof(BufferData, m_positions),
             sizeof(BufferData::m_positions),
             sizeof(BufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_colors),
             offsetof(BufferData, m_colors),
             sizeof(BufferData::m_colors),
             sizeof(BufferData::m_colors),
             sizeof(VertexColor)
             sizeof(VertexColor)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
         m_inputStreamLayout = layoutBuilder.End();
         m_inputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_streamBufferViews);
+        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void DualSourceBlendingComponent::LoadRasterShader()
     void DualSourceBlendingComponent::LoadRasterShader()
@@ -200,25 +199,14 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 3;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 

+ 1 - 2
Gem/Code/Source/RHI/DualSourceBlendingComponent.h

@@ -63,8 +63,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
 
 
         // ----------------------------------
         // ----------------------------------

+ 16 - 24
Gem/Code/Source/RHI/IndirectRenderingExampleComponent.cpp

@@ -241,6 +241,14 @@ namespace AtomSampleViewer
 
 
             RHI::ValidateStreamBufferViews(m_inputStreamLayout, AZStd::span<const RHI::StreamBufferView>(m_streamBufferViews.data(), 2));
             RHI::ValidateStreamBufferViews(m_inputStreamLayout, AZStd::span<const RHI::StreamBufferView>(m_streamBufferViews.data(), 2));
         }
         }
+
+        for (uint32_t i = 0; i < m_numObjects; ++i)
+        {
+            RHI::GeometryView& geoView = m_geometryViews[i];
+            geoView.SetIndexBufferView(m_indexBufferViews[0]);
+            geoView.AddStreamBufferView(m_streamBufferViews[0]);
+            geoView.AddStreamBufferView(m_streamBufferViews[1]);
+        }
     }
     }
 
 
 
 
@@ -406,22 +414,11 @@ namespace AtomSampleViewer
                         ->SetVertexView(0, triangleStreamBufferView)
                         ->SetVertexView(0, triangleStreamBufferView)
                         ->SetIndexView(triangleIndexBufferView);
                         ->SetIndexView(triangleIndexBufferView);
                 }
                 }
-                indirectBufferWriter->DrawIndexed(
-                    RHI::DrawIndexed(
-                        1,
-                        i,
-                        0,
-                        3,
-                        0));
+                indirectBufferWriter->DrawIndexed(RHI::DrawIndexed(0, 3, 0), RHI::DrawInstanceArguments(1, i));
             }
             }
             else
             else
             {
             {
-                RHI::DrawIndexed arguments(
-                    1,
-                    i,
-                    0,
-                    6,
-                    0);
+                RHI::DrawIndexed arguments(0, 6, 0);
 
 
                 switch (m_mode)
                 switch (m_mode)
                 {
                 {
@@ -441,7 +438,7 @@ namespace AtomSampleViewer
                     return;
                     return;
                 }
                 }
 
 
-                indirectBufferWriter->DrawIndexed(arguments);
+                indirectBufferWriter->DrawIndexed(arguments, RHI::DrawInstanceArguments(1, i));
             }
             }
 
 
             indirectBufferWriter->NextSequence();
             indirectBufferWriter->NextSequence();
@@ -850,21 +847,14 @@ namespace AtomSampleViewer
                 m_drawIndirect.m_maxSequenceCount = AZStd::min(m_numObjects - i, maxIndirectDrawCount);
                 m_drawIndirect.m_maxSequenceCount = AZStd::min(m_numObjects - i, maxIndirectDrawCount);
                 m_drawIndirect.m_indirectBufferByteOffset = i * m_indirectDrawBufferView.GetByteStride();
                 m_drawIndirect.m_indirectBufferByteOffset = i * m_indirectDrawBufferView.GetByteStride();
                 m_drawIndirect.m_indirectBufferView = &m_indirectDrawBufferView;
                 m_drawIndirect.m_indirectBufferView = &m_indirectDrawBufferView;
+                m_geometryViews[i].SetDrawArguments(m_drawIndirect);
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = AZ::RHI::DrawArguments(m_drawIndirect).GetDeviceDrawArguments(context.GetDeviceIndex());
+                drawItem.m_geometryView = m_geometryViews[i].GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryViews[i].GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_indexBufferViews[0].GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = 2;
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
                 // Submit the indirect draw item.
                 // Submit the indirect draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             }
             }
@@ -888,6 +878,7 @@ namespace AtomSampleViewer
         using namespace AZ;
         using namespace AZ;
 
 
         m_numObjects = s_maxNumberOfObjects / 2;
         m_numObjects = s_maxNumberOfObjects / 2;
+        m_geometryViews.resize(m_numObjects);
 
 
         RHI::Ptr<RHI::Device> device = Utils::GetRHIDevice();
         RHI::Ptr<RHI::Device> device = Utils::GetRHIDevice();
 
 
@@ -1000,6 +991,7 @@ namespace AtomSampleViewer
         m_indirectDispatchBufferSignature = nullptr;
         m_indirectDispatchBufferSignature = nullptr;
 
 
         m_instancesData.clear();
         m_instancesData.clear();
+        m_geometryViews.clear();
 
 
         m_imguiSidebar.Deactivate();
         m_imguiSidebar.Deactivate();
         AzFramework::WindowNotificationBus::Handler::BusDisconnect();
         AzFramework::WindowNotificationBus::Handler::BusDisconnect();

+ 1 - 0
Gem/Code/Source/RHI/IndirectRenderingExampleComponent.h

@@ -171,6 +171,7 @@ namespace AtomSampleViewer
 
 
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, NumSequencesType> m_indirectCommandsShaderResourceGroups;
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, NumSequencesType> m_indirectCommandsShaderResourceGroups;
 
 
+        AZStd::vector<AZ::RHI::GeometryView> m_geometryViews;
         AZStd::array<AZ::RHI::StreamBufferView, 3> m_streamBufferViews;
         AZStd::array<AZ::RHI::StreamBufferView, 3> m_streamBufferViews;
         AZStd::array<AZ::RHI::IndexBufferView, 2> m_indexBufferViews;
         AZStd::array<AZ::RHI::IndexBufferView, 2> m_indexBufferViews;
         AZ::RHI::IndirectBufferView m_indirectDrawBufferView;
         AZ::RHI::IndirectBufferView m_indirectDrawBufferView;

+ 9 - 9
Gem/Code/Source/RHI/InputAssemblyExampleComponent.cpp

@@ -371,9 +371,10 @@ namespace AtomSampleViewer
                 const auto* inputAssemblyBufferView = context.GetBufferView(RHI::AttachmentId{ InputAssembly::InputAssemblyBufferAttachmentId });
                 const auto* inputAssemblyBufferView = context.GetBufferView(RHI::AttachmentId{ InputAssembly::InputAssemblyBufferAttachmentId });
                 if (inputAssemblyBufferView)
                 if (inputAssemblyBufferView)
                 {
                 {
-                    m_streamBufferView[0] = {*(inputAssemblyBufferView->GetBuffer()), 0, sizeof(BufferData), sizeof(BufferData::value_type)};
+                    m_geometryView[0].ClearStreamBufferViews();
+                    m_geometryView[0].AddStreamBufferView({*(inputAssemblyBufferView->GetBuffer()), 0, sizeof(BufferData), sizeof(BufferData::value_type)});
 
 
-                    RHI::ValidateStreamBufferViews(m_inputStreamLayout, AZStd::span<const RHI::StreamBufferView>(&m_streamBufferView[0], 1));
+                    RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView[0], m_geometryView[0].GetFullStreamBufferIndices());
                 }
                 }
             }
             }
 
 
@@ -381,9 +382,10 @@ namespace AtomSampleViewer
                 const auto* inputAssemblyBufferView = context.GetBufferView(RHI::AttachmentId{ InputAssembly::ImportedInputAssemblyBufferAttachmentId });
                 const auto* inputAssemblyBufferView = context.GetBufferView(RHI::AttachmentId{ InputAssembly::ImportedInputAssemblyBufferAttachmentId });
                 if (inputAssemblyBufferView)
                 if (inputAssemblyBufferView)
                 {
                 {
-                    m_streamBufferView[1] = {*(inputAssemblyBufferView->GetBuffer()), 0, sizeof(BufferData), sizeof(BufferData::value_type)};
+                    m_geometryView[1].ClearStreamBufferViews();
+                    m_geometryView[1].AddStreamBufferView({*(inputAssemblyBufferView->GetBuffer()), 0, sizeof(BufferData), sizeof(BufferData::value_type)});
 
 
-                    RHI::ValidateStreamBufferViews(m_inputStreamLayout, AZStd::span<const RHI::StreamBufferView>(&m_streamBufferView[1], 1));
+                    RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView[1], m_geometryView[1].GetFullStreamBufferIndices());
                 }
                 }
             }
             }
         };
         };
@@ -401,16 +403,14 @@ namespace AtomSampleViewer
             drawLinear.m_vertexCount = BufferData::array_size;
             drawLinear.m_vertexCount = BufferData::array_size;
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawLinear;
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            drawItem.m_indexBufferView = nullptr;
-            drawItem.m_streamBufferViewCount = 1;
             drawItem.m_shaderResourceGroupCount = 1;
             drawItem.m_shaderResourceGroupCount = 1;
 
 
             for (uint32_t index = context.GetSubmitRange().m_startIndex; index < context.GetSubmitRange().m_endIndex; ++index)
             for (uint32_t index = context.GetSubmitRange().m_startIndex; index < context.GetSubmitRange().m_endIndex; ++index)
             {
             {
-                auto deviceStreamBufferView{m_streamBufferView[index].GetDeviceStreamBufferView(context.GetDeviceIndex())};
-                drawItem.m_streamBufferViews = &deviceStreamBufferView;
+                m_geometryView[index].SetDrawArguments(drawLinear);
+                drawItem.m_geometryView = m_geometryView[index].GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView[index].GetFullStreamBufferIndices();
 
 
                 RHI::DeviceShaderResourceGroup* rhiSRGS[] = {
                 RHI::DeviceShaderResourceGroup* rhiSRGS[] = {
                     m_drawSRG[index]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_drawSRG[index]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()

+ 1 - 1
Gem/Code/Source/RHI/InputAssemblyExampleComponent.h

@@ -65,7 +65,7 @@ namespace AtomSampleViewer
         // -------------------------------------------------
         // -------------------------------------------------
         // Input Assembly buffer and its Streams/Index Views
         // Input Assembly buffer and its Streams/Index Views
         // -------------------------------------------------
         // -------------------------------------------------
-        AZ::RHI::StreamBufferView m_streamBufferView[2];
+        AZ::RHI::GeometryView m_geometryView[2];
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
 
 
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;

+ 13 - 38
Gem/Code/Source/RHI/MRTExampleComponent.cpp

@@ -193,36 +193,35 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_positions),
             offsetof(BufferData, m_positions),
             sizeof(BufferData::m_positions),
             sizeof(BufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_uvs),
             offsetof(BufferData, m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         m_inputStreamLayout = layoutBuilder.End();
         m_inputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_streamBufferViews);
+        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void MRTExampleComponent::InitRenderTargets()
     void MRTExampleComponent::InitRenderTargets()
@@ -286,28 +285,16 @@ namespace AtomSampleViewer
             commandList->SetViewports(&viewport, 1);
             commandList->SetViewports(&viewport, 1);
             commandList->SetScissors(&scissor, 1);
             commandList->SetScissors(&scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineStates[0]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineStates[0]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 
@@ -373,28 +360,16 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_shaderResourceGroups[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_shaderResourceGroups[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineStates[1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineStates[1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 

+ 1 - 2
Gem/Code/Source/RHI/MRTExampleComponent.h

@@ -79,8 +79,7 @@ namespace AtomSampleViewer
             AZStd::array<VertexUV, 4> m_uvs;
             AZStd::array<VertexUV, 4> m_uvs;
             AZStd::array<uint16_t, 6> m_indices;
             AZStd::array<uint16_t, 6> m_indices;
         };
         };
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         AZStd::array<AZ::RHI::AttachmentId, 3> m_attachmentID;
         AZStd::array<AZ::RHI::AttachmentId, 3> m_attachmentID;
         AZ::RHI::ClearValue m_clearValue;
         AZ::RHI::ClearValue m_clearValue;

+ 34 - 48
Gem/Code/Source/RHI/MSAAExampleComponent.cpp

@@ -144,28 +144,35 @@ namespace AtomSampleViewer
         request.m_initialData = &bufferData;
         request.m_initialData = &bufferData;
         m_inputAssemblyBufferPool->InitBuffer(request);
         m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-        m_triangleStreamBufferViews[0] =
-        {
+        m_triangleGeometryView.SetDrawArguments(RHI::DrawIndexed(0, 3, 0));
+
+        m_triangleGeometryView.SetIndexBufferView({
+            *m_triangleInputAssemblyBuffer,
+            offsetof(TriangleBufferData, m_indices),
+            sizeof(TriangleBufferData::m_indices),
+            RHI::IndexFormat::Uint16
+        });
+
+        m_triangleGeometryView.AddStreamBufferView({
             *m_triangleInputAssemblyBuffer,
             *m_triangleInputAssemblyBuffer,
             offsetof(TriangleBufferData, m_positions),
             offsetof(TriangleBufferData, m_positions),
             sizeof(TriangleBufferData::m_positions),
             sizeof(TriangleBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_triangleStreamBufferViews[1] =
-        {
+        m_triangleGeometryView.AddStreamBufferView({
             *m_triangleInputAssemblyBuffer,
             *m_triangleInputAssemblyBuffer,
             offsetof(TriangleBufferData, m_colors),
             offsetof(TriangleBufferData, m_colors),
             sizeof(TriangleBufferData::m_colors),
             sizeof(TriangleBufferData::m_colors),
             sizeof(VertexColor)
             sizeof(VertexColor)
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
         m_triangleInputStreamLayout = layoutBuilder.End();
         m_triangleInputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_triangleInputStreamLayout, m_triangleStreamBufferViews);
+        RHI::ValidateStreamBufferViews(m_triangleInputStreamLayout, m_triangleGeometryView, m_triangleGeometryView.GetFullStreamBufferIndices());
 
 
         m_triangleShader = LoadShader(TriangeShaderFilePath, SampleName);
         m_triangleShader = LoadShader(TriangeShaderFilePath, SampleName);
         if (!m_triangleShader)
         if (!m_triangleShader)
@@ -205,26 +212,35 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_quadStreamBufferViews[0] = {
+        m_quadGeometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_quadGeometryView.SetIndexBufferView({
+            *m_quadInputAssemblyBuffer,
+            offsetof(QuadBufferData, m_indices),
+            sizeof(QuadBufferData::m_indices),
+            RHI::IndexFormat::Uint16
+        });
+
+        m_quadGeometryView.AddStreamBufferView({
             *m_quadInputAssemblyBuffer,
             *m_quadInputAssemblyBuffer,
             offsetof(QuadBufferData, m_positions),
             offsetof(QuadBufferData, m_positions),
             sizeof(QuadBufferData::m_positions),
             sizeof(QuadBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_quadStreamBufferViews[1] = {
+        m_quadGeometryView.AddStreamBufferView({
             *m_quadInputAssemblyBuffer,
             *m_quadInputAssemblyBuffer,
             offsetof(QuadBufferData, m_uvs),
             offsetof(QuadBufferData, m_uvs),
             sizeof(QuadBufferData::m_uvs),
             sizeof(QuadBufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         m_quadInputStreamLayout = layoutBuilder.End();
         m_quadInputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_quadInputStreamLayout, m_quadStreamBufferViews);
+        RHI::ValidateStreamBufferViews(m_quadInputStreamLayout, m_quadGeometryView, m_quadGeometryView.GetFullStreamBufferIndices());
 
 
         m_customMSAAResolveShader = LoadShader(CustomResolveShaderFilePath, SampleName);
         m_customMSAAResolveShader = LoadShader(CustomResolveShaderFilePath, SampleName);
         if (!m_customMSAAResolveShader)
         if (!m_customMSAAResolveShader)
@@ -339,32 +355,17 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            const RHI::DeviceIndexBufferView indexBufferView = { *m_triangleInputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                 offsetof(TriangleBufferData, m_indices),
-                                                                 sizeof(TriangleBufferData::m_indices), RHI::IndexFormat::Uint16 };
-
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 3;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_triangleShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_triangleShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
+            // Submit the triangle draw item.
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_triangleGeometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_triangleGeometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineStates[msaaTypeIndex]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineStates[msaaTypeIndex]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            drawItem.m_indexBufferView = &indexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_triangleStreamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_triangleStreamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_triangleStreamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
-            // Submit the triangle draw item.
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 
@@ -454,33 +455,18 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            const RHI::DeviceIndexBufferView indexBufferView = { *m_quadInputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                 offsetof(QuadBufferData, m_indices), sizeof(QuadBufferData::m_indices),
-                                                                 RHI::IndexFormat::Uint16 };
-
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_customMSAAResolveShaderResourceGroup
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = { m_customMSAAResolveShaderResourceGroup
                                                                                  ->GetRHIShaderResourceGroup()
                                                                                  ->GetRHIShaderResourceGroup()
                                                                                  ->GetDeviceShaderResourceGroup(context.GetDeviceIndex())
                                                                                  ->GetDeviceShaderResourceGroup(context.GetDeviceIndex())
                                                                                  .get() };
                                                                                  .get() };
 
 
+            // Submit the quad draw item.
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_quadGeometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_quadGeometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_customResolveMSAAPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_customResolveMSAAPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            drawItem.m_indexBufferView = &indexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_quadStreamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_quadStreamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_quadStreamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
-            // Submit the triangle draw item.
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 

+ 2 - 2
Gem/Code/Source/RHI/MSAAExampleComponent.h

@@ -133,8 +133,8 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 6> m_indices;
             AZStd::array<uint16_t, 6> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_triangleStreamBufferViews;
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_quadStreamBufferViews;
+        AZ::RHI::GeometryView m_triangleGeometryView;
+        AZ::RHI::GeometryView m_quadGeometryView;
         AZ::RHI::InputStreamLayout m_triangleInputStreamLayout;
         AZ::RHI::InputStreamLayout m_triangleInputStreamLayout;
         AZ::RHI::InputStreamLayout m_quadInputStreamLayout;
         AZ::RHI::InputStreamLayout m_quadInputStreamLayout;
 
 

+ 17 - 23
Gem/Code/Source/RHI/MatrixAlignmentTestExampleComponent.cpp

@@ -249,28 +249,35 @@ namespace AtomSampleViewer
             request.m_initialData = &bufferData;
             request.m_initialData = &bufferData;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViews[0] =
-            {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferData, m_indices),
+                sizeof(BufferData::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_positions),
                 offsetof(BufferData, m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] =
-            {
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_colors),
                 offsetof(BufferData, m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(VertexColor)
                 sizeof(VertexColor)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -457,30 +464,17 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_inputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                     offsetof(BufferData, m_indices), sizeof(BufferData::m_indices),
-                                                                     RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 2;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_drawInstanceArgs = RHI::DrawInstanceArguments(2, 0);
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 // Submit the triangle draw item.
                 // Submit the triangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);

+ 1 - 1
Gem/Code/Source/RHI/MatrixAlignmentTestExampleComponent.h

@@ -175,7 +175,7 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 6> m_indices;
             AZStd::array<uint16_t, 6> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         // ImGui stuff.
         // ImGui stuff.
         ImGuiSidebar m_imguiSidebar;
         ImGuiSidebar m_imguiSidebar;

+ 52 - 53
Gem/Code/Source/RHI/MultiGPUExampleComponent.cpp

@@ -101,7 +101,7 @@ namespace AtomSampleViewer
                     AZ_Error("MultiGPUExampleComponent", false, "StagingBufferToGPU was not created");
                     AZ_Error("MultiGPUExampleComponent", false, "StagingBufferToGPU was not created");
                 }
                 }
 
 
-                auto bufferViewDescriptor{ RHI::BufferViewDescriptor::CreateRaw(0, request.m_descriptor.m_byteCount) };
+                auto bufferViewDescriptor{ RHI::BufferViewDescriptor::CreateRaw(0, static_cast<u32>(request.m_descriptor.m_byteCount)) };
                 auto bufferView = m_stagingBufferToGPU->BuildBufferView(bufferViewDescriptor);
                 auto bufferView = m_stagingBufferToGPU->BuildBufferView(bufferViewDescriptor);
                 bufferView->GetDeviceBufferView(0);
                 bufferView->GetDeviceBufferView(0);
                 bufferView->GetDeviceBufferView(1);
                 bufferView->GetDeviceBufferView(1);
@@ -304,20 +304,35 @@ namespace AtomSampleViewer
             request.m_initialData = &bufferData;
             request.m_initialData = &bufferData;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViews[0] = { *m_inputAssemblyBuffer,
-                                       offsetof(BufferDataTrianglePass, m_positions), sizeof(BufferDataTrianglePass::m_positions),
-                                       sizeof(VertexPosition) };
-
-            m_streamBufferViews[1] = { *m_inputAssemblyBuffer,
-                                       offsetof(BufferDataTrianglePass, m_colors), sizeof(BufferDataTrianglePass::m_colors),
-                                       sizeof(VertexColor) };
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 3, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferDataTrianglePass, m_indices),
+                sizeof(BufferDataTrianglePass::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferDataTrianglePass, m_positions),
+                sizeof(BufferDataTrianglePass::m_positions),
+                sizeof(VertexPosition)
+            });
+
+            m_geometryView.AddStreamBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferDataTrianglePass, m_colors),
+                sizeof(BufferDataTrianglePass::m_colors),
+                sizeof(VertexColor)
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -402,32 +417,17 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissors[int(scopeData.second)], 1);
                 commandList->SetScissors(&m_scissors[int(scopeData.second)], 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_inputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                     offsetof(BufferDataTrianglePass, m_indices),
-                                                                     sizeof(BufferDataTrianglePass::m_indices), RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 3;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroupShared->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroupShared->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
+                // Submit the triangle draw item.
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
-                // Submit the triangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             };
             };
 
 
@@ -461,20 +461,35 @@ namespace AtomSampleViewer
             request.m_deviceMask = m_deviceMask_1;
             request.m_deviceMask = m_deviceMask_1;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViewsComposite[0] = { *m_inputAssemblyBufferComposite,
-                                                offsetof(BufferDataCompositePass, m_positions),
-                                                sizeof(BufferDataCompositePass::m_positions), sizeof(VertexPosition) };
-
-            m_streamBufferViewsComposite[1] = { *m_inputAssemblyBufferComposite,
-                                                offsetof(BufferDataCompositePass, m_uvs), sizeof(BufferDataCompositePass::m_uvs),
-                                                sizeof(VertexUV) };
+            m_geometryViewComposite.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryViewComposite.SetIndexBufferView({
+                *m_inputAssemblyBufferComposite,
+                offsetof(BufferDataCompositePass, m_indices),
+                sizeof(BufferDataCompositePass::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryViewComposite.AddStreamBufferView({
+                *m_inputAssemblyBufferComposite,
+                offsetof(BufferDataCompositePass, m_positions),
+                sizeof(BufferDataCompositePass::m_positions),
+                sizeof(VertexPosition)
+            });
+
+            m_geometryViewComposite.AddStreamBufferView({
+                *m_inputAssemblyBufferComposite,
+                offsetof(BufferDataCompositePass, m_uvs),
+                sizeof(BufferDataCompositePass::m_uvs),
+                sizeof(VertexUV)
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViewsComposite);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryViewComposite, m_geometryViewComposite.GetFullStreamBufferIndices());
         }
         }
 
 
         // Load shader and connect inputs
         // Load shader and connect inputs
@@ -575,32 +590,16 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = {
-                    *m_inputAssemblyBufferComposite->GetDeviceBuffer(context.GetDeviceIndex()),
-                    offsetof(BufferDataCompositePass, m_indices), sizeof(BufferDataCompositePass::m_indices), RHI::IndexFormat::Uint16
-                };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroupComposite->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroupComposite->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryViewComposite.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryViewComposite.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineStateComposite->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineStateComposite->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViewsComposite.size());
-                AZStd::array<RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViewsComposite[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViewsComposite[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             };
             };
 
 

+ 2 - 3
Gem/Code/Source/RHI/MultiGPUExampleComponent.h

@@ -76,8 +76,7 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 3> m_indices;
             AZStd::array<uint16_t, 3> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::Ptr<AZ::RHI::ImagePool> m_imagePool{};
         AZ::RHI::Ptr<AZ::RHI::ImagePool> m_imagePool{};
         AZStd::array<AZ::RHI::Ptr<AZ::RHI::Image>, 2> m_images;
         AZStd::array<AZ::RHI::Ptr<AZ::RHI::Image>, 2> m_images;
         AZStd::array<AZ::RHI::AttachmentId, 2> m_imageAttachmentIds = { { AZ::RHI::AttachmentId("MultiGPURenderTexture1"),
         AZStd::array<AZ::RHI::AttachmentId, 2> m_imageAttachmentIds = { { AZ::RHI::AttachmentId("MultiGPURenderTexture1"),
@@ -108,7 +107,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_stagingBufferPool{};
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_stagingBufferPool{};
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_stagingBufferToGPU{};
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_stagingBufferToGPU{};
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBufferComposite{};
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBufferComposite{};
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViewsComposite;
+        AZ::RHI::GeometryView m_geometryViewComposite;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineStateComposite;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineStateComposite;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupPool> m_shaderResourceGroupPoolComposite;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupPool> m_shaderResourceGroupPoolComposite;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroup> m_shaderResourceGroupComposite;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroup> m_shaderResourceGroupComposite;

+ 11 - 24
Gem/Code/Source/RHI/MultiThreadComponent.cpp

@@ -175,29 +175,28 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(AZ::RHI::DrawIndexed(0, s_geometryIndexCount, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_positions),
             offsetof(SingleCubeBufferData, m_positions),
             sizeof(SingleCubeBufferData::m_positions),
             sizeof(SingleCubeBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_colors),
             offsetof(SingleCubeBufferData, m_colors),
             sizeof(SingleCubeBufferData::m_colors),
             sizeof(SingleCubeBufferData::m_colors),
             sizeof(VertexColor)
             sizeof(VertexColor)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_indices),
             offsetof(SingleCubeBufferData, m_indices),
             sizeof(SingleCubeBufferData::m_indices),
             sizeof(SingleCubeBufferData::m_indices),
             AZ::RHI::IndexFormat::Uint16
             AZ::RHI::IndexFormat::Uint16
-        };
+        });
 
 
         AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
         AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.SetTopology(AZ::RHI::PrimitiveTopology::TriangleList);
         layoutBuilder.SetTopology(AZ::RHI::PrimitiveTopology::TriangleList);
@@ -206,7 +205,7 @@ namespace AtomSampleViewer
         m_streamLayoutDescriptor.Clear();
         m_streamLayoutDescriptor.Clear();
         m_streamLayoutDescriptor = layoutBuilder.End();
         m_streamLayoutDescriptor = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_streamLayoutDescriptor, m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(m_streamLayoutDescriptor, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void MultiThreadComponent::CreatePipeline()
     void MultiThreadComponent::CreatePipeline()
@@ -314,10 +313,6 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            AZ::RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = s_geometryIndexCount;
-            drawIndexed.m_instanceCount = 1;
-
             if (context.GetCommandListIndex() == context.GetCommandListCount() - 1)
             if (context.GetCommandListIndex() == context.GetCommandListCount() - 1)
             {
             {
 #if defined(AZ_DEBUG_BUILD)
 #if defined(AZ_DEBUG_BUILD)
@@ -333,19 +328,11 @@ namespace AtomSampleViewer
                 };
                 };
 
 
                 AZ::RHI::DeviceDrawItem drawItem;
                 AZ::RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
                 commandList->Submit(drawItem, i);
                 commandList->Submit(drawItem, i);
             }
             }
         };
         };

+ 1 - 2
Gem/Code/Source/RHI/MultiThreadComponent.h

@@ -86,7 +86,6 @@ namespace AtomSampleViewer
         AZ::RHI::ShaderInputConstantIndex m_shaderIndexViewProj;
         AZ::RHI::ShaderInputConstantIndex m_shaderIndexViewProj;
 
 
         AZ::RHI::AttachmentId m_depthStencilID;
         AZ::RHI::AttachmentId m_depthStencilID;
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        AZ::RHI::GeometryView m_geometryView;
     };
     };
 } // namespace AtomSampleViewer
 } // namespace AtomSampleViewer

+ 15 - 43
Gem/Code/Source/RHI/MultipleViewsComponent.cpp

@@ -257,37 +257,35 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, geometryIndexCount, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_positions),
             offsetof(BufferData, m_positions),
             sizeof(BufferData::m_positions),
             sizeof(BufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_colors),
             offsetof(BufferData, m_colors),
             sizeof(BufferData::m_colors),
             sizeof(BufferData::m_colors),
             sizeof(VertexColor)
             sizeof(VertexColor)
-        };
+        });
 
 
-        m_streamBufferViews[2] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_normals),
             offsetof(BufferData, m_normals),
             sizeof(BufferData::m_normals),
             sizeof(BufferData::m_normals),
             sizeof(VertexNormal)
             sizeof(VertexNormal)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             AZ::RHI::IndexFormat::Uint16
             AZ::RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
@@ -295,7 +293,7 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("NORMAL", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("NORMAL", RHI::Format::R32G32B32_FLOAT);
         m_inputStreamLayout = layoutBuilder.End();
         m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void MultipleViewsComponent::InitRenderTarget()
     void MultipleViewsComponent::InitRenderTarget()
@@ -418,29 +416,16 @@ namespace AtomSampleViewer
             commandList->SetViewports(&viewport, 1);
             commandList->SetViewports(&viewport, 1);
             commandList->SetScissors(&scissor, 1);
             commandList->SetScissors(&scissor, 1);
 
 
-            AZ::RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = geometryIndexCount;
-            drawIndexed.m_instanceCount = 1;
-
             const AZ::RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const AZ::RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             AZ::RHI::DeviceDrawItem drawItem;
             AZ::RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineStates[0]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineStates[0]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 3> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[2].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 
@@ -519,29 +504,16 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            AZ::RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = geometryIndexCount;
-            drawIndexed.m_instanceCount = 1;
-
             const AZ::RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const AZ::RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_shaderResourceGroups[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_shaderResourceGroups[1]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             AZ::RHI::DeviceDrawItem drawItem;
             AZ::RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_pipelineStates[1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_pipelineStates[1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 3> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[2].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
-
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 

+ 1 - 2
Gem/Code/Source/RHI/MultipleViewsComponent.h

@@ -99,8 +99,7 @@ namespace AtomSampleViewer
         AZStd::array<AZ::RHI::ShaderInputConstantIndex, 6> m_shaderInputConstantIndices;
         AZStd::array<AZ::RHI::ShaderInputConstantIndex, 6> m_shaderInputConstantIndices;
         AZ::RHI::ShaderInputImageIndex m_shaderInputImageIndex;
         AZ::RHI::ShaderInputImageIndex m_shaderInputImageIndex;
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 3> m_streamBufferViews;
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::AttachmentId m_depthMapID;
         AZ::RHI::AttachmentId m_depthMapID;
         AZ::RHI::AttachmentId m_depthStencilID;
         AZ::RHI::AttachmentId m_depthStencilID;
         AZ::RHI::ClearValue m_depthClearValue;
         AZ::RHI::ClearValue m_depthClearValue;

+ 14 - 17
Gem/Code/Source/RHI/QueryExampleComponent.cpp

@@ -181,18 +181,27 @@ namespace AtomSampleViewer
                 return;
                 return;
             }
             }
 
 
-            m_quadStreamBufferView = {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_quadInputAssemblyBuffer,
+                offsetof(BufferData, m_indices),
+                sizeof(BufferData::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_quadInputAssemblyBuffer,
                 *m_quadInputAssemblyBuffer,
                 offsetof(BufferData, m_positions),
                 offsetof(BufferData, m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             m_quadInputStreamLayout = layoutBuilder.End();
             m_quadInputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(m_quadInputStreamLayout, AZStd::span<const RHI::StreamBufferView>(&m_quadStreamBufferView, 1));
+            RHI::ValidateStreamBufferViews(m_quadInputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
     }
     }
 
 
@@ -432,26 +441,14 @@ namespace AtomSampleViewer
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
             {
             {
-                const RHI::DeviceIndexBufferView quadIndexBufferView = {
-                    *m_quadInputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()), offsetof(BufferData, m_indices),
-                    sizeof(BufferData::m_indices), RHI::IndexFormat::Uint16
-                };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroups[0]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_quadPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_quadPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &quadIndexBufferView;
-                drawItem.m_streamBufferViewCount = 1;
-                auto deviceStreamBufferView{m_quadStreamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex())};
-                drawItem.m_streamBufferViews = &deviceStreamBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 

+ 1 - 1
Gem/Code/Source/RHI/QueryExampleComponent.h

@@ -100,8 +100,8 @@ namespace AtomSampleViewer
             AZStd::array<VertexPosition, 4> m_positions;
             AZStd::array<VertexPosition, 4> m_positions;
             AZStd::array<uint16_t, 6> m_indices;
             AZStd::array<uint16_t, 6> m_indices;
         };
         };
-        AZ::RHI::StreamBufferView m_quadStreamBufferView;
         AZ::RHI::InputStreamLayout m_quadInputStreamLayout;
         AZ::RHI::InputStreamLayout m_quadInputStreamLayout;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, 3> m_shaderResourceGroups;
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, 3> m_shaderResourceGroups;
         AZ::RHI::ShaderInputConstantIndex m_objectMatrixConstantIndex;
         AZ::RHI::ShaderInputConstantIndex m_objectMatrixConstantIndex;

+ 10 - 22
Gem/Code/Source/RHI/RayTracingExampleComponent.cpp

@@ -168,29 +168,28 @@ namespace AtomSampleViewer
         request.m_initialData = &bufferData;
         request.m_initialData = &bufferData;
         m_inputAssemblyBufferPool->InitBuffer(request);
         m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-        m_fullScreenStreamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_fullScreenInputAssemblyBuffer,
             *m_fullScreenInputAssemblyBuffer,
             offsetof(FullScreenBufferData, m_positions),
             offsetof(FullScreenBufferData, m_positions),
             sizeof(FullScreenBufferData::m_positions),
             sizeof(FullScreenBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_fullScreenStreamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_fullScreenInputAssemblyBuffer,
             *m_fullScreenInputAssemblyBuffer,
             offsetof(FullScreenBufferData, m_uvs),
             offsetof(FullScreenBufferData, m_uvs),
             sizeof(FullScreenBufferData::m_uvs),
             sizeof(FullScreenBufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
 
 
-        m_fullScreenIndexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_fullScreenInputAssemblyBuffer,
             *m_fullScreenInputAssemblyBuffer,
             offsetof(FullScreenBufferData, m_indices),
             offsetof(FullScreenBufferData, m_indices),
             sizeof(FullScreenBufferData::m_indices),
             sizeof(FullScreenBufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
@@ -660,25 +659,14 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_drawSRG->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_drawSRG->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_drawPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_fullScreenIndexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_fullScreenStreamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_fullScreenStreamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_fullScreenStreamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 

+ 1 - 2
Gem/Code/Source/RHI/RayTracingExampleComponent.h

@@ -134,8 +134,7 @@ namespace AtomSampleViewer
         };
         };
 
 
         RHI::Ptr<RHI::Buffer> m_fullScreenInputAssemblyBuffer;
         RHI::Ptr<RHI::Buffer> m_fullScreenInputAssemblyBuffer;
-        AZStd::array<RHI::StreamBufferView, 2> m_fullScreenStreamBufferViews;
-        RHI::IndexBufferView m_fullScreenIndexBufferView;
+        RHI::GeometryView m_geometryView;
         RHI::InputStreamLayout m_fullScreenInputStreamLayout;
         RHI::InputStreamLayout m_fullScreenInputStreamLayout;
 
 
         RHI::ConstPtr<RHI::PipelineState> m_drawPipelineState;
         RHI::ConstPtr<RHI::PipelineState> m_drawPipelineState;

+ 16 - 20
Gem/Code/Source/RHI/SphericalHarmonicsExampleComponent.cpp

@@ -142,26 +142,35 @@ namespace AtomSampleViewer
                 return;
                 return;
             }
             }
 
 
-            m_streamBufferViews[0] = {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_indexBuffer,
+                0,
+                indexBufSize,
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_positionBuffer,
                 *m_positionBuffer,
                 0,
                 0,
                 positionBufSize,
                 positionBufSize,
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] = {
+            m_geometryView.AddStreamBufferView({
                 *m_uvBuffer,
                 *m_uvBuffer,
                 0,
                 0,
                 uvBufSize,
                 uvBufSize,
                 sizeof(VertexUV)
                 sizeof(VertexUV)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         constexpr float objectMatrixScale = 0.8f;
         constexpr float objectMatrixScale = 0.8f;
@@ -309,13 +318,6 @@ namespace AtomSampleViewer
                 // Bind ViewSrg
                 // Bind ViewSrg
                 commandList->SetShaderResourceGroupForDraw(*m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get());
                 commandList->SetShaderResourceGroupForDraw(*m_viewShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get());
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_indexBuffer->GetDeviceBuffer(context.GetDeviceIndex()), 0,
-                                                                     indexBufSize, RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     (m_mode ? m_demoShaderResourceGroup->GetRHIShaderResourceGroup()
                     (m_mode ? m_demoShaderResourceGroup->GetRHIShaderResourceGroup()
                                   ->GetDeviceShaderResourceGroup(context.GetDeviceIndex())
                                   ->GetDeviceShaderResourceGroup(context.GetDeviceIndex())
@@ -327,17 +329,11 @@ namespace AtomSampleViewer
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_mode ? m_demoPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get() : m_renderPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_mode ? m_demoPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get() : m_renderPipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             };
             };

+ 1 - 1
Gem/Code/Source/RHI/SphericalHarmonicsExampleComponent.h

@@ -126,6 +126,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_indexBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_indexBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_positionBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_positionBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_uvBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_uvBuffer;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         struct BufferData
         struct BufferData
         {
         {
@@ -134,7 +135,6 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 6> m_indices;
             AZStd::array<uint16_t, 6> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
         // ------------------------------------------------------------
         // ------------------------------------------------------------
 
 
         AZ::EntityId m_cameraEntityId;
         AZ::EntityId m_cameraEntityId;

+ 21 - 29
Gem/Code/Source/RHI/StencilExampleComponent.cpp

@@ -103,28 +103,38 @@ namespace AtomSampleViewer
             request.m_initialData = &bufferData;
             request.m_initialData = &bufferData;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViews[0] =
-            {
+            m_geometryView.SetIndexBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferData, m_indices),
+                sizeof(BufferData::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_positions),
                 offsetof(BufferData, m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] =
-            {
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_colors),
                 offsetof(BufferData, m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(VertexColor)
                 sizeof(VertexColor)
-            };
+            });
+
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, s_numberOfVertices / 2, 0));
+
+            m_geometryView2 = m_geometryView;
+            m_geometryView2.SetDrawArguments(RHI::DrawIndexed(0, 3, s_numberOfVertices / 2));
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -204,45 +214,27 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_inputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                     offsetof(BufferData, m_indices), sizeof(BufferData::m_indices),
-                                                                     RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_instanceCount = 1;
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_indexBufferView = &indexBufferView;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
 
 
                 for (uint32_t i = context.GetSubmitRange().m_startIndex; i < context.GetSubmitRange().m_endIndex; ++i)
                 for (uint32_t i = context.GetSubmitRange().m_startIndex; i < context.GetSubmitRange().m_endIndex; ++i)
                 {
                 {
                     if (i == 0)
                     if (i == 0)
                     {
                     {
-                        drawIndexed.m_indexCount = s_numberOfVertices / 2;
-
                         // Draw color triangles
                         // Draw color triangles
-                        drawItem.m_arguments = drawIndexed;
+                        drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
                         drawItem.m_pipelineState = m_pipelineStateBasePass->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         drawItem.m_pipelineState = m_pipelineStateBasePass->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         commandList->Submit(drawItem, i);
                         commandList->Submit(drawItem, i);
                     }
                     }
                     else
                     else
                     {
                     {
                         // Draw white triangles
                         // Draw white triangles
-                        drawIndexed.m_indexOffset = s_numberOfVertices / 2;
-                        drawIndexed.m_indexCount = 3;
                         drawItem.m_stencilRef = 1;
                         drawItem.m_stencilRef = 1;
-
-                        drawItem.m_arguments = drawIndexed;
+                        drawItem.m_geometryView = m_geometryView2.GetDeviceGeometryView(context.GetDeviceIndex());
                         drawItem.m_pipelineState = m_pipelineStateStencil[i-1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         drawItem.m_pipelineState = m_pipelineStateStencil[i-1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
                         commandList->Submit(drawItem, i);
                         commandList->Submit(drawItem, i);
-
-                        drawIndexed.m_indexOffset += 3;
                     }
                     }
                 }
                 }
             };
             };

+ 2 - 1
Gem/Code/Source/RHI/StencilExampleComponent.h

@@ -60,7 +60,8 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, s_numberOfVertices> m_indices;
             AZStd::array<uint16_t, s_numberOfVertices> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
+        AZ::RHI::GeometryView m_geometryView2;
 
 
         AZ::RHI::AttachmentId m_depthStencilID;
         AZ::RHI::AttachmentId m_depthStencilID;
         AZ::RHI::ClearValue m_depthClearValue;
         AZ::RHI::ClearValue m_depthClearValue;

+ 7 - 21
Gem/Code/Source/RHI/SubpassExampleComponent.cpp

@@ -263,7 +263,7 @@ namespace AtomSampleViewer
 
 
                 modelLod->GetStreamsForMesh(
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     pipelineDesc.m_inputStreamLayout,
-                    modelData.m_streamBufferList,
+                    modelData.m_streamIndices,
                     nullptr,
                     nullptr,
                     shader->GetInputContract(),
                     shader->GetInputContract(),
                     0);
                     0);
@@ -417,22 +417,14 @@ namespace AtomSampleViewer
                         .get()
                         .get()
                 };
                 };
 
 
-                for (const auto& mesh : m_models[modelData.m_modelType]->GetLods()[0]->GetMeshes())
+                for (auto& mesh : m_models[modelData.m_modelType]->GetLods()[0]->GetMeshes())
                 {
                 {
                     RHI::DeviceDrawItem drawItem;
                     RHI::DeviceDrawItem drawItem;
-                    drawItem.m_arguments = mesh.m_drawArguments.GetDeviceDrawArguments(context.GetDeviceIndex());
+                    drawItem.m_geometryView = mesh.GetDeviceGeometryView(context.GetDeviceIndex());
+                    drawItem.m_streamIndices = modelData.m_streamIndices;
                     drawItem.m_pipelineState = modelData.m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                     drawItem.m_pipelineState = modelData.m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                    auto deviceIndexBufferView{mesh.m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                    drawItem.m_indexBufferView = &deviceIndexBufferView;
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
                     drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                    drawItem.m_streamBufferViewCount = static_cast<uint8_t>(modelData.m_streamBufferList.size());
-                    AZStd::vector<AZ::RHI::DeviceStreamBufferView> deviceStreamBufferViews;
-                    for(const auto& streamBufferView : modelData.m_streamBufferList)
-                    {
-                        deviceStreamBufferViews.emplace_back(streamBufferView.GetDeviceStreamBufferView(context.GetDeviceIndex()));
-                    }
-                    drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                     commandList->Submit(drawItem);
                     commandList->Submit(drawItem);
                 }
                 }
@@ -539,20 +531,14 @@ namespace AtomSampleViewer
                 m_sceneShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
                 m_sceneShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
             };
             };
 
 
-            RHI::DrawLinear drawArguments;
-            drawArguments.m_instanceCount = 1;
-            drawArguments.m_instanceOffset = 0;
-            drawArguments.m_vertexCount = 4;
-            drawArguments.m_vertexOffset = 0;
+            m_compositeGeometryView.SetDrawArguments(RHI::DrawLinear(4, 0));
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = RHI::DeviceDrawArguments(drawArguments);
+            drawItem.m_geometryView = m_compositeGeometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_compositeGeometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_compositionPipeline->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_compositionPipeline->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            drawItem.m_indexBufferView = nullptr;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = 0;
-            drawItem.m_streamBufferViews = nullptr;
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };
 
 

+ 3 - 1
Gem/Code/Source/RHI/SubpassExampleComponent.h

@@ -72,7 +72,7 @@ namespace AtomSampleViewer
 
 
         struct ModelData
         struct ModelData
         {
         {
-            AZ::RPI::ModelLod::StreamBufferViewList m_streamBufferList;
+            AZ::RHI::StreamBufferIndices m_streamIndices;
             AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
             AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup;
             AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup;
             ModelType m_modelType = ModelType_ShaderBall;
             ModelType m_modelType = ModelType_ShaderBall;
@@ -110,6 +110,8 @@ namespace AtomSampleViewer
         AZ::RHI::AttachmentId m_positionAttachmentId;
         AZ::RHI::AttachmentId m_positionAttachmentId;
         AZ::RHI::AttachmentId m_depthStencilAttachmentId;
         AZ::RHI::AttachmentId m_depthStencilAttachmentId;
 
 
+        AZ::RHI::GeometryView m_compositeGeometryView;
+
         AZ::EntityId m_cameraEntityId;
         AZ::EntityId m_cameraEntityId;
         AzFramework::EntityContextId m_entityContextId;
         AzFramework::EntityContextId m_entityContextId;
 
 

+ 3 - 7
Gem/Code/Source/RHI/Texture3dExampleComponent.cpp

@@ -213,9 +213,7 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                RHI::DrawLinear drawIndexed;
-                drawIndexed.m_vertexCount = 4;
-                drawIndexed.m_instanceCount = 1;
+                m_geometryView.SetDrawArguments(RHI::DrawLinear(4, 0));
 
 
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
@@ -223,13 +221,11 @@ namespace AtomSampleViewer
 
 
                 // Create the draw item
                 // Create the draw item
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = nullptr;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = 0;
-                drawItem.m_streamBufferViews = nullptr;
 
 
                 // Add the draw item to the commandlist
                 // Add the draw item to the commandlist
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);

+ 1 - 0
Gem/Code/Source/RHI/Texture3dExampleComponent.h

@@ -54,6 +54,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::ImageView> m_imageView = nullptr;
         AZ::RHI::Ptr<AZ::RHI::ImageView> m_imageView = nullptr;
         AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup = nullptr;
         AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup = nullptr;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState = nullptr;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState = nullptr;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         // Shader Input indices
         // Shader Input indices
         AZ::RHI::ShaderInputImageIndex m_texture3dInputIndex;
         AZ::RHI::ShaderInputImageIndex m_texture3dInputIndex;

+ 15 - 21
Gem/Code/Source/RHI/TextureArrayExampleComponent.cpp

@@ -147,19 +147,28 @@ namespace AtomSampleViewer
                 return;
                 return;
             }
             }
 
 
-            m_rectangleStreamBufferViews[0u] = {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_rectangleInputAssemblyBuffer,
+                offsetof(RectangleBufferData, m_indices),
+                sizeof(RectangleBufferData::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_rectangleInputAssemblyBuffer,
                 *m_rectangleInputAssemblyBuffer,
                 offsetof(RectangleBufferData, m_positions),
                 offsetof(RectangleBufferData, m_positions),
                 sizeof(RectangleBufferData::m_positions),
                 sizeof(RectangleBufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_rectangleStreamBufferViews[1u] = {
+            m_geometryView.AddStreamBufferView({
                 *m_rectangleInputAssemblyBuffer,
                 *m_rectangleInputAssemblyBuffer,
                 offsetof(RectangleBufferData, m_uvs),
                 offsetof(RectangleBufferData, m_uvs),
                 sizeof(RectangleBufferData::m_uvs),
                 sizeof(RectangleBufferData::m_uvs),
                 sizeof(VertexUV)
                 sizeof(VertexUV)
-            };
+            });
 
 
             RHI::ValidateStreamBufferViews(m_rectangleInputStreamLayout, m_rectangleStreamBufferViews);
             RHI::ValidateStreamBufferViews(m_rectangleInputStreamLayout, m_rectangleStreamBufferViews);
         }
         }
@@ -205,32 +214,17 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&viewport, 1u);
                 commandList->SetViewports(&viewport, 1u);
                 commandList->SetScissors(&m_scissor, 1u);
                 commandList->SetScissors(&m_scissor, 1u);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = {
-                    *m_rectangleInputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()), offsetof(RectangleBufferData, m_indices),
-                    sizeof(RectangleBufferData::m_indices), RHI::IndexFormat::Uint16
-                };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6u;
-                drawIndexed.m_instanceCount = 1u;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_textureArraySrg->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
                     m_textureArraySrg->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get(),
                     m_textureIndexSrg->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_textureIndexSrg->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_rectangleStreamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_rectangleStreamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_rectangleStreamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 // Submit the triangle draw item.
                 // Submit the triangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);

+ 1 - 0
Gem/Code/Source/RHI/TextureArrayExampleComponent.h

@@ -44,6 +44,7 @@ namespace AtomSampleViewer
         AZStd::array<AZ::RHI::StreamBufferView, 2> m_rectangleStreamBufferViews;
         AZStd::array<AZ::RHI::StreamBufferView, 2> m_rectangleStreamBufferViews;
         AZ::RHI::InputStreamLayout m_rectangleInputStreamLayout;
         AZ::RHI::InputStreamLayout m_rectangleInputStreamLayout;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         // Srg related resources
         // Srg related resources
         AZ::Data::Instance<AZ::RPI::Shader> m_shader;
         AZ::Data::Instance<AZ::RPI::Shader> m_shader;

+ 11 - 20
Gem/Code/Source/RHI/TextureExampleComponent.cpp

@@ -105,26 +105,30 @@ namespace AtomSampleViewer
                 return;
                 return;
             }
             }
 
 
-            m_streamBufferViews[0] = {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+            m_geometryView.SetIndexBufferView({ *m_indexBuffer, 0, indexBufSize, RHI::IndexFormat::Uint16 });
+
+            m_geometryView.AddStreamBufferView({
                 *m_positionBuffer,
                 *m_positionBuffer,
                 0,
                 0,
                 positionBufSize,
                 positionBufSize,
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] = {
+            m_geometryView.AddStreamBufferView({
                 *m_uvBuffer,
                 *m_uvBuffer,
                 0,
                 0,
                 uvBufSize,
                 uvBufSize,
                 sizeof(VertexUV)
                 sizeof(VertexUV)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -224,29 +228,16 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_indexBuffer->GetDeviceBuffer(context.GetDeviceIndex()), 0,
-                                                                     indexBufSize, RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 6;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             };
             };

+ 1 - 1
Gem/Code/Source/RHI/TextureExampleComponent.h

@@ -56,6 +56,7 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_indexBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_indexBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_positionBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_positionBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_uvBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_uvBuffer;
+        AZ::RHI::GeometryView m_geometryView;
 
 
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup;
         AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_shaderResourceGroup;
@@ -68,7 +69,6 @@ namespace AtomSampleViewer
         };
         };
 
 
         AZ::RHI::DeviceDrawItem m_drawItem;
         AZ::RHI::DeviceDrawItem m_drawItem;
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
 
 
         AZ::RHI::SamplerState m_samplerState;
         AZ::RHI::SamplerState m_samplerState;
         bool m_useStaticSampler = true;
         bool m_useStaticSampler = true;

+ 43 - 39
Gem/Code/Source/RHI/TextureMapExampleComponent.cpp

@@ -227,7 +227,9 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout,
+                                           m_bufferViews[RenderTargetIndex::BufferViewIndex].m_geometryView,
+                                           m_bufferViews[RenderTargetIndex::BufferViewIndex].m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void TextureMapExampleComponent::InitTexture1DBufferView()
     void TextureMapExampleComponent::InitTexture1DBufferView()
@@ -258,7 +260,11 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture1D].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(
+            m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout,
+            m_bufferViews[RenderTargetIndex::Texture1D].m_geometryView,
+            m_bufferViews[RenderTargetIndex::Texture1D].m_geometryView.GetFullStreamBufferIndices()
+            );
     }
     }
 
 
     void TextureMapExampleComponent::InitTexture1DArrayBufferView()
     void TextureMapExampleComponent::InitTexture1DArrayBufferView()
@@ -293,7 +299,11 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
         m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture1DArray].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(
+            m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout,
+            m_bufferViews[RenderTargetIndex::Texture1DArray].m_geometryView,
+            m_bufferViews[RenderTargetIndex::Texture1DArray].m_geometryView.GetFullStreamBufferIndices()
+        );
     }
     }
 
 
     void TextureMapExampleComponent::InitTexture2DArrayBufferView()
     void TextureMapExampleComponent::InitTexture2DArrayBufferView()
@@ -313,7 +323,11 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture2DArray].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(
+            m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout,
+            m_bufferViews[RenderTargetIndex::Texture2DArray].m_geometryView,
+            m_bufferViews[RenderTargetIndex::Texture2DArray].m_geometryView.GetFullStreamBufferIndices()
+        );
     }
     }
 
 
     void TextureMapExampleComponent::InitCubemapBufferView()
     void TextureMapExampleComponent::InitCubemapBufferView()
@@ -333,7 +347,11 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::TextureCubemap].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(
+            m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout,
+            m_bufferViews[RenderTargetIndex::TextureCubemap].m_geometryView,
+            m_bufferViews[RenderTargetIndex::TextureCubemap].m_geometryView.GetFullStreamBufferIndices()
+            );
     }
     }
 
 
     void TextureMapExampleComponent::InitCubemapArrayBufferView()
     void TextureMapExampleComponent::InitCubemapArrayBufferView()
@@ -355,7 +373,11 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32A32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32A32_FLOAT);
         m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(
+            m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout,
+            m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_geometryView,
+            m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_geometryView.GetFullStreamBufferIndices()
+        );
     }
     }
 
 
     void TextureMapExampleComponent::InitTexture3DBufferView()
     void TextureMapExampleComponent::InitTexture3DBufferView()
@@ -390,7 +412,9 @@ namespace AtomSampleViewer
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
         m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout = layoutBuilder.End();
         m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture3D].m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout,
+                                           m_bufferViews[RenderTargetIndex::Texture3D].m_geometryView,
+                                           m_bufferViews[RenderTargetIndex::Texture3D].m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void TextureMapExampleComponent::InitRenderTargets()
     void TextureMapExampleComponent::InitRenderTargets()
@@ -509,26 +533,16 @@ namespace AtomSampleViewer
             RHI::Scissor scissor(0, 0, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_width, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_height);
             RHI::Scissor scissor(0, 0, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_width, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_height);
             commandList->SetScissors(&scissor, 1);
             commandList->SetScissors(&scissor, 1);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
+            m_bufferViews[RenderTargetIndex::BufferViewIndex].m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
 
 
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_targetSRGs[target]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_targetSRGs[target]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_bufferViews[RenderTargetIndex::BufferViewIndex].m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_bufferViews[RenderTargetIndex::BufferViewIndex].m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_targetPipelineStates[target]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_targetPipelineStates[target]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_bufferViews[RenderTargetIndex::BufferViewIndex].m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews[0].GetDeviceStreamBufferView(
-                    context.GetDeviceIndex()),
-                m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 
@@ -596,23 +610,16 @@ namespace AtomSampleViewer
 
 
             RHI::DrawIndexed drawIndexed;
             RHI::DrawIndexed drawIndexed;
             drawIndexed.m_indexCount = m_bufferViews[target].m_indexBufferView.GetByteCount() / sizeof(uint16_t);
             drawIndexed.m_indexCount = m_bufferViews[target].m_indexBufferView.GetByteCount() / sizeof(uint16_t);
-            drawIndexed.m_instanceCount = 1;
+            m_bufferViews[target].m_geometryView.SetDrawArguments(drawIndexed);
 
 
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
             const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 m_screenSRGs[target]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_screenSRGs[target]->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_bufferViews[target].m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_bufferViews[target].m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_screenPipelineStates[target]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_screenPipelineStates[target]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_bufferViews[target].m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_bufferViews[target].m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_bufferViews[target].m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_bufferViews[target].m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
 
 
@@ -793,13 +800,12 @@ namespace AtomSampleViewer
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
         }
         }
 
 
-        m_bufferViews[target].m_streamBufferViews[0] =
-        {
+        m_bufferViews[target].m_geometryView.AddStreamBufferView({
             *m_positionBuffer[target],
             *m_positionBuffer[target],
             0,
             0,
             posSize,
             posSize,
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
         m_uvBuffer[target] = aznew AZ::RHI::Buffer();
         m_uvBuffer[target] = aznew AZ::RHI::Buffer();
         request.m_buffer = m_uvBuffer[target].get();
         request.m_buffer = m_uvBuffer[target].get();
@@ -812,13 +818,12 @@ namespace AtomSampleViewer
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
         }
         }
 
 
-        m_bufferViews[target].m_streamBufferViews[1] =
-        {
+        m_bufferViews[target].m_geometryView.AddStreamBufferView({
             *m_uvBuffer[target],
             *m_uvBuffer[target],
             0,
             0,
             uvSize,
             uvSize,
             uvTypeSize
             uvTypeSize
-        };
+        });
 
 
         m_indexBuffer[target] = aznew AZ::RHI::Buffer();
         m_indexBuffer[target] = aznew AZ::RHI::Buffer();
         request.m_buffer = m_indexBuffer[target].get();
         request.m_buffer = m_indexBuffer[target].get();
@@ -831,12 +836,11 @@ namespace AtomSampleViewer
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
             AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
         }
         }
 
 
-        m_bufferViews[target].m_indexBufferView =
-        {
+        m_bufferViews[target].m_geometryView.SetIndexBufferView({
             *m_indexBuffer[target],
             *m_indexBuffer[target],
             0,
             0,
             indexSize,
             indexSize,
             AZ::RHI::IndexFormat::Uint16
             AZ::RHI::IndexFormat::Uint16
-        };
+        });
     }
     }
 }
 }

+ 2 - 2
Gem/Code/Source/RHI/TextureMapExampleComponent.h

@@ -56,7 +56,7 @@ namespace AtomSampleViewer
 
 
         struct BufferViewData
         struct BufferViewData
         {
         {
-            AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+            AZ::RHI::GeometryView m_geometryView;
             AZ::RHI::IndexBufferView m_indexBufferView;
             AZ::RHI::IndexBufferView m_indexBufferView;
             AZ::RHI::InputStreamLayout m_inputStreamLayout;
             AZ::RHI::InputStreamLayout m_inputStreamLayout;
         };
         };
@@ -142,4 +142,4 @@ namespace AtomSampleViewer
         AZStd::array<AZ::RHI::AttachmentId, s_numOfTargets> m_attachmentID;
         AZStd::array<AZ::RHI::AttachmentId, s_numOfTargets> m_attachmentID;
         AZStd::array<AZ::Vector3, 4> m_baseRectangle;
         AZStd::array<AZ::Vector3, 4> m_baseRectangle;
     };
     };
-}
+}

+ 16 - 23
Gem/Code/Source/RHI/TriangleExampleComponent.cpp

@@ -91,28 +91,35 @@ namespace AtomSampleViewer
             request.m_initialData = &bufferData;
             request.m_initialData = &bufferData;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViews[0] =
-            {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 3, 0));
+
+            m_geometryView.SetIndexBufferView({
+                *m_inputAssemblyBuffer,
+                offsetof(BufferData, m_indices),
+                sizeof(BufferData::m_indices),
+                RHI::IndexFormat::Uint16
+            });
+
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_positions),
                 offsetof(BufferData, m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(BufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] =
-            {
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(BufferData, m_colors),
                 offsetof(BufferData, m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(BufferData::m_colors),
                 sizeof(VertexColor)
                 sizeof(VertexColor)
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         {
         {
@@ -194,30 +201,16 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                const RHI::DeviceIndexBufferView indexBufferView = { *m_inputAssemblyBuffer->GetDeviceBuffer(context.GetDeviceIndex()),
-                                                                     offsetof(BufferData, m_indices), sizeof(BufferData::m_indices),
-                                                                     RHI::IndexFormat::Uint16 };
-
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 3;
-                drawIndexed.m_instanceCount = 1;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                drawItem.m_indexBufferView = &indexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 // Submit the triangle draw item.
                 // Submit the triangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);

+ 1 - 1
Gem/Code/Source/RHI/TriangleExampleComponent.h

@@ -60,6 +60,6 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 3> m_indices;
             AZStd::array<uint16_t, 3> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
     };
     };
 } // namespace AtomSampleViewer
 } // namespace AtomSampleViewer

+ 12 - 23
Gem/Code/Source/RHI/TrianglesConstantBufferExampleComponent.cpp

@@ -147,36 +147,35 @@ namespace AtomSampleViewer
             request.m_initialData = &bufferData;
             request.m_initialData = &bufferData;
             m_inputAssemblyBufferPool->InitBuffer(request);
             m_inputAssemblyBufferPool->InitBuffer(request);
 
 
-            m_streamBufferViews[0] =
-            {
+            m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 3, 0));
+
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(IABufferData, m_positions),
                 offsetof(IABufferData, m_positions),
                 sizeof(IABufferData::m_positions),
                 sizeof(IABufferData::m_positions),
                 sizeof(VertexPosition)
                 sizeof(VertexPosition)
-            };
+            });
 
 
-            m_streamBufferViews[1] =
-            {
+            m_geometryView.AddStreamBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(IABufferData, m_colors),
                 offsetof(IABufferData, m_colors),
                 sizeof(IABufferData::m_colors),
                 sizeof(IABufferData::m_colors),
                 sizeof(VertexColor)
                 sizeof(VertexColor)
-            };
+            });
 
 
-            m_indexBufferView =
-            {
+            m_geometryView.SetIndexBufferView({
                 *m_inputAssemblyBuffer,
                 *m_inputAssemblyBuffer,
                 offsetof(IABufferData, m_indices),
                 offsetof(IABufferData, m_indices),
                 sizeof(IABufferData::m_indices),
                 sizeof(IABufferData::m_indices),
                 RHI::IndexFormat::Uint16
                 RHI::IndexFormat::Uint16
-            };
+            });
 
 
             RHI::InputStreamLayoutBuilder layoutBuilder;
             RHI::InputStreamLayoutBuilder layoutBuilder;
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             layoutBuilder.AddBuffer()->Channel("COLOR", RHI::Format::R32G32B32A32_FLOAT);
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
             pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End();
 
 
-            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_streamBufferViews);
+            RHI::ValidateStreamBufferViews(pipelineStateDescriptor.m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
         }
         }
 
 
         // Create the buffer pool where both buffers get allocated from
         // Create the buffer pool where both buffers get allocated from
@@ -259,27 +258,17 @@ namespace AtomSampleViewer
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetViewports(&m_viewport, 1);
                 commandList->SetScissors(&m_scissor, 1);
                 commandList->SetScissors(&m_scissor, 1);
 
 
-                RHI::DrawIndexed drawIndexed;
-                drawIndexed.m_indexCount = 3;
-                drawIndexed.m_instanceCount = s_numberOfTrianglesTotal;
-
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                 const RHI::DeviceShaderResourceGroup* shaderResourceGroups[] = {
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                     m_shaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 };
                 };
 
 
                 RHI::DeviceDrawItem drawItem;
                 RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
+                drawItem.m_drawInstanceArgs = RHI::DrawInstanceArguments(s_numberOfTrianglesTotal, 0);
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 // Submit the triangle draw item.
                 // Submit the triangle draw item.
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);

+ 2 - 1
Gem/Code/Source/RHI/TrianglesConstantBufferExampleComponent.h

@@ -91,7 +91,6 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_inputAssemblyBufferPool;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
         AZ::RHI::IndexBufferView m_indexBufferView;
         AZ::RHI::IndexBufferView m_indexBufferView;
 
 
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_constantBufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_constantBufferPool;
@@ -100,6 +99,8 @@ namespace AtomSampleViewer
 
 
         AZ::RHI::Ptr<AZ::RHI::BufferView> m_constantBufferView;
         AZ::RHI::Ptr<AZ::RHI::BufferView> m_constantBufferView;
 
 
+        AZ::RHI::GeometryView m_geometryView;
+
         // --------------------------------------------------------
         // --------------------------------------------------------
         // Pipeline state and SRG to be constructed from the shader
         // Pipeline state and SRG to be constructed from the shader
         // --------------------------------------------------------
         // --------------------------------------------------------

+ 13 - 36
Gem/Code/Source/RHI/VariableRateShadingExampleComponent.cpp

@@ -469,36 +469,35 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(RHI::DrawIndexed(0, 6, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_positions),
             offsetof(BufferData, m_positions),
             sizeof(BufferData::m_positions),
             sizeof(BufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_uvs),
             offsetof(BufferData, m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(BufferData::m_uvs),
             sizeof(VertexUV)
             sizeof(VertexUV)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(BufferData, m_indices),
             offsetof(BufferData, m_indices),
             sizeof(BufferData::m_indices),
             sizeof(BufferData::m_indices),
             RHI::IndexFormat::Uint16
             RHI::IndexFormat::Uint16
-        };
+        });
 
 
         RHI::InputStreamLayoutBuilder layoutBuilder;
         RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("POSITION", RHI::Format::R32G32B32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         layoutBuilder.AddBuffer()->Channel("UV", RHI::Format::R32G32_FLOAT);
         m_inputStreamLayout = layoutBuilder.End();
         m_inputStreamLayout = layoutBuilder.End();
 
 
-        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_streamBufferViews);
+        RHI::ValidateStreamBufferViews(m_inputStreamLayout, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void VariableRateShadingExampleComponent::CreateRenderScope()
     void VariableRateShadingExampleComponent::CreateRenderScope()
@@ -558,23 +557,12 @@ namespace AtomSampleViewer
             // dynamic mode is not supported (since the CPU would try to read it while the GPU is updating the contents)
             // dynamic mode is not supported (since the CPU would try to read it while the GPU is updating the contents)
             bool useImageShadingRate = m_useImageShadingRate && (device->GetFeatures().m_dynamicShadingRateImage || m_frameCount > device->GetDescriptor().m_frameCountMax);
             bool useImageShadingRate = m_useImageShadingRate && (device->GetFeatures().m_dynamicShadingRateImage || m_frameCount > device->GetDescriptor().m_frameCountMax);
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_modelPipelineState[useImageShadingRate ? 0 : 1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_modelPipelineState[useImageShadingRate ? 0 : 1]->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
 
 
@@ -740,23 +728,12 @@ namespace AtomSampleViewer
                 m_imageShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
                 m_imageShaderResourceGroup->GetRHIShaderResourceGroup()->GetDeviceShaderResourceGroup(context.GetDeviceIndex()).get()
             };
             };
 
 
-            RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = 6;
-            drawIndexed.m_instanceCount = 1;
-
             RHI::DeviceDrawItem drawItem;
             RHI::DeviceDrawItem drawItem;
-            drawItem.m_arguments = drawIndexed;
+            drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+            drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawItem.m_pipelineState = m_imagePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
             drawItem.m_pipelineState = m_imagePipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-            auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-            drawItem.m_indexBufferView = &deviceIndexBufferView;
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
             drawItem.m_shaderResourceGroups = shaderResourceGroups;
-            drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-            AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-            };
-            drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
             commandList->Submit(drawItem);
             commandList->Submit(drawItem);
         };
         };

+ 2 - 4
Gem/Code/Source/RHI/VariableRateShadingExampleComponent.h

@@ -136,10 +136,8 @@ namespace AtomSampleViewer
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_bufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_bufferPool;
         // Buffer for the IA of the full screen quad.
         // Buffer for the IA of the full screen quad.
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
-        // Bufferviews into the full screen quad IA
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
-        // Indexview of the full screen quad index buffer
-        AZ::RHI::IndexBufferView m_indexBufferView;
+        // Geometry view for the full screen quad.
+        AZ::RHI::GeometryView m_geometryView;
         // Layout of the full screen quad.
         // Layout of the full screen quad.
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
         AZ::RHI::InputStreamLayout m_inputStreamLayout;
 
 

+ 11 - 23
Gem/Code/Source/RHI/XRExampleComponent.cpp

@@ -220,29 +220,28 @@ namespace AtomSampleViewer
             return;
             return;
         }
         }
 
 
-        m_streamBufferViews[0] =
-        {
+        m_geometryView.SetDrawArguments(AZ::RHI::DrawIndexed(0, GeometryIndexCount, 0));
+
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_positions),
             offsetof(SingleCubeBufferData, m_positions),
             sizeof(SingleCubeBufferData::m_positions),
             sizeof(SingleCubeBufferData::m_positions),
             sizeof(VertexPosition)
             sizeof(VertexPosition)
-        };
+        });
 
 
-        m_streamBufferViews[1] =
-        {
+        m_geometryView.AddStreamBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_colors),
             offsetof(SingleCubeBufferData, m_colors),
             sizeof(SingleCubeBufferData::m_colors),
             sizeof(SingleCubeBufferData::m_colors),
             sizeof(VertexColor)
             sizeof(VertexColor)
-        };
+        });
 
 
-        m_indexBufferView =
-        {
+        m_geometryView.SetIndexBufferView({
             *m_inputAssemblyBuffer,
             *m_inputAssemblyBuffer,
             offsetof(SingleCubeBufferData, m_indices),
             offsetof(SingleCubeBufferData, m_indices),
             sizeof(SingleCubeBufferData::m_indices),
             sizeof(SingleCubeBufferData::m_indices),
             AZ::RHI::IndexFormat::Uint16
             AZ::RHI::IndexFormat::Uint16
-        };
+        });
 
 
         AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
         AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
         layoutBuilder.SetTopology(AZ::RHI::PrimitiveTopology::TriangleList);
         layoutBuilder.SetTopology(AZ::RHI::PrimitiveTopology::TriangleList);
@@ -251,7 +250,7 @@ namespace AtomSampleViewer
         m_streamLayoutDescriptor.Clear();
         m_streamLayoutDescriptor.Clear();
         m_streamLayoutDescriptor = layoutBuilder.End();
         m_streamLayoutDescriptor = layoutBuilder.End();
 
 
-        AZ::RHI::ValidateStreamBufferViews(m_streamLayoutDescriptor, m_streamBufferViews);
+        AZ::RHI::ValidateStreamBufferViews(m_streamLayoutDescriptor, m_geometryView, m_geometryView.GetFullStreamBufferIndices());
     }
     }
 
 
     void XRExampleComponent::CreateCubePipeline()
     void XRExampleComponent::CreateCubePipeline()
@@ -358,10 +357,6 @@ namespace AtomSampleViewer
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetViewports(&m_viewport, 1);
             commandList->SetScissors(&m_scissor, 1);
             commandList->SetScissors(&m_scissor, 1);
 
 
-            AZ::RHI::DrawIndexed drawIndexed;
-            drawIndexed.m_indexCount = GeometryIndexCount;
-            drawIndexed.m_instanceCount = 1;
-
             // Dividing NumberOfCubes by context.GetCommandListCount() to balance to number 
             // Dividing NumberOfCubes by context.GetCommandListCount() to balance to number 
             // of draw call equally between each thread.
             // of draw call equally between each thread.
             uint32_t numberOfCubesPerCommandList = NumberOfCubes / context.GetCommandListCount();
             uint32_t numberOfCubesPerCommandList = NumberOfCubes / context.GetCommandListCount();
@@ -380,18 +375,11 @@ namespace AtomSampleViewer
                 };
                 };
 
 
                 AZ::RHI::DeviceDrawItem drawItem;
                 AZ::RHI::DeviceDrawItem drawItem;
-                drawItem.m_arguments = drawIndexed;
+                drawItem.m_geometryView = m_geometryView.GetDeviceGeometryView(context.GetDeviceIndex());
+                drawItem.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
                 drawItem.m_pipelineState = m_pipelineState->GetDevicePipelineState(context.GetDeviceIndex()).get();
-                auto deviceIndexBufferView{m_indexBufferView.GetDeviceIndexBufferView(context.GetDeviceIndex())};
-                drawItem.m_indexBufferView = &deviceIndexBufferView;
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(AZ::RHI::ArraySize(shaderResourceGroups));
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
                 drawItem.m_shaderResourceGroups = shaderResourceGroups;
-                drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_streamBufferViews.size());
-                AZStd::array<AZ::RHI::DeviceStreamBufferView, 2> deviceStreamBufferViews{
-                    m_streamBufferViews[0].GetDeviceStreamBufferView(context.GetDeviceIndex()),
-                    m_streamBufferViews[1].GetDeviceStreamBufferView(context.GetDeviceIndex())
-                };
-                drawItem.m_streamBufferViews = deviceStreamBufferViews.data();
 
 
                 commandList->Submit(drawItem);
                 commandList->Submit(drawItem);
             }
             }

+ 1 - 2
Gem/Code/Source/RHI/XRExampleComponent.h

@@ -94,7 +94,6 @@ namespace AtomSampleViewer
         void CreateScope();
         void CreateScope();
 
 
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_bufferPool;
         AZ::RHI::Ptr<AZ::RHI::BufferPool> m_bufferPool;
-        AZ::RHI::IndexBufferView m_indexBufferView;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::Ptr<AZ::RHI::Buffer> m_inputAssemblyBuffer;
         AZ::RHI::InputStreamLayout m_streamLayoutDescriptor;
         AZ::RHI::InputStreamLayout m_streamLayoutDescriptor;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
@@ -106,7 +105,7 @@ namespace AtomSampleViewer
             AZStd::array<uint16_t, 3> m_indices;
             AZStd::array<uint16_t, 3> m_indices;
         };
         };
 
 
-        AZStd::array<AZ::RHI::StreamBufferView, 2> m_streamBufferViews;
+        AZ::RHI::GeometryView m_geometryView;
         float m_time = 0.0f;
         float m_time = 0.0f;
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, NumberOfCubes> m_shaderResourceGroups;
         AZStd::array<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>, NumberOfCubes> m_shaderResourceGroups;
         AZStd::array<AZ::Matrix4x4, NumberOfCubes> m_modelMatrices;
         AZStd::array<AZ::Matrix4x4, NumberOfCubes> m_modelMatrices;

+ 10 - 11
Gem/Code/Source/RootConstantsExampleComponent.cpp

@@ -166,7 +166,7 @@ namespace AtomSampleViewer
             }
             }
             m_srg->Compile();
             m_srg->Compile();
 
 
-            m_modelStreamBufferViews.resize(m_models.size());
+            m_streamIndices.resize(m_models.size());
             for (uint32_t i = 0; i < m_models.size(); ++i)
             for (uint32_t i = 0; i < m_models.size(); ++i)
             {
             {
                 auto model = m_models[i];
                 auto model = m_models[i];
@@ -174,12 +174,12 @@ namespace AtomSampleViewer
                 {
                 {
                     Data::Instance<AZ::RPI::ModelLod> modelLod = model->GetLods()[0];
                     Data::Instance<AZ::RPI::ModelLod> modelLod = model->GetLods()[0];
 
 
-                    m_modelStreamBufferViews[i].resize(modelLod->GetMeshes().size());
+                    m_streamIndices[i].resize(modelLod->GetMeshes().size());
 
 
-                    for (uint32_t j = 0; j < m_modelStreamBufferViews[i].size(); ++j)
+                    for (uint32_t j = 0; j < m_streamIndices[i].size(); ++j)
                     {
                     {
                         modelLod->GetStreamsForMesh(
                         modelLod->GetStreamsForMesh(
-                            pipelineStateDescriptor.m_inputStreamLayout, m_modelStreamBufferViews[i][j], nullptr, shader->GetInputContract(),
+                            pipelineStateDescriptor.m_inputStreamLayout, m_streamIndices[i][j], nullptr, shader->GetInputContract(),
                             j);
                             j);
                     }
                     }
                 }
                 }
@@ -237,7 +237,7 @@ namespace AtomSampleViewer
         m_srg = nullptr;
         m_srg = nullptr;
         m_modelMatrices.clear();
         m_modelMatrices.clear();
         m_models.clear();
         m_models.clear();
-        m_modelStreamBufferViews.clear();
+        m_streamIndices.clear();
     }
     }
        
        
     void RootConstantsExampleComponent::OnTick([[maybe_unused]] float deltaTime, AZ::ScriptTimePoint timePoint)
     void RootConstantsExampleComponent::OnTick([[maybe_unused]] float deltaTime, AZ::ScriptTimePoint timePoint)
@@ -294,26 +294,25 @@ namespace AtomSampleViewer
         m_rootConstantData.SetConstant(m_materialIdInputIndex, modelIndex);
         m_rootConstantData.SetConstant(m_materialIdInputIndex, modelIndex);
         m_rootConstantData.SetConstant(m_modelMatrixInputIndex, m_modelMatrices[modelIndex]);
         m_rootConstantData.SetConstant(m_modelMatrixInputIndex, m_modelMatrices[modelIndex]);
 
 
-        const auto& model = m_models[modelIndex];
+        auto& model = m_models[modelIndex];
         if (model)
         if (model)
         {
         {
-            const auto& meshes = model->GetLods()[0]->GetMeshes();
+            AZStd::span<AZ::RPI::ModelLod::Mesh> meshes = model->GetLods()[0]->GetMeshes();
             for (uint32_t i = 0; i < meshes.size(); ++i)
             for (uint32_t i = 0; i < meshes.size(); ++i)
             {
             {
-                auto const& mesh = meshes[i];
+                auto& mesh = meshes[i];
 
 
                 // Build draw packet and set the values of the inline constants.
                 // Build draw packet and set the values of the inline constants.
                 RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
                 RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
                 drawPacketBuilder.Begin(nullptr);
                 drawPacketBuilder.Begin(nullptr);
-                drawPacketBuilder.SetDrawArguments(mesh.m_drawArguments);
-                drawPacketBuilder.SetIndexBufferView(mesh.m_indexBufferView);
+                drawPacketBuilder.SetGeometryView(&mesh);
                 drawPacketBuilder.SetRootConstants(m_rootConstantData.GetConstantData());
                 drawPacketBuilder.SetRootConstants(m_rootConstantData.GetConstantData());
                 drawPacketBuilder.AddShaderResourceGroup(m_srg->GetRHIShaderResourceGroup());
                 drawPacketBuilder.AddShaderResourceGroup(m_srg->GetRHIShaderResourceGroup());
 
 
                 RHI::DrawPacketBuilder::DrawRequest drawRequest;
                 RHI::DrawPacketBuilder::DrawRequest drawRequest;
                 drawRequest.m_listTag = m_drawListTag;
                 drawRequest.m_listTag = m_drawListTag;
                 drawRequest.m_pipelineState = m_pipelineState.get();
                 drawRequest.m_pipelineState = m_pipelineState.get();
-                drawRequest.m_streamBufferViews = m_modelStreamBufferViews[modelIndex][i];
+                drawRequest.m_streamIndices = m_streamIndices[modelIndex][i];
                 drawRequest.m_sortKey = 0;
                 drawRequest.m_sortKey = 0;
                 drawPacketBuilder.AddDrawItem(drawRequest);
                 drawPacketBuilder.AddDrawItem(drawRequest);
 
 

+ 1 - 1
Gem/Code/Source/RootConstantsExampleComponent.h

@@ -68,7 +68,7 @@ namespace AtomSampleViewer
        
        
         // Models
         // Models
         AZStd::vector<AZ::Data::Instance<AZ::RPI::Model>> m_models;
         AZStd::vector<AZ::Data::Instance<AZ::RPI::Model>> m_models;
-        AZStd::vector<AZStd::vector<AZ::RPI::ModelLod::StreamBufferViewList>> m_modelStreamBufferViews;
+        AZStd::vector<AZStd::vector<AZ::RHI::StreamBufferIndices>> m_streamIndices;
 
 
         // Cache interfaces
         // Cache interfaces
         AZ::RPI::DynamicDrawInterface* m_dynamicDraw = nullptr;
         AZ::RPI::DynamicDrawInterface* m_dynamicDraw = nullptr;

+ 9 - 9
Gem/Code/Source/StreamingImageExampleComponent.cpp

@@ -114,6 +114,8 @@ namespace AtomSampleViewer
 
 
     void StreamingImageExampleComponent::Activate()
     void StreamingImageExampleComponent::Activate()
     {
     {
+        m_geometryView.SetDrawArguments(RHI::DrawLinear(4, 0));
+
         // Save the streaming image pool's budget and streaming image pool controller's mip bias 
         // Save the streaming image pool's budget and streaming image pool controller's mip bias 
         // These would be recovered when exist the example
         // These would be recovered when exist the example
         Data::Instance<RPI::StreamingImagePool> streamingImagePool = RPI::ImageSystemInterface::Get()->GetSystemStreamingPool();
         Data::Instance<RPI::StreamingImagePool> streamingImagePool = RPI::ImageSystemInterface::Get()->GetSystemStreamingPool();
@@ -492,12 +494,11 @@ namespace AtomSampleViewer
             // Build draw packet...
             // Build draw packet...
             RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
             RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
             drawPacketBuilder.Begin(nullptr);
             drawPacketBuilder.Begin(nullptr);
-            RHI::DrawLinear drawLinear;
-            drawLinear.m_vertexCount = 4;
-            drawLinear.m_instanceCount = image3d.m_sliceCount;
-            drawPacketBuilder.SetDrawArguments(drawLinear);
+            drawPacketBuilder.SetGeometryView(&m_geometryView);
+            drawPacketBuilder.SetDrawInstanceArguments(RHI::DrawInstanceArguments(image3d.m_sliceCount, 0));
 
 
             RHI::DrawPacketBuilder::DrawRequest drawRequest;
             RHI::DrawPacketBuilder::DrawRequest drawRequest;
+            drawRequest.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
             drawRequest.m_listTag = m_image3dDrawListTag;
             drawRequest.m_listTag = m_image3dDrawListTag;
             drawRequest.m_pipelineState = m_image3dPipelineState.get();
             drawRequest.m_pipelineState = m_image3dPipelineState.get();
             drawRequest.m_sortKey = 0;
             drawRequest.m_sortKey = 0;
@@ -510,17 +511,16 @@ namespace AtomSampleViewer
         }
         }
     }
     }
 
 
-    void StreamingImageExampleComponent::DrawImage(const ImageToDraw* imageInfo)
+    void StreamingImageExampleComponent::DrawImage(ImageToDraw* imageInfo)
     {
     {
         // Build draw packet...
         // Build draw packet...
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         drawPacketBuilder.Begin(nullptr);
         drawPacketBuilder.Begin(nullptr);
-        RHI::DrawLinear drawLinear;
-        drawLinear.m_vertexCount = 4;
-        drawLinear.m_instanceCount = imageInfo->m_image->GetMipLevelCount();
-        drawPacketBuilder.SetDrawArguments(drawLinear);
+        drawPacketBuilder.SetGeometryView(&m_geometryView);
+        drawPacketBuilder.SetDrawInstanceArguments(RHI::DrawInstanceArguments(imageInfo->m_image->GetMipLevelCount(), 0));
 
 
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
+        drawRequest.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
         drawRequest.m_listTag = m_drawListTag;
         drawRequest.m_listTag = m_drawListTag;
         drawRequest.m_pipelineState = m_pipelineState.get();
         drawRequest.m_pipelineState = m_pipelineState.get();
         drawRequest.m_sortKey = 0;
         drawRequest.m_sortKey = 0;

+ 3 - 1
Gem/Code/Source/StreamingImageExampleComponent.h

@@ -102,7 +102,7 @@ namespace AtomSampleViewer
         void Draw3dImages();
         void Draw3dImages();
 
 
         // Submit draw package for one image
         // Submit draw package for one image
-        void DrawImage(const ImageToDraw* imageInfo);
+        void DrawImage(ImageToDraw* imageInfo);
 
 
         // Creates resources, resource views, pipeline state, etc. for rendering
         // Creates resources, resource views, pipeline state, etc. for rendering
         void PrepareRenderData();
         void PrepareRenderData();
@@ -183,6 +183,8 @@ namespace AtomSampleViewer
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_image3dShaderAsset;
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_image3dShaderAsset;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_image3dSrgLayout;
         AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> m_image3dSrgLayout;
 
 
+        AZ::RHI::GeometryView m_geometryView;
+
         // shader input indices
         // shader input indices
         AZ::RHI::ShaderInputImageIndex m_imageInputIndex;
         AZ::RHI::ShaderInputImageIndex m_imageInputIndex;
         AZ::RHI::ShaderInputConstantIndex m_positionInputIndex;
         AZ::RHI::ShaderInputConstantIndex m_positionInputIndex;

+ 3 - 3
Gem/Code/Source/TonemappingExampleComponent.cpp

@@ -60,6 +60,7 @@ namespace AtomSampleViewer
     {
     {
         using namespace AZ;
         using namespace AZ;
 
 
+        m_geometryView.SetDrawArguments(RHI::DrawLinear(4, 0));
         m_dynamicDraw = RPI::DynamicDrawInterface::Get();
         m_dynamicDraw = RPI::DynamicDrawInterface::Get();
 
 
         m_imguiSidebar.Activate();
         m_imguiSidebar.Activate();
@@ -273,11 +274,10 @@ namespace AtomSampleViewer
         // Build draw packet
         // Build draw packet
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::DefaultDevice};
         drawPacketBuilder.Begin(nullptr);
         drawPacketBuilder.Begin(nullptr);
-        RHI::DrawLinear drawLinear;
-        drawLinear.m_vertexCount = 4;
-        drawPacketBuilder.SetDrawArguments(drawLinear);
+        drawPacketBuilder.SetGeometryView(&m_geometryView);
 
 
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
         RHI::DrawPacketBuilder::DrawRequest drawRequest;
+        drawRequest.m_streamIndices = m_geometryView.GetFullStreamBufferIndices();
         drawRequest.m_listTag = m_drawListTag;
         drawRequest.m_listTag = m_drawListTag;
         drawRequest.m_pipelineState = m_pipelineState.get();
         drawRequest.m_pipelineState = m_pipelineState.get();
         drawRequest.m_sortKey = 0;
         drawRequest.m_sortKey = 0;

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

@@ -86,6 +86,7 @@ namespace AtomSampleViewer
         AZ::RPI::DynamicDrawInterface* m_dynamicDraw = nullptr;
         AZ::RPI::DynamicDrawInterface* m_dynamicDraw = nullptr;
 
 
         // render related data
         // render related data
+        AZ::RHI::GeometryView m_geometryView;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::ConstPtr<AZ::RHI::PipelineState> m_pipelineState;
         AZ::RHI::DrawListTag m_drawListTag;
         AZ::RHI::DrawListTag m_drawListTag;
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;
         AZ::Data::Asset<AZ::RPI::ShaderAsset> m_shaderAsset;