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 <e...@anholt.net> --- glamor/glamor_egl.c | 37 ++++++------------------------------- glamor/glamor_priv.h | 5 ----- 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 8638063..6eeb7f2 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 df6a02a..dd01aeb 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. */ -- 2.6.2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel