From 0f799e52f457dbaba5d03a5121e2d3578c2f6003 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 16 Jun 2017 15:30:36 -0700 Subject: [PATCH] blit entire texture. Only issue is that it is upside down --- .../display-plugins/OpenGLDisplayPlugin.cpp | 31 ++++++++++++++----- .../src/display-plugins/OpenGLDisplayPlugin.h | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 456d338db9..b044477c1f 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -826,16 +826,31 @@ void OpenGLDisplayPlugin::updateCompositeFramebuffer() { void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) { auto glBackend = const_cast(*this).getGLBackend(); withMainThreadContext([&] { + qDebug() << "initial gl error:" << glGetError(); GLuint sourceTexture = glBackend->getTextureID(source); GLuint targetTexture = target->texture(); - GLuint fbo { 0 }; - glCreateFramebuffers(1, &fbo); - glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture, 0); - glCopyTextureSubImage2D(targetTexture, 0, 0, 0, 0, 0, target->width(), target->height()); - glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); - glDeleteFramebuffers(1, &fbo); - glDeleteTextures(1, &fbo); + GLuint fbo[2] {0, 0}; + + glGenerateTextureMipmap(sourceTexture); + qDebug() << "errors: " << glGetError(); + + glCreateFramebuffers(2, fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); + qDebug() << "errors: " << glGetError(); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture, 0); + qDebug() << "errors: " << glGetError(); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo[1]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0); + qDebug() << "errors: " << glGetError(); + + glBlitNamedFramebuffer(fbo[0], fbo[1], 0, 0, source->getWidth(), source->getHeight(), 0, 0, target->width(), target->height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); + qDebug() << "errors: " << glGetError() << "bound?" << target->isBound(); + + glDeleteFramebuffers(2, fbo); + glDeleteTextures(1, fbo); + glFinish(); }); } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 945708f6a7..58a1157969 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -79,7 +79,7 @@ public: // Three threads, one for rendering, one for texture transfers, one reserved for the GL driver int getRequiredThreadCount() const override { return 3; } - void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target); + void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) override; protected: friend class PresentThread;