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:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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 *
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user