[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