Make the vk_rayquery cvar a bit more robust

This commit is contained in:
Magnus Norddahl 2024-01-21 14:25:08 +01:00
commit e7e89fce09
6 changed files with 12 additions and 17 deletions

View file

@ -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);
}

View file

@ -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<VulkanShader> VkShaderManager::LoadVertShader(FString shadername
std::unique_ptr<VulkanShader> 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";
}

View file

@ -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);
}

View file

@ -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);

View file

@ -138,8 +138,7 @@ void VulkanPrintLog(const char* typestr, const std::string& msg)
VulkanRenderDevice::VulkanRenderDevice(void *hMonitor, bool fullscreen, std::shared_ptr<VulkanSurface> 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()

View file

@ -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;