[Mesa-dev] [PATCH v3 1/7] i965: define astx5x5 workaround infrastructure

Jason Ekstrand jason at jlekstrand.net
Tue Mar 6 15:58:41 UTC 2018


On Tue, Feb 27, 2018 at 1:30 AM, <kevin.rogovin at intel.com> wrote:

> From: Kevin Rogovin <kevin.rogovin at intel.com>
>
> Gen9 GPU's suffer from a HW bug where the GPU will hang if
> the GPU accesses a texture with a an auxilary buffer and
> an ASTC5x5 texture without having a pipeline cs stall (and
> texture cache flush) between such accesses. This patch
> creates the infrastucture to track such potential texture
> accesses and to issue the required pipeline stalls.
>
> Signed-off-by: Kevin Rogovin <kevin.rogovin at intel.com>
> ---
>  src/mesa/drivers/dri/i965/Makefile.sources    |  1 +
>  src/mesa/drivers/dri/i965/brw_context.c       |  6 +++++
>  src/mesa/drivers/dri/i965/brw_context.h       | 24 ++++++++++++++++++
>  src/mesa/drivers/dri/i965/gen9_astc5x5_wa.c   | 36
> +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/intel_batchbuffer.c |  1 +
>  src/mesa/drivers/dri/i965/meson.build         |  1 +
>  6 files changed, 69 insertions(+)
>  create mode 100644 src/mesa/drivers/dri/i965/gen9_astc5x5_wa.c
>
> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources
> b/src/mesa/drivers/dri/i965/Makefile.sources
> index 2f349aa..20f7dee 100644
> --- a/src/mesa/drivers/dri/i965/Makefile.sources
> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
> @@ -78,6 +78,7 @@ i965_FILES = \
>         gen7_urb.c \
>         gen8_depth_state.c \
>         gen8_multisample_state.c \
> +        gen9_astc5x5_wa.c \
>         hsw_queryobj.c \
>         hsw_sol.c \
>         intel_batchbuffer.c \
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c
> b/src/mesa/drivers/dri/i965/brw_context.c
> index ea1c78d..a6e95b2 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -1058,6 +1058,12 @@ brwCreateContext(gl_api api,
>     if (ctx->Extensions.INTEL_performance_query)
>        brw_init_performance_queries(brw);
>
> +   brw->astc5x5_wa.required = (devinfo->gen == 9);
> +   brw->astc5x5_wa.mode = BRW_ASTC5x5_WA_MODE_NONE;
> +   brw->astc5x5_wa.texture_astc5x5_present = false;
> +   brw->astc5x5_wa.texture_with_auxilary_present = false;
> +   brw->astc5x5_wa.blorp_sampling_from_astc5x5 = false;
> +
>     vbo_use_buffer_objects(ctx);
>     vbo_always_unmap_buffers(ctx);
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
> index 050b656..5fe0b29 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -166,6 +166,12 @@ enum brw_cache_id {
>     BRW_MAX_CACHE
>  };
>
> +enum brw_astc5x5_wa_mode_t {
> +   BRW_ASTC5x5_WA_MODE_NONE,
> +   BRW_ASTC5x5_WA_MODE_HAS_ASTC5x5,
> +   BRW_ASTC5x5_WA_MODE_HAS_AUX,
> +};
> +
>  enum brw_state_id {
>     /* brw_cache_ids must come first - see brw_program_cache.c */
>     BRW_STATE_URB_FENCE = BRW_MAX_CACHE,
> @@ -1296,6 +1302,19 @@ struct brw_context
>      */
>     enum isl_aux_usage draw_aux_usage[MAX_DRAW_BUFFERS];
>
> +   /* Certain GEN's have a hardware bug where the sampler hangs if it
> attempts
> +    * to access auxilary buffers and an ASTC5x5 compressed buffer. The
> workaround
> +    * is to make sure that the texture cache is cleared between such
> accesses
> +    * and that such accesses have a command streamer stall between them.
> +    */
> +   struct {
> +      bool required;
>

I would rather have a helper function in brw_draw near where we implement
the workaround than having a boolean in brw_context.  That way the code to
detect the need for the workaround is near the implementation of the
workaround.


> +      enum brw_astc5x5_wa_mode_t mode;
> +      bool texture_astc5x5_present;
> +      bool texture_with_auxilary_present;
> +      bool blorp_sampling_from_astc5x5;
>

This is quite a bit more infastructure than we really need in brw_context.
All we reall need is the enum.  The rest just enables us to spread the
workaround throughout the entire driver which is a bad thing.  Most of my
comments will focus on this theme.


> +   } astc5x5_wa;
> +
>     __DRIcontext *driContext;
>     struct intel_screen *screen;
>  };
> @@ -1729,6 +1748,11 @@ void brw_query_internal_format(struct gl_context
> *ctx, GLenum target,
>                                 GLenum internalFormat, GLenum pname,
>                                 GLint *params);
>
> +/* gen9_astc5x5_wa.c */
> +void gen9_set_astc5x5_wa_mode(struct brw_context *brw,
> +                             enum brw_astc5x5_wa_mode_t mode);
> +void gen9_astc5x5_perform_wa(struct brw_context *brw);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/src/mesa/drivers/dri/i965/gen9_astc5x5_wa.c
> b/src/mesa/drivers/dri/i965/gen9_astc5x5_wa.c
> new file mode 100644
> index 0000000..d3efd05
> --- /dev/null
> +++ b/src/mesa/drivers/dri/i965/gen9_astc5x5_wa.c
> @@ -0,0 +1,36 @@
> +#include "brw_context.h"
> +#include "brw_defines.h"
> +#include "intel_mipmap_tree.h"
> +
> +void
> +gen9_set_astc5x5_wa_mode(struct brw_context *brw,
> +                         enum brw_astc5x5_wa_mode_t mode)
> +{
> +   if (!brw->astc5x5_wa.required ||
> +       mode == BRW_ASTC5x5_WA_MODE_NONE ||
> +       brw->astc5x5_wa.mode == mode) {
> +      return;
> +   }
> +
> +   if (brw->astc5x5_wa.mode != BRW_ASTC5x5_WA_MODE_NONE) {
> +      const uint32_t flags = PIPE_CONTROL_CS_STALL |
> +         PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
> +      brw_emit_pipe_control_flush(brw, flags);
> +   }
> +
> +   brw->astc5x5_wa.mode = mode;
> +}
> +
> +void
> +gen9_astc5x5_perform_wa(struct brw_context *brw)
> +{
> +   if (!brw->astc5x5_wa.required) {
> +      return;
> +   }
> +
> +   if (brw->astc5x5_wa.texture_astc5x5_present) {
> +      gen9_set_astc5x5_wa_mode(brw, BRW_ASTC5x5_WA_MODE_HAS_ASTC5x5);
> +   } else if (brw->astc5x5_wa.texture_with_auxilary_present) {
> +      gen9_set_astc5x5_wa_mode(brw, BRW_ASTC5x5_WA_MODE_HAS_AUX);
> +   }
> +}
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index d0999bb..4e56fa9 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -692,6 +692,7 @@ brw_new_batch(struct brw_context *brw)
>
>     /* Create a new batchbuffer and reset the associated state: */
>     intel_batchbuffer_reset_and_clear_render_cache(brw);
> +   brw->astc5x5_wa.mode = BRW_ASTC5x5_WA_MODE_NONE;
>
>     /* If the kernel supports hardware contexts, then most hardware state
> is
>      * preserved between batches; we only need to re-emit state that is
> required
> diff --git a/src/mesa/drivers/dri/i965/meson.build
> b/src/mesa/drivers/dri/i965/meson.build
> index e686614..55a5f15 100644
> --- a/src/mesa/drivers/dri/i965/meson.build
> +++ b/src/mesa/drivers/dri/i965/meson.build
> @@ -97,6 +97,7 @@ files_i965 = files(
>    'gen7_urb.c',
>    'gen8_depth_state.c',
>    'gen8_multisample_state.c',
> +  'gen9_astc5x5_wa.c',
>    'hsw_queryobj.c',
>    'hsw_sol.c',
>    'intel_batchbuffer.c',
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180306/802d7c85/attachment.html>


More information about the mesa-dev mailing list