[Mesa-dev] [PATCH 5/6] i965/draw: Do resolves properly for textures used by TXF

Kenneth Graunke kenneth at whitecape.org
Wed Jan 17 00:21:57 UTC 2018


On Wednesday, January 10, 2018 11:22:39 AM PST Jason Ekstrand wrote:
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c | 41 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index 4945dec..9fd44e4 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -40,6 +40,7 @@
>  #include "swrast_setup/swrast_setup.h"
>  #include "drivers/common/meta.h"
>  #include "util/bitscan.h"
> +#include "util/bitset.h"
>  
>  #include "brw_blorp.h"
>  #include "brw_draw.h"
> @@ -371,6 +372,20 @@ intel_disable_rb_aux_buffer(struct brw_context *brw,
>     return found;
>  }
>  
> +static void
> +mark_textures_used_for_txf(BITSET_WORD *used_for_txf,
> +                           const struct gl_program *prog)
> +{
> +   if (!prog)
> +      return;
> +
> +   unsigned mask = prog->SamplersUsed & prog->info.textures_used_by_txf;
> +   while (mask) {
> +      int s = u_bit_scan(&mask);
> +      BITSET_SET(used_for_txf, prog->SamplerUnits[s]);
> +   }
> +}
> +
>  /**
>   * \brief Resolve buffers before drawing.
>   *
> @@ -386,6 +401,18 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering)
>     memset(brw->draw_aux_buffer_disabled, 0,
>            sizeof(brw->draw_aux_buffer_disabled));
>  
> +   BITSET_DECLARE(used_for_txf, MAX_COMBINED_TEXTURE_IMAGE_UNITS);

You don't need this "combined" stuff.  You just want a view of all 32
potential GL texture units, and if any stage uses one of them for TXF,
mark it here.

So you can just do:

    uint32_t used_for_txf;

with all the corresponding simplifications (no BITSET_* macros).

This looks good other than that.  I'll let you respin it and then offer
a R-b.

Seems like this could be painful for bindless at some point...

> +   memset(used_for_txf, 0, sizeof(used_for_txf));
> +   if (rendering) {
> +      mark_textures_used_for_txf(used_for_txf, ctx->VertexProgram._Current);
> +      mark_textures_used_for_txf(used_for_txf, ctx->TessCtrlProgram._Current);
> +      mark_textures_used_for_txf(used_for_txf, ctx->TessEvalProgram._Current);
> +      mark_textures_used_for_txf(used_for_txf, ctx->GeometryProgram._Current);
> +      mark_textures_used_for_txf(used_for_txf, ctx->FragmentProgram._Current);
> +   } else {
> +      mark_textures_used_for_txf(used_for_txf, ctx->ComputeProgram._Current);
> +   }
> +
>     /* Resolve depth buffer and render cache of each enabled texture. */
>     int maxEnabledUnit = ctx->Texture._MaxEnabledTexImageUnit;
>     for (int i = 0; i <= maxEnabledUnit; i++) {
> @@ -422,6 +449,20 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering)
>                                      min_layer, num_layers,
>                                      disable_aux);
>  
> +      /* If any programs are using it with texelFetch, we may need to also do
> +       * a prepare with an sRGB format to ensure texelFetch works "properly".
> +       */
> +      if (BITSET_TEST(used_for_txf, i)) {
> +         enum isl_format txf_format =
> +            translate_tex_format(brw, tex_obj->_Format, GL_DECODE_EXT);
> +         if (txf_format != view_format) {
> +            intel_miptree_prepare_texture(brw, tex_obj->mt, txf_format,
> +                                          min_level, num_levels,
> +                                          min_layer, num_layers,
> +                                          disable_aux);
> +         }
> +      }
> +
>        brw_cache_flush_for_read(brw, tex_obj->mt->bo);
>  
>        if (tex_obj->base.StencilSampling ||
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180116/2fa790ca/attachment.sig>


More information about the mesa-dev mailing list