blob: 60dec2a5cf369b947d655ebfbc7f6fd2f4640f07 [file] [log] [blame] [edit]
From 6e4de176c7c2b4aeb4547fa5dc48d29d92b9d1ca Mon Sep 17 00:00:00 2001
From: "Mr.Huang" <hsq2013@163.com>
Date: Wed, 24 Jan 2018 11:18:24 +0800
Subject: [PATCH] fix bug: using multithread render model with Qt5
If I hadn't call makeCurrent function before swapBuffers by using ThreadingModel::CullThreadPerCameraDrawThreadPerContext with Qt5.9, I will get this warning: qopenglcontext::swapbuffers() called without corresponding makecurrent().
---
src/osgQt/GraphicsWindowQt.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/osgQt/GraphicsWindowQt.cpp b/src/osgQt/GraphicsWindowQt.cpp
index 2df1dc3..2fd3855 100644
--- a/src/osgQt/GraphicsWindowQt.cpp
+++ b/src/osgQt/GraphicsWindowQt.cpp
@@ -285,8 +285,9 @@ void GLWidget::setKeyboardModifiers( QInputEvent* event )
void GLWidget::resizeEvent( QResizeEvent* event )
{
+ if (_gw == NULL || !_gw->valid())
+ return;
const QSize& size = event->size();
-
int scaled_width = static_cast<int>(size.width()*_devicePixelRatio);
int scaled_height = static_cast<int>(size.height()*_devicePixelRatio);
_gw->resized( x(), y(), scaled_width, scaled_height);
@@ -298,6 +298,8 @@ void GLWidget::resizeEvent( QResizeEvent* event )
void GLWidget::moveEvent( QMoveEvent* event )
{
+ if (_gw == NULL || !_gw->valid())
+ return;
const QPoint& pos = event->pos();
int scaled_width = static_cast<int>(width()*_devicePixelRatio);
int scaled_height = static_cast<int>(height()*_devicePixelRatio);
@@ -851,8 +851,6 @@ bool GraphicsWindowQt::releaseContextImplementation()
void GraphicsWindowQt::swapBuffersImplementation()
{
- _widget->swapBuffers();
-
// FIXME: the processDeferredEvents should really be executed in a GUI (main) thread context but
// I couln't find any reliable way to do this. For now, lets hope non of *GUI thread only operations* will
// be executed in a QGLWidget::event handler. On the other hand, calling GUI only operations in the
@@ -862,8 +860,8 @@ void GraphicsWindowQt::swapBuffersImplementation()
// We need to call makeCurrent here to restore our previously current context
// which may be changed by the processDeferredEvents function.
- if (QGLContext::currentContext() != _widget->context())
- _widget->makeCurrent();
+ _widget->makeCurrent();
+ _widget->swapBuffers();
}
void GraphicsWindowQt::requestWarpPointer( float x, float y )
From 2c8382421edec353d47f2d91cad454992ae0e199 Mon Sep 17 00:00:00 2001
From: Robert Osfield <robert@openscenegraph.com>
Date: Wed, 7 Mar 2018 10:30:47 +0000
Subject: [PATCH] Added missing Camera::setDrawBuffer()/setReadBuffer()
---
examples/osgqfont/osgqfont.cpp | 4 ++++
examples/osgviewerQt/osgviewerQt.cpp | 5 +++++
2 files changed, 9 insertions(+)
diff --git a/examples/osgqfont/osgqfont.cpp b/examples/osgqfont/osgqfont.cpp
index c30820e..8b4b60c 100644
--- a/examples/osgqfont/osgqfont.cpp
+++ b/examples/osgqfont/osgqfont.cpp
@@ -503,6 +503,10 @@ class MainWindow : public QWidget {
camera->setGraphicsContext(graphicsWindow);
camera->setViewport(new osg::Viewport(0, 0, width(), height()));
+ // set the draw and read buffers up for a double buffered window with rendering going to back buffer
+ camera->setDrawBuffer(GL_BACK);
+ camera->setReadBuffer(GL_BACK);
+
startTimer(10);
}
diff --git a/examples/osgviewerQt/osgviewerQt.cpp b/examples/osgviewerQt/osgviewerQt.cpp
index 1a2eac4..5f6b1ad 100644
--- a/examples/osgviewerQt/osgviewerQt.cpp
+++ b/examples/osgviewerQt/osgviewerQt.cpp
@@ -53,6 +53,11 @@ class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
+
+ // set the draw and read buffers up for a double buffered window with rendering going to back buffer
+ camera->setDrawBuffer(GL_BACK);
+ camera->setReadBuffer(GL_BACK);
+
camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
view->setSceneData( scene );