venus: use instance allocator for ring allocs

and some nice to have refactors

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26179>
This commit is contained in:
Yiwei Zhang 2023-11-03 21:38:38 -07:00 committed by Marge Bot
parent 15c7e7743e
commit ec131c6e55
3 changed files with 22 additions and 17 deletions

View file

@ -130,8 +130,7 @@ vn_instance_init_ring(struct vn_instance *instance)
mtx_init(&instance->ring.mutex, mtx_plain); mtx_init(&instance->ring.mutex, mtx_plain);
struct vn_ring *ring = &instance->ring.ring; struct vn_ring *ring = &instance->ring.ring;
vn_ring_init(ring, instance->renderer, &layout, vn_ring_init(instance, ring, &layout, instance->ring.shmem->mmap_ptr);
instance->ring.shmem->mmap_ptr);
instance->ring.id = (uintptr_t)ring; instance->ring.id = (uintptr_t)ring;
@ -334,6 +333,7 @@ vn_instance_submission_get_ring_submit(struct vn_ring *ring,
struct vn_renderer_shmem *extra_shmem, struct vn_renderer_shmem *extra_shmem,
bool direct) bool direct)
{ {
struct vn_renderer *renderer = ring->instance->renderer;
const uint32_t shmem_count = const uint32_t shmem_count =
(direct ? 0 : cs->buffer_count) + (extra_shmem ? 1 : 0); (direct ? 0 : cs->buffer_count) + (extra_shmem ? 1 : 0);
struct vn_ring_submit *submit = vn_ring_get_submit(ring, shmem_count); struct vn_ring_submit *submit = vn_ring_get_submit(ring, shmem_count);
@ -344,12 +344,12 @@ vn_instance_submission_get_ring_submit(struct vn_ring *ring,
if (!direct) { if (!direct) {
for (uint32_t i = 0; i < cs->buffer_count; i++) { for (uint32_t i = 0; i < cs->buffer_count; i++) {
submit->shmems[i] = submit->shmems[i] =
vn_renderer_shmem_ref(ring->renderer, cs->buffers[i].shmem); vn_renderer_shmem_ref(renderer, cs->buffers[i].shmem);
} }
} }
if (extra_shmem) { if (extra_shmem) {
submit->shmems[shmem_count - 1] = submit->shmems[shmem_count - 1] =
vn_renderer_shmem_ref(ring->renderer, extra_shmem); vn_renderer_shmem_ref(renderer, extra_shmem);
} }
return submit; return submit;

View file

@ -6,6 +6,7 @@
#include "vn_ring.h" #include "vn_ring.h"
#include "vn_cs.h" #include "vn_cs.h"
#include "vn_instance.h"
#include "vn_renderer.h" #include "vn_renderer.h"
static uint32_t static uint32_t
@ -76,16 +77,16 @@ vn_ring_ge_seqno(const struct vn_ring *ring, uint32_t a, uint32_t b)
static void static void
vn_ring_retire_submits(struct vn_ring *ring, uint32_t seqno) vn_ring_retire_submits(struct vn_ring *ring, uint32_t seqno)
{ {
struct vn_renderer *renderer = ring->instance->renderer;
list_for_each_entry_safe(struct vn_ring_submit, submit, &ring->submits, list_for_each_entry_safe(struct vn_ring_submit, submit, &ring->submits,
head) { head) {
if (!vn_ring_ge_seqno(ring, seqno, submit->seqno)) if (!vn_ring_ge_seqno(ring, seqno, submit->seqno))
break; break;
for (uint32_t i = 0; i < submit->shmem_count; i++) for (uint32_t i = 0; i < submit->shmem_count; i++)
vn_renderer_shmem_unref(ring->renderer, submit->shmems[i]); vn_renderer_shmem_unref(renderer, submit->shmems[i]);
list_del(&submit->head); list_move_to(&submit->head, &ring->free_submits);
list_add(&submit->head, &ring->free_submits);
} }
} }
@ -179,15 +180,15 @@ vn_ring_get_layout(size_t buf_size,
} }
void void
vn_ring_init(struct vn_ring *ring, vn_ring_init(struct vn_instance *instance,
struct vn_renderer *renderer, struct vn_ring *ring,
const struct vn_ring_layout *layout, const struct vn_ring_layout *layout,
void *shared) void *shared)
{ {
memset(ring, 0, sizeof(*ring)); memset(ring, 0, sizeof(*ring));
memset(shared, 0, layout->shmem_size); memset(shared, 0, layout->shmem_size);
ring->renderer = renderer; ring->instance = instance;
assert(layout->buffer_size && assert(layout->buffer_size &&
util_is_power_of_two_or_zero(layout->buffer_size)); util_is_power_of_two_or_zero(layout->buffer_size));
@ -207,12 +208,14 @@ vn_ring_init(struct vn_ring *ring,
void void
vn_ring_fini(struct vn_ring *ring) vn_ring_fini(struct vn_ring *ring)
{ {
const VkAllocationCallbacks *alloc = &ring->instance->base.base.alloc;
vn_ring_retire_submits(ring, ring->cur); vn_ring_retire_submits(ring, ring->cur);
assert(list_is_empty(&ring->submits)); assert(list_is_empty(&ring->submits));
list_for_each_entry_safe(struct vn_ring_submit, submit, list_for_each_entry_safe(struct vn_ring_submit, submit,
&ring->free_submits, head) &ring->free_submits, head)
free(submit); vk_free(alloc, submit);
if (ring->monitor.report_period_us) if (ring->monitor.report_period_us)
mtx_destroy(&ring->monitor.mutex); mtx_destroy(&ring->monitor.mutex);
@ -221,6 +224,7 @@ vn_ring_fini(struct vn_ring *ring)
struct vn_ring_submit * struct vn_ring_submit *
vn_ring_get_submit(struct vn_ring *ring, uint32_t shmem_count) vn_ring_get_submit(struct vn_ring *ring, uint32_t shmem_count)
{ {
const VkAllocationCallbacks *alloc = &ring->instance->base.base.alloc;
const uint32_t min_shmem_count = 2; const uint32_t min_shmem_count = 2;
struct vn_ring_submit *submit; struct vn_ring_submit *submit;
@ -231,9 +235,10 @@ vn_ring_get_submit(struct vn_ring *ring, uint32_t shmem_count)
list_first_entry(&ring->free_submits, struct vn_ring_submit, head); list_first_entry(&ring->free_submits, struct vn_ring_submit, head);
list_del(&submit->head); list_del(&submit->head);
} else { } else {
shmem_count = MAX2(shmem_count, min_shmem_count); const size_t submit_size = offsetof(
submit = struct vn_ring_submit, shmems[MAX2(shmem_count, min_shmem_count)]);
malloc(sizeof(*submit) + sizeof(submit->shmems[0]) * shmem_count); submit = vk_alloc(alloc, submit_size, VN_DEFAULT_ALIGN,
VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
} }
return submit; return submit;

View file

@ -60,7 +60,7 @@ struct vn_ring_submit {
}; };
struct vn_ring { struct vn_ring {
struct vn_renderer *renderer; struct vn_instance *instance;
uint32_t buffer_size; uint32_t buffer_size;
uint32_t buffer_mask; uint32_t buffer_mask;
@ -94,8 +94,8 @@ vn_ring_get_layout(size_t buf_size,
struct vn_ring_layout *layout); struct vn_ring_layout *layout);
void void
vn_ring_init(struct vn_ring *ring, vn_ring_init(struct vn_instance *instance,
struct vn_renderer *renderer, struct vn_ring *ring,
const struct vn_ring_layout *layout, const struct vn_ring_layout *layout,
void *shared); void *shared);