From: Chia-I Wu Date: Thu, 26 Aug 2021 18:30:18 +0000 (-0700) Subject: venus: make ring buffer size configurable X-Git-Tag: upstream/22.3.5~18235 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c9eedba75dcd7a8d2c3fc81d9aff728ef2cc1001;p=platform%2Fupstream%2Fmesa.git venus: make ring buffer size configurable Until we can assume large ring support. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Reviewed-by: Ryan Neph Part-of: --- diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index a7fcf74..af7070f 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -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); diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index b6fabc4..3bdc54d 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -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; diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index 3e63efa..033203f 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -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,