mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 00:10:10 +01:00
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:
parent
3e122014cf
commit
d1e29b7557
6 changed files with 48 additions and 38 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue