|
@@ -208,17 +208,30 @@ namespace AZ
|
|
worldInvTranspose3x4.StoreToRowMajorFloat12(meshInfo.m_worldInvTranspose.data());
|
|
worldInvTranspose3x4.StoreToRowMajorFloat12(meshInfo.m_worldInvTranspose.data());
|
|
meshInfo.m_bufferFlags = subMesh.m_bufferFlags;
|
|
meshInfo.m_bufferFlags = subMesh.m_bufferFlags;
|
|
|
|
|
|
|
|
+ AZ_Assert(subMesh.m_indexShaderBufferView.get(), "RayTracing Mesh IndexBuffer cannot be null");
|
|
|
|
+ AZ_Assert(subMesh.m_positionShaderBufferView.get(), "RayTracing Mesh PositionBuffer cannot be null");
|
|
|
|
+ AZ_Assert(subMesh.m_normalShaderBufferView.get(), "RayTracing Mesh NormalBuffer cannot be null");
|
|
|
|
+
|
|
// add mesh buffers
|
|
// add mesh buffers
|
|
meshInfo.m_bufferStartIndex = m_meshBufferIndices.AddEntry(
|
|
meshInfo.m_bufferStartIndex = m_meshBufferIndices.AddEntry(
|
|
{
|
|
{
|
|
|
|
+#if USE_BINDLESS_SRG
|
|
|
|
+ subMesh.m_indexShaderBufferView.get() ? subMesh.m_indexShaderBufferView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_positionShaderBufferView.get() ? subMesh.m_positionShaderBufferView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_normalShaderBufferView.get() ? subMesh.m_normalShaderBufferView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_tangentShaderBufferView.get() ? subMesh.m_tangentShaderBufferView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_bitangentShaderBufferView.get() ? subMesh.m_bitangentShaderBufferView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_uvShaderBufferView.get() ? subMesh.m_uvShaderBufferView->GetBindlessReadIndex() : InvalidIndex
|
|
|
|
+#else
|
|
m_meshBuffers.AddResource(subMesh.m_indexShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_indexShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_positionShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_positionShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_normalShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_normalShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_tangentShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_tangentShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_bitangentShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_bitangentShaderBufferView.get()),
|
|
m_meshBuffers.AddResource(subMesh.m_uvShaderBufferView.get())
|
|
m_meshBuffers.AddResource(subMesh.m_uvShaderBufferView.get())
|
|
|
|
+#endif
|
|
});
|
|
});
|
|
-
|
|
|
|
|
|
+
|
|
meshInfo.m_indexByteOffset = subMesh.m_indexBufferView.GetByteOffset();
|
|
meshInfo.m_indexByteOffset = subMesh.m_indexBufferView.GetByteOffset();
|
|
meshInfo.m_positionByteOffset = subMesh.m_positionVertexBufferView.GetByteOffset();
|
|
meshInfo.m_positionByteOffset = subMesh.m_positionVertexBufferView.GetByteOffset();
|
|
meshInfo.m_normalByteOffset = subMesh.m_normalVertexBufferView.GetByteOffset();
|
|
meshInfo.m_normalByteOffset = subMesh.m_normalVertexBufferView.GetByteOffset();
|
|
@@ -235,11 +248,19 @@ namespace AZ
|
|
|
|
|
|
materialInfo.m_textureStartIndex = m_materialTextureIndices.AddEntry(
|
|
materialInfo.m_textureStartIndex = m_materialTextureIndices.AddEntry(
|
|
{
|
|
{
|
|
|
|
+#if USE_BINDLESS_SRG
|
|
|
|
+ subMesh.m_baseColorImageView.get() ? subMesh.m_baseColorImageView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_normalImageView.get() ? subMesh.m_normalImageView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_metallicImageView.get() ? subMesh.m_metallicImageView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_roughnessImageView.get() ? subMesh.m_roughnessImageView->GetBindlessReadIndex() : InvalidIndex,
|
|
|
|
+ subMesh.m_emissiveImageView.get() ? subMesh.m_emissiveImageView->GetBindlessReadIndex() : InvalidIndex
|
|
|
|
+#else
|
|
m_materialTextures.AddResource(subMesh.m_baseColorImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_baseColorImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_normalImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_normalImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_metallicImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_metallicImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_roughnessImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_roughnessImageView.get()),
|
|
m_materialTextures.AddResource(subMesh.m_emissiveImageView.get())
|
|
m_materialTextures.AddResource(subMesh.m_emissiveImageView.get())
|
|
|
|
+#endif
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -289,6 +310,7 @@ namespace AZ
|
|
m_meshBufferIndices.RemoveEntry(meshInfo.m_bufferStartIndex);
|
|
m_meshBufferIndices.RemoveEntry(meshInfo.m_bufferStartIndex);
|
|
m_materialTextureIndices.RemoveEntry(materialInfo.m_textureStartIndex);
|
|
m_materialTextureIndices.RemoveEntry(materialInfo.m_textureStartIndex);
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
m_meshBuffers.RemoveResource(subMesh.m_indexShaderBufferView.get());
|
|
m_meshBuffers.RemoveResource(subMesh.m_indexShaderBufferView.get());
|
|
m_meshBuffers.RemoveResource(subMesh.m_positionShaderBufferView.get());
|
|
m_meshBuffers.RemoveResource(subMesh.m_positionShaderBufferView.get());
|
|
m_meshBuffers.RemoveResource(subMesh.m_normalShaderBufferView.get());
|
|
m_meshBuffers.RemoveResource(subMesh.m_normalShaderBufferView.get());
|
|
@@ -301,6 +323,7 @@ namespace AZ
|
|
m_materialTextures.RemoveResource(subMesh.m_metallicImageView.get());
|
|
m_materialTextures.RemoveResource(subMesh.m_metallicImageView.get());
|
|
m_materialTextures.RemoveResource(subMesh.m_roughnessImageView.get());
|
|
m_materialTextures.RemoveResource(subMesh.m_roughnessImageView.get());
|
|
m_materialTextures.RemoveResource(subMesh.m_emissiveImageView.get());
|
|
m_materialTextures.RemoveResource(subMesh.m_emissiveImageView.get());
|
|
|
|
+#endif
|
|
|
|
|
|
if (globalIndex < m_subMeshes.size() - 1)
|
|
if (globalIndex < m_subMeshes.size() - 1)
|
|
{
|
|
{
|
|
@@ -339,8 +362,10 @@ namespace AZ
|
|
m_meshBufferIndices.Reset();
|
|
m_meshBufferIndices.Reset();
|
|
m_materialTextureIndices.Reset();
|
|
m_materialTextureIndices.Reset();
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
m_meshBuffers.Reset();
|
|
m_meshBuffers.Reset();
|
|
m_materialTextures.Reset();
|
|
m_materialTextures.Reset();
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -505,6 +530,7 @@ namespace AZ
|
|
currentMeshBufferIndicesGpuBuffer->Resize(newMeshBufferIndicesByteCount);
|
|
currentMeshBufferIndicesGpuBuffer->Resize(newMeshBufferIndicesByteCount);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
// resolve to the true indices using the indirection list
|
|
// resolve to the true indices using the indirection list
|
|
// Note: this is done on the CPU to avoid double-indirection in the shader
|
|
// Note: this is done on the CPU to avoid double-indirection in the shader
|
|
IndexVector resolvedMeshBufferIndices(m_meshBufferIndices.GetIndexList().size());
|
|
IndexVector resolvedMeshBufferIndices(m_meshBufferIndices.GetIndexList().size());
|
|
@@ -522,6 +548,9 @@ namespace AZ
|
|
}
|
|
}
|
|
|
|
|
|
currentMeshBufferIndicesGpuBuffer->UpdateData(resolvedMeshBufferIndices.data(), newMeshBufferIndicesByteCount);
|
|
currentMeshBufferIndicesGpuBuffer->UpdateData(resolvedMeshBufferIndices.data(), newMeshBufferIndicesByteCount);
|
|
|
|
+#else
|
|
|
|
+ currentMeshBufferIndicesGpuBuffer->UpdateData(m_meshBufferIndices.GetIndexList().data(), newMeshBufferIndicesByteCount);
|
|
|
|
+#endif
|
|
|
|
|
|
// update material texture indices buffer
|
|
// update material texture indices buffer
|
|
Data::Instance<RPI::Buffer>& currentMaterialTextureIndicesGpuBuffer = m_materialTextureIndicesGpuBuffer[m_currentIndexListFrameIndex];
|
|
Data::Instance<RPI::Buffer>& currentMaterialTextureIndicesGpuBuffer = m_materialTextureIndicesGpuBuffer[m_currentIndexListFrameIndex];
|
|
@@ -544,6 +573,7 @@ namespace AZ
|
|
currentMaterialTextureIndicesGpuBuffer->Resize(newMaterialTextureIndicesByteCount);
|
|
currentMaterialTextureIndicesGpuBuffer->Resize(newMaterialTextureIndicesByteCount);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
// resolve to the true indices using the indirection list
|
|
// resolve to the true indices using the indirection list
|
|
// Note: this is done on the CPU to avoid double-indirection in the shader
|
|
// Note: this is done on the CPU to avoid double-indirection in the shader
|
|
IndexVector resolvedMaterialTextureIndices(m_materialTextureIndices.GetIndexList().size());
|
|
IndexVector resolvedMaterialTextureIndices(m_materialTextureIndices.GetIndexList().size());
|
|
@@ -561,6 +591,9 @@ namespace AZ
|
|
}
|
|
}
|
|
|
|
|
|
currentMaterialTextureIndicesGpuBuffer->UpdateData(resolvedMaterialTextureIndices.data(), newMaterialTextureIndicesByteCount);
|
|
currentMaterialTextureIndicesGpuBuffer->UpdateData(resolvedMaterialTextureIndices.data(), newMaterialTextureIndicesByteCount);
|
|
|
|
+#else
|
|
|
|
+ currentMaterialTextureIndicesGpuBuffer->UpdateData(m_materialTextureIndices.GetIndexList().data(), newMaterialTextureIndicesByteCount);
|
|
|
|
+#endif
|
|
|
|
|
|
m_indexListNeedsUpdate = false;
|
|
m_indexListNeedsUpdate = false;
|
|
}
|
|
}
|
|
@@ -656,8 +689,10 @@ namespace AZ
|
|
bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_meshBufferIndices"));
|
|
bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_meshBufferIndices"));
|
|
m_rayTracingSceneSrg->SetBufferView(bufferIndex, m_meshBufferIndicesGpuBuffer[m_currentIndexListFrameIndex]->GetBufferView());
|
|
m_rayTracingSceneSrg->SetBufferView(bufferIndex, m_meshBufferIndicesGpuBuffer[m_currentIndexListFrameIndex]->GetBufferView());
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
RHI::ShaderInputBufferUnboundedArrayIndex bufferUnboundedArrayIndex = srgLayout->FindShaderInputBufferUnboundedArrayIndex(AZ::Name("m_meshBuffers"));
|
|
RHI::ShaderInputBufferUnboundedArrayIndex bufferUnboundedArrayIndex = srgLayout->FindShaderInputBufferUnboundedArrayIndex(AZ::Name("m_meshBuffers"));
|
|
m_rayTracingSceneSrg->SetBufferViewUnboundedArray(bufferUnboundedArrayIndex, m_meshBuffers.GetResourceList());
|
|
m_rayTracingSceneSrg->SetBufferViewUnboundedArray(bufferUnboundedArrayIndex, m_meshBuffers.GetResourceList());
|
|
|
|
+#endif
|
|
m_rayTracingSceneSrg->Compile();
|
|
m_rayTracingSceneSrg->Compile();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -672,8 +707,10 @@ namespace AZ
|
|
bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_materialTextureIndices"));
|
|
bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_materialTextureIndices"));
|
|
m_rayTracingMaterialSrg->SetBufferView(bufferIndex, m_materialTextureIndicesGpuBuffer[m_currentIndexListFrameIndex]->GetBufferView());
|
|
m_rayTracingMaterialSrg->SetBufferView(bufferIndex, m_materialTextureIndicesGpuBuffer[m_currentIndexListFrameIndex]->GetBufferView());
|
|
|
|
|
|
|
|
+#if !USE_BINDLESS_SRG
|
|
RHI::ShaderInputImageUnboundedArrayIndex textureUnboundedArrayIndex = srgLayout->FindShaderInputImageUnboundedArrayIndex(AZ::Name("m_materialTextures"));
|
|
RHI::ShaderInputImageUnboundedArrayIndex textureUnboundedArrayIndex = srgLayout->FindShaderInputImageUnboundedArrayIndex(AZ::Name("m_materialTextures"));
|
|
m_rayTracingMaterialSrg->SetImageViewUnboundedArray(textureUnboundedArrayIndex, m_materialTextures.GetResourceList());
|
|
m_rayTracingMaterialSrg->SetImageViewUnboundedArray(textureUnboundedArrayIndex, m_materialTextures.GetResourceList());
|
|
|
|
+#endif
|
|
m_rayTracingMaterialSrg->Compile();
|
|
m_rayTracingMaterialSrg->Compile();
|
|
}
|
|
}
|
|
|
|
|