diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_clear_blit.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_resource.h | 8 |
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) |