diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index 7cadbebda..fb4eda0bf 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -417,6 +417,7 @@ VkRenderPassSetup::VkRenderPassSetup(VulkanRenderDevice* fb, const VkRenderPassK fkey.DepthTest = (j & 2) != 0; fkey.ShaderKey.Layout.AlphaTest = (j & 4) != 0; fkey.ShaderKey.Layout.ShadeVertex = (j & 8) != 0; + fkey.ShaderKey.Layout.UseRaytracePrecise = gl_light_shadows >= 3; PrecompileFragmentShaderLibrary(fkey, true); } } diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index aa6f2a6ac..5bfafea4e 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -419,6 +419,7 @@ void VkShaderManager::BuildDefinesBlock(FString &definesBlock, const char *defin if (key.Layout.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; if (key.Layout.UseLevelMesh) definesBlock << "#define USE_LEVELMESH\n"; if (key.Layout.ShadeVertex) definesBlock << "#define SHADE_VERTEX\n"; + if (key.Layout.UseRaytracePrecise) definesBlock << "#define USE_RAYTRACE_PRECISE\n"; // We could move this to shaders/shaderkey.glsl as its always the same: @@ -440,7 +441,6 @@ void VkShaderManager::BuildDefinesBlock(FString &definesBlock, const char *defin definesBlock << "#define USE_SHADOWMAP ((uShaderKey1 & SK1_USE_SHADOWMAP) != 0)\n"; definesBlock << "#define USE_RAYTRACE ((uShaderKey1 & SK1_USE_RAYTRACE) != 0)\n"; - definesBlock << "#define USE_RAYTRACE_PRECISE ((uShaderKey1 & SK1_USE_RAYTRACE_PRECISE) != 0)\n"; definesBlock << "#define SHADOWMAP_FILTER (SK_GET_SHADOWMAP_FILTER())\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 62b0b49ad..abcc90eb1 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -94,8 +94,8 @@ public: uint64_t Unused3 : 1; uint64_t UseShadowmap : 1; // USE_SHADOWMAP uint64_t UseRaytrace : 1; // USE_RAYTRACE - uint64_t UseRaytracePrecise : 1; // USE_RAYTRACE_PRECISE - uint64_t Unused4 : 1; // formerly PRECISE_MIDTEXTURES + uint64_t Unused4 : 1; + uint64_t Unused5 : 1; // formerly PRECISE_MIDTEXTURES uint64_t ShadowmapFilter : 4; // SHADOWMAP_FILTER uint64_t FogBeforeLights : 1; // FOG_BEFORE_LIGHTS uint64_t FogAfterLights : 1; // FOG_AFTER_LIGHTS @@ -132,7 +132,8 @@ public: uint32_t GBufferPass : 1; // GBUFFER_PASS uint32_t UseLevelMesh : 1; // USE_LEVELMESH uint32_t ShadeVertex : 1; // SHADE_VERTEX - uint32_t Unused : 26; + uint32_t UseRaytracePrecise : 1; // USE_RAYTRACE_PRECISE + uint32_t Unused : 25; }; uint32_t AsDWORD = 0; } Layout; diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index a875909a0..6af503c8b 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -89,8 +89,6 @@ CUSTOM_CVAR(Bool, vk_debug, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINI CVAR(Bool, vk_debug_callstack, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CVAR(Bool, vk_amd_driver_check, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) - CUSTOM_CVAR(Int, vk_device, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { Printf("This won't take effect until " GAMENAME " is restarted.\n"); @@ -189,20 +187,6 @@ VulkanRenderDevice::VulkanRenderDevice(void *hMonitor, bool fullscreen, std::sha mUseRayQuery = vk_rayquery && mDevice->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && mDevice->PhysicalDevice.Features.RayQuery.rayQuery; - if (vk_amd_driver_check) - { - // Creating pipelines with rayquery currently crashes the AMD driver - // To do: try turn this on once in a while to see if they fixed it as we don't want to permanently gimp AMD card performance - if (mDevice->PhysicalDevice.Properties.Properties.vendorID == 0x1002) - { - if (mUseRayQuery) - { - Printf("AMD driver detected. Disabling RT cores. You can force RT cores on by setting vk_amd_driver_check to false.\n"); - mUseRayQuery = false; - } - } - } - mShaderCache = std::make_unique(this); } diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index d6d2d62bc..1ad2601a4 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -335,7 +335,7 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; - pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; + pipelineKey.ShaderKey.Layout.UseRaytracePrecise = gl_light_shadows >= 3; pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); pipelineKey.ShaderKey.Layout.GBufferPass = mRenderTarget.DrawBuffers > 1; @@ -1129,7 +1129,7 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader; pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; - pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; + pipelineKey.ShaderKey.Layout.UseRaytracePrecise = gl_light_shadows >= 3; pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); pipelineKey.ShaderKey.Layout.GBufferPass = mRenderTarget.DrawBuffers > 1; diff --git a/wadsrc/static/shaders/scene/light_trace.glsl b/wadsrc/static/shaders/scene/light_trace.glsl index 972dcab55..cd3bf7013 100644 --- a/wadsrc/static/shaders/scene/light_trace.glsl +++ b/wadsrc/static/shaders/scene/light_trace.glsl @@ -46,10 +46,11 @@ float TraceDynLightRay(vec3 origin, float tmin, vec3 direction, float dist) float traceHit(vec3 origin, vec3 direction, float dist) { - if (USE_RAYTRACE_PRECISE) + #if defined(USE_RAYTRACE_PRECISE) return TraceDynLightRay(origin, 0.01f, direction, dist); - else + #else return TraceAnyHit(origin, 0.01f, direction, dist) ? 0.0 : 1.0; + #endif } float traceShadow(vec3 lightpos, float softShadowRadius) @@ -94,7 +95,7 @@ float traceShadow(vec3 lightpos, float softShadowRadius) float sum = 0.0; const int step_count = SHADOWMAP_FILTER * 4; - if (USE_RAYTRACE_PRECISE) + #if defined(USE_RAYTRACE_PRECISE) { for (int i = 0; i < step_count; i++) { @@ -103,7 +104,7 @@ float traceShadow(vec3 lightpos, float softShadowRadius) sum += TraceDynLightRay(origin, 0.01f, normalize(pos - origin), dist); } } - else + #else { for (int i = 0; i < step_count; i++) { @@ -112,6 +113,7 @@ float traceShadow(vec3 lightpos, float softShadowRadius) sum += TraceAnyHit(origin, 0.01f, normalize(pos - origin), dist) ? 0.0 : 1.0; } } + #endif return (sum / step_count); } diff --git a/wadsrc/static/shaders/shaderkey.glsl b/wadsrc/static/shaders/shaderkey.glsl index 8697bbffd..213ecdcd9 100644 --- a/wadsrc/static/shaders/shaderkey.glsl +++ b/wadsrc/static/shaders/shaderkey.glsl @@ -19,7 +19,7 @@ #define SK1_GBUFFER_PASS (1 << 11) #define SK1_USE_SHADOWMAP (1 << 12) #define SK1_USE_RAYTRACE (1 << 13) -#define SK1_USE_RAYTRACE_PRECISE (1 << 14) +//#define SK1_USE_RAYTRACE_PRECISE (1 << 14) #define SK1_SHADOWMAP_FILTER (15 << 16) #define SK1_FOG_BEFORE_LIGHTS (1 << 20)