Merge pull request #7489 from zzmp/fix/catch-qml-gl

Catch and report GL errors in QML render
This commit is contained in:
Brad Hefta-Gaub 2016-03-28 11:23:19 -07:00
commit 3ca02c847d

View file

@ -190,14 +190,7 @@ void OffscreenQmlRenderThread::setupFbo() {
using namespace oglplus; using namespace oglplus;
_textures.setSize(_size); _textures.setSize(_size);
// Before making any ogl calls, clear any outstanding errors try {
// FIXME: Something upstream is polluting the context with a GL_INVALID_ENUM,
// likely from glewExperimental = true
GLenum err = glGetError();
if (err != GL_NO_ERROR) {
qDebug() << "Clearing outstanding GL error to set up QML FBO:" << glewGetErrorString(err);
}
_depthStencil.reset(new Renderbuffer()); _depthStencil.reset(new Renderbuffer());
Context::Bound(Renderbuffer::Target::Renderbuffer, *_depthStencil) Context::Bound(Renderbuffer::Target::Renderbuffer, *_depthStencil)
.Storage( .Storage(
@ -209,6 +202,9 @@ void OffscreenQmlRenderThread::setupFbo() {
_fbo->AttachRenderbuffer(Framebuffer::Target::Draw, _fbo->AttachRenderbuffer(Framebuffer::Target::Draw,
FramebufferAttachment::Depth, *_depthStencil); FramebufferAttachment::Depth, *_depthStencil);
DefaultFramebuffer().Bind(Framebuffer::Target::Draw); DefaultFramebuffer().Bind(Framebuffer::Target::Draw);
} catch (oglplus::Error& error) {
qWarning() << "OpenGL error in QML render setup: " << error.what();
}
} }
void OffscreenQmlRenderThread::init() { void OffscreenQmlRenderThread::init() {
@ -299,10 +295,21 @@ void OffscreenQmlRenderThread::render() {
try { try {
PROFILE_RANGE("qml_render") PROFILE_RANGE("qml_render")
TexturePtr texture = _textures.getNextTexture(); TexturePtr texture = _textures.getNextTexture();
try {
_fbo->Bind(Framebuffer::Target::Draw); _fbo->Bind(Framebuffer::Target::Draw);
_fbo->AttachTexture(Framebuffer::Target::Draw, FramebufferAttachment::Color, *texture, 0); _fbo->AttachTexture(Framebuffer::Target::Draw, FramebufferAttachment::Color, *texture, 0);
_fbo->Complete(Framebuffer::Target::Draw); _fbo->Complete(Framebuffer::Target::Draw);
} catch (oglplus::Error& error) {
qWarning() << "OpenGL error in QML render: " << error.what();
// In case we are failing from a failed setupFbo, reset fbo before next render
setupFbo();
throw;
}
{ {
PROFILE_RANGE("qml_render->rendercontrol") PROFILE_RANGE("qml_render->rendercontrol")
_renderControl->render(); _renderControl->render();
@ -311,13 +318,14 @@ void OffscreenQmlRenderThread::render() {
// for now just clear the errors // for now just clear the errors
glGetError(); glGetError();
} }
// FIXME probably unecessary // FIXME probably unecessary
DefaultFramebuffer().Bind(Framebuffer::Target::Draw); DefaultFramebuffer().Bind(Framebuffer::Target::Draw);
_quickWindow->resetOpenGLState(); _quickWindow->resetOpenGLState();
_escrow.submit(GetName(*texture)); _escrow.submit(GetName(*texture));
_lastRenderTime = usecTimestampNow(); _lastRenderTime = usecTimestampNow();
} catch (std::runtime_error& error) { } catch (std::runtime_error& error) {
qWarning() << "Failed to render QML " << error.what(); qWarning() << "Failed to render QML: " << error.what();
} }
} }