venus: allow tls ring submission to utilize the entire ring shmem

Ring submissions on tls ring are synchronous and single threaded, thus
without perf degradation, a single cmd can use the entire ring shmem.

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27054>
This commit is contained in:
Yiwei Zhang
2024-01-11 17:12:13 -08:00
committed by Marge Bot
parent 80a5df16fe
commit 85df907ad8
4 changed files with 27 additions and 9 deletions

View File

@@ -276,10 +276,13 @@ vn_tls_get_ring(struct vn_instance *instance)
/* only need a small ring for synchronous cmds on tls ring */
static const size_t buf_size = 16 * 1024;
/* single cmd can use the entire ring shmem on tls ring */
static const uint8_t direct_order = 0;
struct vn_ring_layout layout;
vn_ring_get_layout(buf_size, extra_size, &layout);
tls_ring->ring = vn_ring_create(instance, &layout);
tls_ring->ring = vn_ring_create(instance, &layout, direct_order);
if (!tls_ring->ring) {
free(tls_ring);
return NULL;

View File

@@ -20,8 +20,6 @@
#include "vn_renderer.h"
#include "vn_ring.h"
#define VN_INSTANCE_RING_SIZE (128 * 1024)
/*
* Instance extensions add instance-level or physical-device-level
* functionalities. It seems renderer support is either unnecessary or
@@ -130,10 +128,17 @@ vn_instance_init_ring(struct vn_instance *instance)
{
/* 32-bit seqno for renderer roundtrips */
static const size_t extra_size = sizeof(uint32_t);
struct vn_ring_layout layout;
vn_ring_get_layout(VN_INSTANCE_RING_SIZE, extra_size, &layout);
instance->ring.ring = vn_ring_create(instance, &layout);
/* default instance ring size */
static const size_t buf_size = 128 * 1024;
/* order of 4 for performant async cmd enqueue */
static const uint8_t direct_order = 4;
struct vn_ring_layout layout;
vn_ring_get_layout(buf_size, extra_size, &layout);
instance->ring.ring = vn_ring_create(instance, &layout, direct_order);
if (!instance->ring.ring)
return VK_ERROR_OUT_OF_HOST_MEMORY;

View File

@@ -40,6 +40,11 @@ struct vn_ring {
*/
mtx_t mutex;
/* size limit for cmd submission via ring shmem, derived from
* (buffer_size >> direct_order) upon vn_ring_create
*/
uint32_t direct_size;
/* used for indirect submission of large command (non-VkCommandBuffer) */
struct vn_cs_encoder upload;
@@ -251,7 +256,8 @@ vn_ring_get_layout(size_t buf_size,
struct vn_ring *
vn_ring_create(struct vn_instance *instance,
const struct vn_ring_layout *layout)
const struct vn_ring_layout *layout,
uint8_t direct_order)
{
VN_TRACE_FUNC();
@@ -289,6 +295,9 @@ vn_ring_create(struct vn_instance *instance,
mtx_init(&ring->mutex, mtx_plain);
ring->direct_size = layout->buffer_size >> direct_order;
assert(ring->direct_size);
vn_cs_encoder_init(&ring->upload, instance,
VN_CS_ENCODER_STORAGE_SHMEM_ARRAY, 1 * 1024 * 1024);
@@ -529,7 +538,7 @@ static inline bool
vn_ring_submission_can_direct(const struct vn_ring *ring,
const struct vn_cs_encoder *cs)
{
return vn_cs_encoder_get_len(cs) <= (ring->buffer_size >> 4);
return vn_cs_encoder_get_len(cs) <= ring->direct_size;
}
static struct vn_cs_encoder *

View File

@@ -46,7 +46,8 @@ vn_ring_get_layout(size_t buf_size,
struct vn_ring *
vn_ring_create(struct vn_instance *instance,
const struct vn_ring_layout *layout);
const struct vn_ring_layout *layout,
uint8_t direct_order);
void
vn_ring_destroy(struct vn_ring *ring);