From 95ce73010a135a49ea51d64cbf0a7ff2cb11e5b7 Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Thu, 16 Apr 2020 11:52:41 -0700 Subject: [PATCH] vrend: refactor creating a vrend_resource This is a cleanup for the subsequent commits. Reviewed-by: Chia-I Wu Reviewed-by: Gert Wollny --- src/virglrenderer.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/vrend_renderer.c | 29 ++++++++--------------------- src/vrend_renderer.h | 7 ++----- 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/virglrenderer.c b/src/virglrenderer.c index dbbf981..a540d1e 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -53,11 +53,39 @@ static struct virgl_glx *glx_info; /* new API - just wrap internal API for now */ -int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs) +static int virgl_renderer_resource_create_internal(struct virgl_renderer_resource_create_args *args, + UNUSED struct iovec *iov, UNUSED uint32_t num_iovs, + void *image) { int ret; + struct pipe_resource *pipe_res; + struct vrend_renderer_resource_create_args vrend_args = { 0 }; + + /* do not accept handle 0 */ + if (args->handle == 0) + return EINVAL; + + vrend_args.target = args->target; + vrend_args.format = args->format; + vrend_args.bind = args->bind; + vrend_args.width = args->width; + vrend_args.height = args->height; + vrend_args.depth = args->depth; + vrend_args.array_size = args->array_size; + vrend_args.nr_samples = args->nr_samples; + vrend_args.last_level = args->last_level; + vrend_args.flags = args->flags; + + pipe_res = vrend_renderer_resource_create(&vrend_args, image); + if (!pipe_res) + return EINVAL; + + ret = virgl_resource_create_from_pipe(args->handle, pipe_res); + if (ret) { + vrend_renderer_resource_destroy((struct vrend_resource *)pipe_res); + return ret; + } - ret = vrend_renderer_resource_create((struct vrend_renderer_resource_create_args *)args, NULL); if (!ret && num_iovs) { ret = virgl_renderer_resource_attach_iov(args->handle, iov, num_iovs); if (ret) { @@ -66,13 +94,19 @@ int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *a } } - return ret; + return 0; +} + +int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, + struct iovec *iov, uint32_t num_iovs) +{ + return virgl_renderer_resource_create_internal(args, iov, num_iovs, NULL); } int virgl_renderer_resource_import_eglimage(struct virgl_renderer_resource_create_args *args, void *image) { #ifdef HAVE_EPOXY_EGL_H - return vrend_renderer_resource_create((struct vrend_renderer_resource_create_args *)args, image); + return virgl_renderer_resource_create_internal(args, NULL, 0, image); #else return EINVAL; #endif @@ -308,6 +342,7 @@ int virgl_renderer_resource_get_info(int res_handle, ret = vrend_renderer_resource_get_info(res->pipe_resource, (struct vrend_renderer_resource_info *)info); + info->handle = res_handle; #ifdef HAVE_EPOXY_EGL_H if (ret == 0 && use_context == CONTEXT_EGL) return virgl_egl_get_fourcc_for_texture(egl, info->tex_id, info->virgl_format, &info->drm_fourcc); diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 0c55343..5b14c49 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -6154,12 +6154,6 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de static int check_resource_valid(struct vrend_renderer_resource_create_args *args, char errmsg[256]) { - /* do not accept handle 0 */ - if (args->handle == 0) { - snprintf(errmsg, 256, "Invalid handle"); - return -1; - } - /* limit the target */ if (args->target >= PIPE_MAX_TEXTURE_TYPES) { snprintf(errmsg, 256, "Invalid texture target %d (>= %d)", @@ -6400,7 +6394,6 @@ vrend_renderer_resource_copy_args(struct vrend_renderer_resource_create_args *ar assert(gr); assert(args); - gr->handle = args->handle; gr->base.bind = args->bind; gr->base.width0 = args->width; gr->base.height0 = args->height; @@ -6668,8 +6661,8 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr, return 0; } -int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, - void *image_oes) +struct pipe_resource * +vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, void *image_oes) { struct vrend_resource *gr; int ret; @@ -6678,12 +6671,12 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a ret = check_resource_valid(args, error_string); if (ret) { vrend_printf("%s, Illegal resource parameters, error: %s\n", __func__, error_string); - return EINVAL; + return NULL; } gr = (struct vrend_resource *)CALLOC_STRUCT(vrend_texture); if (!gr) - return ENOMEM; + return NULL; vrend_renderer_resource_copy_args(args, gr); gr->storage_bits = VREND_STORAGE_GUEST_MEMORY; @@ -6700,7 +6693,7 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a gr->ptr = malloc(args->width); if (!gr->ptr) { FREE(gr); - return ENOMEM; + return NULL; } } else if (args->bind == VIRGL_BIND_STAGING) { /* staging buffers only use guest memory -- nothing to do. */ @@ -6744,22 +6737,17 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a } else { vrend_printf("%s: Illegal buffer binding flags 0x%x\n", __func__, args->bind); FREE(gr); - return EINVAL; + return NULL; } } else { int r = vrend_renderer_resource_allocate_texture(gr, image_oes); if (r) { FREE(gr); - return r; + return NULL; } } - ret = virgl_resource_create_from_pipe(args->handle, &gr->base); - if (ret) { - vrend_renderer_resource_destroy(gr); - return ret; - } - return 0; + return &gr->base; } void vrend_renderer_resource_destroy(struct vrend_resource *res) @@ -10125,7 +10113,6 @@ int vrend_renderer_resource_get_info(struct pipe_resource *pres, elsize = util_format_get_blocksize(res->base.format); - info->handle = res->handle; info->tex_id = res->id; info->width = res->base.width0; info->height = res->base.height0; diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index 6973db9..d741ff6 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -88,8 +88,6 @@ struct vrend_resource { GLuint tbo_tex_id;/* tbos have two ids to track */ bool y_0_top; - GLuint handle; - /* Pointer to system memory storage for this resource. Only valid for * VREND_RESOURCE_STORAGE_GUEST_ELSE_SYSTEM buffer storage. */ @@ -174,7 +172,6 @@ struct virgl_context *vrend_renderer_context_create(uint32_t handle, const char *name); struct vrend_renderer_resource_create_args { - uint32_t handle; enum pipe_texture_target target; uint32_t format; uint32_t bind; @@ -187,8 +184,8 @@ struct vrend_renderer_resource_create_args { uint32_t flags; }; -int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, - void *image_eos); +struct pipe_resource * +vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, void *image_eos); int vrend_create_surface(struct vrend_context *ctx, uint32_t handle,