From e7e89fce098b6e1e5903007d72d952c2038c0b23 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 21 Jan 2024 14:25:08 +0100 Subject: [PATCH] Make the vk_rayquery cvar a bit more robust --- .../rendering/vulkan/descriptorsets/vk_descriptorset.cpp | 8 +++----- src/common/rendering/vulkan/shaders/vk_shader.cpp | 6 ++---- src/common/rendering/vulkan/vk_levelmesh.cpp | 4 +--- src/common/rendering/vulkan/vk_lightmapper.cpp | 4 +--- src/common/rendering/vulkan/vk_renderdevice.cpp | 5 +++-- src/common/rendering/vulkan/vk_renderdevice.h | 2 ++ 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 286e6c413..901dfebbf 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -38,8 +38,6 @@ #include "hw_viewpointuniforms.h" #include "v_2ddrawer.h" -extern bool vk_rayquery; - VkDescriptorSetManager::VkDescriptorSetManager(VulkanRenderDevice* fb) : fb(fb) { CreateLevelMeshLayout(); @@ -114,7 +112,7 @@ void VkDescriptorSetManager::UpdateFixedSet() WriteDescriptors update; update.AddCombinedImageSampler(Fixed.Set.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); update.AddCombinedImageSampler(Fixed.Set.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - if (vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) + if (fb->IsRayQueryEnabled()) { update.AddAccelerationStructure(Fixed.Set.get(), 2, fb->GetLevelMesh()->GetAccelStruct()); } @@ -302,7 +300,7 @@ void VkDescriptorSetManager::CreateFixedLayout() DescriptorSetLayoutBuilder builder; builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); - if (vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) + if (fb->IsRayQueryEnabled()) { builder.AddBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } @@ -340,7 +338,7 @@ void VkDescriptorSetManager::CreateFixedPool() { DescriptorPoolBuilder poolbuilder; poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * MaxFixedSets); - if (vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) + if (fb->IsRayQueryEnabled()) { poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * MaxFixedSets); } diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index aed5a29f0..ce0087a91 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -30,8 +30,6 @@ #include "version.h" #include "cmdlib.h" -extern bool vk_rayquery; - VkShaderManager::VkShaderManager(VulkanRenderDevice* fb) : fb(fb) { } @@ -174,7 +172,7 @@ std::unique_ptr VkShaderManager::LoadVertShader(FString shadername std::unique_ptr VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump, const char *defines, const VkShaderKey& key) { FString definesBlock; - if (vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) definesBlock << "\n#define SUPPORTS_RAYQUERY\n"; + if (fb->IsRayQueryEnabled()) definesBlock << "\n#define SUPPORTS_RAYQUERY\n"; definesBlock << defines; definesBlock << "\n#define MAX_SURFACE_UNIFORMS " << std::to_string(MAX_SURFACE_UNIFORMS).c_str() << "\n"; definesBlock << "#define MAX_LIGHT_DATA " << std::to_string(MAX_LIGHT_DATA).c_str() << "\n"; @@ -329,7 +327,7 @@ FString VkShaderManager::GetVersionBlock() versionBlock << "#extension GL_GOOGLE_include_directive : enable\n"; versionBlock << "#extension GL_EXT_nonuniform_qualifier : enable\r\n"; - if (vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) + if (fb->IsRayQueryEnabled()) { versionBlock << "#extension GL_EXT_ray_query : enable\n"; } diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 5e3e6a1d2..9e172120c 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -28,11 +28,9 @@ #include "hw_material.h" #include "texturemanager.h" -EXTERN_CVAR(Bool, vk_rayquery); - VkLevelMesh::VkLevelMesh(VulkanRenderDevice* fb) : fb(fb) { - useRayQuery = vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery; + useRayQuery = fb->IsRayQueryEnabled(); SetLevelMesh(nullptr); } diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index 0e523a739..085320c2d 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -11,8 +11,6 @@ #define USE_DRAWINDIRECT -extern bool vk_rayquery; - static int lastSurfaceCount; static glcycle_t lightmapRaytraceLast; @@ -35,7 +33,7 @@ CVAR(Bool, lm_blur, true, 0); VkLightmapper::VkLightmapper(VulkanRenderDevice* fb) : fb(fb) { - useRayQuery = vk_rayquery && fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery; + useRayQuery = fb->IsRayQueryEnabled(); templightlist.Resize(128); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 59e3599f5..7fc160a68 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -138,8 +138,7 @@ void VulkanPrintLog(const char* typestr, const std::string& msg) VulkanRenderDevice::VulkanRenderDevice(void *hMonitor, bool fullscreen, std::shared_ptr surface) : SystemBaseFrameBuffer(hMonitor, fullscreen) { VulkanDeviceBuilder builder; - if (vk_rayquery) - builder.OptionalRayQuery(); + builder.OptionalRayQuery(); builder.RequireExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); builder.Surface(surface); builder.SelectDevice(vk_device); @@ -154,6 +153,8 @@ VulkanRenderDevice::VulkanRenderDevice(void *hMonitor, bool fullscreen, std::sha { I_FatalError("This GPU does not support the minimum requirements of this application"); } + + mUseRayQuery = vk_rayquery && mDevice->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && mDevice->PhysicalDevice.Features.RayQuery.rayQuery; } VulkanRenderDevice::~VulkanRenderDevice() diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index 563a29caf..106e36d85 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -47,6 +47,7 @@ public: VkRenderBuffers *GetBuffers() { return mActiveRenderBuffers; } FRenderState* RenderState() override; + bool IsRayQueryEnabled() const { return mUseRayQuery; } bool IsVulkan() override { return true; } void Update() override; @@ -119,6 +120,7 @@ private: VkRenderBuffers *mActiveRenderBuffers = nullptr; bool mVSync = false; + bool mUseRayQuery = false; LevelMesh* levelMesh = nullptr; bool levelMeshChanged = true;