diff --git a/.gitmodules b/.gitmodules index 70eede3..7344c4f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/tinyobjloader"] path = external/tinyobjloader url = https://github.com/syoyo/tinyobjloader.git +[submodule "external/vulkan"] + path = external/vulkan + url = https://github.com/KhronosGroup/Vulkan-Headers.git diff --git a/external/vulkan b/external/vulkan new file mode 160000 index 0000000..114c354 --- /dev/null +++ b/external/vulkan @@ -0,0 +1 @@ +Subproject commit 114c3546e195819bd53a34b39f5194b2989a5b12 diff --git a/premake5.lua b/premake5.lua index 9fa2843..6f770d1 100644 --- a/premake5.lua +++ b/premake5.lua @@ -12,7 +12,7 @@ project "rtxON" "external/stb", "external/tinyobjloader", "external/volk", - "external/vulkan/Include", + "external/vulkan/include", "src" } files { diff --git a/src/framework/vulkanapp.cpp b/src/framework/vulkanapp.cpp index 5390a7a..ad2ac25 100644 --- a/src/framework/vulkanapp.cpp +++ b/src/framework/vulkanapp.cpp @@ -292,7 +292,6 @@ bool VulkanApp::InitializeDevicesAndQueues() { Array deviceExtensions({ VK_KHR_SWAPCHAIN_EXTENSION_NAME }); if (mSettings.supportRaytracing) { - //deviceExtensions.push_back("VK_NVX_raytracing"); deviceExtensions.push_back(VK_NV_RAY_TRACING_EXTENSION_NAME); } diff --git a/src/rtxApp.cpp b/src/rtxApp.cpp index bd344f6..966a22f 100644 --- a/src/rtxApp.cpp +++ b/src/rtxApp.cpp @@ -193,22 +193,22 @@ bool RtxApp::CreateAS(const VkAccelerationStructureTypeNV type, const uint32_t instanceCount, RTAccelerationStructure& _as) { - VkAccelerationStructureInfoNV& accelerationStructureInfoNV = _as.accelerationStructureInfo; - accelerationStructureInfoNV.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV; - accelerationStructureInfoNV.pNext = nullptr; - accelerationStructureInfoNV.type = type; - accelerationStructureInfoNV.flags = 0; - accelerationStructureInfoNV.geometryCount = geometryCount; - accelerationStructureInfoNV.instanceCount = instanceCount; - accelerationStructureInfoNV.pGeometries = geometries; - - VkAccelerationStructureCreateInfoNV accelerationStructureInfo; - accelerationStructureInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV; + VkAccelerationStructureInfoNV& accelerationStructureInfo = _as.accelerationStructureInfo; + accelerationStructureInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV; accelerationStructureInfo.pNext = nullptr; - accelerationStructureInfo.info = accelerationStructureInfoNV; - accelerationStructureInfo.compactedSize = 0; - - VkResult error = vkCreateAccelerationStructureNV(mDevice, &accelerationStructureInfo, nullptr, &_as.accelerationStructure); + accelerationStructureInfo.type = type; + accelerationStructureInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV; + accelerationStructureInfo.geometryCount = geometryCount; + accelerationStructureInfo.instanceCount = instanceCount; + accelerationStructureInfo.pGeometries = geometries; + + VkAccelerationStructureCreateInfoNV accelerationStructureCreateInfo; + accelerationStructureCreateInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV; + accelerationStructureCreateInfo.pNext = nullptr; + accelerationStructureCreateInfo.info = accelerationStructureInfo; + accelerationStructureCreateInfo.compactedSize = 0; + + VkResult error = vkCreateAccelerationStructureNV(mDevice, &accelerationStructureCreateInfo, nullptr, &_as.accelerationStructure); if (VK_SUCCESS != error) { CHECK_VK_ERROR(error, "vkCreateAccelerationStructureNV"); return false; @@ -980,12 +980,14 @@ void SBTHelper::SetRaygenStage(const VkPipelineShaderStageCreateInfo& stage) { assert(mStages.empty()); mStages.push_back(stage); - VkRayTracingShaderGroupCreateInfoNV groupInfo = {}; + VkRayTracingShaderGroupCreateInfoNV groupInfo; groupInfo.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; groupInfo.pNext = nullptr; groupInfo.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV; groupInfo.generalShader = 0; - groupInfo.closestHitShader = groupInfo.anyHitShader = groupInfo.intersectionShader = (~0u); + groupInfo.closestHitShader = VK_SHADER_UNUSED_NV; + groupInfo.anyHitShader = VK_SHADER_UNUSED_NV; + groupInfo.intersectionShader = VK_SHADER_UNUSED_NV; mGroups.push_back(groupInfo); // group 0 is always for raygen } @@ -1006,18 +1008,24 @@ void SBTHelper::AddStageToHitGroup(const Array& auto itStage = mStages.begin() + offset; mStages.insert(itStage, stages.begin(), stages.end()); - VkRayTracingShaderGroupCreateInfoNV groupInfo = {}; + VkRayTracingShaderGroupCreateInfoNV groupInfo; groupInfo.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; groupInfo.pNext = nullptr; - groupInfo.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV; - groupInfo.generalShader = groupInfo.closestHitShader = groupInfo.anyHitShader = groupInfo.intersectionShader = (~0u); + groupInfo.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV; + groupInfo.generalShader = VK_SHADER_UNUSED_NV; + groupInfo.closestHitShader = VK_SHADER_UNUSED_NV; + groupInfo.anyHitShader = VK_SHADER_UNUSED_NV; + groupInfo.intersectionShader = VK_SHADER_UNUSED_NV; for (size_t i = 0; i < stages.size(); i++) { - const auto StageIdx = offset+i; - if (stages[i].stage == VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV || stages[i].stage == VK_SHADER_STAGE_ANY_HIT_BIT_NV) groupInfo.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV; - if (stages[i].stage == VK_SHADER_STAGE_RAYGEN_BIT_NV || stages[i].stage == VK_SHADER_STAGE_MISS_BIT_NV) groupInfo.generalShader = StageIdx; - if (stages[i].stage == VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV) groupInfo.closestHitShader = StageIdx; - if (stages[i].stage == VK_SHADER_STAGE_ANY_HIT_BIT_NV) groupInfo.anyHitShader = StageIdx; + const VkPipelineShaderStageCreateInfo& stageInfo = stages[i]; + const uint32_t shaderIdx = static_cast(offset + i); + + if (stageInfo.stage == VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV) { + groupInfo.closestHitShader = shaderIdx; + } else if (stageInfo.stage == VK_SHADER_STAGE_ANY_HIT_BIT_NV) { + groupInfo.anyHitShader = shaderIdx; + } }; mGroups.insert((mGroups.begin() + 1 + groupIndex), groupInfo); @@ -1051,9 +1059,9 @@ void SBTHelper::AddStageToMissGroup(const VkPipelineShaderStageCreateInfo& stage groupInfo.pNext = nullptr; groupInfo.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV; groupInfo.generalShader = offset; - groupInfo.closestHitShader = (~0u); - groupInfo.anyHitShader = (~0u); - groupInfo.intersectionShader = (~0u); + groupInfo.closestHitShader = VK_SHADER_UNUSED_NV; + groupInfo.anyHitShader = VK_SHADER_UNUSED_NV; + groupInfo.intersectionShader = VK_SHADER_UNUSED_NV; // group 0 is always for raygen, then go hit shaders mGroups.insert((mGroups.begin() + (groupIndex + 1 + mNumHitGroups)), groupInfo);