Add OpenGL deinit().
This commit is contained in:
parent
5e38964fbf
commit
8d7ced5c74
3 changed files with 47 additions and 2 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue