etnaviv: GC7000: Track dirty sampler views
authorWladimir J. van der Laan <laanwj@gmail.com>
Sat, 18 Nov 2017 09:44:37 +0000 (10:44 +0100)
committerChristian Gmeiner <christian.gmeiner@gmail.com>
Thu, 30 Nov 2017 06:33:07 +0000 (07:33 +0100)
Need this to efficiently emit texture descriptor invalidations.

Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_context.c
src/gallium/drivers/etnaviv/etnaviv_context.h
src/gallium/drivers/etnaviv/etnaviv_emit.c
src/gallium/drivers/etnaviv/etnaviv_texture.c

index 7d54192dfcb3e7edd3b1a920ff129d7178237fb9..3038d210e1096f148c073251ade22624dfbf2c2f 100644 (file)
@@ -382,6 +382,7 @@ etna_cmd_stream_reset_notify(struct etna_cmd_stream *stream, void *priv)
    }
 
    ctx->dirty = ~0L;
+   ctx->dirty_sampler_views = ~0L;
 
    /* go through all the used resources and clear their status flag */
    LIST_FOR_EACH_ENTRY_SAFE(rsc, rsc_tmp, &ctx->used_resources, list)
index 2903e0963d5177e42e02b78615960b9b1ad2f2f8..1ed38ce48c1f6d3dbdd7fe43c8546ff6732a36c1 100644 (file)
@@ -156,6 +156,7 @@ struct etna_context {
    struct compiled_viewport_state viewport;
    unsigned num_fragment_sampler_views;
    uint32_t active_sampler_views;
+   uint32_t dirty_sampler_views;
    struct pipe_sampler_view *sampler_view[PIPE_MAX_SAMPLERS];
    struct pipe_constant_buffer constant_buffer[PIPE_SHADER_TYPES];
    struct etna_vertexbuf_state vertex_buffer;
index f63ec7748648b357dea9a2290f484827660fa6a2..dcad467f58aff3398fd520167bcf643f644bffdf 100644 (file)
@@ -851,4 +851,5 @@ etna_emit_state(struct etna_context *ctx)
 #undef EMIT_STATE_FIXP
 #undef EMIT_STATE_RELOC
    ctx->dirty = 0;
+   ctx->dirty_sampler_views = 0;
 }
index 6a33f787a1bd7eb34ab362ede42ebe4423cbdc03..295f7eb676cec3fd75e25d880bd3e2c53dc619e6 100644 (file)
@@ -345,12 +345,14 @@ set_sampler_views(struct etna_context *ctx, unsigned start, unsigned end,
 {
    unsigned i, j;
    uint32_t mask = 1 << start;
+   uint32_t prev_active_sampler_views = ctx->active_sampler_views;
 
    for (i = start, j = 0; j < nr; i++, j++, mask <<= 1) {
       pipe_sampler_view_reference(&ctx->sampler_view[i], views[j]);
-      if (views[j])
+      if (views[j]) {
          ctx->active_sampler_views |= mask;
-      else
+         ctx->dirty_sampler_views |= mask;
+      } else
          ctx->active_sampler_views &= ~mask;
    }
 
@@ -358,6 +360,9 @@ set_sampler_views(struct etna_context *ctx, unsigned start, unsigned end,
       pipe_sampler_view_reference(&ctx->sampler_view[i], NULL);
       ctx->active_sampler_views &= ~mask;
    }
+
+   /* sampler views that changed state (even to inactive) are also dirty */
+   ctx->dirty_sampler_views |= ctx->active_sampler_views ^ prev_active_sampler_views;
 }
 
 static inline void