[Mesa-dev] [PATCH 01/16] dri_interface: Update __DRItexBufferExtensionRec to version 3

Kristian Høgsberg krh at bitplanet.net
Fri Apr 25 10:44:57 PDT 2014


On Sun, Mar 16, 2014 at 6:48 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> With commit e59fa4c46c8("dri2: release texture image.") we updated the
> extension without bumping the version number. The patch itself added an
> interface required to enable texture_from_pixmap on certain platforms.
>
> The new code was effectively never build, as it depended on
> __DRI_TEX_BUFFER_VERSION >= 3, which never came to be in upstream mesa.
>
> This commit bumps the version number, drops the __DRI_TEX_BUFFER_VERSION
> checks and resolves all the build conflicts. Additionally it add a version
> check as egl and dri3, as require version 2 of the extension which does
> not have the releaseTexBuffer hook.
>
> Cc: Juan Zhao <juan.j.zhao at intel.com>
> Cc: Kristian Høgsberg <krh at bitplanet.net>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>
> squash yeah it works let's push it
>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>  include/GL/internal/dri_interface.h |  2 +-
>  src/egl/drivers/dri2/egl_dri2.c     | 13 +++++++------
>  src/egl/main/eglsurface.c           | 11 +++++++++++
>  src/egl/main/eglsurface.h           |  3 +++
>  src/glx/dri2_glx.c                  |  6 +-----
>  src/glx/dri3_glx.c                  |  3 ++-
>  src/glx/drisw_glx.c                 | 12 +++++-------
>  7 files changed, 30 insertions(+), 20 deletions(-)
>
> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> index d028d05..4d57d0b 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -231,7 +231,7 @@ struct __DRItexOffsetExtensionRec {
>  #define __DRI_TEXTURE_FORMAT_RGBA        0x20DA
>
>  #define __DRI_TEX_BUFFER "DRI_TexBuffer"
> -#define __DRI_TEX_BUFFER_VERSION 2
> +#define __DRI_TEX_BUFFER_VERSION 3
>  struct __DRItexBufferExtensionRec {
>      __DRIextension base;
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index f304075..d734a1a 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -1089,7 +1089,6 @@ static EGLBoolean
>  dri2_release_tex_image(_EGLDriver *drv,
>                        _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
>  {
> -#if __DRI_TEX_BUFFER_VERSION >= 3
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
>     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
>     struct dri2_egl_context *dri2_ctx;
> @@ -1109,11 +1108,13 @@ dri2_release_tex_image(_EGLDriver *drv,
>     default:
>        assert(0);
>     }
> -   if (dri2_dpy->tex_buffer->releaseTexBuffer!=NULL)
> -    (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,f
> -                                             target,
> -                                             dri2_surf->dri_drawable);
> -#endif
> +
> +   if (dri2_dpy->tex_buffer->base.version >= 3 &&
> +       dri2_dpy->tex_buffer->releaseTexBuffer != NULL) {
> +      (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,
> +                                                target,
> +                                                dri2_surf->dri_drawable);
> +   }
>
>     return EGL_TRUE;
>  }
> diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c
> index c5ea224..e2cb73b 100644
> --- a/src/egl/main/eglsurface.c
> +++ b/src/egl/main/eglsurface.c
> @@ -531,6 +531,17 @@ _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
>     return EGL_TRUE;
>  }
>
> +EGLBoolean
> +_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
> +                    EGLint buffer)
> +{
> +   /* TODO: do basic error checking and return success/fail.
> +    * Drivers must implement the real stuff.
> +    */
> +
> +  return EGL_TRUE;
> +}
> +

What is this for?  It's not used in this patch.

Kristian

>  EGLBoolean
>  _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
> diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h
> index a954123..d13d301 100644
> --- a/src/egl/main/eglsurface.h
> +++ b/src/egl/main/eglsurface.h
> @@ -94,6 +94,9 @@ _eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint a
>  PUBLIC extern EGLBoolean
>  _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
>
> +PUBLIC extern EGLBoolean
> +_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer);
> +
>
>  extern EGLBoolean
>  _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
> index 5a960b0..acd8427 100644
> --- a/src/glx/dri2_glx.c
> +++ b/src/glx/dri2_glx.c
> @@ -1031,17 +1031,14 @@ dri2_bind_tex_image(Display * dpy,
>  static void
>  dri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>  {
> -#if __DRI_TEX_BUFFER_VERSION >= 3
>     struct glx_context *gc = __glXGetCurrentContext();
>     struct dri2_context *pcp = (struct dri2_context *) gc;
>     __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
>     struct glx_display *dpyPriv = __glXInitialize(dpy);
>     struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
> -   struct dri2_display *pdp =
> -      (struct dri2_display *) dpyPriv->dri2Display;
>     struct dri2_screen *psc;
>
> -   if (pdraw != NULL) {
> +   if (dpyPriv != NULL && pdraw != NULL) {
>        psc = (struct dri2_screen *) base->psc;
>
>        if (psc->texBuffer->base.version >= 3 &&
> @@ -1051,7 +1048,6 @@ dri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>                                             pdraw->driDrawable);
>        }
>     }
> -#endif
>  }
>
>  static const struct glx_context_vtable dri2_context_vtable = {
> diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
> index b7dac8e..653b1e5 100644
> --- a/src/glx/dri3_glx.c
> +++ b/src/glx/dri3_glx.c
> @@ -1527,7 +1527,8 @@ dri3_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>     if (pdraw != NULL) {
>        psc = (struct dri3_screen *) base->psc;
>
> -      if (psc->texBuffer->releaseTexBuffer)
> +      if (psc->texBuffer->base.version >= 3 &&
> +          psc->texBuffer->releaseTexBuffer != NULL)
>           (*psc->texBuffer->releaseTexBuffer) (pcp->driContext,
>                                                pdraw->base.textureTarget,
>                                                pdraw->driDrawable);
> diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
> index 33d347a..a77be4e 100644
> --- a/src/glx/drisw_glx.c
> +++ b/src/glx/drisw_glx.c
> @@ -342,16 +342,15 @@ drisw_bind_tex_image(Display * dpy,
>  static void
>  drisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>  {
> -#if __DRI_TEX_BUFFER_VERSION >= 3
>     struct glx_context *gc = __glXGetCurrentContext();
> -   struct dri2_context *pcp = (struct dri2_context *) gc;
> +   struct drisw_context *pcp = (struct drisw_context *) gc;
>     __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
>     struct glx_display *dpyPriv = __glXInitialize(dpy);
> -   struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
> -   struct dri2_screen *psc;
> +   struct drisw_drawable *pdraw = (struct drisw_drawable *) base;
> +   struct drisw_screen *psc;
>
> -   if (pdraw != NULL) {
> -      psc = (struct dri2_screen *) base->psc;
> +   if (dpyPriv != NULL && pdraw != NULL) {
> +      psc = (struct drisw_screen *) base->psc;
>
>        if (!psc->texBuffer)
>           return;
> @@ -363,7 +362,6 @@ drisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>                                             pdraw->driDrawable);
>        }
>     }
> -#endif
>  }
>
>  static const struct glx_context_vtable drisw_context_vtable = {
> --
> 1.9.0
>


More information about the mesa-dev mailing list