For surface with parent backend should be fixed.

This commit is contained in:
John Preston 2021-06-08 15:51:12 +04:00
parent cbb65009ff
commit 7bc9e12614
4 changed files with 32 additions and 9 deletions

View file

@ -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 {};
}

View file

@ -10,6 +10,11 @@
namespace Ui::GL {
enum class Backend {
Raster,
OpenGL,
};
struct Capabilities {
bool supported = false;
bool transparency = false;

View file

@ -114,9 +114,24 @@ void Renderer::paint(
}
std::unique_ptr<RpWidgetWrap> CreateSurface(
QWidget *parent,
Fn<ChosenRenderer(Capabilities)> chooseRenderer) {
auto chosen = chooseRenderer(CheckCapabilities(parent));
auto chosen = chooseRenderer(CheckCapabilities(nullptr));
switch (chosen.backend) {
case Backend::OpenGL:
return std::make_unique<SurfaceOpenGL>(
nullptr,
std::move(chosen.renderer));
case Backend::Raster:
return std::make_unique<SurfaceRaster>(
nullptr,
std::move(chosen.renderer));
}
Unexpected("Backend value in Ui::GL::CreateSurface.");
}
std::unique_ptr<RpWidgetWrap> CreateSurface(
QWidget *parent,
ChosenRenderer chosen) {
switch (chosen.backend) {
case Backend::OpenGL:
return std::make_unique<SurfaceOpenGL>(

View file

@ -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<RpWidgetWrap> CreateSurface(
QWidget *parent,
Fn<ChosenRenderer(Capabilities)> chooseRenderer);
[[nodiscard]] std::unique_ptr<RpWidgetWrap> CreateSurface(
QWidget *parent,
ChosenRenderer chosen);
} // namespace Ui::GL