vtest: add vtest_resource

Add vtest_resource and embed iovec in it.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Alexandros Frantzis <alexandros.frantzis@collabora.com>
macos/master
Chia-I Wu 4 years ago
parent dbeb8e7aff
commit be02caf74b
  1. 85
      vtest/vtest_renderer.c

@ -47,6 +47,10 @@
#include "util/u_memory.h" #include "util/u_memory.h"
#include "util/u_hash_table.h" #include "util/u_hash_table.h"
struct vtest_resource {
struct iovec iov;
};
struct vtest_context { struct vtest_context {
struct list_head head; struct list_head head;
@ -59,7 +63,7 @@ struct vtest_context {
}; };
struct vtest_renderer { struct vtest_renderer {
struct util_hash_table *iovec_hash; struct util_hash_table *resource_table;
const char *rendernode_name; const char *rendernode_name;
uint32_t max_length; uint32_t max_length;
@ -107,14 +111,14 @@ static struct vtest_renderer renderer = {
}; };
static unsigned static unsigned
hash_func(void *key) resource_hash_func(void *key)
{ {
intptr_t ip = pointer_to_intptr(key); intptr_t ip = pointer_to_intptr(key);
return (unsigned)(ip & 0xffffffff); return (unsigned)(ip & 0xffffffff);
} }
static int static int
compare_iovecs(void *key1, void *key2) resource_compare_func(void *key1, void *key2)
{ {
if (key1 < key2) { if (key1 < key2) {
return -1; return -1;
@ -125,12 +129,13 @@ compare_iovecs(void *key1, void *key2)
} }
} }
static void free_iovec(void *value) static void
resource_destroy_func(void *value)
{ {
struct iovec *iovec = value; struct vtest_resource *res = value;
if (iovec->iov_base) if (res->iov.iov_base)
munmap(iovec->iov_base, iovec->iov_len); munmap(res->iov.iov_base, res->iov.iov_len);
free(iovec); free(res);
} }
static int vtest_block_write(int fd, void *buf, int size) static int vtest_block_write(int fd, void *buf, int size)
@ -242,7 +247,9 @@ int vtest_init_renderer(int ctx_flags, const char *render_device)
{ {
int ret; int ret;
renderer.iovec_hash = util_hash_table_create(hash_func, compare_iovecs, free_iovec); renderer.resource_table = util_hash_table_create(resource_hash_func,
resource_compare_func,
resource_destroy_func);
renderer.rendernode_name = render_device; renderer.rendernode_name = render_device;
list_inithead(&renderer.active_contexts); list_inithead(&renderer.active_contexts);
list_inithead(&renderer.free_contexts); list_inithead(&renderer.free_contexts);
@ -280,8 +287,8 @@ void vtest_cleanup_renderer(void)
virgl_renderer_cleanup(&renderer); virgl_renderer_cleanup(&renderer);
util_hash_table_destroy(renderer.iovec_hash); util_hash_table_destroy(renderer.resource_table);
renderer.iovec_hash = NULL; renderer.resource_table = NULL;
} }
static struct vtest_context *vtest_new_context(struct vtest_input *input, static struct vtest_context *vtest_new_context(struct vtest_input *input,
@ -581,7 +588,7 @@ static int vtest_create_resource_decode_args2(struct vtest_context *ctx,
} }
static int vtest_create_resource_setup_shm(uint32_t res_id, static int vtest_create_resource_setup_shm(uint32_t res_id,
struct iovec *iov, struct vtest_resource *res,
size_t size) size_t size)
{ {
int fd; int fd;
@ -597,8 +604,8 @@ static int vtest_create_resource_setup_shm(uint32_t res_id,
return -1; return -1;
} }
iov->iov_base = ptr; res->iov.iov_base = ptr;
iov->iov_len = size; res->iov.iov_len = size;
return fd; return fd;
} }
@ -626,7 +633,7 @@ int vtest_create_resource2(UNUSED uint32_t length_dw)
struct vtest_context *ctx = vtest_get_current_context(); struct vtest_context *ctx = vtest_get_current_context();
struct virgl_renderer_resource_create_args args; struct virgl_renderer_resource_create_args args;
size_t shm_size; size_t shm_size;
struct iovec *iovec; struct vtest_resource *res;
int ret; int ret;
ret = vtest_create_resource_decode_args2(ctx, &args, &shm_size); ret = vtest_create_resource_decode_args2(ctx, &args, &shm_size);
@ -635,7 +642,7 @@ int vtest_create_resource2(UNUSED uint32_t length_dw)
} }
// Check that the handle doesn't already exist. // Check that the handle doesn't already exist.
if (util_hash_table_get(renderer.iovec_hash, intptr_to_pointer(args.handle))) { if (util_hash_table_get(renderer.resource_table, intptr_to_pointer(args.handle))) {
return -EEXIST; return -EEXIST;
} }
@ -645,8 +652,8 @@ int vtest_create_resource2(UNUSED uint32_t length_dw)
virgl_renderer_ctx_attach_resource(ctx->ctx_id, args.handle); virgl_renderer_ctx_attach_resource(ctx->ctx_id, args.handle);
iovec = CALLOC_STRUCT(iovec); res = CALLOC_STRUCT(vtest_resource);
if (!iovec) { if (!res) {
return -ENOMEM; return -ENOMEM;
} }
@ -654,17 +661,17 @@ int vtest_create_resource2(UNUSED uint32_t length_dw)
if (shm_size) { if (shm_size) {
int fd; int fd;
fd = vtest_create_resource_setup_shm(args.handle, iovec, shm_size); fd = vtest_create_resource_setup_shm(args.handle, res, shm_size);
if (fd < 0) { if (fd < 0) {
FREE(iovec); FREE(res);
return -ENOMEM; return -ENOMEM;
} }
ret = vtest_send_fd(ctx->out_fd, fd); ret = vtest_send_fd(ctx->out_fd, fd);
if (ret < 0) { if (ret < 0) {
munmap(iovec->iov_base, iovec->iov_len); munmap(res->iov.iov_base, res->iov.iov_len);
close(fd); close(fd);
FREE(iovec); FREE(res);
return report_failed_call("vtest_send_fd", ret); return report_failed_call("vtest_send_fd", ret);
} }
@ -672,8 +679,8 @@ int vtest_create_resource2(UNUSED uint32_t length_dw)
close(fd); close(fd);
} }
virgl_renderer_resource_attach_iov(args.handle, iovec, 1); virgl_renderer_resource_attach_iov(args.handle, &res->iov, 1);
util_hash_table_set(renderer.iovec_hash, intptr_to_pointer(args.handle), iovec); util_hash_table_set(renderer.resource_table, intptr_to_pointer(args.handle), res);
return 0; return 0;
} }
@ -695,7 +702,7 @@ int vtest_resource_unref(UNUSED uint32_t length_dw)
virgl_renderer_ctx_attach_resource(ctx->ctx_id, handle); virgl_renderer_ctx_attach_resource(ctx->ctx_id, handle);
virgl_renderer_resource_detach_iov(handle, NULL, NULL); virgl_renderer_resource_detach_iov(handle, NULL, NULL);
util_hash_table_remove(renderer.iovec_hash, intptr_to_pointer(handle)); util_hash_table_remove(renderer.resource_table, intptr_to_pointer(handle));
virgl_renderer_resource_unref(handle); virgl_renderer_resource_unref(handle);
return 0; return 0;
@ -946,19 +953,19 @@ int vtest_transfer_get2(UNUSED uint32_t length_dw)
struct vtest_context *ctx = vtest_get_current_context(); struct vtest_context *ctx = vtest_get_current_context();
int ret; int ret;
struct vtest_transfer_args args; struct vtest_transfer_args args;
struct iovec *iovec; struct vtest_resource *res;
ret = vtest_transfer_decode_args2(ctx, &args); ret = vtest_transfer_decode_args2(ctx, &args);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
iovec = util_hash_table_get(renderer.iovec_hash, intptr_to_pointer(args.handle)); res = util_hash_table_get(renderer.resource_table, intptr_to_pointer(args.handle));
if (!iovec) { if (!res) {
return report_failed_call("util_hash_table_get", -ESRCH); return report_failed_call("util_hash_table_get", -ESRCH);
} }
if (args.offset >= iovec->iov_len) { if (args.offset >= res->iov.iov_len) {
return report_failure("offset larger then length of backing store", -EFAULT); return report_failure("offset larger then length of backing store", -EFAULT);
} }
@ -970,19 +977,19 @@ int vtest_transfer_get2_nop(UNUSED uint32_t length_dw)
struct vtest_context *ctx = vtest_get_current_context(); struct vtest_context *ctx = vtest_get_current_context();
int ret; int ret;
struct vtest_transfer_args args; struct vtest_transfer_args args;
struct iovec *iovec; struct vtest_resource *res;
ret = vtest_transfer_decode_args2(ctx, &args); ret = vtest_transfer_decode_args2(ctx, &args);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
iovec = util_hash_table_get(renderer.iovec_hash, intptr_to_pointer(args.handle)); res = util_hash_table_get(renderer.resource_table, intptr_to_pointer(args.handle));
if (!iovec) { if (!res) {
return report_failed_call("util_hash_table_get", -ESRCH); return report_failed_call("util_hash_table_get", -ESRCH);
} }
if (args.offset >= iovec->iov_len) { if (args.offset >= res->iov.iov_len) {
return report_failure("offset larger then length of backing store", -EFAULT); return report_failure("offset larger then length of backing store", -EFAULT);
} }
@ -994,15 +1001,15 @@ int vtest_transfer_put2(UNUSED uint32_t length_dw)
struct vtest_context *ctx = vtest_get_current_context(); struct vtest_context *ctx = vtest_get_current_context();
int ret; int ret;
struct vtest_transfer_args args; struct vtest_transfer_args args;
struct iovec *iovec; struct vtest_resource *res;
ret = vtest_transfer_decode_args2(ctx, &args); ret = vtest_transfer_decode_args2(ctx, &args);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
iovec = util_hash_table_get(renderer.iovec_hash, intptr_to_pointer(args.handle)); res = util_hash_table_get(renderer.resource_table, intptr_to_pointer(args.handle));
if (!iovec) { if (!res) {
return report_failed_call("util_hash_table_get", -ESRCH); return report_failed_call("util_hash_table_get", -ESRCH);
} }
@ -1014,15 +1021,15 @@ int vtest_transfer_put2_nop(UNUSED uint32_t length_dw)
struct vtest_context *ctx = vtest_get_current_context(); struct vtest_context *ctx = vtest_get_current_context();
int ret; int ret;
struct vtest_transfer_args args; struct vtest_transfer_args args;
struct iovec *iovec; struct vtest_resource *res;
ret = vtest_transfer_decode_args2(ctx, &args); ret = vtest_transfer_decode_args2(ctx, &args);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
iovec = util_hash_table_get(renderer.iovec_hash, intptr_to_pointer(args.handle)); res = util_hash_table_get(renderer.resource_table, intptr_to_pointer(args.handle));
if (!iovec) { if (!res) {
return report_failed_call("util_hash_table_get", -ESRCH); return report_failed_call("util_hash_table_get", -ESRCH);
} }

Loading…
Cancel
Save