From 38caabed3f6adde0ce9356785c29a9e28c9afb0a Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 1 Oct 2024 16:09:21 +0200 Subject: [PATCH] Use glRenderbufferStorageMultisampleEXT when available on GLES Important for Mali in particular. This GLES implementation seems to choke when using a glRenderbufferStorageMultisample-allocated renderbuffer with a texture attached via glFramebufferTexture2DMultisampleEXT. Amends 590c85c80b5e84f20282256f64662da8a25d51a9 Change-Id: Ied1cbbd2525a22088d54c1130a2f830a5133eb83 Reviewed-by: Andy Nichols --- src/gui/rhi/qrhigles2.cpp | 13 +++++++++++-- src/gui/rhi/qrhigles2_p.h | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index a0b9f319049..154bcf99186 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -1103,6 +1103,8 @@ bool QRhiGles2::create(QRhi::Flags flags) if (caps.glesMultisampleRenderToTexture) { glFramebufferTexture2DMultisampleEXT = reinterpret_cast( ctx->getProcAddress(QByteArrayLiteral("glFramebufferTexture2DMultisampleEXT"))); + glRenderbufferStorageMultisampleEXT = reinterpret_cast( + ctx->getProcAddress(QByteArrayLiteral("glRenderbufferStorageMultisampleEXT"))); } caps.glesMultiviewMultisampleRenderToTexture = ctx->hasExtension("GL_OVR_multiview_multisampled_render_to_texture"); if (caps.glesMultiviewMultisampleRenderToTexture) { @@ -5488,8 +5490,15 @@ bool QGles2RenderBuffer::create() switch (m_type) { case QRhiRenderBuffer::DepthStencil: if (rhiD->caps.msaaRenderBuffer && samples > 1) { - rhiD->f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, - size.width(), size.height()); + if (rhiD->caps.glesMultisampleRenderToTexture) { + // Must match the logic in QGles2TextureRenderTarget::create(). + // EXT and non-EXT are not the same thing. + rhiD->glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, + size.width(), size.height()); + } else { + rhiD->f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, + size.width(), size.height()); + } stencilRenderbuffer = 0; } else if (rhiD->caps.packedDepthStencil || rhiD->caps.needsDepthStencilCombinedAttach) { const GLenum storage = rhiD->caps.needsDepthStencilCombinedAttach ? GL_DEPTH_STENCIL : GL_DEPTH24_STENCIL8; diff --git a/src/gui/rhi/qrhigles2_p.h b/src/gui/rhi/qrhigles2_p.h index 38f23c58072..a006a943cab 100644 --- a/src/gui/rhi/qrhigles2_p.h +++ b/src/gui/rhi/qrhigles2_p.h @@ -966,6 +966,7 @@ public: void (QOPENGLF_APIENTRYP glObjectLabel)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; void (QOPENGLF_APIENTRYP glFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei) = nullptr; void (QOPENGLF_APIENTRYP glFramebufferTextureMultisampleMultiviewOVR)(GLenum, GLenum, GLuint, GLint, GLsizei, GLint, GLsizei) = nullptr; + void (QOPENGLF_APIENTRYP glRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; uint vao = 0; struct Caps { Caps()