[Intel-gfx] [PATCH] glXReleaseTexImageEXT should release reference to storage for the pixmap (2nd try)

Julien Cristau jcristau at debian.org
Mon Jun 1 20:39:58 CEST 2009


On Mon, Jun  1, 2009 at 17:14:25 +0800, Shuang He wrote:

> According to GLX_EXT_texture_from_pixmap spec, "The storage for the GLX pixmap will be freed when it is not current to any client and all color buffers that are bound to a texture object have been released."
> ---
>  include/GL/internal/dri_interface.h          |   10 +++++-
>  src/glx/x11/glxcmds.c                        |   19 +++++++++++-
>  src/mesa/drivers/dri/intel/intel_screen.c    |    2 +
>  src/mesa/drivers/dri/intel/intel_tex.h       |    7 ++++
>  src/mesa/drivers/dri/intel/intel_tex_image.c |   42 ++++++++++++++++++++++++++
>  5 files changed, 78 insertions(+), 2 deletions(-)
> 
> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> index 910c916..d6643c5 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -231,7 +231,7 @@ struct __DRItexOffsetExtensionRec {
>  
>  
>  #define __DRI_TEX_BUFFER "DRI_TexBuffer"
> -#define __DRI_TEX_BUFFER_VERSION 2
> +#define __DRI_TEX_BUFFER_VERSION 3
>  struct __DRItexBufferExtensionRec {
>      __DRIextension base;
>  
> @@ -256,6 +256,14 @@ struct __DRItexBufferExtensionRec {
>  			  GLint target,
>  			  GLint format,
>  			  __DRIdrawable *pDraw);
> +
> +    void (*unsetTexBuffer)(__DRIcontext *pDRICtx,
> +			 GLint target,
> +			 __DRIdrawable *pDraw);
> +
> +    void (*unsetTexBuffer2)(__DRIcontext *pDRICtx,
> +			  GLint target,
> +			  __DRIdrawable *pDraw);

You still don't need two hooks as far as I can tell, just the one
unsetTexBuffer is enough.

>  };
>  
>  /**
> diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
> index ec3e69e..59866c0 100644
> --- a/src/glx/x11/glxcmds.c
> +++ b/src/glx/x11/glxcmds.c
> @@ -2698,8 +2698,25 @@ static void __glXReleaseTexImageEXT(Display *dpy,
>  	return;
>  
>  #ifdef GLX_DIRECT_RENDERING
> -    if (gc->driContext)
> +    if (gc->driContext) {
> +	__GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
> +
> +	if (pdraw != NULL) {
> +	    if (pdraw->psc->texBuffer->base.version >= 3) {
> +		if (pdraw->psc->texBuffer->unsetTexBuffer2 != NULL) {
> +		    (*pdraw->psc->texBuffer->unsetTexBuffer2)(gc->__driContext,
> +							pdraw->textureTarget,
> +							pdraw->driDrawable);
> +	    	} else if (pdraw->psc->texBuffer->unsetTexBuffer != NULL) {
> +		    (*pdraw->psc->texBuffer->unsetTexBuffer)(gc->__driContext,
> +						       pdraw->textureTarget,
> +						       pdraw->driDrawable);
> +		}
> +	    }

If pdraw->psc->texBuffer->base.version < 3, then the unsetTexBuffer hook
doesn't exist, so you can't call it.

> +	}
>  	return;
> +    }
> +
>  #endif
>  
>      opcode = __glXSetupForCommand(dpy);
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
> index 9904e34..1b7ae94 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -212,6 +212,8 @@ static const __DRItexBufferExtension intelTexBufferExtension = {
>      { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
>     intelSetTexBuffer,
>     intelSetTexBuffer2,
> +   intelUnsetTexBuffer,
> +   intelUnsetTexBuffer2,
>  };
>  
>  static const __DRIextension *intelScreenExtensions[] = {
> diff --git a/src/mesa/drivers/dri/intel/intel_tex.h b/src/mesa/drivers/dri/intel/intel_tex.h
> index f5372d8..f299b72 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex.h
> +++ b/src/mesa/drivers/dri/intel/intel_tex.h
> @@ -149,9 +149,16 @@ void intelSetTexOffset(__DRIcontext *pDRICtx, GLint texname,
>  		       unsigned long long offset, GLint depth, GLuint pitch);
>  void intelSetTexBuffer(__DRIcontext *pDRICtx,
>  		       GLint target, __DRIdrawable *pDraw);
> +
> +void intelUnsetTexBuffer(__DRIcontext *pDRICtx,
> +		       GLint target, __DRIdrawable *pDraw);
> +
>  void intelSetTexBuffer2(__DRIcontext *pDRICtx,
>  			GLint target, GLint format, __DRIdrawable *pDraw);
>  
> +void intelUnsetTexBuffer2(__DRIcontext *pDRICtx,
> +			GLint target, __DRIdrawable *pDraw);
> +
>  GLuint intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit);
>  
>  void intel_tex_map_level_images(struct intel_context *intel,
> diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
> index ddbb13e..b17e5ff 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex_image.c
> +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
> @@ -795,6 +795,42 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
>  }
>  
>  void
> +intelUnsetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
> +		   __DRIdrawable *dPriv)
> +{
> +   struct intel_context *intel = pDRICtx->driverPrivate;
> +   struct intel_texture_object *intelObj;
> +   struct intel_texture_image *intelImage;
> +   struct gl_texture_unit *texUnit;
> +   struct gl_texture_object *texObj;
> +   struct gl_texture_image *texImage;
> +   int level = 0;
> +
> +   texUnit = &intel->ctx.Texture.Unit[intel->ctx.Texture.CurrentUnit];
> +   texObj = _mesa_select_tex_object(&intel->ctx, texUnit, target);
> +   intelObj = intel_texture_object(texObj);
> +
> +   if (!intelObj)
> +      return;
> +
> +   _mesa_lock_texture(&intel->ctx, texObj);
> +
> +   texImage = _mesa_get_tex_image(&intel->ctx, texObj, target, level);
> +   intelImage = intel_texture_image(texImage);
> +
> +   if (intelImage->mt) {
> +      intel_miptree_release(intel, &intelImage->mt);
> +      intelImage->mt = NULL;
> +   }
> +   if (intelObj->mt) {
> +      intel_miptree_release(intel, &intelObj->mt);
> +      intelObj->mt = NULL;
> +   }
> +
> +   _mesa_unlock_texture(&intel->ctx, texObj);
> +}
> +
> +void
>  intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
>  {
>     /* The old interface didn't have the format argument, so copy our
> @@ -802,3 +838,9 @@ intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
>      */
>     intelSetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
>  }
> +
> +void
> +intelUnsetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
> +{
> +   intelUnsetTexBuffer2(pDRICtx, target, dPriv);
> +}

Cheers,
Julien



More information about the Intel-gfx mailing list