[Mesa-dev] [PATCH 07/10] i965: Un-hardcode WM binding table from update_texture_surface.

Paul Berry stereotype441 at gmail.com
Fri Aug 24 12:05:14 PDT 2012


On 24 August 2012 03:06, Kenneth Graunke <kenneth at whitecape.org> wrote:

> Currently, we mirror the VS and WM binding tables' texture entries.
> That may not continue to be true, so in preparation, pass in the binding
> table and surface index as arguments.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c  | 24
> +++++++++++++----------
>  src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 20 +++++++++++--------
>  src/mesa/drivers/dri/intel/intel_context.h        |  5 ++++-
>  3 files changed, 30 insertions(+), 19 deletions(-)
>
> 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 220af1b..0c87b84 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -654,12 +654,14 @@ brw_get_surface_num_multisamples(unsigned
> num_samples)
>
>
>  static void
> -brw_update_buffer_texture_surface(struct gl_context *ctx, GLuint unit)
> +brw_update_buffer_texture_surface(struct gl_context *ctx,
> +                                  unsigned unit,
> +                                  uint32_t *binding_table,
> +                                  unsigned surf_index)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct intel_context *intel = &brw->intel;
>     struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> -   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
>     uint32_t *surf;
>     struct intel_buffer_object *intel_obj =
>        intel_buffer_object(tObj->BufferObject);
> @@ -674,7 +676,7 @@ brw_update_buffer_texture_surface(struct gl_context
> *ctx, GLuint unit)
>     }
>
>     surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         6 * 4, 32, &brw->wm.surf_offset[surf_index]);
> +                         6 * 4, 32, &binding_table[surf_index]);
>
>     surf[0] = (BRW_SURFACE_BUFFER << BRW_SURFACE_TYPE_SHIFT |
>               (brw_format_for_mesa_format(format) <<
> BRW_SURFACE_FORMAT_SHIFT));
> @@ -687,7 +689,7 @@ brw_update_buffer_texture_surface(struct gl_context
> *ctx, GLuint unit)
>
>        /* Emit relocation to surface contents. */
>        drm_intel_bo_emit_reloc(brw->intel.batch.bo,
> -                             brw->wm.surf_offset[surf_index] + 4,
> +                             binding_table[surf_index] + 4,
>                               bo, 0, I915_GEM_DOMAIN_SAMPLER, 0);
>
>        int w = intel_obj->Base.Size / texel_size;
> @@ -706,7 +708,10 @@ brw_update_buffer_texture_surface(struct gl_context
> *ctx, GLuint unit)
>  }
>
>  static void
> -brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
> +brw_update_texture_surface(struct gl_context *ctx,
> +                           unsigned unit,
> +                           uint32_t *binding_table,
> +                           unsigned surf_index)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> @@ -714,19 +719,18 @@ brw_update_texture_surface( struct gl_context *ctx,
> GLuint unit )
>     struct intel_mipmap_tree *mt = intelObj->mt;
>     struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
>     struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> -   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
>     uint32_t *surf;
>     int width, height, depth;
>
>     if (tObj->Target == GL_TEXTURE_BUFFER) {
> -      brw_update_buffer_texture_surface(ctx, unit);
> +      brw_update_buffer_texture_surface(ctx, unit, binding_table,
> surf_index);
>        return;
>     }
>
>     intel_miptree_get_dimensions_for_image(firstImage, &width, &height,
> &depth);
>
>     surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         6 * 4, 32, &brw->wm.surf_offset[surf_index]);
> +                         6 * 4, 32, &binding_table[surf_index]);
>
>     surf[0] = (translate_tex_target(tObj->Target) <<
> BRW_SURFACE_TYPE_SHIFT |
>               BRW_SURFACE_MIPMAPLAYOUT_BELOW <<
> BRW_SURFACE_MIPLAYOUT_SHIFT |
> @@ -754,7 +758,7 @@ brw_update_texture_surface( struct gl_context *ctx,
> GLuint unit )
>
>     /* Emit relocation to surface contents */
>     drm_intel_bo_emit_reloc(brw->intel.batch.bo,
> -                          brw->wm.surf_offset[surf_index] + 4,
> +                          binding_table[surf_index] + 4,
>                            intelObj->mt->region->bo,
>                             intelObj->mt->offset,
>                            I915_GEM_DOMAIN_SAMPLER, 0);
> @@ -1242,7 +1246,7 @@ brw_update_texture_surfaces(struct brw_context *brw)
>
>        /* _NEW_TEXTURE */
>        if (texUnit->_ReallyEnabled) {
> -        brw->intel.vtbl.update_texture_surface(ctx, i);
> +        brw->intel.vtbl.update_texture_surface(ctx, i,
> brw->wm.surf_offset, surf);
>        } else {
>           brw->wm.surf_offset[surf] = 0;
>        }
> 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 e0fd390..5a7e214 100644
> --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> @@ -203,11 +203,13 @@ gen7_check_surface_setup(struct gen7_surface_state
> *surf,
>
>
>  static void
> -gen7_update_buffer_texture_surface(struct gl_context *ctx, GLuint unit)
> +gen7_update_buffer_texture_surface(struct gl_context *ctx,
> +                                   unsigned unit,
> +                                   uint32_t *binding_table,
> +                                   unsigned surf_index)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> -   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
>     struct gen7_surface_state *surf;
>     struct intel_buffer_object *intel_obj =
>        intel_buffer_object(tObj->BufferObject);
> @@ -216,7 +218,7 @@ gen7_update_buffer_texture_surface(struct gl_context
> *ctx, GLuint unit)
>     int texel_size = _mesa_get_format_bytes(format);
>
>     surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         sizeof(*surf), 32,
> &brw->wm.surf_offset[surf_index]);
> +                         sizeof(*surf), 32, &binding_table[surf_index]);
>     memset(surf, 0, sizeof(*surf));
>
>     surf->ss0.surface_type = BRW_SURFACE_BUFFER;
>

There's a call to drm_intel_bo_emit_reloc() later in this function that it
looks like you forgot to update.  brw->wm.surf_offset needs to change to
binding_table:

      /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
       * bspec ("Data Cache") says that the data cache does not exist as
       * a separate cache and is just the sampler cache.
       */
      drm_intel_bo_emit_reloc(brw->intel.batch.bo,
                  (brw->wm.surf_offset[surf_index] +
                   offsetof(struct gen7_surface_state, ss1)),
                  bo, 0,
                  I915_GEM_DOMAIN_SAMPLER, 0);

With that fixed, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


> @@ -261,7 +263,10 @@ gen7_update_buffer_texture_surface(struct gl_context
> *ctx, GLuint unit)
>  }
>
>  static void
> -gen7_update_texture_surface(struct gl_context *ctx, GLuint unit)
> +gen7_update_texture_surface(struct gl_context *ctx,
> +                            unsigned unit,
> +                            uint32_t *binding_table,
> +                            unsigned surf_index)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
> @@ -269,12 +274,11 @@ gen7_update_texture_surface(struct gl_context *ctx,
> GLuint unit)
>     struct intel_mipmap_tree *mt = intelObj->mt;
>     struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
>     struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> -   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
>     struct gen7_surface_state *surf;
>     int width, height, depth;
>
>     if (tObj->Target == GL_TEXTURE_BUFFER) {
> -      gen7_update_buffer_texture_surface(ctx, unit);
> +      gen7_update_buffer_texture_surface(ctx, unit, binding_table,
> surf_index);
>        return;
>     }
>
> @@ -285,7 +289,7 @@ gen7_update_texture_surface(struct gl_context *ctx,
> GLuint unit)
>     intel_miptree_get_dimensions_for_image(firstImage, &width, &height,
> &depth);
>
>     surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         sizeof(*surf), 32,
> &brw->wm.surf_offset[surf_index]);
> +                         sizeof(*surf), 32, &binding_table[surf_index]);
>     memset(surf, 0, sizeof(*surf));
>
>     if (mt->align_h == 4)
> @@ -347,7 +351,7 @@ gen7_update_texture_surface(struct gl_context *ctx,
> GLuint unit)
>
>     /* Emit relocation to surface contents */
>     drm_intel_bo_emit_reloc(brw->intel.batch.bo,
> -                          brw->wm.surf_offset[surf_index] +
> +                          binding_table[surf_index] +
>                            offsetof(struct gen7_surface_state, ss1),
>                            intelObj->mt->region->bo, intelObj->mt->offset,
>                            I915_GEM_DOMAIN_SAMPLER, 0);
> diff --git a/src/mesa/drivers/dri/intel/intel_context.h
> b/src/mesa/drivers/dri/intel/intel_context.h
> index 5075601..ce8cf48 100644
> --- a/src/mesa/drivers/dri/intel/intel_context.h
> +++ b/src/mesa/drivers/dri/intel/intel_context.h
> @@ -189,7 +189,10 @@ struct intel_context
>         * Surface state operations (i965+ only)
>         * \{
>         */
> -      void (*update_texture_surface)(struct gl_context *ctx, unsigned
> unit);
> +      void (*update_texture_surface)(struct gl_context *ctx,
> +                                     unsigned unit,
> +                                     uint32_t *binding_table,
> +                                     unsigned surf_index);
>        void (*update_renderbuffer_surface)(struct brw_context *brw,
>                                           struct gl_renderbuffer *rb,
>                                           unsigned unit);
> --
> 1.7.11.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120824/259e4a6c/attachment.html>


More information about the mesa-dev mailing list