mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-18 00:20:27 +01:00
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:
parent
eb88c8e1d4
commit
c9eedba75d
3 changed files with 26 additions and 15 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue