diff options
author | Simon Ser <contact@emersion.fr> | 2021-05-29 10:25:25 +0200 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-05-30 10:11:09 -0400 |
commit | abf527b0754cc920e5324c593b109ff4c4607471 (patch) | |
tree | a3c41d6ba45fd918517cdb65dae886b0e79ee0e7 /include/render | |
parent | d0560e2597e79f0f25c0ad9fd6969eaf10fd5558 (diff) |
render/gles2: fix texture cleanup on destroy
When importing a DMA-BUF wlr_buffer as a wlr_texture, the GLES2
renderer caches the result, in case the buffer is used for texturing
again in the future. When the wlr_texture is destroyed by the caller,
the wlr_buffer is unref'ed, but the wlr_gles2_texture is kept around.
This is fine because wlr_gles2_texture listens for wlr_buffer's destroy
event to avoid any use-after-free.
However, with this logic wlr_texture_destroy doesn't "really" destroy
the wlr_gles2_texture. It just decrements the wlr_buffer ref'count.
Each wlr_texture_destroy call must have a matching prior
wlr_texture_create_from_buffer call or the ref'counting will go south.
Wehn destroying the renderer, we don't want to decrement any wlr_buffer
ref'count. Instead, we want to go through any cached wlr_gles2_texture
and destroy our GL state. So instead of calling wlr_texture_destroy, we
need to call our internal gles2_texture_destroy function.
Closes: https://github.com/swaywm/wlroots/issues/2941
Diffstat (limited to 'include/render')
-rw-r--r-- | include/render/gles2.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h index 39ec1da0..0e93522f 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -128,6 +128,7 @@ struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer, struct wlr_dmabuf_attributes *attribs); struct wlr_texture *gles2_texture_from_buffer(struct wlr_renderer *wlr_renderer, struct wlr_buffer *buffer); +void gles2_texture_destroy(struct wlr_gles2_texture *texture); void push_gles2_debug_(struct wlr_gles2_renderer *renderer, const char *file, const char *func); |