From c06c8eba507d406480764ab516d325d8f51cd3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Mon, 20 May 2024 08:47:41 +0300 Subject: [PATCH] Add feature for per render target blending Task-number: QTBUG-130334 Change-Id: I30ae0023ce8b5c26360e4255d64c209ebe404ede Reviewed-by: Laszlo Agocs --- src/gui/rhi/qrhi.cpp | 5 +++++ src/gui/rhi/qrhi.h | 3 ++- src/gui/rhi/qrhid3d11.cpp | 2 ++ src/gui/rhi/qrhid3d12.cpp | 2 ++ src/gui/rhi/qrhigles2.cpp | 3 +++ src/gui/rhi/qrhigles2_p.h | 4 +++- src/gui/rhi/qrhimetal.mm | 2 ++ src/gui/rhi/qrhivulkan.cpp | 2 ++ 8 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index 7e66d3a35f8..ad5d10819d4 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -1069,6 +1069,11 @@ Q_STATIC_LOGGING_CATEGORY(QRHI_LOG_RUB, "qt.rhi.rub") specification of the shading rate is supported via regular textures. In practice this may be supported with Direct 3D 12 and Vulkan. This enum value has been introduced in Qt 6.9. + + \value PerRenderTargetBlending Indicates that per rendertarget blending is + supported i.e. different render targets in MRT framebuffer can have different + blending modes. Currently always returns false for OpenGL. + 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 6d869f00eeb..3f6fe5eb3a0 100644 --- a/src/gui/rhi/qrhi.h +++ b/src/gui/rhi/qrhi.h @@ -1907,7 +1907,8 @@ public: ResolveDepthStencil, VariableRateShading, VariableRateShadingMap, - VariableRateShadingMapWithTexture + VariableRateShadingMapWithTexture, + PerRenderTargetBlending, }; enum BeginFrameFlag { diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp index 6e13d89b9a0..4518e5bf31b 100644 --- a/src/gui/rhi/qrhid3d11.cpp +++ b/src/gui/rhi/qrhid3d11.cpp @@ -656,6 +656,8 @@ bool QRhiD3D11::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMap: case QRhi::VariableRateShadingMapWithTexture: return false; + case QRhi::PerRenderTargetBlending: + return true; default: Q_UNREACHABLE(); return false; diff --git a/src/gui/rhi/qrhid3d12.cpp b/src/gui/rhi/qrhid3d12.cpp index 41280713bd5..570bb0efb0d 100644 --- a/src/gui/rhi/qrhid3d12.cpp +++ b/src/gui/rhi/qrhid3d12.cpp @@ -807,6 +807,8 @@ bool QRhiD3D12::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMap: case QRhi::VariableRateShadingMapWithTexture: return caps.vrsMap; + case QRhi::PerRenderTargetBlending: + return true; } return false; } diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 1a24a1bef8b..445f0edb329 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -1117,6 +1117,7 @@ bool QRhiGles2::create(QRhi::Flags flags) } caps.unpackRowLength = !caps.gles || caps.ctxMajor >= 3; + caps.perRenderTargetBlending = false; nativeHandlesStruct.context = ctx; @@ -1507,6 +1508,8 @@ bool QRhiGles2::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMap: case QRhi::VariableRateShadingMapWithTexture: return false; + case QRhi::PerRenderTargetBlending: + return caps.perRenderTargetBlending; default: Q_UNREACHABLE_RETURN(false); } diff --git a/src/gui/rhi/qrhigles2_p.h b/src/gui/rhi/qrhigles2_p.h index a5a7ee6ccc2..9458ae92bd5 100644 --- a/src/gui/rhi/qrhigles2_p.h +++ b/src/gui/rhi/qrhigles2_p.h @@ -1025,7 +1025,8 @@ public: objectLabel(false), glesMultisampleRenderToTexture(false), glesMultiviewMultisampleRenderToTexture(false), - unpackRowLength(false) + unpackRowLength(false), + perRenderTargetBlending(false) { } int ctxMajor; int ctxMinor; @@ -1085,6 +1086,7 @@ public: uint glesMultisampleRenderToTexture : 1; uint glesMultiviewMultisampleRenderToTexture : 1; uint unpackRowLength : 1; + uint perRenderTargetBlending : 1; } caps; QGles2SwapChain *currentSwapChain = nullptr; QSet supportedCompressedFormats; diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index d8f9ca49c18..ca683ce37c4 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -867,6 +867,8 @@ bool QRhiMetal::isFeatureSupported(QRhi::Feature feature) const return caps.shadingRateMap; case QRhi::VariableRateShadingMapWithTexture: return false; + case QRhi::PerRenderTargetBlending: + return true; default: Q_UNREACHABLE(); return false; diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp index 52161295c18..4ce6a80f325 100644 --- a/src/gui/rhi/qrhivulkan.cpp +++ b/src/gui/rhi/qrhivulkan.cpp @@ -5202,6 +5202,8 @@ bool QRhiVulkan::isFeatureSupported(QRhi::Feature feature) const case QRhi::VariableRateShadingMap: case QRhi::VariableRateShadingMapWithTexture: return caps.renderPass2KHR && caps.imageBasedShadingRate; + case QRhi::PerRenderTargetBlending: + return true; default: Q_UNREACHABLE_RETURN(false); }