| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #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((int)info.ScratchDataSizeInBytes);
- scratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
- resultBuffer->setLength((int)info.ResultDataMaxSizeInBytes);
- 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->getCommandList()->BuildRaytracingAccelerationStructure(
- &buildDesc, 0, nullptr);
- }
- Framework::DX12Buffer* Framework::DX12BLAS::zScratchBuffer() const
- {
- return scratchBuffer;
- }
- Framework::DX12Buffer* Framework::DX12BLAS::zResultBuffer() const
- {
- return resultBuffer;
- }
|