From 28564749352bafa05a541944dec67a849e372e9d Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 9 Mar 2025 11:09:53 +0100 Subject: [PATCH] [dxbc] Do not export PointSize on maintenance5-enabled drivers ... or on broken drivers that just explode for no reason at all. --- src/dxbc/dxbc_compiler.cpp | 8 ++++---- src/dxbc/dxbc_compiler.h | 2 -- src/dxbc/dxbc_options.cpp | 5 +++++ src/dxbc/dxbc_options.h | 3 +++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 6897428ed..2bcb0a31f 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -6899,15 +6899,15 @@ namespace dxvk { void DxbcCompiler::emitPointSizeStore() { - if (!m_pointSizeOut) { - m_pointSizeOut = emitNewBuiltinVariable(DxbcRegisterInfo { + if (m_moduleInfo.options.needsPointSizeExport) { + uint32_t pointSizeId = emitNewBuiltinVariable(DxbcRegisterInfo { { DxbcScalarType::Float32, 1, 0 }, spv::StorageClassOutput }, spv::BuiltInPointSize, "point_size"); - } - m_module.opStore(m_pointSizeOut, m_module.constf32(1.0f)); + m_module.opStore(pointSizeId, m_module.constf32(1.0f)); + } } diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 0695e2a10..8c85c467e 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -514,8 +514,6 @@ namespace dxvk { uint32_t m_primitiveIdIn = 0; uint32_t m_primitiveIdOut = 0; - uint32_t m_pointSizeOut = 0; - ////////////////////////////////////////////////// // Immediate constant buffer. If defined, this is // an array of four-component uint32 vectors. diff --git a/src/dxbc/dxbc_options.cpp b/src/dxbc/dxbc_options.cpp index 257e822f1..0d599eb7b 100644 --- a/src/dxbc/dxbc_options.cpp +++ b/src/dxbc/dxbc_options.cpp @@ -41,6 +41,11 @@ namespace dxvk { enableSampleShadingInterlock = device->features().extFragmentShaderInterlock.fragmentShaderSampleInterlock; supportsTightIcbPacking = device->features().vk12.uniformBufferStandardLayout; + // Qcom just breaks for no reason if we export point size, + // even in an environment where doing so is required. + needsPointSizeExport = !device->features().khrMaintenance5.maintenance5 + && !device->adapter()->matchesDriver(VK_DRIVER_ID_QUALCOMM_PROPRIETARY); + // Figure out float control flags to match D3D11 rules if (options.floatControls) { if (devInfo.vk12.shaderSignedZeroInfNanPreserveFloat32) diff --git a/src/dxbc/dxbc_options.h b/src/dxbc/dxbc_options.h index 2cbb968b4..97e556471 100644 --- a/src/dxbc/dxbc_options.h +++ b/src/dxbc/dxbc_options.h @@ -57,6 +57,9 @@ namespace dxvk { /// constant buffers if possible bool supportsTightIcbPacking = false; + /// Whether exporting point size is required + bool needsPointSizeExport = true; + /// Float control flags DxbcFloatControlFlags floatControl;