aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <[email protected]>2020-05-14 12:59:01 +0200
committerLucas Stach <[email protected]>2020-05-15 20:29:10 +0200
commit9d1821adf0bc51958becf116d6df5c65514d58b6 (patch)
tree0a57663c0af1dc534110bf0479194a976a7669e9
parentbb3545a6ee419c4802ac4153eb690a93dc2f339d (diff)
etnaviv: retarget transfer to render resource when necessary
If we have a separate render resource, it may contain more up-to-date data than what is available in the base resource, so we need to retarget the transfer to this resource. As the most likely reason for the existence of the render resource is a multi-tiled render layout we need to allow this transfer to go through the resolve/blit copy path, as we can't de-/tile those layouts in software. Fixes: b96277653033 (etnaviv: rework compatible render base) Signed-off-by: Lucas Stach <[email protected]> Reviewed-by: Jonathan Marek <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5051>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_transfer.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
index 7ef8569a6a8..0d0324ec0cb 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
@@ -241,6 +241,17 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc,
assert(level <= prsc->last_level);
+ /* This one is a little tricky: if we have a separate render resource, which
+ * is newer than the base resource we want the transfer to target this one,
+ * to get the most up-to-date content, but only if we don't have a texture
+ * target of the same age, as transfering in/out of the texture target is
+ * generally preferred for the reasons listed below */
+ if (rsc->render && etna_resource_newer(etna_resource(rsc->render), rsc) &&
+ (!rsc->texture || etna_resource_newer(etna_resource(rsc->render),
+ etna_resource(rsc->texture)))) {
+ rsc = etna_resource(rsc->render);
+ }
+
if (rsc->texture && !etna_resource_newer(rsc, etna_resource(rsc->texture))) {
/* We have a texture resource which is the same age or newer than the
* render resource. Use the texture resource, which avoids bouncing
@@ -303,7 +314,7 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc,
}
if (!(usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE))
- etna_copy_resource_box(pctx, trans->rsc, prsc, level, &ptrans->box);
+ etna_copy_resource_box(pctx, trans->rsc, &rsc->base, level, &ptrans->box);
/* Switch to using the temporary resource instead */
rsc = etna_resource(trans->rsc);