| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include "DX12BLAS.h"
- #include "DX12Buffer.h"
- #include "DX12CommandQueue.h"
- Framework::DX12BLAS::DX12BLAS(
- ID3D12Device5* zDevice, DX12DirectCommandQueue* zDirectQueue)
- : ReferenceCounter(),
- scratchBuffer(0),
- resultBuffer(0),
- zDevice(zDevice),
- zDirectQueue(zDirectQueue),
- geometryDesc(new D3D12_RAYTRACING_GEOMETRY_DESC())
- {}
- Framework::DX12BLAS::~DX12BLAS()
- {
- if (scratchBuffer)
- {
- scratchBuffer->release();
- }
- if (resultBuffer)
- {
- resultBuffer->release();
- }
- delete geometryDesc;
- }
- void Framework::DX12BLAS::build(
- DX12Buffer* vertexBuffer, DX12Buffer* indexBuffer)
- {
- memset(geometryDesc, 0, sizeof(D3D12_RAYTRACING_GEOMETRY_DESC));
- geometryDesc->Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
- geometryDesc->Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
- geometryDesc->Triangles.VertexBuffer.StartAddress
- = vertexBuffer->zBuffer()->GetGPUVirtualAddress();
- geometryDesc->Triangles.VertexBuffer.StrideInBytes
- = vertexBuffer->getElementLength();
- geometryDesc->Triangles.VertexCount
- = (unsigned)vertexBuffer->getElementCount();
- geometryDesc->Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
- geometryDesc->Triangles.IndexBuffer
- = indexBuffer->zBuffer()->GetGPUVirtualAddress();
- geometryDesc->Triangles.IndexCount
- = (unsigned)indexBuffer->getElementCount();
- geometryDesc->Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
- D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
- prebuildDesc.Type
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
- prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
- prebuildDesc.NumDescs = 1;
- prebuildDesc.pGeometryDescs = geometryDesc;
- prebuildDesc.Flags
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
- D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
- zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
- &prebuildDesc, &info);
- scratchBuffer->setLength(
- ROUND_UP_POWER_OF_2((int)info.ScratchDataSizeInBytes, 256));
- scratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
- resultBuffer->setLength(
- ROUND_UP_POWER_OF_2((int)info.ResultDataMaxSizeInBytes, 256));
- resultBuffer->createBufferWithoutData(
- D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
- D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
- buildDesc.Inputs.Type
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
- buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
- buildDesc.Inputs.NumDescs = 1;
- buildDesc.Inputs.pGeometryDescs = geometryDesc;
- buildDesc.DestAccelerationStructureData
- = {resultBuffer->zBuffer()->GetGPUVirtualAddress()};
- buildDesc.ScratchAccelerationStructureData
- = {scratchBuffer->zBuffer()->GetGPUVirtualAddress()};
- buildDesc.SourceAccelerationStructureData = 0;
- buildDesc.Inputs.Flags
- = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
- // Build the AS
- zDirectQueue->zCommandList()->BuildRaytracingAccelerationStructure(
- &buildDesc, 0, nullptr);
- }
- Framework::DX12Buffer* Framework::DX12BLAS::zScratchBuffer() const
- {
- return scratchBuffer;
- }
- Framework::DX12Buffer* Framework::DX12BLAS::zResultBuffer() const
- {
- return resultBuffer;
- }
|