Don't compile multiview vulkan shaders if multiview is not enabled

This commit is contained in:
baldurk
2025-01-25 15:59:31 +00:00
parent e38e2d4177
commit 6865755297
3 changed files with 27 additions and 10 deletions
+2
View File
@@ -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; }
+21 -10
View File
@@ -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<BuiltinShader>(),
"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<BuiltinShader>())
{
@@ -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;
@@ -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();