venus: move ring shmem into vn_ring

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-06 12:33:22 -08:00 committed by Marge Bot
parent 3e122014cf
commit d1e29b7557
6 changed files with 48 additions and 38 deletions

View file

@ -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);

View file

@ -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 */

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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 *

View file

@ -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);