diff --git a/src/Makefile.am b/src/Makefile.am index 295bb84..b15d708 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,8 @@ AM_CFLAGS = \ $(CODE_COVERAGE_CFLAGS) libvrend_la_SOURCES = \ + virgl_context.c \ + virgl_context.h \ virgl_hw.h \ virgl_protocol.h \ virgl_util.c \ diff --git a/src/meson.build b/src/meson.build index 44a13c4..742954a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -25,6 +25,8 @@ subdir('gallium') virgl_sources = [ 'iov.c', + 'virgl_context.c', + 'virgl_context.h', 'virgl_hw.h', 'virgl_protocol.h', 'virgl_util.c', diff --git a/src/virgl_context.c b/src/virgl_context.c new file mode 100644 index 0000000..86a37f9 --- /dev/null +++ b/src/virgl_context.c @@ -0,0 +1,85 @@ +/************************************************************************** + * + * Copyright (C) 2020 Chromium. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include "virgl_context.h" + +#include + +#include "util/u_hash_table.h" +#include "util/u_pointer.h" +#include "virgl_util.h" + +static struct util_hash_table *virgl_context_table; + +static void +virgl_context_destroy_func(void *val) +{ + struct virgl_context *ctx = val; + ctx->destroy(ctx); +} + +int +virgl_context_table_init(void) +{ + virgl_context_table = util_hash_table_create(hash_func_u32, + compare_func, + virgl_context_destroy_func); + return virgl_context_table ? 0 : ENOMEM; +} + +void +virgl_context_table_cleanup(void) +{ + if (virgl_context_table) { + util_hash_table_destroy(virgl_context_table); + virgl_context_table = NULL; + } +} + +void +virgl_context_table_reset(void) +{ + util_hash_table_clear(virgl_context_table); +} + +int +virgl_context_add(struct virgl_context *ctx) +{ + const enum pipe_error err = util_hash_table_set( + virgl_context_table, uintptr_to_pointer(ctx->ctx_id), ctx); + return err == PIPE_OK ? 0 : ENOMEM; +} + +void +virgl_context_remove(uint32_t ctx_id) +{ + util_hash_table_remove(virgl_context_table, uintptr_to_pointer(ctx_id)); +} + +struct virgl_context * +virgl_context_lookup(uint32_t ctx_id) +{ + return util_hash_table_get(virgl_context_table, + uintptr_to_pointer(ctx_id)); +} diff --git a/src/virgl_context.h b/src/virgl_context.h new file mode 100644 index 0000000..862b44f --- /dev/null +++ b/src/virgl_context.h @@ -0,0 +1,54 @@ +/************************************************************************** + * + * Copyright (C) 2020 Chromium. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef VIRGL_CONTEXT_H +#define VIRGL_CONTEXT_H + +#include + +struct virgl_context { + uint32_t ctx_id; + + void (*destroy)(struct virgl_context *ctx); +}; + +int +virgl_context_table_init(void); + +void +virgl_context_table_cleanup(void); + +void +virgl_context_table_reset(void); + +int +virgl_context_add(struct virgl_context *ctx); + +void +virgl_context_remove(uint32_t ctx_id); + +struct virgl_context * +virgl_context_lookup(uint32_t ctx_id); + +#endif /* VIRGL_CONTEXT_H */ diff --git a/src/virglrenderer.c b/src/virglrenderer.c index 50611c4..8858612 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -38,6 +38,8 @@ #include "virglrenderer.h" +#include "virgl_context.h" + #ifdef HAVE_EPOXY_EGL_H #include "virgl_gbm.h" #include "virgl_egl.h" @@ -291,6 +293,8 @@ void virgl_renderer_poll(void) void virgl_renderer_cleanup(UNUSED void *cookie) { vrend_renderer_fini(); + virgl_context_table_cleanup(); + #ifdef HAVE_EPOXY_EGL_H if (use_context == CONTEXT_EGL) { virgl_egl_destroy(egl); @@ -366,6 +370,9 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks #endif } + if (virgl_context_table_init()) + return -1; + if (flags & VIRGL_RENDERER_THREAD_SYNC) renderer_flags |= VREND_USE_THREAD_SYNC;