|
@@ -24,7 +24,7 @@ AccelerationStructure* AccelerationStructure::newInstance(const AccelerationStru
|
|
|
U64 AccelerationStructure::getGpuAddress() const
|
|
U64 AccelerationStructure::getGpuAddress() const
|
|
|
{
|
|
{
|
|
|
ANKI_VK_SELF_CONST(AccelerationStructureImpl);
|
|
ANKI_VK_SELF_CONST(AccelerationStructureImpl);
|
|
|
- return self.getAsDeviceAddress();
|
|
|
|
|
|
|
+ return self.m_deviceAddress;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
AccelerationStructureImpl::~AccelerationStructureImpl()
|
|
AccelerationStructureImpl::~AccelerationStructureImpl()
|
|
@@ -43,6 +43,31 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
m_type = inf.m_type;
|
|
m_type = inf.m_type;
|
|
|
const VkDevice vkdev = getGrManagerImpl().getDevice();
|
|
const VkDevice vkdev = getGrManagerImpl().getDevice();
|
|
|
|
|
|
|
|
|
|
+ PtrSize asBufferSize;
|
|
|
|
|
+ getMemoryRequirement(inf, asBufferSize, m_scratchBufferSize);
|
|
|
|
|
+ m_scratchBufferSize += getGrManagerImpl().getVulkanCapabilities().m_asBuildScratchAlignment;
|
|
|
|
|
+
|
|
|
|
|
+ // Allocate AS buffer
|
|
|
|
|
+ BufferView asBuff = inf.m_accelerationStructureBuffer;
|
|
|
|
|
+ if(!asBuff.isValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ BufferInitInfo bufferInit(inf.getName());
|
|
|
|
|
+ bufferInit.m_usage = BufferUsageBit::kAccelerationStructure;
|
|
|
|
|
+ bufferInit.m_size = asBufferSize;
|
|
|
|
|
+ m_asBuffer = getGrManagerImpl().newBuffer(bufferInit);
|
|
|
|
|
+ m_asBufferOffset = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ const PtrSize alignedOffset = getAlignedRoundUp(getGrManagerImpl().getVulkanCapabilities().m_asBufferAlignment, asBuff.getOffset());
|
|
|
|
|
+ asBuff = asBuff.incrementOffset(alignedOffset - asBuff.getOffset());
|
|
|
|
|
+ ANKI_ASSERT(asBuff.getRange() <= asBufferSize);
|
|
|
|
|
+
|
|
|
|
|
+ m_asBuffer.reset(&asBuff.getBuffer());
|
|
|
|
|
+ m_asBufferOffset = asBuff.getOffset();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Create the AS
|
|
|
if(m_type == AccelerationStructureType::kBottomLevel)
|
|
if(m_type == AccelerationStructureType::kBottomLevel)
|
|
|
{
|
|
{
|
|
|
// Geom
|
|
// Geom
|
|
@@ -58,7 +83,7 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
geom.geometry.triangles.indexType = convertIndexType(inf.m_bottomLevel.m_indexType);
|
|
geom.geometry.triangles.indexType = convertIndexType(inf.m_bottomLevel.m_indexType);
|
|
|
geom.geometry.triangles.indexData.deviceAddress =
|
|
geom.geometry.triangles.indexData.deviceAddress =
|
|
|
inf.m_bottomLevel.m_indexBuffer.getBuffer().getGpuAddress() + inf.m_bottomLevel.m_indexBuffer.getOffset();
|
|
inf.m_bottomLevel.m_indexBuffer.getBuffer().getGpuAddress() + inf.m_bottomLevel.m_indexBuffer.getOffset();
|
|
|
- geom.flags = 0; // VK_GEOMETRY_OPAQUE_BIT_KHR; // TODO
|
|
|
|
|
|
|
+ geom.flags = 0;
|
|
|
|
|
|
|
|
// Geom build info
|
|
// Geom build info
|
|
|
VkAccelerationStructureBuildGeometryInfoKHR& buildInfo = m_buildInfo;
|
|
VkAccelerationStructureBuildGeometryInfoKHR& buildInfo = m_buildInfo;
|
|
@@ -69,26 +94,13 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
buildInfo.geometryCount = 1;
|
|
buildInfo.geometryCount = 1;
|
|
|
buildInfo.pGeometries = &geom;
|
|
buildInfo.pGeometries = &geom;
|
|
|
|
|
|
|
|
- // Get memory info
|
|
|
|
|
- VkAccelerationStructureBuildSizesInfoKHR buildSizes = {};
|
|
|
|
|
- const U32 primitiveCount = inf.m_bottomLevel.m_indexCount / 3;
|
|
|
|
|
- buildSizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
|
|
|
|
|
- vkGetAccelerationStructureBuildSizesKHR(vkdev, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &primitiveCount, &buildSizes);
|
|
|
|
|
- m_scratchBufferSize = buildSizes.buildScratchSize;
|
|
|
|
|
-
|
|
|
|
|
- // Create the buffer that holds the AS memory
|
|
|
|
|
- BufferInitInfo bufferInit(inf.getName());
|
|
|
|
|
- bufferInit.m_usage = PrivateBufferUsageBit::kAccelerationStructure;
|
|
|
|
|
- bufferInit.m_size = buildSizes.accelerationStructureSize;
|
|
|
|
|
- m_asBuffer = getGrManagerImpl().newBuffer(bufferInit);
|
|
|
|
|
-
|
|
|
|
|
// Create the AS
|
|
// Create the AS
|
|
|
VkAccelerationStructureCreateInfoKHR asCi = {};
|
|
VkAccelerationStructureCreateInfoKHR asCi = {};
|
|
|
asCi.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
|
|
asCi.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
|
|
|
asCi.createFlags = 0;
|
|
asCi.createFlags = 0;
|
|
|
asCi.buffer = static_cast<const BufferImpl&>(*m_asBuffer).getHandle();
|
|
asCi.buffer = static_cast<const BufferImpl&>(*m_asBuffer).getHandle();
|
|
|
- asCi.offset = 0;
|
|
|
|
|
- asCi.size = buildSizes.accelerationStructureSize;
|
|
|
|
|
|
|
+ asCi.offset = m_asBufferOffset;
|
|
|
|
|
+ asCi.size = asBufferSize;
|
|
|
asCi.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
|
|
asCi.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
|
|
|
ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(vkdev, &asCi, nullptr, &m_handle));
|
|
ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(vkdev, &asCi, nullptr, &m_handle));
|
|
|
|
|
|
|
@@ -102,68 +114,24 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
buildInfo.dstAccelerationStructure = m_handle;
|
|
buildInfo.dstAccelerationStructure = m_handle;
|
|
|
|
|
|
|
|
// Range info
|
|
// Range info
|
|
|
- m_rangeInfo.primitiveCount = primitiveCount;
|
|
|
|
|
|
|
+ m_rangeInfo.primitiveCount = inf.m_bottomLevel.m_indexCount / 3;
|
|
|
|
|
+
|
|
|
|
|
+ m_blas.m_positionsBuffer.reset(&inf.m_bottomLevel.m_positionBuffer.getBuffer());
|
|
|
|
|
+ m_blas.m_indexBuffer.reset(&inf.m_bottomLevel.m_positionBuffer.getBuffer());
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- const Bool isIndirect = inf.m_topLevel.m_indirectArgs.m_maxInstanceCount > 0;
|
|
|
|
|
-
|
|
|
|
|
- if(!isIndirect)
|
|
|
|
|
- {
|
|
|
|
|
- // Create and populate the instances buffer
|
|
|
|
|
- m_topLevelInfo.m_blases.resizeStorage(inf.m_topLevel.m_directArgs.m_instances.getSize());
|
|
|
|
|
-
|
|
|
|
|
- BufferInitInfo buffInit("AS instances");
|
|
|
|
|
- buffInit.m_size = sizeof(VkAccelerationStructureInstanceKHR) * inf.m_topLevel.m_directArgs.m_instances.getSize();
|
|
|
|
|
- buffInit.m_usage = PrivateBufferUsageBit::kAccelerationStructure;
|
|
|
|
|
- buffInit.m_mapAccess = BufferMapAccessBit::kWrite;
|
|
|
|
|
- m_topLevelInfo.m_instancesBuffer = getGrManagerImpl().newBuffer(buffInit);
|
|
|
|
|
-
|
|
|
|
|
- VkAccelerationStructureInstanceKHR* instances =
|
|
|
|
|
- static_cast<VkAccelerationStructureInstanceKHR*>(m_topLevelInfo.m_instancesBuffer->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
|
|
|
|
|
- for(U32 i = 0; i < inf.m_topLevel.m_directArgs.m_instances.getSize(); ++i)
|
|
|
|
|
- {
|
|
|
|
|
- VkAccelerationStructureInstanceKHR& outInst = instances[i];
|
|
|
|
|
- const AccelerationStructureInstanceInfo& inInst = inf.m_topLevel.m_directArgs.m_instances[i];
|
|
|
|
|
- static_assert(sizeof(outInst.transform) == sizeof(inInst.m_transform), "See file");
|
|
|
|
|
- memcpy(&outInst.transform, &inInst.m_transform, sizeof(inInst.m_transform));
|
|
|
|
|
- outInst.instanceCustomIndex = i & 0xFFFFFF;
|
|
|
|
|
- outInst.mask = inInst.m_mask;
|
|
|
|
|
- outInst.instanceShaderBindingTableRecordOffset = inInst.m_hitgroupSbtRecordIndex & 0xFFFFFF;
|
|
|
|
|
- outInst.flags =
|
|
|
|
|
- VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR | VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
|
|
|
|
|
- outInst.accelerationStructureReference = static_cast<const AccelerationStructureImpl&>(*inInst.m_bottomLevel).m_deviceAddress;
|
|
|
|
|
- ANKI_ASSERT(outInst.accelerationStructureReference != 0);
|
|
|
|
|
-
|
|
|
|
|
- // Hold the reference
|
|
|
|
|
- m_topLevelInfo.m_blases.emplaceBack(inf.m_topLevel.m_directArgs.m_instances[i].m_bottomLevel);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- m_topLevelInfo.m_instancesBuffer->flush(0, kMaxPtrSize);
|
|
|
|
|
- m_topLevelInfo.m_instancesBuffer->unmap();
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- // Instances buffer already created
|
|
|
|
|
- ANKI_ASSERT(sizeof(VkAccelerationStructureInstanceKHR) * inf.m_topLevel.m_indirectArgs.m_maxInstanceCount
|
|
|
|
|
- <= inf.m_topLevel.m_indirectArgs.m_instancesBuffer.getRange());
|
|
|
|
|
- m_topLevelInfo.m_instancesBuffer.reset(&inf.m_topLevel.m_indirectArgs.m_instancesBuffer.getBuffer());
|
|
|
|
|
-
|
|
|
|
|
- m_topLevelInfo.m_maxInstanceCount = inf.m_topLevel.m_indirectArgs.m_maxInstanceCount;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ANKI_ASSERT(sizeof(VkAccelerationStructureInstanceKHR) * inf.m_topLevel.m_instanceCount <= inf.m_topLevel.m_instancesBuffer.getRange());
|
|
|
|
|
+ m_tlas.m_instancesBuffer.reset(&inf.m_topLevel.m_instancesBuffer.getBuffer());
|
|
|
|
|
|
|
|
// Geom
|
|
// Geom
|
|
|
VkAccelerationStructureGeometryKHR& geom = m_geometry;
|
|
VkAccelerationStructureGeometryKHR& geom = m_geometry;
|
|
|
geom.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
|
|
geom.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
|
|
|
geom.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
|
|
geom.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
|
|
|
geom.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
|
|
geom.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
|
|
|
- geom.geometry.instances.data.deviceAddress = m_topLevelInfo.m_instancesBuffer->getGpuAddress();
|
|
|
|
|
- if(isIndirect)
|
|
|
|
|
- {
|
|
|
|
|
- geom.geometry.instances.data.deviceAddress += inf.m_topLevel.m_indirectArgs.m_instancesBuffer.getOffset();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ geom.geometry.instances.data.deviceAddress = m_tlas.m_instancesBuffer->getGpuAddress() + inf.m_topLevel.m_instancesBuffer.getOffset();
|
|
|
geom.geometry.instances.arrayOfPointers = false;
|
|
geom.geometry.instances.arrayOfPointers = false;
|
|
|
- geom.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; // TODO
|
|
|
|
|
|
|
+ geom.flags = 0;
|
|
|
|
|
|
|
|
// Geom build info
|
|
// Geom build info
|
|
|
VkAccelerationStructureBuildGeometryInfoKHR& buildInfo = m_buildInfo;
|
|
VkAccelerationStructureBuildGeometryInfoKHR& buildInfo = m_buildInfo;
|
|
@@ -174,26 +142,13 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
buildInfo.geometryCount = 1;
|
|
buildInfo.geometryCount = 1;
|
|
|
buildInfo.pGeometries = &geom;
|
|
buildInfo.pGeometries = &geom;
|
|
|
|
|
|
|
|
- // Get memory info
|
|
|
|
|
- VkAccelerationStructureBuildSizesInfoKHR buildSizes = {};
|
|
|
|
|
- const U32 instanceCount = (isIndirect) ? inf.m_topLevel.m_indirectArgs.m_maxInstanceCount : inf.m_topLevel.m_directArgs.m_instances.getSize();
|
|
|
|
|
- buildSizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
|
|
|
|
|
- vkGetAccelerationStructureBuildSizesKHR(vkdev, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &instanceCount, &buildSizes);
|
|
|
|
|
- m_scratchBufferSize = buildSizes.buildScratchSize;
|
|
|
|
|
-
|
|
|
|
|
- // Create the buffer that holds the AS memory
|
|
|
|
|
- BufferInitInfo bufferInit(inf.getName());
|
|
|
|
|
- bufferInit.m_usage = PrivateBufferUsageBit::kAccelerationStructure;
|
|
|
|
|
- bufferInit.m_size = buildSizes.accelerationStructureSize;
|
|
|
|
|
- m_asBuffer = getGrManagerImpl().newBuffer(bufferInit);
|
|
|
|
|
-
|
|
|
|
|
// Create the AS
|
|
// Create the AS
|
|
|
VkAccelerationStructureCreateInfoKHR asCi = {};
|
|
VkAccelerationStructureCreateInfoKHR asCi = {};
|
|
|
asCi.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
|
|
asCi.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
|
|
|
asCi.createFlags = 0;
|
|
asCi.createFlags = 0;
|
|
|
asCi.buffer = static_cast<const BufferImpl&>(*m_asBuffer).getHandle();
|
|
asCi.buffer = static_cast<const BufferImpl&>(*m_asBuffer).getHandle();
|
|
|
- asCi.offset = 0;
|
|
|
|
|
- asCi.size = buildSizes.accelerationStructureSize;
|
|
|
|
|
|
|
+ asCi.offset = m_asBufferOffset;
|
|
|
|
|
+ asCi.size = asBufferSize;
|
|
|
asCi.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
|
|
asCi.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
|
|
|
ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(vkdev, &asCi, nullptr, &m_handle));
|
|
ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(vkdev, &asCi, nullptr, &m_handle));
|
|
|
|
|
|
|
@@ -201,7 +156,7 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
|
|
|
buildInfo.dstAccelerationStructure = m_handle;
|
|
buildInfo.dstAccelerationStructure = m_handle;
|
|
|
|
|
|
|
|
// Range info
|
|
// Range info
|
|
|
- m_rangeInfo.primitiveCount = instanceCount;
|
|
|
|
|
|
|
+ m_rangeInfo.primitiveCount = inf.m_topLevel.m_instanceCount;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return Error::kNone;
|
|
return Error::kNone;
|
|
@@ -307,4 +262,67 @@ VkMemoryBarrier AccelerationStructureImpl::computeBarrierInfo(AccelerationStruct
|
|
|
return barrier;
|
|
return barrier;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void AccelerationStructureImpl::generateBuildInfo(U64 scratchBufferAddress, VkAccelerationStructureBuildGeometryInfoKHR& buildInfo,
|
|
|
|
|
+ VkAccelerationStructureBuildRangeInfoKHR& rangeInfo) const
|
|
|
|
|
+{
|
|
|
|
|
+ buildInfo = m_buildInfo;
|
|
|
|
|
+ buildInfo.scratchData.deviceAddress =
|
|
|
|
|
+ getAlignedRoundUp(getGrManagerImpl().getVulkanCapabilities().m_asBuildScratchAlignment, scratchBufferAddress);
|
|
|
|
|
+ rangeInfo = m_rangeInfo;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void AccelerationStructureImpl::getMemoryRequirement(const AccelerationStructureInitInfo& inf, PtrSize& asBufferSize, PtrSize& buildScratchBufferSize)
|
|
|
|
|
+{
|
|
|
|
|
+ ANKI_ASSERT(inf.isValidForGettingMemoryRequirements());
|
|
|
|
|
+
|
|
|
|
|
+ VkAccelerationStructureGeometryKHR geom = {};
|
|
|
|
|
+ geom.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
|
|
|
|
|
+
|
|
|
|
|
+ VkAccelerationStructureBuildGeometryInfoKHR buildInfo = {};
|
|
|
|
|
+ buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
|
|
|
|
|
+
|
|
|
|
|
+ VkAccelerationStructureBuildSizesInfoKHR buildSizes = {};
|
|
|
|
|
+ buildSizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
|
|
|
|
|
+
|
|
|
|
|
+ if(inf.m_type == AccelerationStructureType::kBottomLevel)
|
|
|
|
|
+ {
|
|
|
|
|
+ geom.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
|
|
|
|
|
+ geom.geometry.triangles.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
|
|
|
|
|
+ geom.geometry.triangles.vertexFormat = convertFormat(inf.m_bottomLevel.m_positionsFormat);
|
|
|
|
|
+ geom.geometry.triangles.vertexStride = inf.m_bottomLevel.m_positionStride;
|
|
|
|
|
+ geom.geometry.triangles.maxVertex = inf.m_bottomLevel.m_positionCount - 1;
|
|
|
|
|
+ geom.geometry.triangles.indexType = convertIndexType(inf.m_bottomLevel.m_indexType);
|
|
|
|
|
+ geom.flags = 0;
|
|
|
|
|
+
|
|
|
|
|
+ buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
|
|
|
|
|
+ buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
|
|
|
|
|
+ buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
|
|
|
|
|
+ buildInfo.geometryCount = 1;
|
|
|
|
|
+ buildInfo.pGeometries = &geom;
|
|
|
|
|
+
|
|
|
|
|
+ const U32 primitiveCount = inf.m_bottomLevel.m_indexCount / 3;
|
|
|
|
|
+ vkGetAccelerationStructureBuildSizesKHR(getVkDevice(), VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &primitiveCount,
|
|
|
|
|
+ &buildSizes);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ geom.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
|
|
|
|
|
+ geom.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
|
|
|
|
|
+ geom.geometry.instances.arrayOfPointers = false;
|
|
|
|
|
+ geom.flags = 0;
|
|
|
|
|
+
|
|
|
|
|
+ buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
|
|
|
|
|
+ buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR;
|
|
|
|
|
+ buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
|
|
|
|
|
+ buildInfo.geometryCount = 1;
|
|
|
|
|
+ buildInfo.pGeometries = &geom;
|
|
|
|
|
+
|
|
|
|
|
+ vkGetAccelerationStructureBuildSizesKHR(getVkDevice(), VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo,
|
|
|
|
|
+ &inf.m_topLevel.m_instanceCount, &buildSizes);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ asBufferSize = buildSizes.accelerationStructureSize;
|
|
|
|
|
+ buildScratchBufferSize = buildSizes.buildScratchSize;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|