aboutsummaryrefslogtreecommitdiff
path: root/src/venus/vkr_context.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/venus/vkr_context.h')
-rw-r--r--src/venus/vkr_context.h84
1 files changed, 69 insertions, 15 deletions
diff --git a/src/venus/vkr_context.h b/src/venus/vkr_context.h
index 233205b0..c6f7e11c 100644
--- a/src/venus/vkr_context.h
+++ b/src/venus/vkr_context.h
@@ -10,6 +10,7 @@
#include "venus-protocol/vn_protocol_renderer_defines.h"
#include "virgl_context.h"
+#include "vrend_iov.h"
#include "vkr_cs.h"
@@ -19,15 +20,17 @@ struct virgl_resource;
* When a virgl_resource is attached in vkr_context_attach_resource, a
* vkr_resource_attachment is created. A vkr_resource_attachment is valid
* until the resource it tracks is detached.
- *
- * To support transfers to resources not backed by coherent dma-bufs, we
- * associate a vkr_resource_attachment with a (list of) vkr_device_memory.
- * This way, we can find a vkr_device_memory from a vkr_resource_attachment
- * and do transfers using VkDeviceMemory.
*/
struct vkr_resource_attachment {
struct virgl_resource *resource;
- struct list_head memories;
+
+ /* if VIRGL_RESOURCE_FD_SHM, this is the mapping of the shm and iov below
+ * points to this
+ */
+ struct iovec shm_iov;
+
+ const struct iovec *iov;
+ int iov_count;
};
enum vkr_context_validate_level {
@@ -39,6 +42,14 @@ enum vkr_context_validate_level {
VKR_CONTEXT_VALIDATE_FULL,
};
+struct vkr_cpu_sync {
+ uint32_t flags;
+ uint32_t ring_idx;
+ uint64_t fence_id;
+
+ struct list_head head;
+};
+
struct vkr_context {
struct virgl_context base;
@@ -49,9 +60,8 @@ struct vkr_context {
mtx_t mutex;
struct list_head rings;
- struct util_hash_table_u64 *object_table;
- struct util_hash_table *resource_table;
- struct list_head newly_exported_memories;
+ struct hash_table *object_table;
+ struct hash_table *resource_table;
struct vkr_cs_encoder encoder;
struct vkr_cs_decoder decoder;
@@ -60,15 +70,46 @@ struct vkr_context {
int fence_eventfd;
struct list_head busy_queues;
struct list_head signaled_syncs;
+ struct list_head signaled_cpu_syncs;
+
+ struct vkr_queue *sync_queues[64];
struct vkr_instance *instance;
char *instance_name;
};
+void
+vkr_context_free_resource(struct hash_entry *entry);
+
+static inline void
+vkr_context_add_resource(struct vkr_context *ctx, struct vkr_resource_attachment *att)
+{
+ assert(!_mesa_hash_table_search(ctx->resource_table, &att->resource->res_id));
+ _mesa_hash_table_insert(ctx->resource_table, &att->resource->res_id, att);
+}
+
+static inline void
+vkr_context_remove_resource(struct vkr_context *ctx, uint32_t res_id)
+{
+ struct hash_entry *entry = _mesa_hash_table_search(ctx->resource_table, &res_id);
+ if (likely(entry)) {
+ vkr_context_free_resource(entry);
+ _mesa_hash_table_remove(ctx->resource_table, entry);
+ }
+}
+
+static inline struct vkr_resource_attachment *
+vkr_context_get_resource(struct vkr_context *ctx, uint32_t res_id)
+{
+ const struct hash_entry *entry = _mesa_hash_table_search(ctx->resource_table, &res_id);
+ return likely(entry) ? entry->data : NULL;
+}
+
static inline bool
vkr_context_validate_object_id(struct vkr_context *ctx, vkr_object_id id)
{
- if (unlikely(!id || util_hash_table_get_u64(ctx->object_table, id))) {
+ if (unlikely(!id || _mesa_hash_table_search(ctx->object_table, &id))) {
+ vkr_log("invalid object id %" PRIu64, id);
vkr_cs_decoder_set_fatal(&ctx->decoder);
return false;
}
@@ -89,23 +130,29 @@ vkr_context_alloc_object(UNUSED struct vkr_context *ctx,
return vkr_object_alloc(size, type, id);
}
+void
+vkr_context_free_object(struct hash_entry *entry);
+
static inline void
vkr_context_add_object(struct vkr_context *ctx, struct vkr_object *obj)
{
assert(vkr_is_recognized_object_type(obj->type));
assert(obj->id);
- assert(!util_hash_table_get_u64(ctx->object_table, obj->id));
+ assert(!_mesa_hash_table_search(ctx->object_table, &obj->id));
- util_hash_table_set_u64(ctx->object_table, obj->id, obj);
+ _mesa_hash_table_insert(ctx->object_table, &obj->id, obj);
}
static inline void
vkr_context_remove_object(struct vkr_context *ctx, struct vkr_object *obj)
{
- assert(util_hash_table_get_u64(ctx->object_table, obj->id));
+ assert(_mesa_hash_table_search(ctx->object_table, &obj->id));
- /* this frees obj */
- util_hash_table_remove_u64(ctx->object_table, obj->id);
+ struct hash_entry *entry = _mesa_hash_table_search(ctx->object_table, &obj->id);
+ if (likely(entry)) {
+ vkr_context_free_object(entry);
+ _mesa_hash_table_remove(ctx->object_table, entry);
+ }
}
static inline void
@@ -117,6 +164,13 @@ vkr_context_remove_objects(struct vkr_context *ctx, struct list_head *objects)
/* objects should be reinitialized if to be reused */
}
+static inline void *
+vkr_context_get_object(struct vkr_context *ctx, vkr_object_id obj_id)
+{
+ const struct hash_entry *entry = _mesa_hash_table_search(ctx->object_table, &obj_id);
+ return likely(entry) ? entry->data : NULL;
+}
+
static inline const char *
vkr_context_get_name(const struct vkr_context *ctx)
{