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 "base/debug_log.h"
|
||||||
|
|
||||||
|
#include <QtCore/QSet>
|
||||||
#include <QtGui/QWindow>
|
#include <QtGui/QWindow>
|
||||||
#include <QtGui/QOpenGLContext>
|
#include <QtGui/QOpenGLContext>
|
||||||
#include <QtGui/QOpenGLFunctions>
|
#include <QtGui/QOpenGLFunctions>
|
||||||
|
|
@ -67,6 +68,14 @@ Capabilities CheckCapabilities(QWidget *widget) {
|
||||||
LOG_ONCE(("OpenGL: NoProfile received in final format."));
|
LOG_ONCE(("OpenGL: NoProfile received in final format."));
|
||||||
return {};
|
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
|
const auto version = u"%1.%2"_q
|
||||||
.arg(supported.majorVersion())
|
.arg(supported.majorVersion())
|
||||||
.arg(supported.majorVersion());
|
.arg(supported.majorVersion());
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <QtGui/QtEvents>
|
#include <QtGui/QtEvents>
|
||||||
#include <QtGui/QOpenGLContext>
|
#include <QtGui/QOpenGLContext>
|
||||||
|
#include <QtGui/QWindow>
|
||||||
#include <QtWidgets/QOpenGLWidget>
|
#include <QtWidgets/QOpenGLWidget>
|
||||||
|
|
||||||
namespace Ui::GL {
|
namespace Ui::GL {
|
||||||
|
|
@ -24,13 +25,16 @@ class SurfaceOpenGL final
|
||||||
: public RpWidgetBase<QOpenGLWidget, SurfaceTraits> {
|
: public RpWidgetBase<QOpenGLWidget, SurfaceTraits> {
|
||||||
public:
|
public:
|
||||||
SurfaceOpenGL(QWidget *parent, std::unique_ptr<Renderer> renderer);
|
SurfaceOpenGL(QWidget *parent, std::unique_ptr<Renderer> renderer);
|
||||||
|
~SurfaceOpenGL();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initializeGL() override;
|
void initializeGL() override;
|
||||||
void resizeGL(int w, int h) override;
|
void resizeGL(int w, int h) override;
|
||||||
void paintGL() override;
|
void paintGL() override;
|
||||||
|
void callDeInit();
|
||||||
|
|
||||||
const std::unique_ptr<Renderer> _renderer;
|
const std::unique_ptr<Renderer> _renderer;
|
||||||
|
QMetaObject::Connection _connection;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -52,8 +56,22 @@ SurfaceOpenGL::SurfaceOpenGL(
|
||||||
, _renderer(std::move(renderer)) {
|
, _renderer(std::move(renderer)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SurfaceOpenGL::~SurfaceOpenGL() {
|
||||||
|
callDeInit();
|
||||||
|
}
|
||||||
|
|
||||||
void SurfaceOpenGL::initializeGL() {
|
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) {
|
void SurfaceOpenGL::resizeGL(int w, int h) {
|
||||||
|
|
@ -64,6 +82,18 @@ void SurfaceOpenGL::paintGL() {
|
||||||
_renderer->paint(this, context()->functions());
|
_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(
|
SurfaceRaster::SurfaceRaster(
|
||||||
QWidget *parent,
|
QWidget *parent,
|
||||||
std::unique_ptr<Renderer> renderer)
|
std::unique_ptr<Renderer> renderer)
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,10 @@
|
||||||
|
|
||||||
#include "ui/gl/gl_detection.h"
|
#include "ui/gl/gl_detection.h"
|
||||||
|
|
||||||
|
#include <QtGui/QOpenGLFunctions>
|
||||||
|
|
||||||
class Painter;
|
class Painter;
|
||||||
class QOpenGLWidget;
|
class QOpenGLWidget;
|
||||||
class QOpenGLFunctions;
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class RpWidgetWrap;
|
class RpWidgetWrap;
|
||||||
|
|
@ -30,6 +31,11 @@ public:
|
||||||
not_null<QOpenGLFunctions*> f) {
|
not_null<QOpenGLFunctions*> f) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void deinit(
|
||||||
|
not_null<QOpenGLWidget*> widget,
|
||||||
|
not_null<QOpenGLFunctions*> f) {
|
||||||
|
}
|
||||||
|
|
||||||
virtual void resize(
|
virtual void resize(
|
||||||
not_null<QOpenGLWidget*> widget,
|
not_null<QOpenGLWidget*> widget,
|
||||||
not_null<QOpenGLFunctions*> f,
|
not_null<QOpenGLFunctions*> f,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue