From 8f1d8139c40d8b050ac606c3d62eee7f1f37410f Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Wed, 8 Feb 2023 09:05:44 +0100 Subject: [PATCH] Avoid glDrawBuffers on ES 2.0 / WebGL 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: QTBUG-111007 Pick-to: 6.5 Change-Id: If1d84df56ad47ac89ea43ad5091392416fe9fc5f Reviewed-by: Christian Strømme --- src/gui/rhi/qrhigles2.cpp | 14 +++++++++++--- src/gui/rhi/qrhigles2_p_p.h | 4 +++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 11b1b965b8..77448a8b21 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -766,12 +766,20 @@ bool QRhiGles2::create(QRhi::Flags flags) f->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &caps.maxTextureSize); - if (caps.ctxMajor >= 3 || actualFormat.renderableType() == QSurfaceFormat::OpenGL) { + caps.gles = actualFormat.renderableType() == QSurfaceFormat::OpenGLES; + + if (!caps.gles || caps.ctxMajor >= 3) { + // non-ES or ES 3.0+ f->glGetIntegerv(GL_MAX_DRAW_BUFFERS, &caps.maxDrawBuffers); + caps.hasDrawBuffersFunc = true; f->glGetIntegerv(GL_MAX_SAMPLES, &caps.maxSamples); caps.maxSamples = qMax(1, caps.maxSamples); } else { + // ES 2.0 / WebGL 1 caps.maxDrawBuffers = 1; + caps.hasDrawBuffersFunc = false; + // This does not mean MSAA is not supported, just that we cannot query + // the supported sample counts. caps.maxSamples = 1; } @@ -781,7 +789,6 @@ bool QRhiGles2::create(QRhi::Flags flags) caps.npotTextureFull = f->hasOpenGLFeature(QOpenGLFunctions::NPOTTextures) && f->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); - caps.gles = actualFormat.renderableType() == QSurfaceFormat::OpenGLES; if (caps.gles) caps.fixedIndexPrimitiveRestart = caps.ctxMajor >= 3; // ES 3.0 else @@ -3073,7 +3080,8 @@ void QRhiGles2::executeCommandBuffer(QRhiCommandBuffer *cb) else bufs.append(caps.gles ? GL_BACK : GL_BACK_LEFT); } - f->glDrawBuffers(bufs.count(), bufs.constData()); + if (caps.hasDrawBuffersFunc) + f->glDrawBuffers(bufs.count(), bufs.constData()); if (caps.srgbCapableDefaultFramebuffer) { if (cmd.args.bindFramebuffer.srgb) f->glEnable(GL_FRAMEBUFFER_SRGB); diff --git a/src/gui/rhi/qrhigles2_p_p.h b/src/gui/rhi/qrhigles2_p_p.h index f27320cab5..7caec5f7d5 100644 --- a/src/gui/rhi/qrhigles2_p_p.h +++ b/src/gui/rhi/qrhigles2_p_p.h @@ -960,7 +960,8 @@ public: texture3D(false), tessellation(false), geometryShader(false), - texture1D(false) + texture1D(false), + hasDrawBuffersFunc(false) { } int ctxMajor; int ctxMinor; @@ -1012,6 +1013,7 @@ public: uint tessellation : 1; uint geometryShader : 1; uint texture1D : 1; + uint hasDrawBuffersFunc : 1; } caps; QGles2SwapChain *currentSwapChain = nullptr; QSet supportedCompressedFormats;