From 7bc9e1261498af07475f4bac0d8bcd8721202177 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 8 Jun 2021 15:51:12 +0400 Subject: [PATCH] For surface with parent backend should be fixed. --- ui/gl/gl_detection.cpp | 7 ++++++- ui/gl/gl_detection.h | 5 +++++ ui/gl/gl_surface.cpp | 19 +++++++++++++++++-- ui/gl/gl_surface.h | 10 ++++------ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ui/gl/gl_detection.cpp b/ui/gl/gl_detection.cpp index d6caf7d..90b1581 100644 --- a/ui/gl/gl_detection.cpp +++ b/ui/gl/gl_detection.cpp @@ -46,8 +46,13 @@ Capabilities CheckCapabilities(QWidget *widget) { auto tester = QOpenGLWidget(widget); tester.setFormat(format); tester.grabFramebuffer(); // Force initialize(). + if (!tester.window()->windowHandle()) { + tester.window()->createWinId(); + } const auto context = tester.context(); - if (!context) { + if (!context + || !context->isValid() + || !context->makeCurrent(tester.window()->windowHandle())) { LOG_ONCE(("OpenGL: Could not create widget in a window.")); return {}; } diff --git a/ui/gl/gl_detection.h b/ui/gl/gl_detection.h index a9a55a5..9641fad 100644 --- a/ui/gl/gl_detection.h +++ b/ui/gl/gl_detection.h @@ -10,6 +10,11 @@ namespace Ui::GL { +enum class Backend { + Raster, + OpenGL, +}; + struct Capabilities { bool supported = false; bool transparency = false; diff --git a/ui/gl/gl_surface.cpp b/ui/gl/gl_surface.cpp index 9e38fa9..0196f92 100644 --- a/ui/gl/gl_surface.cpp +++ b/ui/gl/gl_surface.cpp @@ -114,9 +114,24 @@ void Renderer::paint( } std::unique_ptr CreateSurface( - QWidget *parent, Fn chooseRenderer) { - auto chosen = chooseRenderer(CheckCapabilities(parent)); + auto chosen = chooseRenderer(CheckCapabilities(nullptr)); + switch (chosen.backend) { + case Backend::OpenGL: + return std::make_unique( + nullptr, + std::move(chosen.renderer)); + case Backend::Raster: + return std::make_unique( + nullptr, + std::move(chosen.renderer)); + } + Unexpected("Backend value in Ui::GL::CreateSurface."); +} + +std::unique_ptr CreateSurface( + QWidget *parent, + ChosenRenderer chosen) { switch (chosen.backend) { case Backend::OpenGL: return std::make_unique( diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index 9984c28..89b925e 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h @@ -19,11 +19,6 @@ class RpWidgetWrap; namespace Ui::GL { -enum class Backend { - OpenGL, - Raster, -}; - class Renderer { public: virtual void init( @@ -62,7 +57,10 @@ struct ChosenRenderer { }; [[nodiscard]] std::unique_ptr CreateSurface( - QWidget *parent, Fn chooseRenderer); +[[nodiscard]] std::unique_ptr CreateSurface( + QWidget *parent, + ChosenRenderer chosen); + } // namespace Ui::GL