venus: raise the ring buffer size to 64KB

When the renderer supports largeRing, raise the ring buffer size to 64KB
and raise the direct submit threshold to 4KB.  The numbers are randomly
picked.

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:42:18 -07:00
committed by Marge Bot
parent 79b8498c05
commit e38c58c808
+18 -6
View File
@@ -19,6 +19,10 @@
#include "vn_physical_device.h"
#include "vn_renderer.h"
#define VN_INSTANCE_LARGE_RING_SIZE (64 * 1024)
#define VN_INSTANCE_LARGE_RING_DIRECT_THRESHOLD \
(VN_INSTANCE_LARGE_RING_SIZE / 16)
/* 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)
@@ -111,7 +115,9 @@ 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;
const size_t buf_size = instance->experimental.largeRing
? VN_INSTANCE_LARGE_RING_SIZE
: VN_INSTANCE_RING_SIZE;
/* 32-bit seqno for renderer roundtrips */
const size_t extra_size = sizeof(uint32_t);
struct vn_ring_layout layout;
@@ -215,9 +221,11 @@ vn_instance_init_experimental_features(struct vn_instance *instance)
vn_log(instance,
"VkVenusExperimentalFeatures100000MESA is as below:"
"\n\tmemoryResourceAllocationSize = %u"
"\n\tglobalFencing = %u",
"\n\tglobalFencing = %u"
"\n\tlargeRing = %u",
instance->experimental.memoryResourceAllocationSize,
instance->experimental.globalFencing);
instance->experimental.globalFencing,
instance->experimental.largeRing);
}
return VK_SUCCESS;
@@ -448,9 +456,13 @@ vn_instance_submission_prepare(struct vn_instance_submission *submit,
}
static bool
vn_instance_submission_can_direct(const struct vn_cs_encoder *cs)
vn_instance_submission_can_direct(const struct vn_instance *instance,
const struct vn_cs_encoder *cs)
{
return vn_cs_encoder_get_len(cs) <= VN_INSTANCE_RING_DIRECT_THRESHOLD;
const size_t threshold = instance->experimental.largeRing
? VN_INSTANCE_LARGE_RING_DIRECT_THRESHOLD
: VN_INSTANCE_RING_DIRECT_THRESHOLD;
return vn_cs_encoder_get_len(cs) <= threshold;
}
static struct vn_cs_encoder *
@@ -483,7 +495,7 @@ vn_instance_ring_submit_locked(struct vn_instance *instance,
{
struct vn_ring *ring = &instance->ring.ring;
const bool direct = vn_instance_submission_can_direct(cs);
const bool direct = vn_instance_submission_can_direct(instance, cs);
if (!direct && !cs->indirect) {
cs = vn_instance_ring_cs_upload_locked(instance, cs);
if (!cs)