summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@gmail.com>2015-03-17 08:50:33 +1000
committerDave Airlie <airlied@redhat.com>2015-06-16 12:34:26 +1000
commit76fed9b2e06be9319ba9fe7bd0d5e42b6a191347 (patch)
treed0be8601f910dc6688c35382b3a5ed0ba182a477
parentf2b3f0c17009b9f2fb80875663bd7431d95e7945 (diff)
vtest: avoid writing over end of resource on transfer get
we may get more data back from the other end, but we don't want to use it, just overwrite the correct data line by line
-rw-r--r--src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c19
-rw-r--r--src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c17
-rw-r--r--src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h4
3 files changed, 30 insertions, 10 deletions
diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
index eeaa80db1d9..7def6bf8c1e 100644
--- a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
+++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
@@ -9,6 +9,7 @@
#include <sys/un.h>
#include <unistd.h>
+#include <util/u_format.h>
/* connect to remote socket */
#define VTEST_SOCKET_NAME "/tmp/.virgl_test"
@@ -194,9 +195,23 @@ int virgl_vtest_send_transfer_put_data(struct virgl_vtest_winsys *vws,
int virgl_vtest_recv_transfer_get_data(struct virgl_vtest_winsys *vws,
void *data,
- uint32_t data_size)
+ uint32_t data_size,
+ uint32_t stride,
+ const struct pipe_box *box, uint32_t format)
{
- return virgl_block_read(vws->sock_fd, data, data_size);
+ int elsize = util_format_get_blocksize(format);
+ void *line = malloc(stride);
+ int h = box->height;
+ void *ptr = data;
+
+ line = malloc(stride);
+ while (h) {
+ virgl_block_read(vws->sock_fd, line, stride);
+ memcpy(ptr, line, box->width * elsize);
+ ptr += stride;
+ h--;
+ }
+ return 0;
}
int virgl_vtest_busy_wait(struct virgl_vtest_winsys *vws, int handle,
diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
index 031b1d6432b..dae74366557 100644
--- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
+++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
@@ -19,7 +19,7 @@ static INLINE boolean can_cache_resource(struct virgl_hw_res *res)
static uint32_t vtest_get_transfer_size(struct virgl_hw_res *res,
const struct pipe_box *box,
uint32_t stride, uint32_t layer_stride,
- uint32_t level)
+ uint32_t level, uint32_t *valid_stride_p)
{
uint32_t valid_stride, valid_layer_stride;
int elsize = util_format_get_blocksize(res->format);
@@ -36,6 +36,7 @@ static uint32_t vtest_get_transfer_size(struct virgl_hw_res *res,
valid_layer_stride = layer_stride;
}
+ *valid_stride_p = valid_stride;
return valid_layer_stride * box->depth;
}
@@ -49,8 +50,9 @@ virgl_vtest_transfer_put(struct virgl_winsys *vws,
struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
uint32_t size;
void *ptr;
+ uint32_t valid_stride;
- size = vtest_get_transfer_size(res, box, stride, layer_stride, level);
+ size = vtest_get_transfer_size(res, box, stride, layer_stride, level, &valid_stride);
virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_PUT, res->res_handle,
level, stride, layer_stride,
@@ -71,8 +73,9 @@ virgl_vtest_transfer_get(struct virgl_winsys *vws,
struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
uint32_t size;
void *ptr;
+ uint32_t valid_stride;
- size = vtest_get_transfer_size(res, box, stride, layer_stride, level);
+ size = vtest_get_transfer_size(res, box, stride, layer_stride, level, &valid_stride);
virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_GET, res->res_handle,
level, stride, layer_stride,
@@ -80,7 +83,7 @@ virgl_vtest_transfer_get(struct virgl_winsys *vws,
ptr = virgl_vtest_resource_map(vws, res);
- virgl_vtest_recv_transfer_get_data(vtws, ptr + buf_offset, size);
+ virgl_vtest_recv_transfer_get_data(vtws, ptr + buf_offset, size, valid_stride, box, res->format);
virgl_vtest_resource_unmap(vws, res);
return 0;
}
@@ -543,7 +546,7 @@ static void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws,
struct pipe_box box;
void *map;
uint32_t size;
- uint32_t offset = 0;
+ uint32_t offset = 0, valid_stride;
int elsize = util_format_get_blocksize(res->format);
if (!res->dt)
return;
@@ -560,7 +563,7 @@ static void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws,
box.depth = 1;
}
- size = vtest_get_transfer_size(res, &box, res->stride, 0, level);
+ size = vtest_get_transfer_size(res, &box, res->stride, 0, level, &valid_stride);
virgl_vtest_busy_wait(vtws, res->res_handle, VCMD_BUSY_WAIT_FLAG_WAIT);
map = vtws->sws->displaytarget_map(vtws->sws, res->dt, 0);
@@ -568,7 +571,7 @@ static void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws,
/* execute a transfer */
virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_GET, res->res_handle,
level, res->stride, 0, &box, size);
- virgl_vtest_recv_transfer_get_data(vtws, map + offset, size);
+ virgl_vtest_recv_transfer_get_data(vtws, map + offset, size, valid_stride, &box, res->format);
vtws->sws->displaytarget_unmap(vtws->sws, res->dt);
vtws->sws->displaytarget_display(vtws->sws, res->dt, winsys_drawable_handle, sub_box);
diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
index 6787f9bf9f5..b4fb37e124b 100644
--- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
+++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
@@ -101,7 +101,9 @@ int virgl_vtest_send_transfer_put_data(struct virgl_vtest_winsys *vws,
uint32_t data_size);
int virgl_vtest_recv_transfer_get_data(struct virgl_vtest_winsys *vws,
void *data,
- uint32_t data_size);
+ uint32_t data_size,
+ uint32_t stride,
+ const struct pipe_box *box, uint32_t format);
int virgl_vtest_busy_wait(struct virgl_vtest_winsys *vws, int handle,
int flags);