From 60f22c51b94a5be0f3f9b8a9f71ff69fad09db97 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 17 Mar 2016 16:27:36 -0700 Subject: [PATCH] Check qml gl context on create --- libraries/gl/src/gl/OffscreenGLCanvas.cpp | 18 ++++++++++++++---- libraries/gl/src/gl/OffscreenGLCanvas.h | 2 +- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 8 ++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.cpp b/libraries/gl/src/gl/OffscreenGLCanvas.cpp index 6ce80296e9..1b10d6b032 100644 --- a/libraries/gl/src/gl/OffscreenGLCanvas.cpp +++ b/libraries/gl/src/gl/OffscreenGLCanvas.cpp @@ -32,17 +32,27 @@ OffscreenGLCanvas::~OffscreenGLCanvas() { _context->doneCurrent(); } -void OffscreenGLCanvas::create(QOpenGLContext* sharedContext) { +bool OffscreenGLCanvas::create(QOpenGLContext* sharedContext) { if (nullptr != sharedContext) { sharedContext->doneCurrent(); _context->setShareContext(sharedContext); } _context->setFormat(getDefaultOpenGLSurfaceFormat()); - _context->create(); + if (_context->create()) { + _offscreenSurface->setFormat(_context->format()); + _offscreenSurface->create(); + return true; + } - _offscreenSurface->setFormat(_context->format()); - _offscreenSurface->create(); + std::call_once(_reportOnce, []{ + qWarning() << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); + qWarning() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + qWarning() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); + qWarning() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER)); + qWarning() << "Failed to create OffscreenGLCanvas"; + }); + return false; } bool OffscreenGLCanvas::makeCurrent() { diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.h b/libraries/gl/src/gl/OffscreenGLCanvas.h index 0f02e7c76f..9858c7cefa 100644 --- a/libraries/gl/src/gl/OffscreenGLCanvas.h +++ b/libraries/gl/src/gl/OffscreenGLCanvas.h @@ -23,7 +23,7 @@ class OffscreenGLCanvas : public QObject { public: OffscreenGLCanvas(); ~OffscreenGLCanvas(); - void create(QOpenGLContext* sharedContext = nullptr); + bool create(QOpenGLContext* sharedContext = nullptr); bool makeCurrent(); void doneCurrent(); QOpenGLContext* getContext() { diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 6a780d74e2..33287493d4 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -65,7 +65,11 @@ class OffscreenQmlRenderer : public OffscreenGLCanvas { public: OffscreenQmlRenderer(OffscreenQmlSurface* surface, QOpenGLContext* shareContext) : _surface(surface) { - OffscreenGLCanvas::create(shareContext); + if (!OffscreenGLCanvas::create(shareContext)) { + static const char* error = "Failed to create OffscreenGLCanvas"; + qWarning() << error; + throw error; + }; _renderControl = new QMyQuickRenderControl(); @@ -153,7 +157,7 @@ private: qWarning("Failed to make context current on render thread"); return; } - _renderControl->initialize(_context); + _renderControl->initialize(getContext()); setupFbo(); _escrow.setRecycler([this](GLuint texture){ _textures.recycleTexture(texture);