summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2015-06-19 15:30:31 -0700
committerEric Anholt <eric@anholt.net>2015-11-06 12:38:54 -0800
commit009cfb63c0dd53306f92f4f9fb4a7a7ce68defad (patch)
tree0e25a01797bb62e877d10aa7998bec8ed8192ce1
parent3fdb17c7fedff8d2210243d9a4f1102914760b7a (diff)
glamor: Stop holding on to the EGLImage for textures.glamor-delay-shareable
We used to cache the EGLImage to be able to return an fd again faster, but now we keep the gbm bo on hand to do so. One concern might be if the early destruction of the EGLImage meant orphaning. However, the EGL_KHR_image_base spec text says: Once destroyed, <image> may not be used to create any additional EGLImage target resources within any client API contexts, although existing EGLImage siblings may continue to be used. and, even more clearly in the issues section: Note that the EGLImage source and any EGLImage target resources will still be EGLImage siblings, even if the EGLImage object is destroyed by a call to DestroyImageKHR. Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r--glamor/glamor_egl.c37
-rw-r--r--glamor/glamor_priv.h5
2 files changed, 6 insertions, 36 deletions
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 8638063ce..6eeb7f217 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -225,24 +225,6 @@ glamor_egl_check_has_gem(int fd)
return FALSE;
}
-static void
-glamor_egl_set_pixmap_image(PixmapPtr pixmap, EGLImageKHR image)
-{
- struct glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- EGLImageKHR old;
-
- old = pixmap_priv->image;
- if (old) {
- ScreenPtr screen = pixmap->drawable.pScreen;
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl = glamor_egl_get_screen_private(scrn);
-
- eglDestroyImageKHR(glamor_egl->display, old);
- }
- pixmap_priv->image = image;
-}
-
Bool
glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
{
@@ -284,7 +266,7 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
glamor_create_texture_from_image(screen, image, &texture);
glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
glamor_set_pixmap_texture(pixmap, texture);
- glamor_egl_set_pixmap_image(pixmap, image);
+ eglDestroyImageKHR(glamor_egl->display, image);
ret = TRUE;
done:
@@ -321,7 +303,6 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap,
glamor_create_texture_from_image(screen, image, &texture);
glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
glamor_set_pixmap_texture(pixmap, texture);
- glamor_egl_set_pixmap_image(pixmap, image);
if (pixmap_priv->gbm)
gbm_bo_destroy(pixmap_priv->gbm);
pixmap_priv->gbm = bo;
@@ -532,13 +513,10 @@ glamor_egl_destroy_pixmap(PixmapPtr pixmap)
Bool ret;
if (pixmap->refcnt == 1) {
+#ifdef GLAMOR_HAS_GBM
struct glamor_pixmap_private *pixmap_priv =
glamor_get_pixmap_private(pixmap);
- if (pixmap_priv->image)
- eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image);
-
-#ifdef GLAMOR_HAS_GBM
if (pixmap_priv->gbm) {
gbm_bo_destroy(pixmap_priv->gbm);
pixmap_priv->gbm = NULL;
@@ -557,7 +535,6 @@ glamor_egl_destroy_pixmap(PixmapPtr pixmap)
_X_EXPORT void
glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back)
{
- EGLImageKHR temp_image;
struct gbm_bo *temp_bo;
struct glamor_pixmap_private *front_priv =
glamor_get_pixmap_private(front);
@@ -566,10 +543,6 @@ glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back)
glamor_pixmap_exchange_fbos(front, back);
- temp_image = back_priv->image;
- back_priv->image = front_priv->image;
- front_priv->image = temp_image;
-
temp_bo = back_priv->gbm;
back_priv->gbm = front_priv->gbm;
front_priv->gbm = temp_bo;
@@ -591,8 +564,10 @@ glamor_egl_close_screen(ScreenPtr screen)
screen_pixmap = screen->GetScreenPixmap(screen);
pixmap_priv = glamor_get_pixmap_private(screen_pixmap);
- eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image);
- pixmap_priv->image = NULL;
+ if (pixmap_priv->gbm) {
+ gbm_bo_destroy(pixmap_priv->gbm);
+ pixmap_priv->gbm = NULL;
+ }
screen->CloseScreen = glamor_egl->saved_close_screen;
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index df6a02a18..dd01aeba4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -38,10 +38,6 @@
#endif
#include <epoxy/gl.h>
-#if GLAMOR_HAS_GBM
-#define MESA_EGL_NO_X11_HEADERS
-#include <epoxy/egl.h>
-#endif
#define GLAMOR_DEFAULT_PRECISION \
"#ifdef GL_ES\n" \
@@ -355,7 +351,6 @@ typedef struct glamor_pixmap_private {
Bool prepared;
Bool usage_shared;
#if GLAMOR_HAS_GBM
- EGLImageKHR image;
struct gbm_bo *gbm;
#endif
/** block width of this large pixmap. */