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

Loading…
Cancel
Save