summaryrefslogtreecommitdiffstats
path: root/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp')
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index 453800c18..f5e63aec5 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -198,10 +198,14 @@ public:
QEGLStreamConvenience *funcs;
static WaylandEglClientBufferIntegrationPrivate *get(WaylandEglClientBufferIntegration *integration) {
- return integration->d_ptr.data();
+ return shuttingDown ? nullptr : integration->d_ptr.data();
}
+
+ static bool shuttingDown;
};
+bool WaylandEglClientBufferIntegrationPrivate::shuttingDown = false;
+
BufferState::BufferState()
: egl_format(EGL_TEXTURE_RGBA)
, egl_stream(EGL_NO_STREAM_KHR)
@@ -395,6 +399,11 @@ WaylandEglClientBufferIntegration::WaylandEglClientBufferIntegration()
{
}
+WaylandEglClientBufferIntegration::~WaylandEglClientBufferIntegration()
+{
+ WaylandEglClientBufferIntegrationPrivate::shuttingDown = true;
+}
+
void WaylandEglClientBufferIntegration::initializeHardware(struct wl_display *display)
{
Q_D(WaylandEglClientBufferIntegration);
@@ -480,6 +489,24 @@ WaylandEglClientBuffer::WaylandEglClientBuffer(WaylandEglClientBufferIntegration
}
}
+
+WaylandEglClientBuffer::~WaylandEglClientBuffer()
+{
+ auto *p = WaylandEglClientBufferIntegrationPrivate::get(m_integration);
+
+ if (p) {
+ for (auto image : d->egl_images)
+ p->egl_destroy_image(p->egl_display, image);
+
+ if (d->egl_stream)
+ p->funcs->destroy_stream(p->egl_display, d->egl_stream);
+
+ for (auto *texture : d->textures)
+ delete texture;
+ }
+ delete d;
+}
+
static QWaylandBufferRef::BufferFormatEgl formatFromEglFormat(EGLint format) {
switch (format) {
case EGL_TEXTURE_RGB: