From 29f339e26e11af5d56c5da1d6536bee0233d5194 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 3 Sep 2021 21:41:04 +0300 Subject: [PATCH] Allow Ui::GL::Renderer::deinit on lost context. --- ui/gl/gl_image.cpp | 14 +++++++++----- ui/gl/gl_image.h | 10 +++++----- ui/gl/gl_surface.cpp | 10 ++++++---- ui/gl/gl_surface.h | 2 +- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/ui/gl/gl_image.cpp b/ui/gl/gl_image.cpp index 3db6653..fc0e348 100644 --- a/ui/gl/gl_image.cpp +++ b/ui/gl/gl_image.cpp @@ -29,10 +29,12 @@ void GenerateTextures( } } -void DestroyTextures(QOpenGLFunctions &f, gsl::span values) { +void DestroyTextures(QOpenGLFunctions *f, gsl::span values) { Expects(!values.empty()); - f.glDeleteTextures(values.size(), values.data()); + if (f) { + f->glDeleteTextures(values.size(), values.data()); + } ranges::fill(values, 0); } @@ -42,10 +44,12 @@ void GenerateFramebuffers(QOpenGLFunctions &f, gsl::span values) { f.glGenFramebuffers(values.size(), values.data()); } -void DestroyFramebuffers(QOpenGLFunctions &f, gsl::span values) { +void DestroyFramebuffers(QOpenGLFunctions *f, gsl::span values) { Expects(!values.empty()); - f.glDeleteTextures(values.size(), values.data()); + if (f) { + f->glDeleteTextures(values.size(), values.data()); + } ranges::fill(values, 0); } @@ -114,7 +118,7 @@ void Image::bind(QOpenGLFunctions &f) { } } -void Image::destroy(QOpenGLFunctions &f) { +void Image::destroy(QOpenGLFunctions *f) { _textures.destroy(f); _cacheKey = 0; } diff --git a/ui/gl/gl_image.h b/ui/gl/gl_image.h index 75c24ec..736aa4d 100644 --- a/ui/gl/gl_image.h +++ b/ui/gl/gl_image.h @@ -18,10 +18,10 @@ void GenerateTextures( gsl::span values, GLint filter, GLint clamp); -void DestroyTextures(QOpenGLFunctions &f, gsl::span values); +void DestroyTextures(QOpenGLFunctions *f, gsl::span values); void GenerateFramebuffers(QOpenGLFunctions &f, gsl::span values); -void DestroyFramebuffers(QOpenGLFunctions &f, gsl::span values); +void DestroyFramebuffers(QOpenGLFunctions *f, gsl::span values); } // namespace details @@ -42,7 +42,7 @@ public: clamp); } } - void destroy(QOpenGLFunctions &f) { + void destroy(QOpenGLFunctions *f) { if (created()) { details::DestroyTextures(f, gsl::make_span(_values)); } @@ -79,7 +79,7 @@ public: details::GenerateFramebuffers(f, gsl::make_span(_values)); } } - void destroy(QOpenGLFunctions &f) { + void destroy(QOpenGLFunctions *f) { if (created()) { details::DestroyFramebuffers(f, gsl::make_span(_values)); } @@ -113,7 +113,7 @@ public: void invalidate(); void bind(QOpenGLFunctions &f); - void destroy(QOpenGLFunctions &f); + void destroy(QOpenGLFunctions *f); [[nodiscard]] TexturedRect texturedRect( const QRect &geometry, diff --git a/ui/gl/gl_surface.cpp b/ui/gl/gl_surface.cpp index 150210a..a08ffe6 100644 --- a/ui/gl/gl_surface.cpp +++ b/ui/gl/gl_surface.cpp @@ -107,11 +107,13 @@ void SurfaceOpenGL::callDeInit() { return; } QObject::disconnect(base::take(_connection)); - const auto surface = window()->windowHandle(); - Assert(surface != nullptr); + makeCurrent(); const auto context = this->context(); - context->makeCurrent(surface); - _renderer->deinit(this, *context->functions()); + _renderer->deinit( + this, + ((isValid() && context && QOpenGLContext::currentContext() == context) + ? context->functions() + : nullptr)); } SurfaceRaster::SurfaceRaster( diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index 1bf5981..2877816 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h @@ -28,7 +28,7 @@ public: virtual void deinit( not_null widget, - QOpenGLFunctions &f) { + QOpenGLFunctions *f) { } virtual void resize(