|
@@ -52,7 +52,11 @@ DirectX12::DirectX12()
|
|
|
uiTexture(0),
|
|
uiTexture(0),
|
|
|
texturRegister(new TextureList()),
|
|
texturRegister(new TextureList()),
|
|
|
vertexShader(0),
|
|
vertexShader(0),
|
|
|
- pixelShader(0)
|
|
|
|
|
|
|
+ pixelShader(0),
|
|
|
|
|
+ blasModels(0),
|
|
|
|
|
+ blasScratchBuffer(0),
|
|
|
|
|
+ blasResultBuffer(0),
|
|
|
|
|
+ lastModelId(-1)
|
|
|
{
|
|
{
|
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
|
backBuffer[i] = 0;
|
|
backBuffer[i] = 0;
|
|
@@ -60,6 +64,22 @@ DirectX12::DirectX12()
|
|
|
|
|
|
|
|
DirectX12::~DirectX12()
|
|
DirectX12::~DirectX12()
|
|
|
{
|
|
{
|
|
|
|
|
+ if (blasModels)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (int i = 0; i <= lastModelId; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (blasModels[i]) blasModels[i]->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ delete[] blasModels;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (blasScratchBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ blasScratchBuffer->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (blasResultBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ blasResultBuffer->release();
|
|
|
|
|
+ }
|
|
|
if (directCommandQueue)
|
|
if (directCommandQueue)
|
|
|
{
|
|
{
|
|
|
directCommandQueue->flush();
|
|
directCommandQueue->flush();
|
|
@@ -108,7 +128,7 @@ DirectX12::~DirectX12()
|
|
|
void DirectX12::updateBottomLevelAccelerationStructure()
|
|
void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
{
|
|
{
|
|
|
bool updateRequired = 0;
|
|
bool updateRequired = 0;
|
|
|
- for (Model3DData* model : *modelList->zModels())
|
|
|
|
|
|
|
+ for (const Model3DData* model : *modelList->zModels())
|
|
|
{
|
|
{
|
|
|
if (model->wasIndexBufferChanged() || model->wasVertexBufferChanged())
|
|
if (model->wasIndexBufferChanged() || model->wasVertexBufferChanged())
|
|
|
{
|
|
{
|
|
@@ -116,20 +136,94 @@ void DirectX12::updateBottomLevelAccelerationStructure()
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- int bufferIndex = 0;
|
|
|
|
|
|
|
+ int bufferCount = 0;
|
|
|
if (updateRequired)
|
|
if (updateRequired)
|
|
|
{
|
|
{
|
|
|
- for (Model3DData* model : *modelList->zModels())
|
|
|
|
|
|
|
+ for (const Model3DData* model : *modelList->zModels())
|
|
|
|
|
+ {
|
|
|
|
|
+ int id = model->getId();
|
|
|
|
|
+ blasModels[id]->calculateBuffers();
|
|
|
|
|
+ bufferCount += blasModels[id]->getBufferCount();
|
|
|
|
|
+ }
|
|
|
|
|
+ D3D12_RAYTRACING_GEOMETRY_DESC* geometryDescs
|
|
|
|
|
+ = new D3D12_RAYTRACING_GEOMETRY_DESC[bufferCount];
|
|
|
|
|
+ memset(geometryDescs,
|
|
|
|
|
+ 0,
|
|
|
|
|
+ sizeof(D3D12_RAYTRACING_GEOMETRY_DESC) * bufferCount);
|
|
|
|
|
+ int bufferIndex = 0;
|
|
|
|
|
+ for (const Model3DData* model : *modelList->zModels())
|
|
|
{
|
|
{
|
|
|
int id = model->getId();
|
|
int id = model->getId();
|
|
|
- if (model->wasIndexBufferChanged()
|
|
|
|
|
- || model->wasVertexBufferChanged())
|
|
|
|
|
|
|
+ for (int i = 0; i < blasModels[id]->getBufferCount()
|
|
|
|
|
+ && bufferIndex < bufferCount;
|
|
|
|
|
+ i++)
|
|
|
{
|
|
{
|
|
|
- blasModels[id]->calculateBuffers();
|
|
|
|
|
|
|
+ DX12Buffer* vertexBuffer
|
|
|
|
|
+ = blasModels[id]->zVertexBuffers()->z(i);
|
|
|
|
|
+ DX12Buffer* indexBuffer = blasModels[id]->zIndexBuffers()->z(i);
|
|
|
|
|
+ geometryDescs[bufferIndex].Type
|
|
|
|
|
+ = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
|
|
|
|
|
+ geometryDescs[bufferIndex].Flags
|
|
|
|
|
+ = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.VertexBuffer.StartAddress
|
|
|
|
|
+ = vertexBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.VertexBuffer.StrideInBytes
|
|
|
|
|
+ = vertexBuffer->getElementLength();
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.VertexCount
|
|
|
|
|
+ = (unsigned)vertexBuffer->getElementCount();
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.VertexFormat
|
|
|
|
|
+ = DXGI_FORMAT_R32G32B32_FLOAT;
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.IndexBuffer
|
|
|
|
|
+ = indexBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.IndexCount
|
|
|
|
|
+ = (unsigned)indexBuffer->getElementCount();
|
|
|
|
|
+ geometryDescs[bufferIndex].Triangles.IndexFormat
|
|
|
|
|
+ = DXGI_FORMAT_R32_UINT;
|
|
|
|
|
+ bufferIndex++;
|
|
|
}
|
|
}
|
|
|
- bufferIndex += blasModels[id]->getBufferCount();
|
|
|
|
|
}
|
|
}
|
|
|
- // TODO: create BLAS from calculated buffers
|
|
|
|
|
|
|
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
|
|
|
|
|
+ prebuildDesc.Type
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
|
|
|
|
|
+ prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
|
|
|
|
+ prebuildDesc.NumDescs = bufferCount;
|
|
|
|
|
+ prebuildDesc.pGeometryDescs = geometryDescs;
|
|
|
|
|
+ prebuildDesc.Flags
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
+
|
|
|
|
|
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
|
|
|
|
+ device->GetRaytracingAccelerationStructurePrebuildInfo(
|
|
|
|
|
+ &prebuildDesc, &info);
|
|
|
|
|
+
|
|
|
|
|
+ blasScratchBuffer->setLength((int)info.ScratchDataSizeInBytes);
|
|
|
|
|
+ blasScratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
|
|
|
|
|
+ blasResultBuffer->setLength((int)info.ResultDataMaxSizeInBytes);
|
|
|
|
|
+ blasResultBuffer->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 = bufferCount;
|
|
|
|
|
+ buildDesc.Inputs.pGeometryDescs = geometryDescs;
|
|
|
|
|
+ buildDesc.DestAccelerationStructureData
|
|
|
|
|
+ = {blasResultBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
+ buildDesc.ScratchAccelerationStructureData
|
|
|
|
|
+ = {blasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
+ buildDesc.SourceAccelerationStructureData = 0;
|
|
|
|
|
+ buildDesc.Inputs.Flags
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
+
|
|
|
|
|
+ // Build the AS
|
|
|
|
|
+ directCommandQueue->getCommandList()
|
|
|
|
|
+ ->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
|
|
|
|
|
+ directCommandQueue
|
|
|
|
|
+ ->execute(); // TODO: check if this is realy necessary
|
|
|
|
|
+ // here, because maybe the command list is
|
|
|
|
|
+ // executed in the render function anyway
|
|
|
|
|
+
|
|
|
|
|
+ delete[] geometryDescs;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -373,6 +467,11 @@ void DirectX12::initialize(
|
|
|
copyCommandQueue = new DX12CopyCommandQueue(device);
|
|
copyCommandQueue = new DX12CopyCommandQueue(device);
|
|
|
computeCommandQueue = new DX12ComputeCommandQueue(device);
|
|
computeCommandQueue = new DX12ComputeCommandQueue(device);
|
|
|
|
|
|
|
|
|
|
+ blasScratchBuffer
|
|
|
|
|
+ = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
+ blasResultBuffer
|
|
|
|
|
+ = new DX12Buffer(1, device, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
+
|
|
|
IDXGIFactory5* fac5 = 0;
|
|
IDXGIFactory5* fac5 = 0;
|
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
|
|
|
if (fac5)
|
|
if (fac5)
|