[virglrenderer-devel] [PATCH 2/3] vtest: Add backing store to each resource

Dave Airlie airlied at gmail.com
Fri Aug 3 03:23:22 UTC 2018


On 2 August 2018 at 19:09, Tomeu Vizoso <tomeu.vizoso at collabora.com> wrote:
> With the main aim of making vtest's usage of virglrenderer more similar
> to that of QEMU, this patch sets a backing store to each resource and
> reads from or writes to at each transfer operation.

Thinking about it, I don't think you need the callback.

I think on the resource_unref path you can just nuke the iov, before calling
the renderer unref. There should be no more users of the iov after that point.

Dave.

> ---
>  vtest/vtest_protocol.h |  6 ++--
>  vtest/vtest_renderer.c | 62 ++++++++++++++++++++++++++----------------
>  2 files changed, 42 insertions(+), 26 deletions(-)
>
> diff --git a/vtest/vtest_protocol.h b/vtest/vtest_protocol.h
> index f6176437e6e9..1d3e426998d1 100644
> --- a/vtest/vtest_protocol.h
> +++ b/vtest/vtest_protocol.h
> @@ -54,7 +54,7 @@
>  /* 0 length cmd */
>  /* resp VCMD_GET_CAPS + caps */
>
> -#define VCMD_RES_CREATE_SIZE 10
> +#define VCMD_RES_CREATE_SIZE 11
>  #define VCMD_RES_CREATE_RES_HANDLE 0
>  #define VCMD_RES_CREATE_TARGET 1
>  #define VCMD_RES_CREATE_FORMAT 2
> @@ -65,11 +65,12 @@
>  #define VCMD_RES_CREATE_ARRAY_SIZE 7
>  #define VCMD_RES_CREATE_LAST_LEVEL 8
>  #define VCMD_RES_CREATE_NR_SAMPLES 9
> +#define VCMD_RES_CREATE_DATA_SIZE 10
>
>  #define VCMD_RES_UNREF_SIZE 1
>  #define VCMD_RES_UNREF_RES_HANDLE 0
>
> -#define VCMD_TRANSFER_HDR_SIZE 11
> +#define VCMD_TRANSFER_HDR_SIZE 12
>  #define VCMD_TRANSFER_RES_HANDLE 0
>  #define VCMD_TRANSFER_LEVEL 1
>  #define VCMD_TRANSFER_STRIDE 2
> @@ -81,6 +82,7 @@
>  #define VCMD_TRANSFER_HEIGHT 8
>  #define VCMD_TRANSFER_DEPTH 9
>  #define VCMD_TRANSFER_DATA_SIZE 10
> +#define VCMD_TRANSFER_OFFSET 11
>
>  #define VCMD_BUSY_WAIT_FLAG_WAIT 1
>
> diff --git a/vtest/vtest_renderer.c b/vtest/vtest_renderer.c
> index 8f0262a83b20..6607f20c4bb6 100644
> --- a/vtest/vtest_renderer.c
> +++ b/vtest/vtest_renderer.c
> @@ -35,9 +35,11 @@
>  #include "vtest_protocol.h"
>  #include "util.h"
>  #include "util/u_debug.h"
> +#include "util/u_memory.h"
>
>  static int ctx_id = 1;
>  static int fence_id = 1;
> +static struct iovec iovecs[1024] = {0,};
>
>  static int last_fence;
>  static void vtest_write_fence(UNUSED void *cookie, uint32_t fence_id_in)
> @@ -45,9 +47,17 @@ static void vtest_write_fence(UNUSED void *cookie, uint32_t fence_id_in)
>    last_fence = fence_id_in;
>  }
>
> +static void vtest_res_destroy(UNUSED void *cookie, uint32_t handle)
> +{
> +  if (iovecs[handle].iov_base != NULL)
> +    free(iovecs[handle].iov_base);
> +  iovecs[handle].iov_base = NULL;
> +}
> +
>  struct virgl_renderer_callbacks vtest_cbs = {
>      .version = 1,
>      .write_fence = vtest_write_fence,
> +    .res_destroy = vtest_res_destroy,
>  };
>
>  struct vtest_renderer {
> @@ -234,6 +244,7 @@ int vtest_create_resource(void)
>  {
>      uint32_t res_create_buf[VCMD_RES_CREATE_SIZE];
>      struct virgl_renderer_resource_create_args args;
> +    struct iovec *iovec;
>      int ret;
>
>      ret = vtest_block_read(renderer.in_fd, &res_create_buf, sizeof(res_create_buf));
> @@ -254,8 +265,24 @@ int vtest_create_resource(void)
>      args.flags = 0;
>
>      ret = virgl_renderer_resource_create(&args, NULL, 0);
> +    if (ret)
> +      return ret;
>
>      virgl_renderer_ctx_attach_resource(ctx_id, args.handle);
> +
> +    iovec = CALLOC_STRUCT(iovec);
> +    if (!iovec)
> +      return -ENOMEM;
> +
> +    iovec->iov_len = res_create_buf[VCMD_RES_CREATE_DATA_SIZE];
> +    iovec->iov_base = calloc(1, iovec->iov_len);
> +    if (!iovec->iov_base)
> +      return -ENOMEM;
> +
> +    virgl_renderer_resource_attach_iov(args.handle, iovec, 1);
> +    assert(args.handle < ARRAY_SIZE(iovecs));
> +    iovecs[args.handle] = *iovec;
> +
>      return ret;
>  }
>
> @@ -312,6 +339,7 @@ int vtest_submit_cmd(uint32_t length_dw)
>    box.h = thdr_buf[VCMD_TRANSFER_HEIGHT];              \
>    box.d = thdr_buf[VCMD_TRANSFER_DEPTH];               \
>    data_size = thdr_buf[VCMD_TRANSFER_DATA_SIZE];               \
> +  offset = thdr_buf[VCMD_TRANSFER_OFFSET];             \
>    } while(0)
>
>
> @@ -323,8 +351,7 @@ int vtest_transfer_get(UNUSED uint32_t length_dw)
>      uint32_t stride, layer_stride, handle;
>      struct virgl_box box;
>      uint32_t data_size;
> -    void *ptr;
> -    struct iovec iovec;
> +    uint32_t offset;
>
>      ret = vtest_block_read(renderer.in_fd, thdr_buf, VCMD_TRANSFER_HDR_SIZE * 4);
>      if (ret != VCMD_TRANSFER_HDR_SIZE * 4)
> @@ -332,25 +359,20 @@ int vtest_transfer_get(UNUSED uint32_t length_dw)
>
>      DECODE_TRANSFER;
>
> -    ptr = malloc(data_size);
> -    if (!ptr)
> -      return -ENOMEM;
> -
> -    iovec.iov_len = data_size;
> -    iovec.iov_base = ptr;
>      ret = virgl_renderer_transfer_read_iov(handle,
>                                      ctx_id,
>                                      level,
>                                      stride,
>                                      layer_stride,
>                                      &box,
> -                                    0,
> -                                    &iovec, 1);
> +                                    offset,
> +                                    NULL, 0);
>      if (ret)
>        fprintf(stderr," transfer read failed %d\n", ret);
> -    ret = vtest_block_write(renderer.out_fd, ptr, data_size);
>
> -    free(ptr);
> +    ret = vtest_block_write(renderer.out_fd,
> +                            iovecs[handle].iov_base + offset,
> +                            data_size);
>      return ret < 0 ? ret : 0;
>  }
>
> @@ -362,8 +384,7 @@ int vtest_transfer_put(UNUSED uint32_t length_dw)
>      uint32_t stride, layer_stride, handle;
>      struct virgl_box box;
>      uint32_t data_size;
> -    void *ptr;
> -    struct iovec iovec;
> +    uint32_t offset;
>
>      ret = vtest_block_read(renderer.in_fd, thdr_buf, VCMD_TRANSFER_HDR_SIZE * 4);
>      if (ret != VCMD_TRANSFER_HDR_SIZE * 4)
> @@ -371,27 +392,20 @@ int vtest_transfer_put(UNUSED uint32_t length_dw)
>
>      DECODE_TRANSFER;
>
> -    ptr = malloc(data_size);
> -    if (!ptr)
> -      return -ENOMEM;
> -
> -    ret = vtest_block_read(renderer.in_fd, ptr, data_size);
> +    ret = vtest_block_read(renderer.in_fd, iovecs[handle].iov_base + offset, data_size);
>      if (ret < 0)
>        return ret;
>
> -    iovec.iov_len = data_size;
> -    iovec.iov_base = ptr;
>      ret = virgl_renderer_transfer_write_iov(handle,
>                                             ctx_id,
>                                             level,
>                                             stride,
>                                             layer_stride,
>                                             &box,
> -                                           0,
> -                                           &iovec, 1);
> +                                           offset,
> +                                           NULL, 0);
>      if (ret)
>        fprintf(stderr," transfer write failed %d\n", ret);
> -    free(ptr);
>      return 0;
>  }
>
> --
> 2.17.1
>
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel


More information about the virglrenderer-devel mailing list