[Mesa-dev] [PATCH 13/16] meta: Track temporary textures using gl_texture_object instead of GL API object handle

Tapani Pälli tapani.palli at intel.com
Fri Dec 22 05:31:19 UTC 2017



On 19.12.2017 02:14, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>   src/mesa/drivers/common/meta.c      | 43 ++++++++++++++++++++++++++-----------
>   src/mesa/drivers/common/meta.h      |  2 +-
>   src/mesa/drivers/common/meta_blit.c |  8 ++++---
>   3 files changed, 36 insertions(+), 17 deletions(-)
> 
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 52d959a..be490d5 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -1228,6 +1228,8 @@ invert_z(GLfloat normZ)
>   static void
>   init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
>   {
> +   GLuint texObj;
> +

this declaration could've been moved closer to the usage but since it's 
removed later ... it does not really matter :)

>      /* prefer texture rectangle */
>      if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle) {
>         tex->Target = GL_TEXTURE_RECTANGLE;
> @@ -1243,16 +1245,22 @@ init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
>      tex->MinSize = 16;  /* 16 x 16 at least */
>      assert(tex->MaxSize > 0);
>   
> -   _mesa_GenTextures(1, &tex->TexObj);
> +   _mesa_GenTextures(1, &texObj);
> +   tex->tex_obj = NULL;
> +
> +   if (texObj == 0)
> +      return;
> +
> +   tex->tex_obj = _mesa_lookup_texture(ctx, texObj);
>   }
>   
>   static void
>   cleanup_temp_texture(struct temp_texture *tex)
>   {
> -   if (!tex->TexObj)
> +   if (tex->tex_obj == NULL)
>        return;
> -   _mesa_DeleteTextures(1, &tex->TexObj);
> -   tex->TexObj = 0;
> +   _mesa_DeleteTextures(1, &tex->tex_obj->Name);
> +   tex->tex_obj = NULL;
>   }
>   
>   
> @@ -1265,7 +1273,7 @@ _mesa_meta_get_temp_texture(struct gl_context *ctx)
>   {
>      struct temp_texture *tex = &ctx->Meta->TempTex;
>   
> -   if (!tex->TexObj) {
> +   if (tex->tex_obj == NULL) {
>         init_temp_texture(ctx, tex);
>      }
>   
> @@ -1283,7 +1291,7 @@ get_bitmap_temp_texture(struct gl_context *ctx)
>   {
>      struct temp_texture *tex = &ctx->Meta->Bitmap.Tex;
>   
> -   if (!tex->TexObj) {
> +   if (tex->tex_obj == NULL) {
>         init_temp_texture(ctx, tex);
>      }
>   
> @@ -1299,7 +1307,7 @@ _mesa_meta_get_temp_depth_texture(struct gl_context *ctx)
>   {
>      struct temp_texture *tex = &ctx->Meta->Blit.depthTex;
>   
> -   if (!tex->TexObj) {
> +   if (tex->tex_obj == NULL) {
>         init_temp_texture(ctx, tex);
>      }
>   
> @@ -1378,9 +1386,11 @@ _mesa_meta_setup_copypix_texture(struct gl_context *ctx,
>   {
>      bool newTex;
>   
> -   _mesa_BindTexture(tex->Target, tex->TexObj);
> -   _mesa_TexParameteri(tex->Target, GL_TEXTURE_MIN_FILTER, filter);
> -   _mesa_TexParameteri(tex->Target, GL_TEXTURE_MAG_FILTER, filter);
> +   _mesa_BindTexture(tex->Target, tex->tex_obj->Name);
> +   _mesa_texture_parameteriv(ctx, tex->tex_obj, GL_TEXTURE_MIN_FILTER,
> +                             (GLint *) &filter, false);
> +   _mesa_texture_parameteriv(ctx, tex->tex_obj, GL_TEXTURE_MAG_FILTER,
> +                             (GLint *) &filter, false);
>      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
>   
>      newTex = _mesa_meta_alloc_texture(tex, width, height, intFormat);
> @@ -1422,9 +1432,16 @@ _mesa_meta_setup_drawpix_texture(struct gl_context *ctx,
>                                    GLenum format, GLenum type,
>                                    const GLvoid *pixels)
>   {
> -   _mesa_BindTexture(tex->Target, tex->TexObj);
> -   _mesa_TexParameteri(tex->Target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> -   _mesa_TexParameteri(tex->Target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> +   /* GLint so the compiler won't complain about type signedness mismatch in
> +    * the call to _mesa_texture_parameteriv below.
> +    */
> +   static const GLint filter = GL_NEAREST;
> +
> +   _mesa_BindTexture(tex->Target, tex->tex_obj->Name);
> +   _mesa_texture_parameteriv(ctx, tex->tex_obj, GL_TEXTURE_MIN_FILTER, &filter,
> +                             false);
> +   _mesa_texture_parameteriv(ctx, tex->tex_obj, GL_TEXTURE_MAG_FILTER, &filter,
> +                             false);
>      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
>   
>      /* copy pixel data to texture */
> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
> index 252b236..6d51854 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -200,7 +200,7 @@ struct save_state
>    */
>   struct temp_texture
>   {
> -   GLuint TexObj;
> +   struct gl_texture_object *tex_obj;
>      GLenum Target;         /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */
>      GLsizei MinSize;       /**< Min texture size to allocate */
>      GLsizei MaxSize;       /**< Max possible texture size */
> diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
> index 0c08109..95dfa64 100644
> --- a/src/mesa/drivers/common/meta_blit.c
> +++ b/src/mesa/drivers/common/meta_blit.c
> @@ -674,7 +674,7 @@ blitframebuffer_texture(struct gl_context *ctx,
>         }
>   
>         srcLevel = 0;
> -      texObj = _mesa_lookup_texture(ctx, meta_temp_texture->TexObj);
> +      texObj = meta_temp_texture->tex_obj;
>         if (texObj == NULL) {
>            return false;
>         }
> @@ -1056,8 +1056,10 @@ _mesa_meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit)
>      _mesa_meta_blit_shader_table_cleanup(ctx, &blit->shaders_with_depth);
>      _mesa_meta_blit_shader_table_cleanup(ctx, &blit->shaders_without_depth);
>   
> -   _mesa_DeleteTextures(1, &blit->depthTex.TexObj);
> -   blit->depthTex.TexObj = 0;
> +   if (blit->depthTex.tex_obj != NULL) {
> +      _mesa_DeleteTextures(1, &blit->depthTex.tex_obj->Name);
> +      blit->depthTex.tex_obj = NULL;
> +   }
>   }
>   
>   void
> 


More information about the mesa-dev mailing list