summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2017-10-28 16:01:49 +0200
committerLucas Stach <l.stach@pengutronix.de>2017-11-02 11:00:26 +0100
commitbc71c318426b2939aae839a356f1ab4aef1e5ada (patch)
tree5e9738cf69e77ccf7799b5b8786bf85a082c4463
parent8fbd82f464f26a56167f7962174b2b69756a105a (diff)
etnaviv: Don't flush on transfer when UNSYNCHRONIZED
Structure code to only flush when we will potentially call cpu_prep. This prevents spurious flushes in applications that heavily rely on u_uploader. Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com> Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_transfer.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
index 08ec1987d8..c389920709 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
@@ -243,18 +243,6 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc,
struct etna_resource_level *res_level = &rsc->levels[level];
- /*
- * Always flush if we have the temporary resource and have a copy to this
- * outstanding. Otherwise infer flush requirement from resource access and
- * current GPU usage (reads must wait for GPU writes, writes must have
- * exclusive access to the buffer).
- */
- if ((trans->rsc && (etna_resource(trans->rsc)->status & ETNA_PENDING_WRITE)) ||
- (!trans->rsc &&
- (((usage & PIPE_TRANSFER_READ) && (rsc->status & ETNA_PENDING_WRITE)) ||
- ((usage & PIPE_TRANSFER_WRITE) && rsc->status))))
- pctx->flush(pctx, NULL, 0);
-
/* XXX we don't handle PIPE_TRANSFER_FLUSH_EXPLICIT; this flag can be ignored
* when mapping in-place,
* but when not in place we need to fire off the copy operation in
@@ -312,6 +300,18 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc,
if (trans->rsc || !(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
uint32_t prep_flags = 0;
+ /*
+ * Always flush if we have the temporary resource and have a copy to this
+ * outstanding. Otherwise infer flush requirement from resource access and
+ * current GPU usage (reads must wait for GPU writes, writes must have
+ * exclusive access to the buffer).
+ */
+ if ((trans->rsc && (etna_resource(trans->rsc)->status & ETNA_PENDING_WRITE)) ||
+ (!trans->rsc &&
+ (((usage & PIPE_TRANSFER_READ) && (rsc->status & ETNA_PENDING_WRITE)) ||
+ ((usage & PIPE_TRANSFER_WRITE) && rsc->status))))
+ pctx->flush(pctx, NULL, 0);
+
if (usage & PIPE_TRANSFER_READ)
prep_flags |= DRM_ETNA_PREP_READ;
if (usage & PIPE_TRANSFER_WRITE)