From 5c4e4e5832613e758b7c1389a5dbcc1d57db7c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=BCns?= Date: Tue, 9 Jun 2020 17:11:12 +0200 Subject: [PATCH] Allow compilation on GLES platforms On GLES 2.0 platforms (more specifically, for Qt5 "opengl es2" builds), QOpenGLFunctions_3_2_Core does not exist. Since Qt 5.7, QOpenGlFramebufferObject has a static wrapper method for framebuffer blitting, which in worst case (i.e. no GL_EXT_framebuffer blit extension) is a noop, but handles all GL platform differences otherwise (3.2 Core context, GLES 3.0, or any earlier with required extensions). The code ignores the passed in targetId FBO handle, but relies on the default framebuffer object of the context. As the calling code calls QOpenGLWindow::makeCurrent() the context default FBO is the one returned by QOpenGLWindow::defaultFramebufferObject(). --- GUISupport/Qt/QVTKRenderWindowAdapter.cxx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/GUISupport/Qt/QVTKRenderWindowAdapter.cxx b/GUISupport/Qt/QVTKRenderWindowAdapter.cxx index 5a66e236df..e5fc5a6135 100644 --- a/GUISupport/Qt/QVTKRenderWindowAdapter.cxx +++ b/GUISupport/Qt/QVTKRenderWindowAdapter.cxx @@ -334,12 +334,17 @@ public: { return false; } +#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) QOpenGLFunctions_3_2_Core* f = this->Context->versionFunctions(); +#else + QOpenGLFunctions* f = this->Context->functions(); +#endif if (!f) { return false; } +#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) f->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetId); f->glDrawBuffer(targetAttachment); @@ -358,6 +363,20 @@ public: auto sourceSize = this->FBO->size(); f->glBlitFramebuffer(0, 0, sourceSize.width(), sourceSize.height(), targetRect.x(), targetRect.y(), targetRect.width(), targetRect.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); +#else + GLboolean scissorTest = f->glIsEnabled(GL_SCISSOR_TEST); + if (scissorTest == GL_TRUE) + { + f->glDisable(GL_SCISSOR_TEST); // Scissor affects glBindFramebuffer. + } + auto sourceSize = this->FBO->size(); + QRect sourceRect(0, 0, sourceSize.width(), sourceSize.height()); + unsigned int readAttachment = + left ? this->RenderWindow->GetFrontLeftBuffer() : this->RenderWindow->GetFrontRightBuffer(); + QOpenGLFramebufferObject::blitFramebuffer(nullptr, targetRect, this->FBO.get(), sourceRect, + GL_COLOR_BUFFER_BIT, GL_NEAREST, readAttachment, targetAttachment, + QOpenGLFramebufferObject::DontRestoreFramebufferBinding); +#endif this->clearAlpha(targetRect); @@ -436,7 +455,7 @@ public: { Q_ASSERT(this->Context && this->FBO); - QOpenGLFunctions_3_2_Core* f = this->Context->versionFunctions(); + QOpenGLFunctions* f = this->Context->functions(); if (f) { // now clear alpha otherwise we end up blending the rendering with -- 2.27.0