venus: make ring buffer size configurable
authorChia-I Wu <olvaffe@gmail.com>
Thu, 26 Aug 2021 18:30:18 +0000 (11:30 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 8 Sep 2021 16:38:24 +0000 (16:38 +0000)
Until we can assume large ring support.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12568>

src/virtio/vulkan/vn_instance.c
src/virtio/vulkan/vn_ring.c
src/virtio/vulkan/vn_ring.h

index a7fcf74..af7070f 100644 (file)
@@ -19,7 +19,9 @@
 #include "vn_physical_device.h"
 #include "vn_renderer.h"
 
-#define VN_INSTANCE_RING_DIRECT_THRESHOLD (256)
+/* this must not exceed 2KiB for the ring to fit in a 4K page */
+#define VN_INSTANCE_RING_SIZE (2 * 1024)
+#define VN_INSTANCE_RING_DIRECT_THRESHOLD (VN_INSTANCE_RING_SIZE / 8)
 
 /*
  * Instance extensions add instance-level or physical-device-level
@@ -109,10 +111,11 @@ vn_instance_init_renderer_versions(struct vn_instance *instance)
 static VkResult
 vn_instance_init_ring(struct vn_instance *instance)
 {
+   const size_t buf_size = VN_INSTANCE_RING_SIZE;
    /* 32-bit seqno for renderer roundtrips */
    const size_t extra_size = sizeof(uint32_t);
    struct vn_ring_layout layout;
-   vn_ring_get_layout(extra_size, &layout);
+   vn_ring_get_layout(buf_size, extra_size, &layout);
 
    instance->ring.shmem =
       vn_renderer_shmem_create(instance->renderer, layout.shmem_size);
index b6fabc4..3bdc54d 100644 (file)
@@ -8,10 +8,6 @@
 #include "vn_cs.h"
 #include "vn_renderer.h"
 
-/* must be power-of-two */
-#define VN_RING_BUFFER_SIZE (1u << 11)
-#define VN_RING_BUFFER_MASK (VN_RING_BUFFER_SIZE - 1)
-
 enum vn_ring_status_flag {
    VN_RING_STATUS_IDLE = 1u << 0,
 };
@@ -45,13 +41,13 @@ vn_ring_load_status(const struct vn_ring *ring)
 static void
 vn_ring_write_buffer(struct vn_ring *ring, const void *data, uint32_t size)
 {
-   assert(ring->cur + size - vn_ring_load_head(ring) <= VN_RING_BUFFER_SIZE);
+   assert(ring->cur + size - vn_ring_load_head(ring) <= ring->buffer_size);
 
-   const uint32_t offset = ring->cur & VN_RING_BUFFER_MASK;
-   if (offset + size <= VN_RING_BUFFER_SIZE) {
+   const uint32_t offset = ring->cur & ring->buffer_mask;
+   if (offset + size <= ring->buffer_size) {
       memcpy(ring->shared.buffer + offset, data, size);
    } else {
-      const uint32_t s = VN_RING_BUFFER_SIZE - offset;
+      const uint32_t s = ring->buffer_size - offset;
       memcpy(ring->shared.buffer + offset, data, s);
       memcpy(ring->shared.buffer, data + s, size - s);
    }
@@ -108,20 +104,22 @@ vn_ring_wait_seqno(const struct vn_ring *ring, uint32_t seqno)
 static uint32_t
 vn_ring_wait_space(const struct vn_ring *ring, uint32_t size)
 {
-   assert(size <= VN_RING_BUFFER_SIZE);
+   assert(size <= ring->buffer_size);
 
    /* see the reasoning in vn_ring_wait_seqno */
    uint32_t iter = 0;
    do {
       const uint32_t head = vn_ring_load_head(ring);
-      if (ring->cur + size - head <= VN_RING_BUFFER_SIZE)
+      if (ring->cur + size - head <= ring->buffer_size)
          return head;
       vn_relax(&iter, "ring space");
    } while (true);
 }
 
 void
-vn_ring_get_layout(size_t extra_size, struct vn_ring_layout *layout)
+vn_ring_get_layout(size_t buf_size,
+                   size_t extra_size,
+                   struct vn_ring_layout *layout)
 {
    /* this can be changed/extended quite freely */
    struct layout {
@@ -131,7 +129,6 @@ vn_ring_get_layout(size_t extra_size, struct vn_ring_layout *layout)
 
       uint8_t buffer[] __attribute__((aligned(64)));
    };
-   const size_t buf_size = VN_RING_BUFFER_SIZE;
 
    assert(buf_size && util_is_power_of_two_or_zero(buf_size));
 
@@ -159,6 +156,11 @@ vn_ring_init(struct vn_ring *ring,
 
    ring->renderer = renderer;
 
+   assert(layout->buffer_size &&
+          util_is_power_of_two_or_zero(layout->buffer_size));
+   ring->buffer_size = layout->buffer_size;
+   ring->buffer_mask = ring->buffer_size - 1;
+
    ring->shared.head = shared + layout->head_offset;
    ring->shared.tail = shared + layout->tail_offset;
    ring->shared.status = shared + layout->status_offset;
index 3e63efa..033203f 100644 (file)
@@ -62,6 +62,10 @@ struct vn_ring_submit {
 struct vn_ring {
    struct vn_renderer *renderer;
 
+   /* TODO assume large ring support and use fixed size */
+   uint32_t buffer_size;
+   uint32_t buffer_mask;
+
    struct vn_ring_shared shared;
    uint32_t cur;
 
@@ -70,7 +74,9 @@ struct vn_ring {
 };
 
 void
-vn_ring_get_layout(size_t extra_size, struct vn_ring_layout *layout);
+vn_ring_get_layout(size_t buf_size,
+                   size_t extra_size,
+                   struct vn_ring_layout *layout);
 
 void
 vn_ring_init(struct vn_ring *ring,