From 4e5e469b14d28cec5290a91e5be3047c8c53d354 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 26 Mar 2020 21:52:10 -0700 Subject: [PATCH] vrend: rework context resource management Do not abuse context object table to manage context resources. Add a simpler variant, which replaces the now unused vrend_resource_*, to manage context resources instead. This is cleaner and more efficient because we no longer allocate a vrend_object to manage a vrend_resource. Signed-off-by: Chia-I Wu Tested-by: Gurchetan Singh Reviewed-by: Gurchetan Singh --- src/vrend_object.c | 63 +++++++++++++------------------------------- src/vrend_object.h | 21 +++++++++------ src/vrend_renderer.c | 17 ++++-------- 3 files changed, 37 insertions(+), 64 deletions(-) diff --git a/src/vrend_object.c b/src/vrend_object.c index 03daa8d..ec30842 100644 --- a/src/vrend_object.c +++ b/src/vrend_object.c @@ -33,20 +33,11 @@ struct vrend_object_types { void (*unref)(void *); } obj_types[VIRGL_MAX_OBJECTS]; -static void (*resource_unref)(void *); - void vrend_object_set_destroy_callback(int type, void (*cb)(void *)) { obj_types[type].unref = cb; } -void vrend_resource_set_destroy_callback(void (*cb)(void *)) -{ - resource_unref = cb; -} - -static struct util_hash_table *res_hash; - struct vrend_object { enum virgl_object_type type; uint32_t handle; @@ -84,26 +75,22 @@ void vrend_object_fini_ctx_table(struct util_hash_table *ctx_hash) util_hash_table_destroy(ctx_hash); } -static void free_res(void *value) +static void vrend_ctx_resource_destroy_func(UNUSED void *val) { - struct vrend_object *obj = value; - (*resource_unref)(obj->data); - free(obj); + /* we don't own a reference of vrend_resource */ } -void -vrend_object_init_resource_table(void) +struct util_hash_table * +vrend_ctx_resource_init_table(void) { - if (!res_hash) - res_hash = util_hash_table_create(hash_func_u32, compare_func, free_res); + return util_hash_table_create(hash_func_u32, + compare_func, + vrend_ctx_resource_destroy_func); } -void vrend_object_fini_resource_table(void) +void vrend_ctx_resource_fini_table(struct util_hash_table *res_hash) { - if (res_hash) { - util_hash_table_destroy(res_hash); - } - res_hash = NULL; + util_hash_table_destroy(res_hash); } uint32_t @@ -153,33 +140,21 @@ void *vrend_object_lookup(struct util_hash_table *handle_hash, return obj->data; } -int vrend_resource_insert(void *data, uint32_t handle) +void vrend_ctx_resource_insert(struct util_hash_table *res_hash, + uint32_t res_id, + struct vrend_resource *res) { - struct vrend_object *obj; - - if (!handle) - return 0; - - obj = CALLOC_STRUCT(vrend_object); - if (!obj) - return 0; - - obj->handle = handle; - obj->data = data; - util_hash_table_set(res_hash, intptr_to_pointer(obj->handle), obj); - return obj->handle; + util_hash_table_set(res_hash, uintptr_to_pointer(res_id), res); } -void vrend_resource_remove(uint32_t handle) +void vrend_ctx_resource_remove(struct util_hash_table *res_hash, + uint32_t res_id) { - util_hash_table_remove(res_hash, intptr_to_pointer(handle)); + util_hash_table_remove(res_hash, uintptr_to_pointer(res_id)); } -void *vrend_resource_lookup(uint32_t handle, UNUSED uint32_t ctx_id) +struct vrend_resource *vrend_ctx_resource_lookup(struct util_hash_table *res_hash, + uint32_t res_id) { - struct vrend_object *obj; - obj = util_hash_table_get(res_hash, intptr_to_pointer(handle)); - if (!obj) - return NULL; - return obj->data; + return util_hash_table_get(res_hash, uintptr_to_pointer(res_id)); } diff --git a/src/vrend_object.h b/src/vrend_object.h index a72b9ee..5323304 100644 --- a/src/vrend_object.h +++ b/src/vrend_object.h @@ -27,8 +27,7 @@ #include "virgl_protocol.h" -void vrend_object_init_resource_table(void); -void vrend_object_fini_resource_table(void); +struct vrend_resource; struct util_hash_table *vrend_object_init_ctx_table(void); void vrend_object_fini_ctx_table(struct util_hash_table *ctx_hash); @@ -41,12 +40,18 @@ uint32_t vrend_object_insert_nofree(struct util_hash_table *handle_hash, uint32_t handle, enum virgl_object_type type, bool free_data); -/* resources are global */ -int vrend_resource_insert(void *data, uint32_t handle); - -void vrend_resource_remove(uint32_t handle); -void *vrend_resource_lookup(uint32_t handle, uint32_t ctx_id); void vrend_object_set_destroy_callback(int type, void (*cb)(void *)); -void vrend_resource_set_destroy_callback(void (*cb)(void *)); + +struct util_hash_table *vrend_ctx_resource_init_table(void); +void vrend_ctx_resource_fini_table(struct util_hash_table *res_hash); + +void vrend_ctx_resource_insert(struct util_hash_table *res_hash, + uint32_t res_id, + struct vrend_resource *res); +void vrend_ctx_resource_remove(struct util_hash_table *res_hash, + uint32_t res_id); +struct vrend_resource *vrend_ctx_resource_lookup(struct util_hash_table *res_hash, + uint32_t res_id); + #endif diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 18ea0aa..8c98fde 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -6038,7 +6038,7 @@ void vrend_destroy_context(struct vrend_context *ctx) if(ctx->ctx_id) vrend_renderer_force_ctx_0(); - vrend_object_fini_ctx_table(ctx->res_hash); + vrend_ctx_resource_fini_table(ctx->res_hash); list_del(&ctx->ctx_entry); @@ -6069,7 +6069,7 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de list_inithead(&grctx->sub_ctxs); list_inithead(&grctx->active_nontimer_query_list); - grctx->res_hash = vrend_object_init_ctx_table(); + grctx->res_hash = vrend_ctx_resource_init_table(); grctx->shader_cfg.use_gles = vrend_state.use_gles; grctx->shader_cfg.use_core_profile = vrend_state.use_core_profile; @@ -10079,24 +10079,17 @@ void vrend_renderer_attach_res_ctx(struct vrend_context *ctx, int resource_id) if (!res) return; - vrend_object_insert_nofree(ctx->res_hash, res, sizeof(*res), resource_id, 1, false); + vrend_ctx_resource_insert(ctx->res_hash, resource_id, res); } void vrend_renderer_detach_res_ctx(struct vrend_context *ctx, int res_handle) { - struct vrend_resource *res; - res = vrend_object_lookup(ctx->res_hash, res_handle, 1); - if (!res) - return; - - vrend_object_remove(ctx->res_hash, res_handle, 1); + vrend_ctx_resource_remove(ctx->res_hash, res_handle); } static struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, int res_handle) { - struct vrend_resource *res = vrend_object_lookup(ctx->res_hash, res_handle, 1); - - return res; + return vrend_ctx_resource_lookup(ctx->res_hash, res_handle); } void vrend_context_set_debug_flags(struct vrend_context *ctx, const char *flagstring)