diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index 6090ca21c0e..0dc7d55a986 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -171,7 +171,7 @@ vn_relax_fini(struct vn_relax_state *state) struct vn_relax_state vn_relax_init(struct vn_instance *instance, const char *reason) { - struct vn_ring *ring = &instance->ring.ring; + struct vn_ring *ring = instance->ring.ring; struct vn_watchdog *watchdog = &instance->ring.watchdog; if (vn_watchdog_acquire(watchdog, true)) vn_ring_unset_status_bits(ring, VK_RING_STATUS_ALIVE_BIT_MESA); @@ -212,7 +212,7 @@ vn_relax(struct vn_relax_state *state) struct vn_instance *instance = state->instance; vn_log(instance, "stuck in %s wait with iter at %d", reason, *iter); - struct vn_ring *ring = &instance->ring.ring; + struct vn_ring *ring = instance->ring.ring; const uint32_t status = vn_ring_load_status(ring); if (status & VK_RING_STATUS_FATAL_BIT_MESA) { vn_log(instance, "aborting on ring fatal error at iter %d", *iter); diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index 46bb6935f58..f61f753fc86 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -64,8 +64,7 @@ vn_device_memory_wait_alloc(struct vn_device *dev, * - mem alloc is done upon bo map or export * - mem import is done upon bo destroy */ - if (vn_ring_get_seqno_status(&dev->instance->ring.ring, - mem->bo_ring_seqno)) + if (vn_ring_get_seqno_status(dev->instance->ring.ring, mem->bo_ring_seqno)) return VK_SUCCESS; /* fine to false it here since renderer submission failure is fatal */ diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 351337010d9..87e44086f64 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -127,11 +127,9 @@ vn_instance_fini_ring(struct vn_instance *instance) vn_watchdog_fini(&instance->ring.watchdog); - vn_ring_fini(&instance->ring.ring); - mtx_destroy(&instance->ring.mutex); - vn_renderer_shmem_unref(instance->renderer, instance->ring.shmem); + vn_ring_destroy(instance->ring.ring); } static VkResult @@ -142,21 +140,14 @@ vn_instance_init_ring(struct vn_instance *instance) struct vn_ring_layout layout; vn_ring_get_layout(VN_INSTANCE_RING_SIZE, extra_size, &layout); - instance->ring.shmem = - vn_renderer_shmem_create(instance->renderer, layout.shmem_size); - if (!instance->ring.shmem) { - if (VN_DEBUG(INIT)) - vn_log(instance, "failed to allocate/map ring shmem"); + instance->ring.ring = vn_ring_create(instance, &layout); + if (!instance->ring.ring) return VK_ERROR_OUT_OF_HOST_MEMORY; - } + + instance->ring.id = (uintptr_t)instance->ring.ring; mtx_init(&instance->ring.mutex, mtx_plain); - struct vn_ring *ring = &instance->ring.ring; - vn_ring_init(instance, ring, &layout, instance->ring.shmem->mmap_ptr); - - instance->ring.id = (uintptr_t)ring; - vn_watchdog_init(&instance->ring.watchdog); const struct VkRingMonitorInfoMESA monitor_info = { @@ -166,7 +157,7 @@ vn_instance_init_ring(struct vn_instance *instance) const struct VkRingCreateInfoMESA info = { .sType = VK_STRUCTURE_TYPE_RING_CREATE_INFO_MESA, .pNext = &monitor_info, - .resourceId = instance->ring.shmem->res_id, + .resourceId = instance->ring.ring->shmem->res_id, .size = layout.shmem_size, .idleTimeout = 5ull * 1000 * 1000, .headOffset = layout.head_offset, @@ -399,7 +390,7 @@ vn_instance_submission_prepare(struct vn_instance *instance, return VK_ERROR_OUT_OF_HOST_MEMORY; submit->submit = vn_instance_submission_get_ring_submit( - &instance->ring.ring, cs, extra_shmem, direct); + instance->ring.ring, cs, extra_shmem, direct); if (!submit->submit) { vn_instance_submission_cleanup(instance, submit); return VK_ERROR_OUT_OF_HOST_MEMORY; @@ -444,7 +435,7 @@ vn_instance_ring_submit_locked(struct vn_instance *instance, struct vn_renderer_shmem *extra_shmem, uint32_t *ring_seqno) { - struct vn_ring *ring = &instance->ring.ring; + struct vn_ring *ring = instance->ring.ring; const bool direct = vn_instance_submission_can_direct(instance, cs); if (!direct && cs->storage_type == VN_CS_ENCODER_STORAGE_POINTER) { @@ -543,7 +534,7 @@ vn_instance_submit_command(struct vn_instance *instance, submit->reply = VN_CS_DECODER_INITIALIZER(reply_ptr, submit->reply_size); if (submit->ring_seqno_valid) - vn_ring_wait_seqno(&instance->ring.ring, submit->ring_seqno); + vn_ring_wait_seqno(instance->ring.ring, submit->ring_seqno); } } diff --git a/src/virtio/vulkan/vn_instance.h b/src/virtio/vulkan/vn_instance.h index c512a5fcf88..e1ab750e11a 100644 --- a/src/virtio/vulkan/vn_instance.h +++ b/src/virtio/vulkan/vn_instance.h @@ -49,10 +49,9 @@ struct vn_instance { uint64_t ring_idx_used_mask; struct { - mtx_t mutex; - struct vn_renderer_shmem *shmem; - struct vn_ring ring; + struct vn_ring *ring; uint64_t id; + mtx_t mutex; struct vn_cs_encoder upload; diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index 9015c701104..84c60d83f28 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -181,13 +181,29 @@ vn_ring_get_layout(size_t buf_size, layout->shmem_size = layout->extra_offset + layout->extra_size; } -void -vn_ring_init(struct vn_instance *instance, - struct vn_ring *ring, - const struct vn_ring_layout *layout, - void *shared) +struct vn_ring * +vn_ring_create(struct vn_instance *instance, + const struct vn_ring_layout *layout) { - memset(ring, 0, sizeof(*ring)); + VN_TRACE_FUNC(); + + const VkAllocationCallbacks *alloc = &instance->base.base.alloc; + + struct vn_ring *ring = vk_zalloc(alloc, sizeof(*ring), VN_DEFAULT_ALIGN, + VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!ring) + return NULL; + + ring->shmem = + vn_renderer_shmem_create(instance->renderer, layout->shmem_size); + if (!ring->shmem) { + if (VN_DEBUG(INIT)) + vn_log(instance, "failed to allocate/map ring shmem"); + vk_free(alloc, ring); + return NULL; + } + + void *shared = ring->shmem->mmap_ptr; memset(shared, 0, layout->shmem_size); ring->instance = instance; @@ -205,11 +221,15 @@ vn_ring_init(struct vn_instance *instance, list_inithead(&ring->submits); list_inithead(&ring->free_submits); + + return ring; } void -vn_ring_fini(struct vn_ring *ring) +vn_ring_destroy(struct vn_ring *ring) { + VN_TRACE_FUNC(); + const VkAllocationCallbacks *alloc = &ring->instance->base.base.alloc; vn_ring_retire_submits(ring, ring->cur); @@ -218,6 +238,8 @@ vn_ring_fini(struct vn_ring *ring) list_for_each_entry_safe(struct vn_ring_submit, submit, &ring->free_submits, head) vk_free(alloc, submit); + + vk_free(alloc, ring); } struct vn_ring_submit * diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index 9d2943df075..86b2542edf5 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -61,6 +61,7 @@ struct vn_ring_submit { struct vn_ring { struct vn_instance *instance; + struct vn_renderer_shmem *shmem; uint32_t buffer_size; uint32_t buffer_mask; @@ -77,14 +78,12 @@ vn_ring_get_layout(size_t buf_size, size_t extra_size, struct vn_ring_layout *layout); -void -vn_ring_init(struct vn_instance *instance, - struct vn_ring *ring, - const struct vn_ring_layout *layout, - void *shared); +struct vn_ring * +vn_ring_create(struct vn_instance *instance, + const struct vn_ring_layout *layout); void -vn_ring_fini(struct vn_ring *ring); +vn_ring_destroy(struct vn_ring *ring); struct vn_ring_submit * vn_ring_get_submit(struct vn_ring *ring, uint32_t shmem_count);