diff --git a/src/view-backend-exportable-fdo-egl-private.h b/src/view-backend-exportable-fdo-egl-private.h index e19c177..9293674 100644 --- a/src/view-backend-exportable-fdo-egl-private.h +++ b/src/view-backend-exportable-fdo-egl-private.h @@ -33,7 +33,7 @@ struct wpe_fdo_egl_exported_image { EGLImageKHR eglImage { nullptr }; uint32_t width { 0 }; uint32_t height { 0 }; - bool exported { false }; + bool released { false }; struct wl_resource* bufferResource { nullptr }; struct wl_listener bufferDestroyListener; }; diff --git a/src/view-backend-exportable-fdo-egl.cpp b/src/view-backend-exportable-fdo-egl.cpp index 0031222..553f95f 100644 --- a/src/view-backend-exportable-fdo-egl.cpp +++ b/src/view-backend-exportable-fdo-egl.cpp @@ -178,11 +178,6 @@ class ClientBundleEGL final : public ClientBundle { void exportBuffer(struct wl_resource* bufferResource) override { - if (auto* image = findImage(bufferResource)) { - exportImage(image); - return; - } - EGLImageKHR eglImage = WS::instanceImpl().createImage(bufferResource); if (!eglImage) return; @@ -200,11 +195,6 @@ class ClientBundleEGL final : public ClientBundle { void exportBuffer(const struct linux_dmabuf_buffer* dmabufBuffer) override { - if (auto* image = findImage(dmabufBuffer->buffer_resource)) { - exportImage(image); - return; - } - EGLImageKHR eglImage = WS::instanceImpl().createImage(dmabufBuffer); if (!eglImage) return; @@ -247,6 +237,7 @@ class ClientBundleEGL final : public ClientBundle { void releaseImage(struct wpe_fdo_egl_exported_image* image) { + image->released = true; if (image->bufferResource) viewBackend->releaseBuffer(image->bufferResource); else @@ -263,21 +254,8 @@ class ClientBundleEGL final : public ClientBundle { const struct wpe_view_backend_exportable_fdo_egl_client* client; private: - struct wpe_fdo_egl_exported_image* findImage(struct wl_resource* bufferResource) - { - if (bufferResource) { - if (auto* listener = wl_resource_get_destroy_listener(bufferResource, bufferDestroyListenerCallback)) { - struct wpe_fdo_egl_exported_image* image; - return wl_container_of(listener, image, bufferDestroyListener); - } - } - - return nullptr; - } - void exportImage(struct wpe_fdo_egl_exported_image* image) { - image->exported = true; client->export_fdo_egl_image(data, image); } @@ -295,6 +273,9 @@ class ClientBundleEGL final : public ClientBundle { image = wl_container_of(listener, image, bufferDestroyListener); image->bufferResource = nullptr; + + if (image->released) + deleteImage(image); } };