diff --git a/3rdparty/Vulkan-Headers b/3rdparty/Vulkan-Headers index 2c823b7f2..31aa7f634 160000 --- a/3rdparty/Vulkan-Headers +++ b/3rdparty/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 2c823b7f27590ec0a489f7fbe14b154e13fa5cfb +Subproject commit 31aa7f634b052d87ede4664053e85f3f4d1d50d3 diff --git a/examples_tests b/examples_tests index 2af7f3806..96b1826cf 160000 --- a/examples_tests +++ b/examples_tests @@ -1 +1 @@ -Subproject commit 2af7f380674697637c2fc1384c098bb9e14bf572 +Subproject commit 96b1826cf037d24bcef0b0b494a58252e008327e diff --git a/include/nbl/builtin/hlsl/spirv_intrinsics/raytracing.hlsl b/include/nbl/builtin/hlsl/spirv_intrinsics/raytracing.hlsl new file mode 100644 index 000000000..81295e31e --- /dev/null +++ b/include/nbl/builtin/hlsl/spirv_intrinsics/raytracing.hlsl @@ -0,0 +1,74 @@ +// Copyright (C) 2023 - DevSH Graphics Programming Sp. z O.O. +// This file is part of the "Nabla Engine". +// For conditions of distribution and use, see copyright notice in nabla.h +#ifndef _NBL_BUILTIN_HLSL_SPIRV_INTRINSICS_RAYTRACING_INCLUDED_ +#define _NBL_BUILTIN_HLSL_SPIRV_INTRINSICS_RAYTRACING_INCLUDED_ + +#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl" + +namespace nbl +{ +namespace hlsl +{ +namespace spirv +{ + +//[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] https://github.com/microsoft/DirectXShaderCompiler/issues/6958 +using RayQueryKHR = vk::SpirvOpaqueType; + +//[[vk::ext_capability(spv::CapabilityAccelerationStructureKHR)]] +using AccelerationStructureKHR = vk::SpirvOpaqueType; + +[[vk::ext_instruction(spv::OpConvertUToAccelerationStructureKHR)]] +AccelerationStructureKHR accelerationStructureKHR(uint64_t u); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryInitializeKHR)]] +void rayQueryInitializeKHR([[vk::ext_reference]] RayQueryKHR query, AccelerationStructureKHR AS, uint32_t flags, uint32_t cullMask, float32_t3 origin, float32_t tmin, float32_t3 direction, float32_t tmax); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryInitializeKHR)]] +void rayQueryInitializeKHR([[vk::ext_reference]] RayQueryKHR query, RaytracingAccelerationStructure AS, uint32_t flags, uint32_t cullMask, float32_t3 origin, float32_t tmin, float32_t3 direction, float32_t tmax); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryProceedKHR)]] +bool rayQueryProceedKHR([[vk::ext_reference]] RayQueryKHR query); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryGetIntersectionTypeKHR)]] +int rayQueryGetIntersectionTypeKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryGetIntersectionInstanceIdKHR)]] +int rayQueryGetIntersectionInstanceIdKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryGetIntersectionPrimitiveIndexKHR)]] +int rayQueryGetIntersectionPrimitiveIndexKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed); + +[[vk::ext_capability(spv::CapabilityRayQueryKHR)]] +[[vk::ext_extension("SPV_KHR_ray_query")]] +[[vk::ext_instruction(spv::OpRayQueryGetIntersectionBarycentricsKHR)]] +float2 rayQueryGetIntersectionBarycentricsKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed); + +// position fetch for ray tracing uses gl_HitTriangleVertexPositionsEXT -> HitTriangleVertexPositionsKHR decorated OpVariable +[[vk::ext_builtin_input(spv::BuiltInHitTriangleVertexPositionsKHR)]] +static const float32_t3 HitTriangleVertexPositionsKHR[3]; + +// ray query version +[[vk::ext_capability(spv::CapabilityRayQueryPositionFetchKHR)]] +[[vk::ext_extension("SPV_KHR_ray_tracing_position_fetch")]] +[[vk::ext_instruction(spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)]] +float3 rayQueryGetIntersectionTriangleVertexPositionsKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed)[3]; + +} +} +} + +#endif diff --git a/src/nbl/builtin/CMakeLists.txt b/src/nbl/builtin/CMakeLists.txt index 2818b3f64..b70a5f119 100644 --- a/src/nbl/builtin/CMakeLists.txt +++ b/src/nbl/builtin/CMakeLists.txt @@ -213,6 +213,7 @@ LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/macros.h") #spirv intrinsics LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/core.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/fragment_shader_pixel_interlock.hlsl") +LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/raytracing.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_arithmetic.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_ballot.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/subgroup_basic.hlsl") diff --git a/src/nbl/video/CVulkanPhysicalDevice.cpp b/src/nbl/video/CVulkanPhysicalDevice.cpp index b7bfe9497..79ffc7306 100644 --- a/src/nbl/video/CVulkanPhysicalDevice.cpp +++ b/src/nbl/video/CVulkanPhysicalDevice.cpp @@ -705,6 +705,7 @@ std::unique_ptr CVulkanPhysicalDevice::create(core::smart VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroupMemoryExplicitLayout = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR }; VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR raytracingMaintenance1Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR }; VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM rasterizationOrderAttachmentAccessFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM }; + VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR rayTracingPositionFetchFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR }; VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT }; #if 0 VkPhysicalDeviceCooperativeMatrixFeaturesKHR cooperativeMatrixFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR }; @@ -768,6 +769,8 @@ std::unique_ptr CVulkanPhysicalDevice::create(core::smart addToPNextChain(&workgroupMemoryExplicitLayout); if (isExtensionSupported(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME)) addToPNextChain(&rasterizationOrderAttachmentAccessFeatures); + if (isExtensionSupported(VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME)) + addToPNextChain(&rayTracingPositionFetchFeatures); if (isExtensionSupported(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME)) addToPNextChain(&colorWriteEnableFeatures); // call @@ -1196,6 +1199,9 @@ std::unique_ptr CVulkanPhysicalDevice::create(core::smart properties.limits.workgroupMemoryExplicitLayout16BitAccess = workgroupMemoryExplicitLayout.workgroupMemoryExplicitLayout16BitAccess; } + if (isExtensionSupported(VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME) && isExtensionSupported(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME)) + properties.limits.rayTracingPositionFetch = rayTracingPositionFetchFeatures.rayTracingPositionFetch; + if (isExtensionSupported(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME)) properties.limits.colorWriteEnable = colorWriteEnableFeatures.colorWriteEnable; #if 0 //TODO @@ -1566,6 +1572,9 @@ core::smart_refctd_ptr CVulkanPhysicalDevice::createLogicalDevic &rasterizationOrderAttachmentAccessFeatures ); + VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR rayTracingPositionFetchFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR, nullptr }; + REQUIRE_EXTENSION_IF(enabledFeatures.accelerationStructure && m_initData.properties.limits.rayTracingPositionFetch, VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME, &rayTracingPositionFetchFeatures); + VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT,nullptr }; enableExtensionIfAvailable(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME,&colorWriteEnableFeatures); #if 0 @@ -1751,6 +1760,8 @@ core::smart_refctd_ptr CVulkanPhysicalDevice::createLogicalDevic rayQueryFeatures.rayQuery = enabledFeatures.rayQuery; + rayTracingPositionFetchFeatures.rayTracingPositionFetch = limits.rayTracingPositionFetch; + //shaderSMBuiltinsFeaturesNV [LIMIT SO ENABLE EVERYTHING BY DEFAULT] representativeFragmentTestFeatures.representativeFragmentTest = enabledFeatures.representativeFragmentTest; diff --git a/src/nbl/video/device_capabilities/device_features.json b/src/nbl/video/device_capabilities/device_features.json index db1383968..3c09088a2 100644 --- a/src/nbl/video/device_capabilities/device_features.json +++ b/src/nbl/video/device_capabilities/device_features.json @@ -4023,8 +4023,16 @@ "VK_AMD_extension_478", "VK_AMD_extension_479", "VK_EXT_extension_480", - "VK_EXT_extension_481", - "TODO: implement", + "VK_EXT_extension_481" + ] + }, + { + "type": "bool", + "name": "rayTracingPositionFetch", + "value": false, + "expose": "MOVE_TO_LIMIT", + "comment": [ + "RayTracingPositionFetchFeaturesKHR", "VK_KHR_ray_tracing_position_fetch" ] },