|
@@ -38,7 +38,8 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
m_type = inf.m_type;
|
|
m_type = inf.m_type;
|
|
|
|
|
|
|
|
PtrSize asBufferSize;
|
|
PtrSize asBufferSize;
|
|
|
- getMemoryRequirement(inf, asBufferSize, m_scratchBufferSize);
|
|
|
|
|
|
|
+ getMemoryRequirement(inf, asBufferSize, m_scratchBufferSize, false);
|
|
|
|
|
+ m_scratchBufferSize += kScratchBufferAlignment;
|
|
|
|
|
|
|
|
// Allocate AS buffer
|
|
// Allocate AS buffer
|
|
|
BufferView asBuff = inf.m_accelerationStructureBuffer;
|
|
BufferView asBuff = inf.m_accelerationStructureBuffer;
|
|
@@ -92,8 +93,12 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
|
|
|
|
|
void AccelerationStructureImpl::fillBuildInfo(BufferView scratchBuff, D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC& buildDesc) const
|
|
void AccelerationStructureImpl::fillBuildInfo(BufferView scratchBuff, D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC& buildDesc) const
|
|
|
{
|
|
{
|
|
|
|
|
+ ANKI_ASSERT(scratchBuff.getRange() == m_scratchBufferSize);
|
|
|
buildDesc = {};
|
|
buildDesc = {};
|
|
|
buildDesc.DestAccelerationStructureData = m_asBuffer->getGpuAddress() + m_asBufferOffset;
|
|
buildDesc.DestAccelerationStructureData = m_asBuffer->getGpuAddress() + m_asBufferOffset;
|
|
|
|
|
+
|
|
|
|
|
+ const PtrSize offsetDiff = getAlignedRoundUp(kScratchBufferAlignment, scratchBuff.getOffset()) - scratchBuff.getOffset();
|
|
|
|
|
+ scratchBuff = scratchBuff.incrementOffset(offsetDiff);
|
|
|
buildDesc.ScratchAccelerationStructureData = scratchBuff.getBuffer().getGpuAddress() + scratchBuff.getOffset();
|
|
buildDesc.ScratchAccelerationStructureData = scratchBuff.getBuffer().getGpuAddress() + scratchBuff.getOffset();
|
|
|
|
|
|
|
|
if(m_type == AccelerationStructureType::kBottomLevel)
|
|
if(m_type == AccelerationStructureType::kBottomLevel)
|
|
@@ -116,95 +121,63 @@ void AccelerationStructureImpl::fillBuildInfo(BufferView scratchBuff, D3D12_BUIL
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-D3D12_GLOBAL_BARRIER AccelerationStructureImpl::computeBarrierInfo(AccelerationStructureUsageBit before, AccelerationStructureUsageBit after) const
|
|
|
|
|
|
|
+D3D12_BARRIER_SYNC AccelerationStructureImpl::computeBarrierSync(AccelerationStructureUsageBit usage)
|
|
|
{
|
|
{
|
|
|
- D3D12_GLOBAL_BARRIER barrier = {};
|
|
|
|
|
-
|
|
|
|
|
- if(before == AccelerationStructureUsageBit::kNone)
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_NONE;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_NO_ACCESS;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kBuild))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kAttach))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ D3D12_BARRIER_SYNC out = {};
|
|
|
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kSrvGeometry))
|
|
|
|
|
|
|
+ if(usage == AccelerationStructureUsageBit::kNone)
|
|
|
{
|
|
{
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ; // READ_BIT is the only viable solution by elimination
|
|
|
|
|
|
|
+ out |= D3D12_BARRIER_SYNC_NONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kSrvPixel))
|
|
|
|
|
|
|
+ if(!!(usage & (AccelerationStructureUsageBit::kBuild | AccelerationStructureUsageBit::kAttach)))
|
|
|
{
|
|
{
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_PIXEL_SHADING;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
|
|
+ out |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kSrvCompute))
|
|
|
|
|
|
|
+ if(!!(usage & (AccelerationStructureUsageBit::kAllSrv)))
|
|
|
{
|
|
{
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_COMPUTE_SHADING;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
|
|
+ out |= D3D12_BARRIER_SYNC_ALL_SHADING;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(before & AccelerationStructureUsageBit::kSrvDispatchRays))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncBefore |= D3D12_BARRIER_SYNC_RAYTRACING;
|
|
|
|
|
- barrier.AccessBefore |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return out;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- // After
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kBuild))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+D3D12_BARRIER_ACCESS AccelerationStructureImpl::computeBarrierAccess(AccelerationStructureUsageBit usage)
|
|
|
|
|
+{
|
|
|
|
|
+ D3D12_BARRIER_ACCESS out = {};
|
|
|
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kAttach))
|
|
|
|
|
|
|
+ if(usage == AccelerationStructureUsageBit::kNone)
|
|
|
{
|
|
{
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
|
|
+ return D3D12_BARRIER_ACCESS_NO_ACCESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kSrvGeometry))
|
|
|
|
|
|
|
+ if(!!(usage & AccelerationStructureUsageBit::kAllRead))
|
|
|
{
|
|
{
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ; // READ_BIT is the only viable solution by elimination
|
|
|
|
|
|
|
+ out |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kSrvPixel))
|
|
|
|
|
|
|
+ if(!!(usage & AccelerationStructureUsageBit::kAllWrite))
|
|
|
{
|
|
{
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_PIXEL_SHADING;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
|
|
+ out |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kSrvCompute))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_COMPUTE_SHADING;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return out;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- if(!!(after & AccelerationStructureUsageBit::kSrvDispatchRays))
|
|
|
|
|
- {
|
|
|
|
|
- barrier.SyncAfter |= D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- barrier.AccessAfter |= D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+D3D12_GLOBAL_BARRIER AccelerationStructureImpl::computeBarrierInfo(AccelerationStructureUsageBit before, AccelerationStructureUsageBit after) const
|
|
|
|
|
+{
|
|
|
|
|
+ const D3D12_GLOBAL_BARRIER barrier = {.SyncBefore = computeBarrierSync(before),
|
|
|
|
|
+ .SyncAfter = computeBarrierSync(after),
|
|
|
|
|
+ .AccessBefore = computeBarrierAccess(before),
|
|
|
|
|
+ .AccessAfter = computeBarrierAccess(after)};
|
|
|
|
|
|
|
|
ANKI_ASSERT(barrier.SyncBefore || barrier.SyncAfter);
|
|
ANKI_ASSERT(barrier.SyncBefore || barrier.SyncAfter);
|
|
|
-
|
|
|
|
|
return barrier;
|
|
return barrier;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void AccelerationStructureImpl::getMemoryRequirement(const AccelerationStructureInitInfo& inf, PtrSize& asBufferSize, PtrSize& buildScratchBufferSize)
|
|
|
|
|
|
|
+void AccelerationStructureImpl::getMemoryRequirement(const AccelerationStructureInitInfo& inf, PtrSize& asBufferSize, PtrSize& buildScratchBufferSize,
|
|
|
|
|
+ Bool alignSizes)
|
|
|
{
|
|
{
|
|
|
ANKI_ASSERT(inf.isValidForGettingMemoryRequirements());
|
|
ANKI_ASSERT(inf.isValidForGettingMemoryRequirements());
|
|
|
|
|
|
|
@@ -243,6 +216,12 @@ void AccelerationStructureImpl::getMemoryRequirement(const AccelerationStructure
|
|
|
getDevice().GetRaytracingAccelerationStructurePrebuildInfo(&inputs, &prebuildInfo);
|
|
getDevice().GetRaytracingAccelerationStructurePrebuildInfo(&inputs, &prebuildInfo);
|
|
|
asBufferSize = prebuildInfo.ResultDataMaxSizeInBytes;
|
|
asBufferSize = prebuildInfo.ResultDataMaxSizeInBytes;
|
|
|
buildScratchBufferSize = prebuildInfo.ScratchDataSizeInBytes;
|
|
buildScratchBufferSize = prebuildInfo.ScratchDataSizeInBytes;
|
|
|
|
|
+
|
|
|
|
|
+ if(alignSizes)
|
|
|
|
|
+ {
|
|
|
|
|
+ asBufferSize += D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT;
|
|
|
|
|
+ buildScratchBufferSize += kScratchBufferAlignment;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|