summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2020-02-05 07:54:19 +0100
committerDylan Baker <dylan@pnwbakers.com>2020-02-07 09:20:49 -0800
commit632f18ea171c466745b49c34351a6b5bea9e569b (patch)
treebd549abe6163ae24a12dc98bcc8ec709cc7be742 /src
parent10a0b602b488d76a70f5792749457ee655d1e8a8 (diff)
downloadmesa-632f18ea171c466745b49c34351a6b5bea9e569b.tar.gz
svga: Fix banded DMA upload
A previous commit ("winsys/svga: Limit the maximum DMA hardware buffer size") made banded DMA transfer kick in when transfering gnome-shell window contents under gnome-shell / wayland. This uncovered a bug where we assumed that banded DMA transfers always occur to the top (y=0) of the surface. Fix this by taking the destination y offset into account. Cc: 19.2 19.3 20.0 <mesa-stable@lists.freedesktop.org> Fixes: 287c94ea498 ("Squashed commit of the following:") Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3733> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3733> (cherry picked from commit 451cf228d53ba8f51beb3dcf04370e126fb7ccb6)
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/svga/svga_resource_texture.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c
index f1d16563efb..2ca13b7a73e 100644
--- a/src/gallium/drivers/svga/svga_resource_texture.c
+++ b/src/gallium/drivers/svga/svga_resource_texture.c
@@ -133,25 +133,26 @@ svga_transfer_dma(struct svga_context *svga,
}
}
else {
- int y, h, srcy;
+ int y, h, y_max;
unsigned blockheight =
util_format_get_blockheight(st->base.resource->format);
h = st->hw_nblocksy * blockheight;
- srcy = 0;
+ y_max = st->box.y + st->box.h;
- for (y = 0; y < st->box.h; y += h) {
+ for (y = st->box.y; y < y_max; y += h) {
unsigned offset, length;
void *hw, *sw;
- if (y + h > st->box.h)
- h = st->box.h - y;
+ if (y + h > y_max)
+ h = y_max - y;
/* Transfer band must be aligned to pixel block boundaries */
assert(y % blockheight == 0);
assert(h % blockheight == 0);
- offset = y * st->base.stride / blockheight;
+ /* First band starts at the top of the SW buffer. */
+ offset = (y - st->box.y) * st->base.stride / blockheight;
length = h * st->base.stride / blockheight;
sw = (uint8_t *) st->swbuf + offset;
@@ -159,9 +160,9 @@ svga_transfer_dma(struct svga_context *svga,
if (transfer == SVGA3D_WRITE_HOST_VRAM) {
unsigned usage = PIPE_TRANSFER_WRITE;
- /* Wait for the previous DMAs to complete */
- /* TODO: keep one DMA (at half the size) in the background */
- if (y) {
+ /* Don't write to an in-flight DMA buffer. Synchronize or
+ * discard in-flight storage. */
+ if (y != st->box.y) {
svga_context_flush(svga, NULL);
usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
}
@@ -177,7 +178,7 @@ svga_transfer_dma(struct svga_context *svga,
svga_transfer_dma_band(svga, st, transfer,
st->box.x, y, st->box.z,
st->box.w, h, st->box.d,
- 0, srcy, 0, flags);
+ 0, 0, 0, flags);
/*
* Prevent the texture contents to be discarded on the next band