summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_clear_blit.c3
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_resource.h8
2 files changed, 11 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
index a089fed13ce..528b57389d5 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
@@ -597,6 +597,9 @@ etna_flush_resource(struct pipe_context *pctx, struct pipe_resource *prsc)
etna_resource_older(etna_resource(rsc->scanout->prime), rsc)) {
etna_copy_resource(pctx, rsc->scanout->prime, prsc, 0, 0);
etna_resource(rsc->scanout->prime)->seqno = rsc->seqno;
+ } else if (etna_resource_needs_flush(rsc)) {
+ etna_copy_resource(pctx, prsc, prsc, 0, 0);
+ rsc->flush_seqno = rsc->seqno;
}
}
diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h
index a6c6a78269e..a8d42ee1a09 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_resource.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h
@@ -61,6 +61,7 @@ struct etna_resource {
struct pipe_resource base;
struct renderonly_scanout *scanout;
uint32_t seqno;
+ uint32_t flush_seqno;
/* only lod 0 used for non-texture buffers */
/* Layout for surface (tiled, multitiled, split tiled, ...) */
@@ -97,6 +98,13 @@ etna_resource_older(struct etna_resource *a, struct etna_resource *b)
return (int)(a->seqno - b->seqno) < 0;
}
+/* returns TRUE if the resource needs a resolve to itself */
+static inline bool
+etna_resource_needs_flush(struct etna_resource *res)
+{
+ return (int)(res->seqno - res->flush_seqno) > 0;
+}
+
/* is the resource only used on the sampler? */
static inline bool
etna_resource_sampler_only(const struct pipe_resource *pres)