[Mesa-dev] [PATCH 6/8] [v2] i965: Add Gen9 surface state decoding

Pohjolainen, Topi topi.pohjolainen at intel.com
Mon May 18 01:02:32 PDT 2015


On Fri, May 15, 2015 at 10:06:22PM -0700, Ben Widawsky wrote:
> Gen9 surface state is very similar to the previous generation. The important
> changes here are aux mode, and the way clear colors work.
> 
> NOTE: There are some things intentionally left out of this decoding.
> 
> v2: Redo the string for the aux buffer type to address compressed variants.
> 
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> Cc: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_defines.h    |  2 ++
>  src/mesa/drivers/dri/i965/brw_state_dump.c | 44 ++++++++++++++++++++----------
>  2 files changed, 31 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index 8fd5a49..3a5cb81 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -608,6 +608,8 @@
>  #define GEN8_SURFACE_AUX_MODE_HIZ               3
>  
>  /* Surface state DW7 */
> +#define GEN9_SURFACE_RT_COMPRESSION_SHIFT       30
> +#define GEN9_SURFACE_RT_COMPRESSION_MASK        INTEL_MASK(31, 31)

Your shift is 30 and mask is 31:31. Bit 31 is memory compression mode while
bit 30 is memory compression enable - I guess you meant to use the latter,
so the shift is correct while the mask is not?

>  #define GEN7_SURFACE_CLEAR_COLOR_SHIFT		28
>  #define GEN7_SURFACE_SCS_R_SHIFT                25
>  #define GEN7_SURFACE_SCS_R_MASK                 INTEL_MASK(27, 25)
> diff --git a/src/mesa/drivers/dri/i965/brw_state_dump.c b/src/mesa/drivers/dri/i965/brw_state_dump.c
> index e0245b0..232d0c1 100644
> --- a/src/mesa/drivers/dri/i965/brw_state_dump.c
> +++ b/src/mesa/drivers/dri/i965/brw_state_dump.c
> @@ -66,15 +66,6 @@ static const char *surface_tiling[] = {
>     "Y-tiled"
>  };
>  
> -static const char *surface_aux_mode[] = {
> -   "AUX_NONE",
> -   "AUX_MCS",
> -   "AUX_APPEND",
> -   "AUX_HIZ",
> -   "RSVD",
> -   "RSVD"
> -};
> -
>  static void
>  batch_out(struct brw_context *brw, const char *name, uint32_t offset,
>  	  int index, char *fmt, ...) PRINTFLIKE(5, 6);
> @@ -272,6 +263,22 @@ static void dump_gen8_surface_state(struct brw_context *brw, uint32_t offset)
>  {
>     const char *name = "SURF";
>     uint32_t *surf = brw->batch.bo->virtual + offset;
> +   int aux_mode = surf[6] & INTEL_MASK(2, 0);
> +   const char *aux_str;
> +
> +   if (brw->gen >= 9 && (aux_mode == 1 || aux_mode == 5)) {
> +      bool msrt = GET_BITS(surf[4], 5, 3) > 0;
> +      bool compression = GET_FIELD(surf[7], GEN9_SURFACE_RT_COMPRESSION) == 1;
> +      aux_str = ralloc_asprintf(NULL, "AUX_CCS_%c (%s, MULTISAMPLE_COUNT%c1)",
> +                                (aux_mode == 1) ? 'D' : 'E',
> +                                compression ? "Compressed RT" : "Uncompressed",
> +                                msrt ? '>' : '=');

If you shift one (1 << msrt) you get the actual number of samples. Should we
print that instead? And may be s/MULTISAMPLE_COUNT/SAMPLES/ to shrink the
output a little.

Otherwise this looks good to me:

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

> +   } else {
> +      static const char *surface_aux_mode[] = { "AUX_NONE", "AUX_MCS",
> +                                                "AUX_APPEND", "AUX_HIZ",
> +                                                "RSVD", "RSVD"};
> +      aux_str = ralloc_asprintf(NULL, "%s", surface_aux_mode[aux_mode]);
> +   }
>  
>     batch_out(brw, "SURF'", offset, 0, "%s %s %s VALIGN%d HALIGN%d %s\n",
>               get_965_surfacetype(GET_FIELD(surf[0], BRW_SURFACE_TYPE)),
> @@ -288,7 +295,7 @@ static void dump_gen8_surface_state(struct brw_context *brw, uint32_t offset)
>     batch_out(brw, name, offset, 2, "%dx%d [%s]\n",
>               GET_FIELD(surf[2], GEN7_SURFACE_WIDTH) + 1,
>               GET_FIELD(surf[2], GEN7_SURFACE_HEIGHT) + 1,
> -             surface_aux_mode[surf[6] & INTEL_MASK(2, 0)]);
> +             aux_str);
>     batch_out(brw, name, offset, 3, "%d slices (depth), pitch: %d\n",
>               GET_FIELD(surf[3], BRW_SURFACE_DEPTH) + 1,
>               (surf[3] & INTEL_MASK(17, 0)) + 1);
> @@ -303,14 +310,21 @@ static void dump_gen8_surface_state(struct brw_context *brw, uint32_t offset)
>     batch_out(brw, name, offset, 6, "AUX pitch: %d qpitch: %d\n",
>               GET_FIELD(surf[6], GEN8_SURFACE_AUX_QPITCH) << 2,
>               GET_FIELD(surf[6], GEN8_SURFACE_AUX_PITCH) << 2);
> -   batch_out(brw, name, offset, 7, "Clear color: %c%c%c%c\n",
> -             GET_BITS(surf[7], 31, 31) ? 'R' : '-',
> -             GET_BITS(surf[7], 30, 30) ? 'G' : '-',
> -             GET_BITS(surf[7], 29, 29) ? 'B' : '-',
> -             GET_BITS(surf[7], 28, 28) ? 'A' : '-');
> +   if (brw->gen >= 9) {
> +      batch_out(brw, name, offset, 7, "Clear color: R(%x)G(%x)B(%x)A(%x)\n",
> +                surf[12], surf[13], surf[14], surf[15]);
> +   } else {
> +      batch_out(brw, name, offset, 7, "Clear color: %c%c%c%c\n",
> +                GET_BITS(surf[7], 31, 31) ? 'R' : '-',
> +                GET_BITS(surf[7], 30, 30) ? 'G' : '-',
> +                GET_BITS(surf[7], 29, 29) ? 'B' : '-',
> +                GET_BITS(surf[7], 28, 28) ? 'A' : '-');
> +   }
>  
>     for (int i = 8; i < 12; i++)
>        batch_out(brw, name, offset, i, "0x%08x\n", surf[i]);
> +
> +   ralloc_free((void *)aux_str);
>  }
>  
>  static void
> -- 
> 2.4.1
> 


More information about the mesa-dev mailing list