diff options
| author | Yong He <yonghe@outlook.com> | 2021-06-30 14:59:18 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-30 14:59:18 -0700 |
| commit | a03d21a5f54cba913c3f52e2822a433de8f39fdd (patch) | |
| tree | 84d24d4355cc4b3e941da9eab57147cd9d297ee4 /tools/gfx/vulkan/vk-util.cpp | |
| parent | 5395ef82535c283109b1ea6b89b737c5a39bf147 (diff) | |
[gfx] Add inline ray tracing support. (#1899)
Diffstat (limited to 'tools/gfx/vulkan/vk-util.cpp')
| -rw-r--r-- | tools/gfx/vulkan/vk-util.cpp | 144 |
1 files changed, 143 insertions, 1 deletions
diff --git a/tools/gfx/vulkan/vk-util.cpp b/tools/gfx/vulkan/vk-util.cpp index 5f7077753..4971e3f3d 100644 --- a/tools/gfx/vulkan/vk-util.cpp +++ b/tools/gfx/vulkan/vk-util.cpp @@ -1,5 +1,6 @@ // vk-util.cpp #include "vk-util.h" +#include "core/slang-math.h" #include <stdlib.h> #include <stdio.h> @@ -170,4 +171,145 @@ VkImageLayout VulkanUtil::mapResourceStateToLayout(ResourceState state) } } -} // renderer_test +Result AccelerationStructureBuildGeometryInfoBuilder::build( + const IAccelerationStructure::BuildInputs& buildInputs, + IDebugCallback* debugCallback) +{ + buildInfo.dstAccelerationStructure = VK_NULL_HANDLE; + switch (buildInputs.kind) + { + case IAccelerationStructure::Kind::BottomLevel: + buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; + break; + case IAccelerationStructure::Kind::TopLevel: + buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR; + break; + default: + debugCallback->handleMessage( + DebugMessageType::Error, + DebugMessageSource::Layer, + "invalid value of IAccelerationStructure::Kind encountered in buildInputs.kind"); + return SLANG_E_INVALID_ARG; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::PerformUpdate) + { + buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR; + } + else + { + buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::AllowCompaction) + { + buildInfo.flags |= VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::AllowUpdate) + { + buildInfo.flags |= VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::MinimizeMemory) + { + buildInfo.flags |= VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::PreferFastBuild) + { + buildInfo.flags |= VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR; + } + if (buildInputs.flags & IAccelerationStructure::BuildFlags::Enum::PreferFastTrace) + { + buildInfo.flags |= VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; + } + if (buildInputs.kind == IAccelerationStructure::Kind::BottomLevel) + { + m_geometryInfos.setCount(buildInputs.descCount); + primitiveCounts.setCount(buildInputs.descCount); + memset( + m_geometryInfos.getBuffer(), + 0, + sizeof(VkAccelerationStructureGeometryKHR) * buildInputs.descCount); + for (int i = 0; i < buildInputs.descCount; i++) + { + auto& geomDesc = buildInputs.geometryDescs[i]; + m_geometryInfos[i].sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR; + if (geomDesc.flags & IAccelerationStructure::GeometryFlags::NoDuplicateAnyHitInvocation) + { + m_geometryInfos[i].flags |= VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR; + } + else if (geomDesc.flags & IAccelerationStructure::GeometryFlags::Opaque) + { + m_geometryInfos[i].flags |= VK_GEOMETRY_OPAQUE_BIT_KHR; + } + auto& vkGeomData = m_geometryInfos[i].geometry; + switch (geomDesc.type) + { + case IAccelerationStructure::GeometryType::Triangles: + m_geometryInfos[i].geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR; + vkGeomData.triangles.sType = + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR; + vkGeomData.triangles.vertexFormat = + VulkanUtil::getVkFormat(geomDesc.content.triangles.vertexFormat); + vkGeomData.triangles.vertexData.deviceAddress = + geomDesc.content.triangles.vertexData; + vkGeomData.triangles.vertexStride = geomDesc.content.triangles.vertexStride; + vkGeomData.triangles.maxVertex = geomDesc.content.triangles.vertexCount - 1; + switch (geomDesc.content.triangles.indexFormat) + { + case Format::R_UInt32: + vkGeomData.triangles.indexType = VK_INDEX_TYPE_UINT32; + break; + case Format::R_UInt16: + vkGeomData.triangles.indexType = VK_INDEX_TYPE_UINT16; + break; + default: + debugCallback->handleMessage( + DebugMessageType::Error, + DebugMessageSource::Layer, + "unsupported value of Format encountered in " + "GeometryDesc::content.triangles.indexFormat"); + return SLANG_E_INVALID_ARG; + } + vkGeomData.triangles.indexData.deviceAddress = geomDesc.content.triangles.indexData; + vkGeomData.triangles.transformData.deviceAddress = + geomDesc.content.triangles.transform3x4; + primitiveCounts[i] = Slang::Math::Max( + geomDesc.content.triangles.vertexCount, + geomDesc.content.triangles.indexCount) / + 3; + break; + case IAccelerationStructure::GeometryType::ProcedurePrimitives: + m_geometryInfos[i].geometryType = VK_GEOMETRY_TYPE_AABBS_KHR; + vkGeomData.aabbs.sType = + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR; + vkGeomData.aabbs.data.deviceAddress = geomDesc.content.proceduralAABBs.data; + vkGeomData.aabbs.stride = geomDesc.content.proceduralAABBs.stride; + primitiveCounts[i] = + (uint32_t)buildInputs.geometryDescs[i].content.proceduralAABBs.count; + break; + default: + debugCallback->handleMessage( + DebugMessageType::Error, + DebugMessageSource::Layer, + "invalid value of IAccelerationStructure::GeometryType encountered in " + "buildInputs.geometryDescs"); + return SLANG_E_INVALID_ARG; + } + } + buildInfo.geometryCount = buildInputs.descCount; + buildInfo.pGeometries = m_geometryInfos.getBuffer(); + } + else + { + m_vkInstanceInfo.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR; + m_vkInstanceInfo.geometry.instances.sType = + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR; + m_vkInstanceInfo.geometry.instances.arrayOfPointers = 0; + m_vkInstanceInfo.geometry.instances.data.deviceAddress = buildInputs.instanceDescs; + buildInfo.pGeometries = &m_vkInstanceInfo; + buildInfo.geometryCount = 1; + primitiveCounts.setCount(1); + primitiveCounts[0] = buildInputs.descCount; + } + return SLANG_OK; +} + +} // namespace gfx |
