Add OpenGL deinit().

This commit is contained in:
John Preston 2021-05-22 19:47:37 +04:00
parent 5e38964fbf
commit 8d7ced5c74
3 changed files with 47 additions and 2 deletions

View file

@ -8,6 +8,7 @@
#include "base/debug_log.h"
#include <QtCore/QSet>
#include <QtGui/QWindow>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLFunctions>
@ -67,6 +68,14 @@ Capabilities CheckCapabilities(QWidget *widget) {
LOG_ONCE(("OpenGL: NoProfile received in final format."));
return {};
}
static const auto extensionsLogged = [&] {
auto list = QStringList();
for (const auto extension : context->extensions()) {
list.append(QString::fromLatin1(extension));
}
LOG(("OpenGL Extensions: %1").arg(list.join(", ")));
return true;
}();
const auto version = u"%1.%2"_q
.arg(supported.majorVersion())
.arg(supported.majorVersion());

View file

@ -11,6 +11,7 @@
#include <QtGui/QtEvents>
#include <QtGui/QOpenGLContext>
#include <QtGui/QWindow>
#include <QtWidgets/QOpenGLWidget>
namespace Ui::GL {
@ -24,13 +25,16 @@ class SurfaceOpenGL final
: public RpWidgetBase<QOpenGLWidget, SurfaceTraits> {
public:
SurfaceOpenGL(QWidget *parent, std::unique_ptr<Renderer> renderer);
~SurfaceOpenGL();
private:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
void callDeInit();
const std::unique_ptr<Renderer> _renderer;
QMetaObject::Connection _connection;
};
@ -52,8 +56,22 @@ SurfaceOpenGL::SurfaceOpenGL(
, _renderer(std::move(renderer)) {
}
SurfaceOpenGL::~SurfaceOpenGL() {
callDeInit();
}
void SurfaceOpenGL::initializeGL() {
_renderer->init(this, context()->functions());
Expects(window()->windowHandle() != nullptr);
if (_connection) {
QObject::disconnect(base::take(_connection));
}
const auto context = this->context();
_connection = QObject::connect(
context,
&QOpenGLContext::aboutToBeDestroyed,
[=] { callDeInit(); });
_renderer->init(this, context->functions());
}
void SurfaceOpenGL::resizeGL(int w, int h) {
@ -64,6 +82,18 @@ void SurfaceOpenGL::paintGL() {
_renderer->paint(this, context()->functions());
}
void SurfaceOpenGL::callDeInit() {
if (!_connection) {
return;
}
QObject::disconnect(base::take(_connection));
const auto surface = window()->windowHandle();
Assert(surface != nullptr);
const auto context = this->context();
context->makeCurrent(surface);
_renderer->deinit(this, context->functions());
}
SurfaceRaster::SurfaceRaster(
QWidget *parent,
std::unique_ptr<Renderer> renderer)

View file

@ -8,9 +8,10 @@
#include "ui/gl/gl_detection.h"
#include <QtGui/QOpenGLFunctions>
class Painter;
class QOpenGLWidget;
class QOpenGLFunctions;
namespace Ui {
class RpWidgetWrap;
@ -30,6 +31,11 @@ public:
not_null<QOpenGLFunctions*> f) {
}
virtual void deinit(
not_null<QOpenGLWidget*> widget,
not_null<QOpenGLFunctions*> f) {
}
virtual void resize(
not_null<QOpenGLWidget*> widget,
not_null<QOpenGLFunctions*> f,