Mesa (main): venus: use vn_renderer_shmem_pool for reply shmems
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Dec 15 19:12:29 UTC 2021
Module: Mesa
Branch: main
Commit: 1fe8f0fea0dd81a8d055b158e7c480a47fa25db0
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1fe8f0fea0dd81a8d055b158e7c480a47fa25db0
Author: Chia-I Wu <olvaffe at gmail.com>
Date: Thu Dec 9 17:08:15 2021 -0800
venus: use vn_renderer_shmem_pool for reply shmems
Signed-off-by: Chia-I Wu <olvaffe at gmail.com>
Reviewed-by: Ryan Neph <ryanneph at google.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14179>
---
src/virtio/vulkan/vn_instance.c | 73 +++++++++++++++++------------------------
src/virtio/vulkan/vn_instance.h | 9 ++---
2 files changed, 32 insertions(+), 50 deletions(-)
diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c
index 7e0f6c1aac4..793bc9e9b26 100644
--- a/src/virtio/vulkan/vn_instance.c
+++ b/src/virtio/vulkan/vn_instance.c
@@ -548,54 +548,38 @@ vn_instance_ring_submit(struct vn_instance *instance,
return result;
}
-static bool
-vn_instance_grow_reply_shmem_locked(struct vn_instance *instance, size_t size)
+static struct vn_renderer_shmem *
+vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
+ size_t size,
+ void **out_ptr)
{
- const size_t min_shmem_size = 1 << 20;
-
- size_t shmem_size =
- instance->reply.size ? instance->reply.size : min_shmem_size;
- while (shmem_size < size) {
- shmem_size <<= 1;
- if (!shmem_size)
- return false;
- }
+ struct vn_renderer_shmem_pool *pool = &instance->reply_shmem_pool;
+ const struct vn_renderer_shmem *saved_pool_shmem = pool->shmem;
+ size_t offset;
struct vn_renderer_shmem *shmem =
- vn_renderer_shmem_create(instance->renderer, shmem_size);
+ vn_renderer_shmem_pool_alloc(instance->renderer, pool, size, &offset);
if (!shmem)
- return false;
-
- if (instance->reply.shmem)
- vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
- instance->reply.shmem = shmem;
- instance->reply.size = shmem_size;
- instance->reply.used = 0;
- instance->reply.ptr = shmem->mmap_ptr;
-
- return true;
-}
+ return NULL;
-static struct vn_renderer_shmem *
-vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
- size_t size,
- void **ptr)
-{
- if (unlikely(instance->reply.used + size > instance->reply.size)) {
- if (!vn_instance_grow_reply_shmem_locked(instance, size))
- return NULL;
+ assert(shmem == pool->shmem);
+ *out_ptr = shmem->mmap_ptr + offset;
+ if (shmem != saved_pool_shmem) {
uint32_t set_reply_command_stream_data[16];
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
set_reply_command_stream_data,
sizeof(set_reply_command_stream_data));
const struct VkCommandStreamDescriptionMESA stream = {
- .resourceId = instance->reply.shmem->res_id,
- .size = instance->reply.size,
+ .resourceId = shmem->res_id,
+ .size = pool->size,
};
vn_encode_vkSetReplyCommandStreamMESA(&local_enc, 0, &stream);
vn_cs_encoder_commit(&local_enc);
+ /* vn_instance_init_experimental_features calls this before the ring is
+ * created
+ */
if (likely(instance->ring.id)) {
vn_instance_roundtrip(instance);
vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
@@ -610,10 +594,12 @@ vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
uint32_t seek_reply_command_stream_data[8];
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
seek_reply_command_stream_data, sizeof(seek_reply_command_stream_data));
- const size_t offset = instance->reply.used;
vn_encode_vkSeekReplyCommandStreamMESA(&local_enc, 0, offset);
vn_cs_encoder_commit(&local_enc);
+ /* vn_instance_init_experimental_features calls this before the ring is
+ * created
+ */
if (likely(instance->ring.id)) {
vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
} else {
@@ -622,10 +608,7 @@ vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
vn_cs_encoder_get_len(&local_enc));
}
- *ptr = instance->reply.ptr + offset;
- instance->reply.used += size;
-
- return vn_renderer_shmem_ref(instance->renderer, instance->reply.shmem);
+ return shmem;
}
void
@@ -743,6 +726,9 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
if (result != VK_SUCCESS)
goto fail;
+ vn_renderer_shmem_pool_init(instance->renderer,
+ &instance->reply_shmem_pool, 1u << 20);
+
result = vn_instance_init_experimental_features(instance);
if (result != VK_SUCCESS)
goto fail;
@@ -795,9 +781,6 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
return VK_SUCCESS;
fail:
- if (instance->reply.shmem)
- vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
-
if (instance->ring.shmem) {
uint32_t destroy_ring_data[4];
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
@@ -813,6 +796,9 @@ fail:
mtx_destroy(&instance->ring.mutex);
}
+ vn_renderer_shmem_pool_fini(instance->renderer,
+ &instance->reply_shmem_pool);
+
if (instance->renderer)
vn_renderer_destroy(instance->renderer, alloc);
@@ -845,8 +831,6 @@ vn_DestroyInstance(VkInstance _instance,
vn_call_vkDestroyInstance(instance, _instance, NULL);
- vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
-
uint32_t destroy_ring_data[4];
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
destroy_ring_data, sizeof(destroy_ring_data));
@@ -860,6 +844,9 @@ vn_DestroyInstance(VkInstance _instance,
mtx_destroy(&instance->ring.mutex);
vn_renderer_shmem_unref(instance->renderer, instance->ring.shmem);
+ vn_renderer_shmem_pool_fini(instance->renderer,
+ &instance->reply_shmem_pool);
+
vn_renderer_destroy(instance->renderer, alloc);
driDestroyOptionCache(&instance->dri_options);
diff --git a/src/virtio/vulkan/vn_instance.h b/src/virtio/vulkan/vn_instance.h
index 1c3767fcea9..800554961b9 100644
--- a/src/virtio/vulkan/vn_instance.h
+++ b/src/virtio/vulkan/vn_instance.h
@@ -40,6 +40,8 @@ struct vn_instance {
struct vn_renderer *renderer;
struct vn_renderer_info renderer_info;
+ struct vn_renderer_shmem_pool reply_shmem_pool;
+
/* XXX staged features to be merged to core venus protocol */
VkVenusExperimentalFeatures100000MESA experimental;
@@ -57,13 +59,6 @@ struct vn_instance {
uint32_t roundtrip_next;
} ring;
- struct {
- struct vn_renderer_shmem *shmem;
- size_t size;
- size_t used;
- void *ptr;
- } reply;
-
/* Between the driver and the app, VN_MAX_API_VERSION is what we advertise
* and base.base.app_info.api_version is what the app requests.
*
More information about the mesa-commit
mailing list