[Mesa-dev] [PATCH 1/7] i965: Move texture buffer dispatch into single location

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu May 7 07:36:12 PDT 2015


On Thu, May 07, 2015 at 05:15:35PM +0300, Francisco Jerez wrote:
> From: Topi Pohjolainen <topi.pohjolainen at intel.com>
> 
> All generations do the same exact dispatch and it could be
> therefore done in the hardware independent stage.
> 
> Reviewed-by: Matt Turner <mattst88 at gmail.com>
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> [ Francisco Jerez: Non-trivial rebase. ]
> Reviewed-by: Francisco Jerez <currojerez at riseup.net>
> ---
>  src/mesa/drivers/dri/i965/brw_context.h           |  3 -
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c  | 31 ++++++----
>  src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 69 +++++++++++------------
>  src/mesa/drivers/dri/i965/gen8_surface_state.c    | 67 ++++++++++------------
>  4 files changed, 83 insertions(+), 87 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 2fcdcfa..a6282f4 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1698,9 +1698,6 @@ void brw_create_constant_surface(struct brw_context *brw,
>                                   uint32_t size,
>                                   uint32_t *out_offset,
>                                   bool dword_pitch);
> -void brw_update_buffer_texture_surface(struct gl_context *ctx,
> -                                       unsigned unit,
> -                                       uint32_t *surf_offset);
>  void
>  brw_update_sol_surface(struct brw_context *brw,
>                         struct gl_buffer_object *buffer_obj,
> 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 160dd2f..2b8040c 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -274,10 +274,10 @@ gen4_emit_buffer_surface_state(struct brw_context *brw,
>     }
>  }
>  
> -void
> -brw_update_buffer_texture_surface(struct gl_context *ctx,
> -                                  unsigned unit,
> -                                  uint32_t *surf_offset)
> +static void
> +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;
> @@ -320,12 +320,6 @@ brw_update_texture_surface(struct gl_context *ctx,
>     struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
>     uint32_t *surf;
>  
> -   /* BRW_NEW_TEXTURE_BUFFER */
> -   if (tObj->Target == GL_TEXTURE_BUFFER) {
> -      brw_update_buffer_texture_surface(ctx, unit, surf_offset);
> -      return;
> -   }
> -
>     surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
>  			  6 * 4, 32, surf_offset);
>  
> @@ -795,6 +789,21 @@ const struct brw_tracked_state gen6_renderbuffer_surfaces = {
>     .emit = update_renderbuffer_surfaces,
>  };
>  
> +static void
> +update_texture_surface(struct gl_context *ctx,
> +                       unsigned unit,
> +                       uint32_t *surf_offset,
> +                       bool for_gather)
> +{
> +   struct brw_context *brw = brw_context(ctx);
> +   struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current;
> +
> +   if (obj->Target == GL_TEXTURE_BUFFER) {
> +      update_buffer_texture_surface(ctx, unit, surf_offset);

In order to avoid extra level of indentation I used the following. I would
have preferred it here also.

      if (obj->Target == GL_TEXTURE_BUFFER) {
         update_buffer_texture_surface(ctx, unit, surf_offset);
         return;
      }

> +   } else {
> +      brw->vtbl.update_texture_surface(ctx, unit, surf_offset, for_gather);
> +   }
> +}
>  
>  static void
>  update_stage_texture_surfaces(struct brw_context *brw,
> @@ -824,7 +833,7 @@ update_stage_texture_surfaces(struct brw_context *brw,
>  
>           /* _NEW_TEXTURE */
>           if (ctx->Texture.Unit[unit]._Current) {
> -            brw->vtbl.update_texture_surface(ctx, unit, surf_offset + s, for_gather);
> +            update_texture_surface(ctx, unit, surf_offset + s, for_gather);
>           }
>        }
>     }
> diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> index 15ab2b0..098b5c8 100644
> --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> @@ -356,43 +356,38 @@ gen7_update_texture_surface(struct gl_context *ctx,
>     struct brw_context *brw = brw_context(ctx);
>     struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current;
>  
> -   if (obj->Target == GL_TEXTURE_BUFFER) {
> -      brw_update_buffer_texture_surface(ctx, unit, surf_offset);
> -
> -   } else {
> -      struct intel_texture_object *intel_obj = intel_texture_object(obj);
> -      struct intel_mipmap_tree *mt = intel_obj->mt;
> -      struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> -      /* If this is a view with restricted NumLayers, then our effective depth
> -       * is not just the miptree depth.
> -       */
> -      const unsigned depth = (obj->Immutable && obj->Target != GL_TEXTURE_3D ?
> -                              obj->NumLayers : mt->logical_depth0);
> -
> -      /* Handling GL_ALPHA as a surface format override breaks 1.30+ style
> -       * texturing functions that return a float, as our code generation always
> -       * selects the .x channel (which would always be 0).
> -       */
> -      struct gl_texture_image *firstImage = obj->Image[0][obj->BaseLevel];
> -      const bool alpha_depth = obj->DepthMode == GL_ALPHA &&
> -         (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||
> -          firstImage->_BaseFormat == GL_DEPTH_STENCIL);
> -      const unsigned swizzle = (unlikely(alpha_depth) ? SWIZZLE_XYZW :
> -                                brw_get_texture_swizzle(&brw->ctx, obj));
> -
> -      unsigned format = translate_tex_format(
> -         brw, intel_obj->_Format, sampler->sRGBDecode);
> -
> -      if (for_gather && format == BRW_SURFACEFORMAT_R32G32_FLOAT)
> -         format = BRW_SURFACEFORMAT_R32G32_FLOAT_LD;
> -
> -      gen7_emit_texture_surface_state(brw, mt, obj->Target,
> -                                      obj->MinLayer, obj->MinLayer + depth,
> -                                      obj->MinLevel + obj->BaseLevel,
> -                                      obj->MinLevel + intel_obj->_MaxLevel + 1,
> -                                      format, swizzle,
> -                                      surf_offset, false, for_gather);
> -   }
> +   struct intel_texture_object *intel_obj = intel_texture_object(obj);
> +   struct intel_mipmap_tree *mt = intel_obj->mt;
> +   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> +   /* If this is a view with restricted NumLayers, then our effective depth
> +    * is not just the miptree depth.
> +    */
> +   const unsigned depth = (obj->Immutable && obj->Target != GL_TEXTURE_3D ?
> +                           obj->NumLayers : mt->logical_depth0);
> +
> +   /* Handling GL_ALPHA as a surface format override breaks 1.30+ style
> +    * texturing functions that return a float, as our code generation always
> +    * selects the .x channel (which would always be 0).
> +    */
> +   struct gl_texture_image *firstImage = obj->Image[0][obj->BaseLevel];
> +   const bool alpha_depth = obj->DepthMode == GL_ALPHA &&
> +      (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||
> +       firstImage->_BaseFormat == GL_DEPTH_STENCIL);
> +   const unsigned swizzle = (unlikely(alpha_depth) ? SWIZZLE_XYZW :
> +                             brw_get_texture_swizzle(&brw->ctx, obj));
> +
> +   unsigned format = translate_tex_format(
> +      brw, intel_obj->_Format, sampler->sRGBDecode);
> +
> +   if (for_gather && format == BRW_SURFACEFORMAT_R32G32_FLOAT)
> +      format = BRW_SURFACEFORMAT_R32G32_FLOAT_LD;
> +
> +   gen7_emit_texture_surface_state(brw, mt, obj->Target,
> +                                   obj->MinLayer, obj->MinLayer + depth,
> +                                   obj->MinLevel + obj->BaseLevel,
> +                                   obj->MinLevel + intel_obj->_MaxLevel + 1,
> +                                   format, swizzle,
> +                                   surf_offset, false, for_gather);
>  }
>  
>  /**
> diff --git a/src/mesa/drivers/dri/i965/gen8_surface_state.c b/src/mesa/drivers/dri/i965/gen8_surface_state.c
> index d0c2d80..2f9b98e 100644
> --- a/src/mesa/drivers/dri/i965/gen8_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/gen8_surface_state.c
> @@ -255,44 +255,39 @@ gen8_update_texture_surface(struct gl_context *ctx,
>     struct brw_context *brw = brw_context(ctx);
>     struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current;
>  
> -   if (obj->Target == GL_TEXTURE_BUFFER) {
> -      brw_update_buffer_texture_surface(ctx, unit, surf_offset);
> +   struct gl_texture_image *firstImage = obj->Image[0][obj->BaseLevel];
> +   struct intel_texture_object *intel_obj = intel_texture_object(obj);
> +   struct intel_mipmap_tree *mt = intel_obj->mt;
> +   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> +   /* If this is a view with restricted NumLayers, then our effective depth
> +    * is not just the miptree depth.
> +    */
> +   const unsigned depth = (obj->Immutable && obj->Target != GL_TEXTURE_3D ?
> +                           obj->NumLayers : mt->logical_depth0);
>  
> -   } else {
> -      struct gl_texture_image *firstImage = obj->Image[0][obj->BaseLevel];
> -      struct intel_texture_object *intel_obj = intel_texture_object(obj);
> -      struct intel_mipmap_tree *mt = intel_obj->mt;
> -      struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> -      /* If this is a view with restricted NumLayers, then our effective depth
> -       * is not just the miptree depth.
> -       */
> -      const unsigned depth = (obj->Immutable && obj->Target != GL_TEXTURE_3D ?
> -                              obj->NumLayers : mt->logical_depth0);
> -
> -      /* Handling GL_ALPHA as a surface format override breaks 1.30+ style
> -       * texturing functions that return a float, as our code generation always
> -       * selects the .x channel (which would always be 0).
> -       */
> -      const bool alpha_depth = obj->DepthMode == GL_ALPHA &&
> -         (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||
> -          firstImage->_BaseFormat == GL_DEPTH_STENCIL);
> -      const unsigned swizzle = (unlikely(alpha_depth) ? SWIZZLE_XYZW :
> -                                brw_get_texture_swizzle(&brw->ctx, obj));
> -
> -      unsigned format = translate_tex_format(brw, intel_obj->_Format,
> -                                             sampler->sRGBDecode);
> -      if (obj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
> -         mt = mt->stencil_mt;
> -         format = BRW_SURFACEFORMAT_R8_UINT;
> -      }
> -
> -      gen8_emit_texture_surface_state(brw, mt, obj->Target,
> -                                      obj->MinLayer, obj->MinLayer + depth,
> -                                      obj->MinLevel + obj->BaseLevel,
> -                                      obj->MinLevel + intel_obj->_MaxLevel + 1,
> -                                      format, swizzle, surf_offset,
> -                                      false, for_gather);
> +   /* Handling GL_ALPHA as a surface format override breaks 1.30+ style
> +    * texturing functions that return a float, as our code generation always
> +    * selects the .x channel (which would always be 0).
> +    */
> +   const bool alpha_depth = obj->DepthMode == GL_ALPHA &&
> +      (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||
> +       firstImage->_BaseFormat == GL_DEPTH_STENCIL);
> +   const unsigned swizzle = (unlikely(alpha_depth) ? SWIZZLE_XYZW :
> +                             brw_get_texture_swizzle(&brw->ctx, obj));
> +
> +   unsigned format = translate_tex_format(brw, intel_obj->_Format,
> +                                          sampler->sRGBDecode);
> +   if (obj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
> +      mt = mt->stencil_mt;
> +      format = BRW_SURFACEFORMAT_R8_UINT;
>     }
> +
> +   gen8_emit_texture_surface_state(brw, mt, obj->Target,
> +                                   obj->MinLayer, obj->MinLayer + depth,
> +                                   obj->MinLevel + obj->BaseLevel,
> +                                   obj->MinLevel + intel_obj->_MaxLevel + 1,
> +                                   format, swizzle, surf_offset,
> +                                   false, for_gather);
>  }
>  
>  /**
> -- 
> 2.3.5
> 


More information about the mesa-dev mailing list