[virglrenderer-devel] [PATCH] vrend: Fix iovec read/write for depth

Jakob Bornecrantz jakob at collabora.com
Tue Feb 27 13:12:39 UTC 2018


On 2018-02-27 03:00, Stéphane Marchesin wrote:
> 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 at chromium.org>

Tested-by: Jakob Bornecrantz <jakob at collabora.com>

> ---
>   src/vrend_renderer.c | 44 ++++++++++++++++++++++++++------------------
>   1 file changed, 26 insertions(+), 18 deletions(-)
> 
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index de569d0..eb00157 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -4673,23 +4673,27 @@ 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 (h = bh - 1; h >= 0; h--) {
> -            void *ptr = data + (h * bwx);
> -            vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
> -            myoffset += src_stride;
> +         for (d = 0; d < box->depth; d++) {
> +            for (h = bh - 1; h >= 0; h--) {
> +               void *ptr = data + (h * bwx) + d * (bh * src_stride);
> +               vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
> +               myoffset += src_stride;
> +            }
>            }
>         } else {
> -         for (h = 0; h < bh; h++) {
> -            void *ptr = data + (h * bwx);
> -            vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
> -            myoffset += src_stride;
> +         for (d = 0; d < box->depth; d++) {
> +            for (h = 0; h < bh; h++) {
> +               void *ptr = data + (h * bwx) + d * (bh * src_stride);
> +               vrend_read_from_iovec(iov, num_iovs, myoffset, ptr, bwx);
> +               myoffset += src_stride;
> +            }
>            }
>         }
>      }
> @@ -4711,23 +4715,27 @@ 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 (h = bh - 1; h >= 0; h--) {
> -         void *ptr = data + (h * bwx);
> -         vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
> -         myoffset += stride;
> +      for (d = 0; d < box->depth; d++) {
> +         for (h = bh - 1; h >= 0; h--) {
> +            void *ptr = data + (h * bwx) + d * (bh * stride);
> +            vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
> +            myoffset += stride;
> +         }
>         }
>      } else {
> -      for (h = 0; h < bh; h++) {
> -         void *ptr = data + (h * bwx);
> -         vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
> -         myoffset += stride;
> +      for (d = 0; d < box->depth; d++) {
> +         for (h = 0; h < bh; h++) {
> +            void *ptr = data + (h * bwx) + d * (bh * stride);
> +            vrend_write_to_iovec(iov, num_iovs, myoffset, ptr, bwx);
> +            myoffset += stride;
> +         }
>         }
>      }
>   }
> 



More information about the virglrenderer-devel mailing list