[Mesa-dev] [PATCH v2 1/6] i965: Use SURF_INDEX_DRAW() for drawbuffer binding table indices.

Paul Berry stereotype441 at gmail.com
Tue Aug 20 09:49:13 PDT 2013


On 18 August 2013 22:15, Kenneth Graunke <kenneth at whitecape.org> wrote:

> SURF_INDEX_DRAW() has been the identity function since the dawn of time,
> and both the shader code and binding table upload code relied on that,
> simply using X rather than SURF_INDEX_DRAW(X).
>
> Even if that continues to be true, using the macro clarifies the code.
>
> The comment about draw buffers needing to be first in order for
> headerless render target writes to work turned out to be wrong; with
> this change, SURF_INDEX_DRAW can be changed to arbitrary indices and
> everything continues working.
>
> The confusion was over the "Render Target Index" field in the FB write
> message header.  If it were a binding table index, then RT 0 would have
> to be at index 0 for headerless FB writes to work.  However, it's
> actually an index into the blend state table, so there's no problem.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Paul Berry <stereotype441 at gmail.com>
>

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


> ---
>  src/mesa/drivers/dri/i965/brw_context.h           |  4 ----
>  src/mesa/drivers/dri/i965/brw_fs_emit.cpp         |  2 +-
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c  | 12 ++++++------
>  src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 14 ++++++++------
>  4 files changed, 15 insertions(+), 17 deletions(-)
>
> In order to fix the comment as Paul requested, I had to do some digging.
> The end result was discovering that the comment was entirely wrong - the
> only reason SURF_INDEX_DRAW had to be the identity function was that we
> weren't calling it.  With that fixed, it can be arbitrary, so there's
> no need for the comment at all.
>
> I did try totally scrambling the order of the binding table indexes
> after applying the patch, and there were no Piglit regressions on IVB.
> So I'm confident that it works (at least on Gen7+).
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
> index acd8e3f..e0deee0 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -602,10 +602,6 @@ struct brw_vs_prog_data {
>   *    |   : |     :                   |
>   *    |  63 | SOL Binding 63          |
>   *    +-----+-------------------------+
> - *
> - * Note that nothing actually uses the SURF_INDEX_DRAW macro, so it has
> to be
> - * the identity function or things will break.  We do want to keep draw
> buffers
> - * first so we can use headerless render target writes for RT 0.
>   */
>  #define SURF_INDEX_DRAW(d)           (d)
>  #define SURF_INDEX_FRAG_CONST_BUFFER (BRW_MAX_DRAW_BUFFERS + 1)
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> index 4225922..b90cf0f 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> @@ -170,7 +170,7 @@ fs_generator::generate_fb_write(fs_inst *inst)
>                 inst->base_mrf,
>                 implied_header,
>                 msg_control,
> -               inst->target,
> +               SURF_INDEX_DRAW(inst->target),
>                 inst->mlen,
>                 0,
>                 eot,
> 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 8847f91..16579f9 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -533,8 +533,8 @@ brw_update_null_renderbuffer_surface(struct
> brw_context *brw, unsigned int unit)
>     /* _NEW_BUFFERS */
>     const struct gl_framebuffer *fb = ctx->DrawBuffer;
>
> -   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         6 * 4, 32, &brw->wm.surf_offset[unit]);
> +   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32,
> +                          &brw->wm.surf_offset[SURF_INDEX_DRAW(unit)]);
>
>     if (fb->Visual.samples > 1) {
>        /* On Gen6, null render targets seem to cause GPU hangs when
> @@ -587,7 +587,7 @@ brw_update_null_renderbuffer_surface(struct
> brw_context *brw, unsigned int unit)
>
>     if (bo) {
>        drm_intel_bo_emit_reloc(brw->batch.bo,
> -                              brw->wm.surf_offset[unit] + 4,
> +                              brw->wm.surf_offset[SURF_INDEX_DRAW(unit)]
> + 4,
>                                bo, 0,
>                                I915_GEM_DOMAIN_RENDER,
> I915_GEM_DOMAIN_RENDER);
>     }
> @@ -635,8 +635,8 @@ brw_update_renderbuffer_surface(struct brw_context
> *brw,
>
>     region = irb->mt->region;
>
> -   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                         6 * 4, 32, &brw->wm.surf_offset[unit]);
> +   surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32,
> +                          &brw->wm.surf_offset[SURF_INDEX_DRAW(unit)]);
>
>     format = brw->render_target_format[rb_format];
>     if (unlikely(!brw->format_supported_as_render_target[rb_format])) {
> @@ -692,7 +692,7 @@ brw_update_renderbuffer_surface(struct brw_context
> *brw,
>     }
>
>     drm_intel_bo_emit_reloc(brw->batch.bo,
> -                          brw->wm.surf_offset[unit] + 4,
> +                          brw->wm.surf_offset[SURF_INDEX_DRAW(unit)] + 4,
>                            region->bo,
>                            surf[1] - region->bo->offset,
>                            I915_GEM_DOMAIN_RENDER,
> 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 34cf63b..cdd2242 100644
> --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
> @@ -475,8 +475,8 @@ gen7_update_null_renderbuffer_surface(struct
> brw_context *brw, unsigned unit)
>     /* _NEW_BUFFERS */
>     const struct gl_framebuffer *fb = ctx->DrawBuffer;
>
> -   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                                   8 * 4, 32, &brw->wm.surf_offset[unit]);
> +   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 8 * 4,
> 32,
> +
>  &brw->wm.surf_offset[SURF_INDEX_DRAW(unit)]);
>     memset(surf, 0, 8 * 4);
>
>     /* From the Ivybridge PRM, Volume 4, Part 1, page 65,
> @@ -518,8 +518,10 @@ gen7_update_renderbuffer_surface(struct brw_context
> *brw,
>     GLenum gl_target = rb->TexImage ?
>                           rb->TexImage->TexObject->Target : GL_TEXTURE_2D;
>
> -   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
> -                                    8 * 4, 32,
> &brw->wm.surf_offset[unit]);
> +   uint32_t surf_index = SURF_INDEX_DRAW(unit);
> +
> +   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 8 * 4,
> 32,
> +                                    &brw->wm.surf_offset[surf_index]);
>     memset(surf, 0, 8 * 4);
>
>     intel_miptree_used_for_rendering(irb->mt);
> @@ -588,7 +590,7 @@ gen7_update_renderbuffer_surface(struct brw_context
> *brw,
>               (depth - 1) << GEN7_SURFACE_RENDER_TARGET_VIEW_EXTENT_SHIFT;
>
>     if (irb->mt->mcs_mt) {
> -      gen7_set_surface_mcs_info(brw, surf, brw->wm.surf_offset[unit],
> +      gen7_set_surface_mcs_info(brw, surf,
> brw->wm.surf_offset[surf_index],
>                                  irb->mt->mcs_mt, true /* is RT */);
>     }
>
> @@ -602,7 +604,7 @@ gen7_update_renderbuffer_surface(struct brw_context
> *brw,
>     }
>
>     drm_intel_bo_emit_reloc(brw->batch.bo,
> -                          brw->wm.surf_offset[unit] + 4,
> +                          brw->wm.surf_offset[surf_index] + 4,
>                            region->bo,
>                            surf[1] - region->bo->offset,
>                            I915_GEM_DOMAIN_RENDER,
> --
> 1.8.3.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130820/3977a59a/attachment-0001.html>


More information about the mesa-dev mailing list