From a8beae64ae78a8b8e081191d460902656126490b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 22 Dec 2019 03:04:34 +1100 Subject: [PATCH] general improvements to the renderer backend to help keep rendering consistent and performant --- app/render/backend/opengl/functions.cpp | 3 ++ app/render/backend/opengl/openglbackend.cpp | 3 +- app/render/backend/opengl/openglexporter.cpp | 40 +++++++++---------- .../backend/opengl/opengltexturecache.cpp | 8 ++-- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/app/render/backend/opengl/functions.cpp b/app/render/backend/opengl/functions.cpp index 767cbed65..c00223560 100644 --- a/app/render/backend/opengl/functions.cpp +++ b/app/render/backend/opengl/functions.cpp @@ -118,6 +118,9 @@ void olive::gl::Blit(OpenGLShaderPtr pipeline, bool flipped, QMatrix4x4 matrix) m_vbo.destroy(); m_vao.release(); m_vao.destroy(); + + // Make sure drawing is actually complete before this function returns + func->glFinish(); } void olive::gl::OCIOBlit(OpenGLShaderPtr pipeline, diff --git a/app/render/backend/opengl/openglbackend.cpp b/app/render/backend/opengl/openglbackend.cpp index ee6b5f37f..5d2c4af3a 100644 --- a/app/render/backend/opengl/openglbackend.cpp +++ b/app/render/backend/opengl/openglbackend.cpp @@ -32,8 +32,7 @@ bool OpenGLBackend::InitInternal() // Initiate one thread per CPU core for (int i=0;iSetParameters(params()); processors_.append(processor); } diff --git a/app/render/backend/opengl/openglexporter.cpp b/app/render/backend/opengl/openglexporter.cpp index 6d08afb8a..1da778c02 100644 --- a/app/render/backend/opengl/openglexporter.cpp +++ b/app/render/backend/opengl/openglexporter.cpp @@ -45,12 +45,12 @@ FramePtr OpenGLExporter::TextureToFrame(const QVariant& texture) frame->set_format(params_.format()); frame->allocate(); - QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions(); - f->glViewport(0, 0, texture_->width(), texture_->height()); - // Blit for transform if the width/height are different OpenGLTexturePtr input_tex = texture.value(); if (input_tex) { + QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions(); + f->glViewport(0, 0, texture_->width(), texture_->height()); + buffer_.Attach(texture_); buffer_.Bind(); input_tex->Bind(); @@ -60,24 +60,24 @@ FramePtr OpenGLExporter::TextureToFrame(const QVariant& texture) input_tex->Release(); buffer_.Release(); buffer_.Detach(); + + // Perform OpenGL read + buffer_.Attach(texture_); + buffer_.Bind(); + + PixelFormatInfo format_info = PixelService::GetPixelFormatInfo(params_.format()); + + f->glReadPixels(0, + 0, + texture_->width(), + texture_->height(), + format_info.pixel_format, + format_info.gl_pixel_type, + frame->data()); + + buffer_.Release(); + buffer_.Detach(); } - // Perform OpenGL read - buffer_.Attach(texture_); - buffer_.Bind(); - - PixelFormatInfo format_info = PixelService::GetPixelFormatInfo(params_.format()); - - f->glReadPixels(0, - 0, - texture_->width(), - texture_->height(), - format_info.pixel_format, - format_info.gl_pixel_type, - frame->data()); - - buffer_.Release(); - buffer_.Detach(); - return frame; } diff --git a/app/render/backend/opengl/opengltexturecache.cpp b/app/render/backend/opengl/opengltexturecache.cpp index 30919db98..1e5f29a91 100644 --- a/app/render/backend/opengl/opengltexturecache.cpp +++ b/app/render/backend/opengl/opengltexturecache.cpp @@ -29,9 +29,7 @@ OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext* ctx, co // If we didn't find a texture, we'll need to create one if (!texture) { texture = std::make_shared(); - texture->Create(ctx, params.effective_width(), params.effective_height(), params.format(), data); - } else if (data) { - texture->Upload(data); + texture->Create(ctx, params.effective_width(), params.effective_height(), params.format()); } ReferencePtr ref = std::make_shared(this, texture); @@ -39,6 +37,10 @@ OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext* ctx, co lock_.unlock(); + if (data) { + texture->Upload(data); + } + return ref; }