Improve threadedqopenglwidget example.

Retrieve vendor/renderer name similar to context info
and exclude renderers that do not support threaded
Open GL (ANGLE/noveau).

Change-Id: I690c2fc277538bf28bf1f6032c2e017ede15e434
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
This commit is contained in:
Friedemann Kleint 2014-10-08 16:57:07 +02:00
parent bf73ab490d
commit eaf04207bd
3 changed files with 39 additions and 11 deletions

View File

@ -100,7 +100,7 @@ class GLWidget : public QOpenGLWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
GLWidget(QWidget *parent); explicit GLWidget(QWidget *parent = 0);
~GLWidget(); ~GLWidget();
protected: protected:

View File

@ -40,10 +40,19 @@
#include <QApplication> #include <QApplication>
#include <QMainWindow> #include <QMainWindow>
#include <QDesktopWidget>
#include <QSurfaceFormat> #include <QSurfaceFormat>
#include <QOpenGLContext>
#include "mainwindow.h" #include "mainwindow.h"
#include "glwidget.h" #include "glwidget.h"
static QString getGlString(QOpenGLFunctions *functions, GLenum name)
{
if (const GLubyte *p = functions->glGetString(name))
return QString::fromLatin1(reinterpret_cast<const char *>(p));
return QString();
}
int main( int argc, char ** argv ) int main( int argc, char ** argv )
{ {
QApplication a( argc, argv ); QApplication a( argc, argv );
@ -54,20 +63,38 @@ int main( int argc, char ** argv )
// Two top-level windows with two QOpenGLWidget children in each. // Two top-level windows with two QOpenGLWidget children in each.
// The rendering for the four QOpenGLWidgets happens on four separate threads. // The rendering for the four QOpenGLWidgets happens on four separate threads.
MainWindow mw1;
mw1.setMinimumSize(800, 400);
mw1.show();
GLWidget topLevelGlWidget;
QPoint pos = QApplication::desktop()->availableGeometry(&topLevelGlWidget).topLeft() + QPoint(200, 200);
topLevelGlWidget.setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example top level"));
topLevelGlWidget.resize(200, 200);
topLevelGlWidget.move(pos);
topLevelGlWidget.show();
const QString glInfo = getGlString(topLevelGlWidget.context()->functions(), GL_VENDOR)
+ QLatin1Char('/') + getGlString(topLevelGlWidget.context()->functions(), GL_RENDERER);
const bool supportsThreading = !glInfo.contains(QLatin1String("nouveau"), Qt::CaseInsensitive)
&& !glInfo.contains(QLatin1String("ANGLE"), Qt::CaseInsensitive);
const QString toolTip = supportsThreading ? glInfo : glInfo + QStringLiteral("\ndoes not support threaded OpenGL.");
topLevelGlWidget.setToolTip(toolTip);
QScopedPointer<MainWindow> mw1;
QScopedPointer<MainWindow> mw2; QScopedPointer<MainWindow> mw2;
if (!QApplication::arguments().contains(QStringLiteral("--single"))) { if (supportsThreading && !QApplication::arguments().contains(QStringLiteral("--single"))) {
pos += QPoint(100, 100);
mw1.reset(new MainWindow);
mw1->setToolTip(toolTip);
mw1->move(pos);
mw1->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #1"));
mw1->show();
pos += QPoint(100, 100);
mw2.reset(new MainWindow); mw2.reset(new MainWindow);
mw2->setMinimumSize(800, 400); mw2->setToolTip(toolTip);
mw2->move(pos);
mw2->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #2"));
mw2->show(); mw2->show();
// And a top-level.
GLWidget *bonus = new GLWidget(0);
bonus->resize(200, 200);
bonus->show();
} }
return a.exec(); return a.exec();

View File

@ -43,6 +43,7 @@
MainWindow::MainWindow() MainWindow::MainWindow()
{ {
setMinimumSize(800, 400);
GLWidget *glwidget1 = new GLWidget(this); GLWidget *glwidget1 = new GLWidget(this);
glwidget1->resize(400, 400); glwidget1->resize(400, 400);