diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index fbe0bf56b00..3d977c75c94 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -130,8 +130,7 @@ vn_instance_init_ring(struct vn_instance *instance) mtx_init(&instance->ring.mutex, mtx_plain); struct vn_ring *ring = &instance->ring.ring; - vn_ring_init(ring, instance->renderer, &layout, - instance->ring.shmem->mmap_ptr); + vn_ring_init(instance, ring, &layout, instance->ring.shmem->mmap_ptr); 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, bool direct) { + struct vn_renderer *renderer = ring->instance->renderer; const uint32_t shmem_count = (direct ? 0 : cs->buffer_count) + (extra_shmem ? 1 : 0); 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) { for (uint32_t i = 0; i < cs->buffer_count; 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) { submit->shmems[shmem_count - 1] = - vn_renderer_shmem_ref(ring->renderer, extra_shmem); + vn_renderer_shmem_ref(renderer, extra_shmem); } return submit; diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index b4d342f32aa..f12eed23167 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -6,6 +6,7 @@ #include "vn_ring.h" #include "vn_cs.h" +#include "vn_instance.h" #include "vn_renderer.h" static uint32_t @@ -76,16 +77,16 @@ vn_ring_ge_seqno(const struct vn_ring *ring, uint32_t a, uint32_t b) static void 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, head) { if (!vn_ring_ge_seqno(ring, seqno, submit->seqno)) break; 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_add(&submit->head, &ring->free_submits); + list_move_to(&submit->head, &ring->free_submits); } } @@ -179,15 +180,15 @@ vn_ring_get_layout(size_t buf_size, } void -vn_ring_init(struct vn_ring *ring, - struct vn_renderer *renderer, +vn_ring_init(struct vn_instance *instance, + struct vn_ring *ring, const struct vn_ring_layout *layout, void *shared) { memset(ring, 0, sizeof(*ring)); memset(shared, 0, layout->shmem_size); - ring->renderer = renderer; + ring->instance = instance; assert(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 vn_ring_fini(struct vn_ring *ring) { + const VkAllocationCallbacks *alloc = &ring->instance->base.base.alloc; + vn_ring_retire_submits(ring, ring->cur); assert(list_is_empty(&ring->submits)); list_for_each_entry_safe(struct vn_ring_submit, submit, &ring->free_submits, head) - free(submit); + vk_free(alloc, submit); if (ring->monitor.report_period_us) mtx_destroy(&ring->monitor.mutex); @@ -221,6 +224,7 @@ vn_ring_fini(struct vn_ring *ring) struct vn_ring_submit * 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; 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_del(&submit->head); } else { - shmem_count = MAX2(shmem_count, min_shmem_count); - submit = - malloc(sizeof(*submit) + sizeof(submit->shmems[0]) * shmem_count); + const size_t submit_size = offsetof( + struct vn_ring_submit, shmems[MAX2(shmem_count, min_shmem_count)]); + submit = vk_alloc(alloc, submit_size, VN_DEFAULT_ALIGN, + VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); } return submit; diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index 4b97a2f146e..dcef54ec3a1 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -60,7 +60,7 @@ struct vn_ring_submit { }; struct vn_ring { - struct vn_renderer *renderer; + struct vn_instance *instance; uint32_t buffer_size; uint32_t buffer_mask; @@ -94,8 +94,8 @@ vn_ring_get_layout(size_t buf_size, struct vn_ring_layout *layout); void -vn_ring_init(struct vn_ring *ring, - struct vn_renderer *renderer, +vn_ring_init(struct vn_instance *instance, + struct vn_ring *ring, const struct vn_ring_layout *layout, void *shared);