[Mesa-dev] [PATCH] i965: Program the dynamic state heap size to MAX_STATE_SIZE.

Jordan Justen jordan.l.justen at intel.com
Wed Nov 29 09:57:13 UTC 2017


Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

On 2017-11-29 01:08:23, Kenneth Graunke wrote:
> STATE_BASE_ADDRESS specifies a maximum size of the dynamic state
> section, beyond which data supposedly reads back as 0.  On Gen8+,
> we were programming it to the size of the buffer.  This worked fine
> until we started growing the state buffer in commit 2dfc119f22f25708.
> When the state buffer grows, the value in STATE_BASE_ADDRESS becomes
> too small, and our state beyond STATE_SZ bytes would read back as 0.
> 
> To avoid having to update the value, we program it to MAX_STATE_SIZE.
> We used to program the upper bound to the maximum on older hardware
> anyway, so programming it too large isn't a big deal.
> 
> Bogus SURFACE_STATE can easily lead to GPU hangs and misrendering.
> DiRT Rally was hitting the statebuffer growth path, and suffered from
> bad texture corruption and GPU hangs (usually around the same time).
> 
> This patch fixes both issues.
> 
> Fixes: 2dfc119f22f257082ab0 "i965: Grow the batch/state buffers if we need space and can't flush."
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103101
> Tested-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_misc_state.c    | 2 +-
>  src/mesa/drivers/dri/i965/intel_batchbuffer.c | 9 ---------
>  src/mesa/drivers/dri/i965/intel_batchbuffer.h | 9 +++++++++
>  3 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c
> index 94d5c9783db..2d7471d40c9 100644
> --- a/src/mesa/drivers/dri/i965/brw_misc_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c
> @@ -641,7 +641,7 @@ brw_upload_state_base_address(struct brw_context *brw)
>        /* General state buffer size */
>        OUT_BATCH(0xfffff001);
>        /* Dynamic state buffer size */
> -      OUT_BATCH(ALIGN(brw->batch.state_bo->size, 4096) | 1);
> +      OUT_BATCH(ALIGN(MAX_STATE_SIZE, 4096) | 1);
>        /* Indirect object upper bound */
>        OUT_BATCH(0xfffff001);
>        /* Instruction access upper bound */
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index 216073129ba..10e33bb8c7b 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -52,15 +52,6 @@
>  #define BATCH_SZ (20 * 1024)
>  #define STATE_SZ (16 * 1024)
>  
> -/* The kernel assumes batchbuffers are smaller than 256kB. */
> -#define MAX_BATCH_SIZE (256 * 1024)
> -
> -/* 3DSTATE_BINDING_TABLE_POINTERS has a U16 offset from Surface State Base
> - * Address, which means that we can't put binding tables beyond 64kB.  This
> - * effectively limits the maximum statebuffer size to 64kB.
> - */
> -#define MAX_STATE_SIZE (64 * 1024)
> -
>  static void
>  intel_batchbuffer_reset(struct brw_context *brw);
>  
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.h b/src/mesa/drivers/dri/i965/intel_batchbuffer.h
> index 5a2649f06f3..e186e29ec67 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.h
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.h
> @@ -10,6 +10,15 @@
>  extern "C" {
>  #endif
>  
> +/* The kernel assumes batchbuffers are smaller than 256kB. */
> +#define MAX_BATCH_SIZE (256 * 1024)
> +
> +/* 3DSTATE_BINDING_TABLE_POINTERS has a U16 offset from Surface State Base
> + * Address, which means that we can't put binding tables beyond 64kB.  This
> + * effectively limits the maximum statebuffer size to 64kB.
> + */
> +#define MAX_STATE_SIZE (64 * 1024)
> +
>  struct intel_batchbuffer;
>  
>  void intel_batchbuffer_init(struct brw_context *brw);
> -- 
> 2.15.0
> 


More information about the mesa-dev mailing list