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