[Mesa-dev] [PATCH 2/2] i965: Disable auxiliary buffers when there are self-dependencies.

Jason Ekstrand jason at jlekstrand.net
Fri Oct 6 05:26:51 UTC 2017


On October 5, 2017 10:02:58 PM Kenneth Graunke <kenneth at whitecape.org> wrote:

> Jason and I investigated several OpenGL CTS failures where the tests
> bind the same texture for rendering and texturing, at the same time.
> This has defined results as long as the reads happen before writes,
> or the regions are non-overlapping.  Normally, this just works out.
>
> However, CCS can cause problems.  If the shader is reading one set of
> pixels, and writing to different pixels that are adjacent, they may end
> up being covered by the same CCS block.  So rendering may be writing a
> CCS block, while the sampler is trying to read it.  Corruption ensues.
>
> Disabling CCS is unfortunate, but safe.
>
> Fixes several KHR-GL45.texture_barrier.* subtests.
>
> Cc: nanleychery at gmail.com
> Cc: jason at jlekstrand.net
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c          |  8 +++++++-
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 13 +++++++------
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  2 +-
>  3 files changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c 
> b/src/mesa/drivers/dri/i965/brw_draw.c
> index cab3758d7b5..c13fa8c367a 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -383,7 +383,13 @@ brw_predraw_resolve_inputs(struct brw_context *brw)
>           translate_tex_format(brw, tex_obj->_Format, sampler->sRGBDecode);
>        int drawbuf_idx = get_drawbuffer_index(brw, tex_obj->mt->bo);
>
> -      bool aux_supported;
> +      /* Disable auxiliary buffers if there's a self-dependency, where
> +       * we're both texturing from and rendering to the same buffer.
> +       * It's not necessarily safe - concurrent reads and writes to the
> +       * CCS buffer can result in incorrect pixels.
> +       */
> +      bool aux_supported = drawbuf_idx == -1;
> +
>        intel_miptree_prepare_texture(brw, tex_obj->mt, view_format,
>                                      &aux_supported);
>
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c 
> b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> index 5b7cde82f65..29b93dd656c 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> @@ -2651,9 +2651,10 @@ intel_miptree_prepare_texture_slices(struct 
> brw_context *brw,
>                                       enum isl_format view_format,
>                                       uint32_t start_level, uint32_t num_levels,
>                                       uint32_t start_layer, uint32_t num_layers,
> -                                     bool *aux_supported_out)
> +                                     bool *aux_supported)

Now that this is an input parameter, there's no reason for it to be a pointer.

>  {
> -   enum isl_aux_usage aux_usage =
> +   enum isl_aux_usage aux_usage = aux_supported && !*aux_supported ?
> +      ISL_AUX_USAGE_NONE :
>        intel_miptree_texture_aux_usage(brw, mt, view_format);
>     bool clear_supported = aux_usage != ISL_AUX_USAGE_NONE;
>
> @@ -2667,20 +2668,20 @@ intel_miptree_prepare_texture_slices(struct 
> brw_context *brw,
>     intel_miptree_prepare_access(brw, mt, start_level, num_levels,
>                                  start_layer, num_layers,
>                                  aux_usage, clear_supported);
> -   if (aux_supported_out)
> -      *aux_supported_out = aux_usage != ISL_AUX_USAGE_NONE;
> +   if (aux_supported)
> +      *aux_supported = aux_usage != ISL_AUX_USAGE_NONE;
>  }
>
>  void
>  intel_miptree_prepare_texture(struct brw_context *brw,
>                                struct intel_mipmap_tree *mt,
>                                enum isl_format view_format,
> -                              bool *aux_supported_out)
> +                              bool *aux_supported)
>  {
>     intel_miptree_prepare_texture_slices(brw, mt, view_format,
>                                          0, INTEL_REMAINING_LEVELS,
>                                          0, INTEL_REMAINING_LAYERS,
> -                                        aux_supported_out);
> +                                        aux_supported);
>  }
>
>  void
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h 
> b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index 2fce28c524b..0da7fafe601 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -640,7 +640,7 @@ void
>  intel_miptree_prepare_texture(struct brw_context *brw,
>                                struct intel_mipmap_tree *mt,
>                                enum isl_format view_format,
> -                              bool *aux_supported_out);
> +                              bool *aux_supported);
>  void
>  intel_miptree_prepare_image(struct brw_context *brw,
>                              struct intel_mipmap_tree *mt);
> --
> 2.14.2
>




More information about the mesa-dev mailing list