mirror of
https://bitbucket.org/CPMADevs/cnq3
synced 2024-11-10 06:31:48 +00:00
minimizing memory allocations in CmdCreateBLAS
This commit is contained in:
parent
a76dba5cfb
commit
fedfff191e
1 changed files with 15 additions and 8 deletions
|
@ -752,6 +752,8 @@ namespace RHI
|
||||||
HBuffer raytracingScratchBuffer;
|
HBuffer raytracingScratchBuffer;
|
||||||
HBuffer raytracingInstanceBuffer;
|
HBuffer raytracingInstanceBuffer;
|
||||||
uint32_t beginFrameCounter;
|
uint32_t beginFrameCounter;
|
||||||
|
D3D12_RAYTRACING_GEOMETRY_DESC* rtGeoDescs;
|
||||||
|
uint32_t rtGeoDescCount;
|
||||||
|
|
||||||
// immediate-mode barrier API
|
// immediate-mode barrier API
|
||||||
TextureBarrier textureBarriers[64];
|
TextureBarrier textureBarriers[64];
|
||||||
|
@ -3687,6 +3689,8 @@ namespace RHI
|
||||||
CloseHandle(rhi.frameLatencyWaitableObject);
|
CloseHandle(rhi.frameLatencyWaitableObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(rhi.rtGeoDescs);
|
||||||
|
|
||||||
rhi.upload.Release();
|
rhi.upload.Release();
|
||||||
rhi.readback.Release();
|
rhi.readback.Release();
|
||||||
rhi.mainFence.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 baseVertexAddress = rhi.buffers.Get(rhiDesc.vertexBuffer).gpuAddress;
|
||||||
const D3D12_GPU_VIRTUAL_ADDRESS baseIndexAddress = rhi.buffers.Get(rhiDesc.indexBuffer).gpuAddress;
|
const D3D12_GPU_VIRTUAL_ADDRESS baseIndexAddress = rhi.buffers.Get(rhiDesc.indexBuffer).gpuAddress;
|
||||||
|
|
||||||
D3D12_RAYTRACING_GEOMETRY_DESC* const geos =
|
if(rhiDesc.meshCount > rhi.rtGeoDescCount)
|
||||||
(D3D12_RAYTRACING_GEOMETRY_DESC*)calloc(rhiDesc.meshCount, sizeof(D3D12_RAYTRACING_GEOMETRY_DESC));
|
|
||||||
if(geos == NULL)
|
|
||||||
{
|
{
|
||||||
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)
|
for(uint32_t i = 0; i < rhiDesc.meshCount; ++i)
|
||||||
{
|
{
|
||||||
const BLASMeshDesc& mesh = rhiDesc.meshes[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.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
|
||||||
geoDesc.Flags = mesh.isFullyOpaque ?
|
geoDesc.Flags = mesh.isFullyOpaque ?
|
||||||
D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE :
|
D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE :
|
||||||
|
@ -5551,7 +5560,7 @@ namespace RHI
|
||||||
inputs.Flags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
inputs.Flags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
||||||
inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
||||||
inputs.NumDescs = rhiDesc.meshCount;
|
inputs.NumDescs = rhiDesc.meshCount;
|
||||||
inputs.pGeometryDescs = geos;
|
inputs.pGeometryDescs = rhi.rtGeoDescs;
|
||||||
|
|
||||||
D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
||||||
rhi.device->GetRaytracingAccelerationStructurePrebuildInfo(&inputs, &info);
|
rhi.device->GetRaytracingAccelerationStructurePrebuildInfo(&inputs, &info);
|
||||||
|
@ -5574,8 +5583,6 @@ namespace RHI
|
||||||
rtasDesc.Inputs = inputs;
|
rtasDesc.Inputs = inputs;
|
||||||
rhi.commandList->BuildRaytracingAccelerationStructure(&rtasDesc, 0, NULL);
|
rhi.commandList->BuildRaytracingAccelerationStructure(&rtasDesc, 0, NULL);
|
||||||
|
|
||||||
free(geos);
|
|
||||||
|
|
||||||
CmdBeginBarrier();
|
CmdBeginBarrier();
|
||||||
CmdBufferBarrier(*blasBuffer, ResourceStates::UnorderedAccessBit);
|
CmdBufferBarrier(*blasBuffer, ResourceStates::UnorderedAccessBit);
|
||||||
CmdEndBarrier();
|
CmdEndBarrier();
|
||||||
|
|
Loading…
Reference in a new issue