|
|
@@ -1,6 +1,7 @@
|
|
|
#include "DX12TLAS.h"
|
|
|
|
|
|
#include "DX12CommandQueue.h"
|
|
|
+#include "Logging.h"
|
|
|
|
|
|
Framework::DX12TLAS::DX12TLAS(
|
|
|
ID3D12Device5* zDevice, Framework::DX12DirectCommandQueue* zDirectQueue)
|
|
|
@@ -8,13 +9,15 @@ Framework::DX12TLAS::DX12TLAS(
|
|
|
scratchBuffer(0),
|
|
|
resultBuffer(0),
|
|
|
descriptorBuffer(0),
|
|
|
- previousResultBuffer(0),
|
|
|
zDevice(zDevice),
|
|
|
zDirectQueue(zDirectQueue),
|
|
|
overflowInstanceIterator(0, 0, 0, 0),
|
|
|
currentInstanceIndex(0),
|
|
|
lastInstanceCount(0),
|
|
|
- mappedDescriptorBuffer(0)
|
|
|
+ mappedDescriptorBuffer(0),
|
|
|
+ lastResultBuffer(0),
|
|
|
+ lastScratchBuffer(0),
|
|
|
+ bufferChanged(0)
|
|
|
{}
|
|
|
|
|
|
Framework::DX12TLAS::~DX12TLAS()
|
|
|
@@ -31,9 +34,13 @@ Framework::DX12TLAS::~DX12TLAS()
|
|
|
{
|
|
|
descriptorBuffer->release();
|
|
|
}
|
|
|
- if (previousResultBuffer)
|
|
|
+ if (lastResultBuffer)
|
|
|
{
|
|
|
- previousResultBuffer->release();
|
|
|
+ lastResultBuffer->Release();
|
|
|
+ }
|
|
|
+ if (lastScratchBuffer)
|
|
|
+ {
|
|
|
+ lastScratchBuffer->Release();
|
|
|
}
|
|
|
for (const D3D12_RAYTRACING_INSTANCE_DESC* desc : overflowInstanceDescs)
|
|
|
{
|
|
|
@@ -115,18 +122,22 @@ void Framework::DX12TLAS::endUpdate()
|
|
|
&prebuildDesc, &info);
|
|
|
|
|
|
// create new buffers witch fit the TLAS
|
|
|
- if (resultBuffer)
|
|
|
+ if (scratchBuffer)
|
|
|
{
|
|
|
- if (previousResultBuffer)
|
|
|
+ if (lastScratchBuffer)
|
|
|
{
|
|
|
- previousResultBuffer->release();
|
|
|
+ lastScratchBuffer->Release();
|
|
|
}
|
|
|
- previousResultBuffer = resultBuffer;
|
|
|
+ lastScratchBuffer = scratchBuffer->zBuffer();
|
|
|
+ lastScratchBuffer->AddRef();
|
|
|
+ }
|
|
|
+ if (!resultBuffer)
|
|
|
+ {
|
|
|
+ resultBuffer = new DX12Buffer(1,
|
|
|
+ zDevice,
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
|
|
|
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
}
|
|
|
- resultBuffer = new DX12Buffer(1,
|
|
|
- zDevice,
|
|
|
- dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
|
|
|
- D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
resultBuffer->setLength(
|
|
|
ROUND_UP_POWER_OF_2(info.ResultDataMaxSizeInBytes, 256));
|
|
|
resultBuffer->createBufferWithoutData(
|
|
|
@@ -175,7 +186,8 @@ void Framework::DX12TLAS::endUpdate()
|
|
|
{
|
|
|
memcpy(newMappedDescriptorBuffer,
|
|
|
mappedDescriptorBuffer,
|
|
|
- oldDescriptorBufferElementCount);
|
|
|
+ oldDescriptorBufferElementCount
|
|
|
+ * sizeof(D3D12_RAYTRACING_INSTANCE_DESC));
|
|
|
D3D12_RANGE range = {0, 0}; // do not write to the old buffer
|
|
|
oldDescriptorBuffer->Unmap(0, &range);
|
|
|
oldDescriptorBuffer->Release();
|
|
|
@@ -191,6 +203,19 @@ void Framework::DX12TLAS::endUpdate()
|
|
|
overflowInstanceIterator++;
|
|
|
}
|
|
|
descriptorBuffer->zBuffer()->Unmap(0, nullptr);
|
|
|
+ bufferChanged = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (resultBuffer)
|
|
|
+ {
|
|
|
+ if (lastResultBuffer)
|
|
|
+ {
|
|
|
+ lastResultBuffer->Release();
|
|
|
+ }
|
|
|
+ lastResultBuffer = resultBuffer->zBuffer();
|
|
|
+ lastResultBuffer->AddRef();
|
|
|
+ }
|
|
|
}
|
|
|
D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc = {};
|
|
|
buildDesc.Inputs.Type
|
|
|
@@ -204,11 +229,11 @@ void Framework::DX12TLAS::endUpdate()
|
|
|
buildDesc.ScratchAccelerationStructureData
|
|
|
= {scratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
buildDesc.SourceAccelerationStructureData
|
|
|
- = previousResultBuffer
|
|
|
- ? previousResultBuffer->zBuffer()->GetGPUVirtualAddress()
|
|
|
+ = lastResultBuffer && currentInstanceIndex < lastInstanceCount
|
|
|
+ ? lastResultBuffer->GetGPUVirtualAddress()
|
|
|
: 0;
|
|
|
buildDesc.Inputs.Flags
|
|
|
- = previousResultBuffer
|
|
|
+ = lastResultBuffer && currentInstanceIndex < lastInstanceCount
|
|
|
? D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE
|
|
|
: D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE;
|
|
|
|
|
|
@@ -231,3 +256,13 @@ Framework::DX12Buffer* Framework::DX12TLAS::zResultBuffer() const
|
|
|
{
|
|
|
return resultBuffer;
|
|
|
}
|
|
|
+
|
|
|
+bool Framework::DX12TLAS::hasBufferChanged() const
|
|
|
+{
|
|
|
+ return bufferChanged;
|
|
|
+}
|
|
|
+
|
|
|
+void Framework::DX12TLAS::setBufferChanged(bool changed)
|
|
|
+{
|
|
|
+ bufferChanged = changed;
|
|
|
+}
|