From fedfff191e9d40955b2b1756becaf03a9ade0526 Mon Sep 17 00:00:00 2001 From: myT <> Date: Wed, 7 Feb 2024 00:40:20 +0100 Subject: [PATCH] minimizing memory allocations in CmdCreateBLAS --- code/renderer/rhi_d3d12.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/code/renderer/rhi_d3d12.cpp b/code/renderer/rhi_d3d12.cpp index aaa07ff..e060db3 100644 --- a/code/renderer/rhi_d3d12.cpp +++ b/code/renderer/rhi_d3d12.cpp @@ -752,6 +752,8 @@ namespace RHI HBuffer raytracingScratchBuffer; HBuffer raytracingInstanceBuffer; uint32_t beginFrameCounter; + D3D12_RAYTRACING_GEOMETRY_DESC* rtGeoDescs; + uint32_t rtGeoDescCount; // immediate-mode barrier API TextureBarrier textureBarriers[64]; @@ -3687,6 +3689,8 @@ namespace RHI CloseHandle(rhi.frameLatencyWaitableObject); } + free(rhi.rtGeoDescs); + rhi.upload.Release(); rhi.readback.Release(); rhi.mainFence.Release(); @@ -5521,17 +5525,22 @@ namespace RHI const D3D12_GPU_VIRTUAL_ADDRESS baseVertexAddress = rhi.buffers.Get(rhiDesc.vertexBuffer).gpuAddress; const D3D12_GPU_VIRTUAL_ADDRESS baseIndexAddress = rhi.buffers.Get(rhiDesc.indexBuffer).gpuAddress; - D3D12_RAYTRACING_GEOMETRY_DESC* const geos = - (D3D12_RAYTRACING_GEOMETRY_DESC*)calloc(rhiDesc.meshCount, sizeof(D3D12_RAYTRACING_GEOMETRY_DESC)); - if(geos == NULL) + if(rhiDesc.meshCount > rhi.rtGeoDescCount) { - ri.Error(ERR_FATAL, "Failed to allocate %d D3D12_RAYTRACING_GEOMETRY_DESC instances\n", (int)rhiDesc.meshCount); + const uint32_t meshCount = max(rhiDesc.meshCount, 2 * rhi.rtGeoDescCount); + const size_t byteCount = meshCount * sizeof(D3D12_RAYTRACING_GEOMETRY_DESC); + rhi.rtGeoDescs = (D3D12_RAYTRACING_GEOMETRY_DESC*)realloc(rhi.rtGeoDescs, byteCount); + if(rhi.rtGeoDescs == NULL) + { + ri.Error(ERR_FATAL, "Failed to allocate %d D3D12_RAYTRACING_GEOMETRY_DESC instances\n", (int)meshCount); + } + rhi.rtGeoDescCount = rhiDesc.meshCount; } for(uint32_t i = 0; i < rhiDesc.meshCount; ++i) { const BLASMeshDesc& mesh = rhiDesc.meshes[i]; - D3D12_RAYTRACING_GEOMETRY_DESC& geoDesc = geos[i]; + D3D12_RAYTRACING_GEOMETRY_DESC& geoDesc = rhi.rtGeoDescs[i]; geoDesc.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES; geoDesc.Flags = mesh.isFullyOpaque ? D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE : @@ -5551,7 +5560,7 @@ namespace RHI inputs.Flags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE; inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY; inputs.NumDescs = rhiDesc.meshCount; - inputs.pGeometryDescs = geos; + inputs.pGeometryDescs = rhi.rtGeoDescs; D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {}; rhi.device->GetRaytracingAccelerationStructurePrebuildInfo(&inputs, &info); @@ -5574,8 +5583,6 @@ namespace RHI rtasDesc.Inputs = inputs; rhi.commandList->BuildRaytracingAccelerationStructure(&rtasDesc, 0, NULL); - free(geos); - CmdBeginBarrier(); CmdBufferBarrier(*blasBuffer, ResourceStates::UnorderedAccessBit); CmdEndBarrier();