1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker *
3*bbecb9d1SAndroid Build Coastguard Worker * Copyright (C) 2020 Chromium.
4*bbecb9d1SAndroid Build Coastguard Worker *
5*bbecb9d1SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker *
12*bbecb9d1SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker *
15*bbecb9d1SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker *
23*bbecb9d1SAndroid Build Coastguard Worker **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker
25*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_context.h"
26*bbecb9d1SAndroid Build Coastguard Worker
27*bbecb9d1SAndroid Build Coastguard Worker #include <errno.h>
28*bbecb9d1SAndroid Build Coastguard Worker
29*bbecb9d1SAndroid Build Coastguard Worker #include "util/os_misc.h"
30*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_hash_table.h"
31*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_pointer.h"
32*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_util.h"
33*bbecb9d1SAndroid Build Coastguard Worker
34*bbecb9d1SAndroid Build Coastguard Worker static struct util_hash_table *virgl_context_table;
35*bbecb9d1SAndroid Build Coastguard Worker
36*bbecb9d1SAndroid Build Coastguard Worker static void
virgl_context_destroy_func(void * val)37*bbecb9d1SAndroid Build Coastguard Worker virgl_context_destroy_func(void *val)
38*bbecb9d1SAndroid Build Coastguard Worker {
39*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context *ctx = val;
40*bbecb9d1SAndroid Build Coastguard Worker ctx->destroy(ctx);
41*bbecb9d1SAndroid Build Coastguard Worker }
42*bbecb9d1SAndroid Build Coastguard Worker
43*bbecb9d1SAndroid Build Coastguard Worker int
virgl_context_table_init(void)44*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_init(void)
45*bbecb9d1SAndroid Build Coastguard Worker {
46*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table = util_hash_table_create(hash_func_u32,
47*bbecb9d1SAndroid Build Coastguard Worker equal_func,
48*bbecb9d1SAndroid Build Coastguard Worker virgl_context_destroy_func);
49*bbecb9d1SAndroid Build Coastguard Worker return virgl_context_table ? 0 : ENOMEM;
50*bbecb9d1SAndroid Build Coastguard Worker }
51*bbecb9d1SAndroid Build Coastguard Worker
52*bbecb9d1SAndroid Build Coastguard Worker void
virgl_context_table_cleanup(void)53*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_cleanup(void)
54*bbecb9d1SAndroid Build Coastguard Worker {
55*bbecb9d1SAndroid Build Coastguard Worker util_hash_table_destroy(virgl_context_table);
56*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table = NULL;
57*bbecb9d1SAndroid Build Coastguard Worker }
58*bbecb9d1SAndroid Build Coastguard Worker
59*bbecb9d1SAndroid Build Coastguard Worker void
virgl_context_table_reset(void)60*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table_reset(void)
61*bbecb9d1SAndroid Build Coastguard Worker {
62*bbecb9d1SAndroid Build Coastguard Worker util_hash_table_clear(virgl_context_table);
63*bbecb9d1SAndroid Build Coastguard Worker }
64*bbecb9d1SAndroid Build Coastguard Worker
65*bbecb9d1SAndroid Build Coastguard Worker int
virgl_context_add(struct virgl_context * ctx)66*bbecb9d1SAndroid Build Coastguard Worker virgl_context_add(struct virgl_context *ctx)
67*bbecb9d1SAndroid Build Coastguard Worker {
68*bbecb9d1SAndroid Build Coastguard Worker const enum pipe_error err = util_hash_table_set(
69*bbecb9d1SAndroid Build Coastguard Worker virgl_context_table, uintptr_to_pointer(ctx->ctx_id), ctx);
70*bbecb9d1SAndroid Build Coastguard Worker return err == PIPE_OK ? 0 : ENOMEM;
71*bbecb9d1SAndroid Build Coastguard Worker }
72*bbecb9d1SAndroid Build Coastguard Worker
73*bbecb9d1SAndroid Build Coastguard Worker void
virgl_context_remove(uint32_t ctx_id)74*bbecb9d1SAndroid Build Coastguard Worker virgl_context_remove(uint32_t ctx_id)
75*bbecb9d1SAndroid Build Coastguard Worker {
76*bbecb9d1SAndroid Build Coastguard Worker util_hash_table_remove(virgl_context_table, uintptr_to_pointer(ctx_id));
77*bbecb9d1SAndroid Build Coastguard Worker }
78*bbecb9d1SAndroid Build Coastguard Worker
79*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context *
virgl_context_lookup(uint32_t ctx_id)80*bbecb9d1SAndroid Build Coastguard Worker virgl_context_lookup(uint32_t ctx_id)
81*bbecb9d1SAndroid Build Coastguard Worker {
82*bbecb9d1SAndroid Build Coastguard Worker return util_hash_table_get(virgl_context_table,
83*bbecb9d1SAndroid Build Coastguard Worker uintptr_to_pointer(ctx_id));
84*bbecb9d1SAndroid Build Coastguard Worker }
85*bbecb9d1SAndroid Build Coastguard Worker
86*bbecb9d1SAndroid Build Coastguard Worker static enum pipe_error
virgl_context_foreach_func(UNUSED void * key,void * val,void * data)87*bbecb9d1SAndroid Build Coastguard Worker virgl_context_foreach_func(UNUSED void *key, void *val, void *data)
88*bbecb9d1SAndroid Build Coastguard Worker {
89*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_context_foreach_args *args = data;
90*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context *ctx = val;
91*bbecb9d1SAndroid Build Coastguard Worker
92*bbecb9d1SAndroid Build Coastguard Worker return args->callback(ctx, args->data) ? PIPE_OK : PIPE_ERROR;
93*bbecb9d1SAndroid Build Coastguard Worker }
94*bbecb9d1SAndroid Build Coastguard Worker
95*bbecb9d1SAndroid Build Coastguard Worker void
virgl_context_foreach(const struct virgl_context_foreach_args * args)96*bbecb9d1SAndroid Build Coastguard Worker virgl_context_foreach(const struct virgl_context_foreach_args *args)
97*bbecb9d1SAndroid Build Coastguard Worker {
98*bbecb9d1SAndroid Build Coastguard Worker util_hash_table_foreach(virgl_context_table,
99*bbecb9d1SAndroid Build Coastguard Worker virgl_context_foreach_func,
100*bbecb9d1SAndroid Build Coastguard Worker (void *)args);
101*bbecb9d1SAndroid Build Coastguard Worker }
102