[Mesa-dev] [PATCH 2/4] i965: Move buffer texture size calculation into a common helper function.

Nanley Chery nanleychery at gmail.com
Fri May 11 22:54:05 UTC 2018


On Mon, Mar 19, 2018 at 11:26:57AM -0700, Francisco Jerez wrote:
> The buffer texture size calculations (should be easy enough, right?)
> are repeated in three different places, each of them subtly broken in
> a different way.  E.g. the image load/store path was never fixed to
> clamp to MaxTextureBufferSize, and none of them are taking into
> account the buffer offset correctly.  It's easier to fix it all in one
> place.
> 
> Cc: mesa-stable at lists.freedesktop.org

I created a bug so that we remember to add test coverage for this issue:
https://bugs.freedesktop.org/show_bug.cgi?id=106481

> ---
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 54 ++++++++++++++----------
>  1 file changed, 32 insertions(+), 22 deletions(-)

This patch is
Reviewed-by: Nanley Chery <nanley.g.chery at intel.com>

> 
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index caa92d7d878..ed4def9046e 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -629,26 +629,14 @@ brw_emit_buffer_surface_state(struct brw_context *brw,
>                           .mocs = brw_get_bo_mocs(devinfo, bo));
>  }
>  
> -void
> -brw_update_buffer_texture_surface(struct gl_context *ctx,
> -                                  unsigned unit,
> -                                  uint32_t *surf_offset)
> +static unsigned
> +buffer_texture_range_size(struct brw_context *brw,
> +                          struct gl_texture_object *obj)
>  {
> -   struct brw_context *brw = brw_context(ctx);
> -   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> -   struct intel_buffer_object *intel_obj =
> -      intel_buffer_object(tObj->BufferObject);
> -   uint32_t size = tObj->BufferSize;
> -   struct brw_bo *bo = NULL;
> -   mesa_format format = tObj->_BufferObjectFormat;
> -   const enum isl_format isl_format = brw_isl_format_for_mesa_format(format);
> -   int texel_size = _mesa_get_format_bytes(format);
> -
> -   if (intel_obj) {
> -      size = MIN2(size, intel_obj->Base.Size);
> -      bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size,
> -                                  false);
> -   }
> +   assert(obj->Target == GL_TEXTURE_BUFFER);
> +   const unsigned texel_size = _mesa_get_format_bytes(obj->_BufferObjectFormat);
> +   const unsigned buffer_size = (!obj->BufferObject ? 0 :
> +                                 obj->BufferObject->Size);
>  
>     /* The ARB_texture_buffer_specification says:
>      *
> @@ -666,7 +654,28 @@ brw_update_buffer_texture_surface(struct gl_context *ctx,
>      * so that when ISL divides by stride to obtain the number of texels, that
>      * texel count is clamped to MAX_TEXTURE_BUFFER_SIZE.
>      */
> -   size = MIN2(size, ctx->Const.MaxTextureBufferSize * (unsigned) texel_size);
> +   return MIN3((unsigned)obj->BufferSize, buffer_size,
> +               brw->ctx.Const.MaxTextureBufferSize * texel_size);
> +}
> +
> +void
> +brw_update_buffer_texture_surface(struct gl_context *ctx,
> +                                  unsigned unit,
> +                                  uint32_t *surf_offset)
> +{
> +   struct brw_context *brw = brw_context(ctx);
> +   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> +   struct intel_buffer_object *intel_obj =
> +      intel_buffer_object(tObj->BufferObject);
> +   const unsigned size = buffer_texture_range_size(brw, tObj);
> +   struct brw_bo *bo = NULL;
> +   mesa_format format = tObj->_BufferObjectFormat;
> +   const enum isl_format isl_format = brw_isl_format_for_mesa_format(format);
> +   int texel_size = _mesa_get_format_bytes(format);
> +
> +   if (intel_obj)
> +      bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size,
> +                                  false);
>  
>     if (isl_format == ISL_FORMAT_UNSUPPORTED) {
>        _mesa_problem(NULL, "bad format %s for texture buffer\n",
> @@ -1468,7 +1477,7 @@ update_buffer_image_param(struct brw_context *brw,
>                            struct brw_image_param *param)
>  {
>     struct gl_buffer_object *obj = u->TexObj->BufferObject;
> -   const uint32_t size = MIN2((uint32_t)u->TexObj->BufferSize, obj->Size);
> +   const unsigned size = buffer_texture_range_size(brw, u->TexObj);
>     update_default_image_param(brw, u, surface_idx, param);
>  
>     param->size[0] = size / _mesa_get_format_bytes(u->_ActualFormat);
> @@ -1504,10 +1513,11 @@ update_image_surface(struct brw_context *brw,
>              intel_buffer_object(obj->BufferObject);
>           const unsigned texel_size = (format == ISL_FORMAT_RAW ? 1 :
>                                        _mesa_get_format_bytes(u->_ActualFormat));
> +         const unsigned buffer_size = buffer_texture_range_size(brw, obj);
>  
>           brw_emit_buffer_surface_state(
>              brw, surf_offset, intel_obj->buffer, obj->BufferOffset,
> -            format, intel_obj->Base.Size, texel_size,
> +            format, buffer_size, texel_size,
>              access != GL_READ_ONLY ? RELOC_WRITE : 0);
>  
>           update_buffer_image_param(brw, u, surface_idx, param);
> -- 
> 2.16.1
> 


More information about the mesa-dev mailing list