diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index df1eb27fe..7c0dbfc82 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -477,6 +477,7 @@ private: bool m_DynColorWrite = false; bool m_DynVertexInput = false; bool m_DynAttachmentLoop = false; + bool m_MultiView = false; bool m_MeshQueries = false; bool m_MeshShaders = false; bool m_TaskShaders = false; @@ -1368,6 +1369,7 @@ public: bool DynamicColorWrite() const { return m_DynColorWrite; } bool DynamicVertexInput() const { return m_DynVertexInput; } bool DynamicAttachmentLoop() const { return m_DynAttachmentLoop; } + bool MultiView() const { return m_MultiView; } bool MeshQueries() const { return m_MeshQueries; } bool TaskShaders() const { return m_TaskShaders; } bool MeshShaders() const { return m_MeshShaders; } diff --git a/renderdoc/driver/vulkan/vk_shader_cache.cpp b/renderdoc/driver/vulkan/vk_shader_cache.cpp index 7c7720693..1fa5f440d 100644 --- a/renderdoc/driver/vulkan/vk_shader_cache.cpp +++ b/renderdoc/driver/vulkan/vk_shader_cache.cpp @@ -36,6 +36,7 @@ enum class FeatureCheck FormatlessWrite = 0x8, SampleShading = 0x10, Geometry = 0x20, + MultiView = 0x40, }; BITMASK_OPERATORS(FeatureCheck); @@ -90,13 +91,15 @@ static const BuiltinShaderConfig builtinShaders[] = { rdcspv::ShaderStage::Fragment, FeatureCheck::FragmentStores), BuiltinShaderConfig(BuiltinShader::QuadResolveMultiviewFS, EmbeddedResource(glsl_quadresolve_frag), rdcspv::ShaderStage::Fragment, - FeatureCheck::FragmentStores, BuiltinShaderFlags::Multiview), + FeatureCheck::FragmentStores | FeatureCheck::MultiView, + BuiltinShaderFlags::Multiview), BuiltinShaderConfig(BuiltinShader::QuadWriteFS, EmbeddedResource(glsl_quadwrite_frag), rdcspv::ShaderStage::Fragment), - BuiltinShaderConfig(BuiltinShader::QuadWriteMultiviewFS, EmbeddedResource(glsl_quadwrite_frag), - rdcspv::ShaderStage::Fragment, - FeatureCheck::FragmentStores | FeatureCheck::NonMetalBackend, - BuiltinShaderFlags::Multiview), + BuiltinShaderConfig( + BuiltinShader::QuadWriteMultiviewFS, EmbeddedResource(glsl_quadwrite_frag), + rdcspv::ShaderStage::Fragment, + FeatureCheck::FragmentStores | FeatureCheck::NonMetalBackend | FeatureCheck::MultiView, + BuiltinShaderFlags::Multiview), BuiltinShaderConfig(BuiltinShader::TrisizeGS, EmbeddedResource(glsl_trisize_geom), rdcspv::ShaderStage::Geometry), BuiltinShaderConfig(BuiltinShader::TrisizeFS, EmbeddedResource(glsl_trisize_frag), @@ -148,8 +151,8 @@ static const BuiltinShaderConfig builtinShaders[] = { RDCCOMPILE_ASSERT(ARRAY_COUNT(builtinShaders) == arraydim(), "Missing built-in shader config"); -static bool PassesChecks(const BuiltinShaderConfig &config, const VkDriverInfo &driverVersion, - const VkPhysicalDeviceFeatures &features) +static bool PassesChecks(const BuiltinShaderConfig &config, const WrappedVulkan *driver, + const VkDriverInfo &driverVersion, const VkPhysicalDeviceFeatures &features) { if(config.checks & FeatureCheck::ShaderMSAAStorage) { @@ -198,6 +201,14 @@ static bool PassesChecks(const BuiltinShaderConfig &config, const VkDriverInfo & } } + if(config.checks & FeatureCheck::MultiView) + { + if(!driver->MultiView()) + { + return false; + } + } + if(config.stage == rdcspv::ShaderStage::Geometry && !features.geometryShader) return false; @@ -262,8 +273,8 @@ VulkanShaderCache::VulkanShaderCache(WrappedVulkan *driver) rdcspv::CompilationSettings compileSettings; compileSettings.lang = rdcspv::InputLanguage::VulkanGLSL; - m_Buffer2MSSupported = - PassesChecks(builtinShaders[(size_t)BuiltinShader::Buffer2MSCS], driverVersion, availFeatures); + m_Buffer2MSSupported = PassesChecks(builtinShaders[(size_t)BuiltinShader::Buffer2MSCS], driver, + driverVersion, availFeatures); for(auto i : indices()) { @@ -271,7 +282,7 @@ VulkanShaderCache::VulkanShaderCache(WrappedVulkan *driver) RDCASSERT(config.builtin == (BuiltinShader)i); - bool passesChecks = PassesChecks(config, driverVersion, enabledFeatures); + bool passesChecks = PassesChecks(config, driver, driverVersion, enabledFeatures); if(!passesChecks) continue; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 844cfe7a8..9ddcdfed3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2344,6 +2344,8 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(protectedMemory); CHECK_PHYS_EXT_FEATURE(samplerYcbcrConversion); CHECK_PHYS_EXT_FEATURE(shaderDrawParameters); + + m_MultiView |= ext->multiview != VK_FALSE; } END_PHYS_EXT_CHECK(); @@ -2487,6 +2489,8 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(multiview); CHECK_PHYS_EXT_FEATURE(multiviewGeometryShader); CHECK_PHYS_EXT_FEATURE(multiviewTessellationShader); + + m_MultiView |= ext->multiview != VK_FALSE; } END_PHYS_EXT_CHECK();