From 56514926c5c3ffe228eb0616039119c29fa8c8f4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 22 Oct 2024 11:15:43 +0100 Subject: [PATCH] Fix calculation of offset/sizes when copying build inputs --- renderdoc/driver/d3d12/d3d12_manager.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_manager.cpp b/renderdoc/driver/d3d12/d3d12_manager.cpp index 3fb14958c..171ffd86e 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -1386,7 +1386,10 @@ ASBuildData *D3D12RTManager::CopyBuildInputs( else { if(desc.Triangles.Transform3x4) + { byteSize += sizeof(float) * 3 * 4; + byteSize = AlignUp16(byteSize); + } if(desc.Triangles.IndexBuffer) { @@ -1396,11 +1399,13 @@ ASBuildData *D3D12RTManager::CopyBuildInputs( byteSize += isize * desc.Triangles.IndexCount; byteSize = AlignUp16(byteSize); - ResourceId vbId = WrappedID3D12Resource::GetResIDFromAddr(desc.Triangles.VertexBuffer.RVA); + ResourceId vbId; + uint64_t srcOffs = 0; + WrappedID3D12Resource::GetResIDFromAddr(desc.Triangles.VertexBuffer.RVA, vbId, srcOffs); ID3D12Resource *sourceBuffer = m_wrappedDevice->GetResourceManager()->GetCurrentAs(vbId); - uint64_t vbSize = sourceBuffer->GetDesc().Width; + uint64_t vbSize = sourceBuffer->GetDesc().Width - srcOffs; uint32_t untrustedVertexCount = desc.Triangles.VertexCount; uint32_t estimatedVertexCount = @@ -1519,16 +1524,21 @@ ASBuildData *D3D12RTManager::CopyBuildInputs( ID3D12Resource *sourceBuffer = m_wrappedDevice->GetResourceManager()->GetCurrentAs(vbId); - uint64_t vbSize = sourceBuffer->GetDesc().Width; + uint64_t vbSize = sourceBuffer->GetDesc().Width - srcOffs; - vbSize = - RDCMIN(vbSize, desc.Triangles.VertexBuffer.StrideInBytes * desc.Triangles.VertexCount); + uint32_t untrustedVertexCount = desc.Triangles.VertexCount; + uint32_t estimatedVertexCount = + untrustedVertexCount + + (untrustedVertexCount / 100) * D3D12_Debug_RTMaxVertexPercentIncrease() + + D3D12_Debug_RTMaxVertexIncrement(); + + vbSize = RDCMIN(vbSize, desc.Triangles.VertexBuffer.StrideInBytes * estimatedVertexCount); unwrappedCmd->CopyBufferRegion(dstRes, dstOffset, Unwrap(sourceBuffer), srcOffs, vbSize); desc.Triangles.VertexBuffer.RVA = dstOffset - baseOffset; - dstOffset = AlignUp16(dstOffset + byteSize); + dstOffset = AlignUp16(dstOffset + vbSize); } else {