vrend: Fix iovec read/write for depth

The depth was ignored in the fallback path, which caused us to copy
only the first layer.

This fixes:
dEQP-GLES3.functional.shaders.texture_functions.texture.isampler2darray.*
and probably other 3D texture/sample array tests.

Signed-off-by: Stéphane Marchesin <marcheu@chromium.org>
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
macos/master
Stéphane Marchesin 7 years ago committed by Dave Airlie
parent 88444a8ee8
commit c284516c53
  1. 20
      src/vrend_renderer.c

@ -4673,26 +4673,30 @@ static void read_transfer_data(struct pipe_resource *res,
box->height) * blsize * box->depth;
uint32_t bwx = util_format_get_nblocksx(res->format, box->width) * blsize;
uint32_t bh = util_format_get_nblocksy(res->format, box->height);
int h;
int d, h;
uint32_t myoffset = offset;
if ((send_size == size || bh == 1) && !invert)
vrend_read_from_iovec(iov, num_iovs, offset, data, send_size);
else {
if (invert) {
for (d = 0; d < box->depth; d++) {
for (h = bh - 1; h >= 0; h--) {
void *ptr = data + (h * bwx);
void *ptr = data + (h * bwx) + d * (bh * src_stride);
vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
myoffset += src_stride;
}
}
} else {
for (d = 0; d < box->depth; d++) {
for (h = 0; h < bh; h++) {
void *ptr = data + (h * bwx);
void *ptr = data + (h * bwx) + d * (bh * src_stride);
vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
myoffset += src_stride;
}
}
}
}
}
static void write_transfer_data(struct pipe_resource *res,
@ -4711,25 +4715,29 @@ static void write_transfer_data(struct pipe_resource *res,
box->height) * blsize * box->depth;
uint32_t bwx = util_format_get_nblocksx(res->format, box->width) * blsize;
uint32_t bh = util_format_get_nblocksy(res->format, box->height);
int h;
int d, h;
uint32_t myoffset = offset;
uint32_t stride = dst_stride ? dst_stride : util_format_get_nblocksx(res->format, u_minify(res->width0, level)) * blsize;
if ((send_size == size || bh == 1) && !invert) {
vrend_write_to_iovec(iov, num_iovs, offset, data, send_size);
} else if (invert) {
for (d = 0; d < box->depth; d++) {
for (h = bh - 1; h >= 0; h--) {
void *ptr = data + (h * bwx);
void *ptr = data + (h * bwx) + d * (bh * stride);
vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
myoffset += stride;
}
}
} else {
for (d = 0; d < box->depth; d++) {
for (h = 0; h < bh; h++) {
void *ptr = data + (h * bwx);
void *ptr = data + (h * bwx) + d * (bh * stride);
vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
myoffset += stride;
}
}
}
}
static bool check_transfer_bounds(struct vrend_resource *res,

Loading…
Cancel
Save