From 35df964d61747bdacf1863447a64492a6c081bb4 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 14 Jan 2023 03:47:12 +0100 Subject: [PATCH] Update ZVulkan, rename vk_raytrace to gl_light_raytrace and support turning it on and off without a restart --- .../rendering/hwrenderer/data/hw_cvars.h | 1 + .../hwrenderer/data/hw_shadowmap.cpp | 1 + .../vulkan/renderer/vk_descriptorset.cpp | 6 ++-- .../rendering/vulkan/renderer/vk_raytrace.cpp | 2 +- .../rendering/vulkan/shaders/vk_shader.cpp | 2 +- .../rendering/vulkan/system/vk_renderdevice.h | 2 -- .../hwrenderer/scene/hw_drawinfo.cpp | 2 +- wadsrc/static/shaders/glsl/main.fp | 30 +++++++++++-------- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.h b/src/common/rendering/hwrenderer/data/hw_cvars.h index cf23649799..90770974ed 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.h +++ b/src/common/rendering/hwrenderer/data/hw_cvars.h @@ -15,6 +15,7 @@ EXTERN_CVAR(Int, gl_weaponlight) EXTERN_CVAR (Bool, gl_light_sprites); EXTERN_CVAR (Bool, gl_light_particles); EXTERN_CVAR (Bool, gl_light_shadowmap); +EXTERN_CVAR (Bool, gl_light_raytrace); EXTERN_CVAR (Int, gl_shadowmap_quality); EXTERN_CVAR(Int, gl_fogmode) diff --git a/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp b/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp index e536098403..18acd865d0 100644 --- a/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp +++ b/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp @@ -60,6 +60,7 @@ int IShadowMap::LightsProcessed; int IShadowMap::LightsShadowmapped; CVAR(Bool, gl_light_shadowmap, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Bool, gl_light_raytrace, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) ADD_STAT(shadowmap) { diff --git a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp index 1c36f865ba..3980831d16 100644 --- a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp @@ -103,7 +103,7 @@ void VkDescriptorSetManager::UpdateFixedSet() WriteDescriptors update; update.AddCombinedImageSampler(FixedSet.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); update.AddCombinedImageSampler(FixedSet.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - if (fb->RaytracingEnabled()) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) update.AddAccelerationStructure(FixedSet.get(), 2, fb->GetRaytrace()->GetAccelStruct()); update.Execute(fb->device.get()); } @@ -263,7 +263,7 @@ void VkDescriptorSetManager::CreateFixedSetLayout() 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 (fb->RaytracingEnabled()) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) builder.AddBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.DebugName("VkDescriptorSetManager.FixedSetLayout"); FixedSetLayout = builder.Create(fb->device.get()); @@ -283,7 +283,7 @@ void VkDescriptorSetManager::CreateFixedSetPool() { DescriptorPoolBuilder poolbuilder; poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * maxSets); - if (fb->RaytracingEnabled()) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * maxSets); poolbuilder.MaxSets(maxSets); poolbuilder.DebugName("VkDescriptorSetManager.FixedDescriptorPool"); diff --git a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp index 084c475eb2..9e7a95889d 100644 --- a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp +++ b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp @@ -55,7 +55,7 @@ void VkRaytrace::SetLevelMesh(hwrenderer::LevelMesh* mesh) { Reset(); Mesh = mesh; - if (fb->RaytracingEnabled()) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) { CreateVulkanObjects(); } diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 0140aa6cb6..aac85262f7 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -361,7 +361,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 *light_lump, const char *defines, bool alphatest, bool gbufferpass) { FString code = GetTargetGlslVersion(); - if (fb->RaytracingEnabled()) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) code << "\n#define SUPPORTS_RAYTRACING\n"; code << defines; code << "\n$placeholder$"; // here the code can later add more needed #defines. diff --git a/src/common/rendering/vulkan/system/vk_renderdevice.h b/src/common/rendering/vulkan/system/vk_renderdevice.h index 79c2fab909..d29d3442eb 100644 --- a/src/common/rendering/vulkan/system/vk_renderdevice.h +++ b/src/common/rendering/vulkan/system/vk_renderdevice.h @@ -91,8 +91,6 @@ public: void WaitForCommands(bool finish) override; - bool RaytracingEnabled(); - private: void RenderTextureView(FCanvasTexture* tex, std::function renderFunc) override; void PrintStartupLog(); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 2275d9a113..38786459ca 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -165,7 +165,7 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mPalLightLevels = static_cast(gl_bandedswlight) | (static_cast(gl_fogmode) << 8) | ((int)lightmode << 16); } VPUniforms.mClipLine.X = -10000000.0f; - VPUniforms.mShadowmapFilter = gl_shadowmap_filter; + VPUniforms.mShadowmapFilter = gl_light_raytrace ? -1 - static_cast(gl_shadowmap_filter) : static_cast(gl_shadowmap_filter); VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); } mClipper->SetViewpoint(Viewpoint); diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 32891e564e..78d868f194 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -387,19 +387,15 @@ vec2 softshadow[9 * 3] = vec2[]( vec2(-0.25, 0.75) ); -float shadowAttenuation(vec4 lightpos, float lightcolorA) +float traceShadow(vec4 lightpos, int quality) { - float shadowIndex = abs(lightcolorA) - 1.0; - if (shadowIndex >= 1024.0) - return 1.0; // Don't cast rays for this light - vec3 origin = pixelpos.xzy; vec3 target = lightpos.xzy + 0.01; // nudge light position slightly as Doom maps tend to have their lights perfectly aligned with planes vec3 direction = normalize(target - origin); float dist = distance(origin, target); - if (uShadowmapFilter <= 0) + if (quality == 0) { return traceHit(origin, direction, dist) ? 0.0 : 1.0; } @@ -410,7 +406,7 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) vec3 ydir = cross(direction, xdir); float sum = 0.0; - int step_count = uShadowmapFilter * 9; + int step_count = quality * 9; for (int i = 0; i <= step_count; i++) { vec3 pos = target + xdir * softshadow[i].x + ydir * softshadow[i].y; @@ -421,6 +417,14 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) } #else + +float traceShadow(vec4 lightpos, int quality) +{ + return 1.0; +} + +#endif + #ifdef SUPPORTS_SHADOWMAPS float shadowDirToU(vec2 dir) @@ -530,9 +534,6 @@ float sampleShadowmapPCF(vec3 planePoint, float v) float shadowmapAttenuation(vec4 lightpos, float shadowIndex) { - if (shadowIndex >= 1024.0) - return 1.0; // No shadowmap available for this light - vec3 planePoint = pixelpos.xyz - lightpos.xyz; planePoint += 0.01; // nudge light position slightly as Doom maps tend to have their lights perfectly aligned with planes @@ -541,7 +542,7 @@ float shadowmapAttenuation(vec4 lightpos, float shadowIndex) float v = (shadowIndex + 0.5) / 1024.0; - if (uShadowmapFilter <= 0) + if (uShadowmapFilter == 0) { return sampleShadowmap(planePoint, v); } @@ -554,6 +555,12 @@ float shadowmapAttenuation(vec4 lightpos, float shadowIndex) float shadowAttenuation(vec4 lightpos, float lightcolorA) { float shadowIndex = abs(lightcolorA) - 1.0; + if (shadowIndex >= 1024.0) + return 1.0; // No shadowmap available for this light + + if (uShadowmapFilter < 0) + return traceShadow(lightpos, 1 - uShadowmapFilter); + return shadowmapAttenuation(lightpos, shadowIndex); } @@ -564,7 +571,6 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) return 1.0; } -#endif #endif float spotLightAttenuation(vec4 lightpos, vec3 spotdir, float lightCosInnerAngle, float lightCosOuterAngle)