[Mesa-dev] [PATCH 16/19] i965: Manipulate state batches for HiZ operation meta-ops

Eric Anholt eric at anholt.net
Mon Sep 26 13:15:20 PDT 2011


On Fri, 23 Sep 2011 17:37:46 -0700, Chad Versace <chad at chad-versace.us> wrote:

That's a pretty terse commit message :)

> Signed-off-by: Chad Versace <chad at chad-versace.us>
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c          |    3 ++
>  src/mesa/drivers/dri/i965/gen6_clip_state.c   |   17 +++++++++++++++
>  src/mesa/drivers/dri/i965/gen6_depthstencil.c |   22 +++++++++++++++++-
>  src/mesa/drivers/dri/i965/gen6_sf_state.c     |   16 ++++++++++++-
>  src/mesa/drivers/dri/i965/gen6_wm_state.c     |   28 +++++++++++++++++++++---
>  5 files changed, 78 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/gen6_depthstencil.c b/src/mesa/drivers/dri/i965/gen6_depthstencil.c
> index 5d14147..59f3fe4 100644
> --- a/src/mesa/drivers/dri/i965/gen6_depthstencil.c
> +++ b/src/mesa/drivers/dri/i965/gen6_depthstencil.c
> @@ -77,10 +77,28 @@ gen6_prepare_depth_stencil_state(struct brw_context *brw)
>     }
>  
>     /* _NEW_DEPTH */
> -   if (ctx->Depth.Test) {
> -      ds->ds2.depth_test_enable = 1;
> +   if (ctx->Depth.Test || brw->hiz.op != 0) {
>        ds->ds2.depth_test_func = intel_translate_compare_func(ctx->Depth.Func);
>        ds->ds2.depth_write_enable = ctx->Depth.Mask;
> +
> +      /* See the following sections of the Sandy Bridge PRM, Volume 1, Part2:
> +       *   - 7.5.3.1 Depth Buffer Clear
> +       *   - 7.5.3.2 Depth Buffer Resolve
> +       *   - 7.5.3.3 Hierarchical Depth Buffer Resolve
> +       */
> +      switch (brw->hiz.op) {
> +      case BRW_HIZ_OP_NONE:
> +      case BRW_HIZ_OP_DEPTH_RESOLVE:
> +         ds->ds2.depth_test_enable = 1;
> +         break;
> +      case BRW_HIZ_OP_DEPTH_CLEAR:
> +      case BRW_HIZ_OP_HIZ_RESOLVE:
> +         ds->ds2.depth_test_enable = 0;
> +         break;
> +      default:
> +         assert(0);
> +         break;
> +      }

Isn't the metaop already ensuring that the depth test is
enabled/disabled as appropriate?

> diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> index 5cbfe78..bdd02ed 100644
> --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> @@ -149,8 +149,20 @@ upload_sf_state(struct brw_context *brw)
>        num_outputs << GEN6_SF_NUM_OUTPUTS_SHIFT |
>        urb_entry_read_length << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT |
>        urb_entry_read_offset << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT;
> -   dw2 = GEN6_SF_VIEWPORT_TRANSFORM_ENABLE |
> -      GEN6_SF_STATISTICS_ENABLE;
> +
> +   dw2 = GEN6_SF_STATISTICS_ENABLE;
> +
> +   /* Enable viewport transform only if no HiZ operation is progress
> +    *
> +    * From page 11 of the SandyBridge PRM, Volume 2, Part 1, Section 1.3, "3D
> +    * Primitives Overview":
> +    *     RECTLIST: Viewport Mapping must be DISABLED (as is typical with the
> +    *     use of screen- space coordinates).
> +    */
> +   if (brw->hiz.op == 0) {
> +      dw2 |= GEN6_SF_VIEWPORT_TRANSFORM_ENABLE;
> +   }

> diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> index 07e9995..bbc421f 100644
> --- a/src/mesa/drivers/dri/i965/gen6_wm_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c
> @@ -144,6 +144,23 @@ upload_wm_state(struct brw_context *brw)
>     dw4 |= (brw->wm.prog_data->first_curbe_grf_16 <<
>  	   GEN6_WM_DISPATCH_START_GRF_SHIFT_2);
>  
> +   switch (brw->hiz.op) {
> +   case BRW_HIZ_OP_NONE:
> +      break;
> +   case BRW_HIZ_OP_DEPTH_CLEAR:
> +      dw4 |= GEN6_WM_DEPTH_CLEAR;
> +      break;
> +   case BRW_HIZ_OP_DEPTH_RESOLVE:
> +      dw4 |= GEN6_WM_DEPTH_RESOLVE;
> +      break;
> +   case BRW_HIZ_OP_HIZ_RESOLVE:
> +      dw4 |= GEN6_WM_HIERARCHICAL_DEPTH_RESOLVE;
> +      break;
> +   default:
> +      assert(0);
> +      break;
> +   }
> +
>     dw5 |= (brw->wm_max_threads - 1) << GEN6_WM_MAX_THREADS_SHIFT;
>  
>     /* CACHE_NEW_WM_PROG */
> @@ -166,15 +183,18 @@ upload_wm_state(struct brw_context *brw)
>     /* BRW_NEW_FRAGMENT_PROGRAM */
>     if (fp->program.Base.InputsRead & (1 << FRAG_ATTRIB_WPOS))
>        dw5 |= GEN6_WM_USES_SOURCE_DEPTH | GEN6_WM_USES_SOURCE_W;
> -   if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH))
> +   if ((fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) &&
> +       !brw->hiz.op)
>        dw5 |= GEN6_WM_COMPUTED_DEPTH;
>  
>     /* _NEW_COLOR */
> -   if (fp->program.UsesKill || ctx->Color.AlphaEnabled)
> +   if ((fp->program.UsesKill || ctx->Color.AlphaEnabled) &&
> +       !brw->hiz.op)
>        dw5 |= GEN6_WM_KILL_ENABLE;
>  
> -   if (brw_color_buffer_write_enabled(brw) ||
> -       dw5 & (GEN6_WM_KILL_ENABLE | GEN6_WM_COMPUTED_DEPTH)) {
> +   if ((brw_color_buffer_write_enabled(brw) ||
> +        (dw5 & (GEN6_WM_KILL_ENABLE | GEN6_WM_COMPUTED_DEPTH))) &&
> +       !brw->hiz.op) {
>        dw5 |= GEN6_WM_DISPATCH_ENABLE;

It looks to me like if the meta code just set up an empty fragment
shader with its VS, none of the hiz.op checks here would be needed.  I
think that would be cleaner.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110926/881eccd6/attachment.pgp>


More information about the mesa-dev mailing list