From f1ec9b9e81d87c55ac30f0804e6de0d2b62b3780 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 25 Apr 2018 15:05:10 +0100 Subject: [PATCH] Check for and enable fragmentStoresAndAtomics feature for quad overdraw --- renderdoc/driver/vulkan/vk_overlay.cpp | 1 + renderdoc/driver/vulkan/vk_shader_cache.cpp | 15 +++++++++++---- .../driver/vulkan/wrappers/vk_device_funcs.cpp | 5 +++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 85eab4eb2..f159002e4 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -1581,6 +1581,7 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, CompType typeHint, Debu { VulkanRenderState prevstate = m_pDriver->m_RenderState; + if(m_Overlay.m_QuadResolvePipeline[0] != VK_NULL_HANDLE) { SCOPED_TIMER("Quad Overdraw"); diff --git a/renderdoc/driver/vulkan/vk_shader_cache.cpp b/renderdoc/driver/vulkan/vk_shader_cache.cpp index a8cbfdf17..fbe3da8f1 100644 --- a/renderdoc/driver/vulkan/vk_shader_cache.cpp +++ b/renderdoc/driver/vulkan/vk_shader_cache.cpp @@ -30,8 +30,9 @@ enum class FeatureCheck { - NoCheck, - ShaderMSAAStorage, + NoCheck = 0x0, + ShaderMSAAStorage = 0x1, + FragmentStores = 0x2, }; BITMASK_OPERATORS(FeatureCheck); @@ -69,9 +70,9 @@ static const BuiltinShaderConfig builtinShaders[] = { {BuiltinShader::OutlineFS, EmbeddedResource(glsl_outline_frag), SPIRVShaderStage::Fragment, FeatureCheck::NoCheck, true}, {BuiltinShader::QuadResolveFS, EmbeddedResource(glsl_quadresolve_frag), - SPIRVShaderStage::Fragment, FeatureCheck::NoCheck, true}, + SPIRVShaderStage::Fragment, FeatureCheck::FragmentStores, true}, {BuiltinShader::QuadWriteFS, EmbeddedResource(glsl_quadwrite_frag), SPIRVShaderStage::Fragment, - FeatureCheck::NoCheck, false}, + FeatureCheck::FragmentStores, false}, {BuiltinShader::TrisizeGS, EmbeddedResource(glsl_trisize_geom), SPIRVShaderStage::Geometry, FeatureCheck::NoCheck, true}, {BuiltinShader::TrisizeFS, EmbeddedResource(glsl_trisize_frag), SPIRVShaderStage::Fragment, @@ -147,6 +148,12 @@ VulkanShaderCache::VulkanShaderCache(WrappedVulkan *driver) } } + if(config.checks & FeatureCheck::FragmentStores) + { + if(!features.fragmentStoresAndAtomics) + continue; + } + if(config.stage == SPIRVShaderStage::Geometry && !features.geometryShader) continue; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index a4396d7cb..cee10199c 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1182,6 +1182,11 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi "shaderStorageImageMultisample = false, save/load from 2DMS textures will not be " "possible"); + if(availFeatures.fragmentStoresAndAtomics) + enabledFeatures.fragmentStoresAndAtomics = true; + else + RDCWARN("fragmentStoresAndAtomics = false, quad overdraw overlay will not be available"); + if(availFeatures.sampleRateShading) enabledFeatures.sampleRateShading = true; else