From f39b02ed4b4846a1be9258186a3ee45f10600ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Tue, 25 Mar 2025 12:23:46 +0200 Subject: [PATCH] Rhi: Add SampleVariables feature The feature is required to check if gl_sampleID etc are available in the fragment shaders. Task-number: QTBUG-134999 Change-Id: Id26c75780011a7553d332ae22e69aab632891998 Reviewed-by: Laszlo Agocs (cherry picked from commit 86e3573671ec3ea919e534957bf9dc320f853575) Reviewed-by: Qt Cherry-pick Bot --- src/gui/rhi/qrhi.cpp | 6 ++++++ src/gui/rhi/qrhi.h | 1 + src/gui/rhi/qrhid3d11.cpp | 1 + src/gui/rhi/qrhid3d12.cpp | 1 + src/gui/rhi/qrhigles2.cpp | 12 ++++++++++++ src/gui/rhi/qrhigles2_p.h | 1 + src/gui/rhi/qrhimetal.mm | 1 + src/gui/rhi/qrhivulkan.cpp | 1 + 8 files changed, 24 insertions(+) diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index 21175ecedb2..c5df249aaf7 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -1091,6 +1091,12 @@ Q_LOGGING_CATEGORY(QRHI_LOG_RUB, "qt.rhi.rub") blending modes. In practice this can be expected to be supported everywhere except OpenGL ES, where it is only available with GLES 3.2 implementations. This enum value has been introduced in Qt 6.9. + + \value SampleVariables Indicates that gl_SampleID, gl_SamplePosition, + gl_SampleMaskIn and gl_SampleMask variables are available in fragment shaders. + In practice this can be expected to be supported everywhere except OpenGL ES, + where it is only available with GLES 3.2 implementations. + This enum value has been introduced in Qt 6.9. */ /*! diff --git a/src/gui/rhi/qrhi.h b/src/gui/rhi/qrhi.h index 5fbe7873fe5..63f0954f9d7 100644 --- a/src/gui/rhi/qrhi.h +++ b/src/gui/rhi/qrhi.h @@ -1912,6 +1912,7 @@ public: VariableRateShadingMap, VariableRateShadingMapWithTexture, PerRenderTargetBlending, + SampleVariables }; enum BeginFrameFlag { diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp index eb922857158..44fff83675f 100644 --- a/src/gui/rhi/qrhid3d11.cpp +++ b/src/gui/rhi/qrhid3d11.cpp @@ -657,6 +657,7 @@ bool QRhiD3D11::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMapWithTexture: return false; case QRhi::PerRenderTargetBlending: + case QRhi::SampleVariables: return true; default: Q_UNREACHABLE(); diff --git a/src/gui/rhi/qrhid3d12.cpp b/src/gui/rhi/qrhid3d12.cpp index 295fe790226..24f3f792dde 100644 --- a/src/gui/rhi/qrhid3d12.cpp +++ b/src/gui/rhi/qrhid3d12.cpp @@ -808,6 +808,7 @@ bool QRhiD3D12::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMapWithTexture: return caps.vrsMap; case QRhi::PerRenderTargetBlending: + case QRhi::SampleVariables: return true; } return false; diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 2ed331ff885..cd02cca8f94 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -1141,6 +1141,16 @@ bool QRhiGles2::create(QRhi::Flags flags) else caps.perRenderTargetBlending = caps.ctxMajor >= 4; + if (caps.gles) { + if (caps.ctxMajor == 3 && caps.ctxMinor < 2) { + caps.sampleVariables = ctx->hasExtension("GL_OES_sample_variables"); + } else { + caps.sampleVariables = caps.ctxMajor > 3 || (caps.ctxMajor == 3 && caps.ctxMinor >= 2); + } + } else { + caps.sampleVariables = caps.ctxMajor >= 4; + } + nativeHandlesStruct.context = ctx; contextLost = false; @@ -1555,6 +1565,8 @@ bool QRhiGles2::isFeatureSupported(QRhi::Feature feature) const return false; case QRhi::PerRenderTargetBlending: return caps.perRenderTargetBlending; + case QRhi::SampleVariables: + return caps.sampleVariables; default: Q_UNREACHABLE_RETURN(false); } diff --git a/src/gui/rhi/qrhigles2_p.h b/src/gui/rhi/qrhigles2_p.h index 1efef16af66..34afbd36498 100644 --- a/src/gui/rhi/qrhigles2_p.h +++ b/src/gui/rhi/qrhigles2_p.h @@ -1090,6 +1090,7 @@ public: uint glesMultiviewMultisampleRenderToTexture : 1; uint unpackRowLength : 1; uint perRenderTargetBlending : 1; + uint sampleVariables : 1; } caps; QGles2SwapChain *currentSwapChain = nullptr; QSet supportedCompressedFormats; diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index c909781e019..dedadb74b2b 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -868,6 +868,7 @@ bool QRhiMetal::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMapWithTexture: return false; case QRhi::PerRenderTargetBlending: + case QRhi::SampleVariables: return true; default: Q_UNREACHABLE(); diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp index afe4f00e427..c113e302cd1 100644 --- a/src/gui/rhi/qrhivulkan.cpp +++ b/src/gui/rhi/qrhivulkan.cpp @@ -5252,6 +5252,7 @@ bool QRhiVulkan::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMapWithTexture: return caps.renderPass2KHR && caps.imageBasedShadingRate; case QRhi::PerRenderTargetBlending: + case QRhi::SampleVariables: return true; default: Q_UNREACHABLE_RETURN(false);