[Mesa-dev] [PATCH 04/11] i965: Add new intel_set_texture_image_mt() helper

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu May 12 05:23:03 UTC 2016


On Wed, May 11, 2016 at 12:22:37PM -0700, Kristian H?gsberg wrote:
> From: Kristian Høgsberg Kristensen <krh at bitplanet.net>
> 
> This factors out the work of setting up a miptree as the backing for a
> texture image into a new helper.
> ---
>  src/mesa/drivers/dri/i965/intel_tex_image.c | 69 ++++++++++++++++++-----------
>  1 file changed, 42 insertions(+), 27 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
> index 9a40476..b214937 100644
> --- a/src/mesa/drivers/dri/i965/intel_tex_image.c
> +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
> @@ -135,6 +135,33 @@ intelTexImage(struct gl_context * ctx,
>  }
>  
>  
> +static void
> +intel_set_texture_image_mt(struct brw_context *brw,
> +                           struct gl_texture_image *image,
> +                           struct intel_mipmap_tree *mt)
> +
> +{
> +   const uint32_t internal_format = _mesa_get_format_base_format(mt->format);
> +   struct gl_texture_object *texobj = image->TexObject;
> +   struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
> +   struct intel_texture_image *intel_image = intel_texture_image(image);
> +
> +   _mesa_init_teximage_fields(&brw->ctx, image,
> +			      mt->logical_width0, mt->logical_height0, 1,
> +			      0, internal_format, mt->format);

Indentation looks a little odd here.

> +
> +   brw->ctx.Driver.FreeTextureImageBuffer(&brw->ctx, image);
> +
> +   intel_texobj->needs_validate = true;
> +   intel_image->base.RowStride = mt->pitch / mt->cpp;
> +   assert(mt->pitch % mt->cpp == 0);
> +
> +   intel_miptree_reference(&intel_image->mt, mt);
> +
> +   /* Immediately validate the image to the object. */
> +   intel_miptree_reference(&intel_texobj->mt, mt);
> +}
> +
>  /**
>   * Binds a BO to a texture image, as if it was uploaded by glTexImage2D().
>   *
> @@ -154,29 +181,21 @@ intel_set_texture_image_bo(struct gl_context *ctx,
>                             uint32_t layout_flags)
>  {
>     struct brw_context *brw = brw_context(ctx);
> -   struct intel_texture_image *intel_image = intel_texture_image(image);
> -   struct gl_texture_object *texobj = image->TexObject;
> -   struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
>     uint32_t draw_x, draw_y;
> +   struct intel_mipmap_tree *mt;
>  
> -   _mesa_init_teximage_fields(&brw->ctx, image,
> -			      width, height, 1,
> -			      0, internalFormat, format);
> -
> -   ctx->Driver.FreeTextureImageBuffer(ctx, image);
> -
> -   intel_image->mt = intel_miptree_create_for_bo(brw, bo, image->TexFormat,
> -                                                 0, width, height, 1, pitch,
> -                                                 layout_flags);
> -   if (intel_image->mt == NULL)
> +   mt = intel_miptree_create_for_bo(brw, bo, image->TexFormat,
> +                                    0, width, height, 1, pitch,
> +                                    layout_flags);
> +   if (mt == NULL)
>         return;
> -   intel_image->mt->target = target;
> -   intel_image->mt->total_width = width;
> -   intel_image->mt->total_height = height;
> -   intel_image->mt->level[0].slice[0].x_offset = tile_x;
> -   intel_image->mt->level[0].slice[0].y_offset = tile_y;
> +   mt->target = target;
> +   mt->total_width = width;
> +   mt->total_height = height;
> +   mt->level[0].slice[0].x_offset = tile_x;
> +   mt->level[0].slice[0].y_offset = tile_y;
>  
> -   intel_miptree_get_tile_offsets(intel_image->mt, 0, 0, &draw_x, &draw_y);
> +   intel_miptree_get_tile_offsets(mt, 0, 0, &draw_x, &draw_y);
>  
>     /* From "OES_EGL_image" error reporting. We report GL_INVALID_OPERATION
>      * for EGL images from non-tile aligned sufaces in gen4 hw and earlier which has
> @@ -185,18 +204,14 @@ intel_set_texture_image_bo(struct gl_context *ctx,
>     if (!brw->has_surface_tile_offset &&
>         (draw_x != 0 || draw_y != 0)) {
>        _mesa_error(ctx, GL_INVALID_OPERATION, __func__);
> -      intel_miptree_release(&intel_image->mt);
> +      intel_miptree_release(&mt);
>        return;
>     }
>  
> -   intel_texobj->needs_validate = true;
> -
> -   intel_image->mt->offset = offset;
> -   assert(pitch % intel_image->mt->cpp == 0);
> -   intel_image->base.RowStride = pitch / intel_image->mt->cpp;
> +   mt->offset = offset;
>  
> -   /* Immediately validate the image to the object. */
> -   intel_miptree_reference(&intel_texobj->mt, intel_image->mt);
> +   intel_set_texture_image_mt(brw, image, mt);
> +   intel_miptree_release(&mt);

We can drop the reference counter here because we explicitly associated the
miptree with intel_image and intel_texobj in intel_set_texture_image_mt()?

>  }
>  
>  void
> -- 
> 2.5.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list