venus: make ring buffer size configurable

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>
This commit is contained in:
Chia-I Wu 2021-08-26 11:30:18 -07:00 committed by Marge Bot
parent eb88c8e1d4
commit c9eedba75d
3 changed files with 26 additions and 15 deletions

View 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);

View 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;

View 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,