mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
venus: make vn_renderer_shmem_pool thread-safe
This can be thread-safe only because we have dropped seeking command stream offset, which requires comparing pool shmem to decide conditional set stream. This is to prepare for later sharing reply shmem pool across rings. 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
0273c9cc03
commit
90e64564b8
4 changed files with 18 additions and 23 deletions
|
|
@ -630,7 +630,6 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
|
|||
instance->ring_idx_used_mask = 0x1;
|
||||
|
||||
mtx_init(&instance->physical_device.mutex, mtx_plain);
|
||||
mtx_init(&instance->cs_shmem.mutex, mtx_plain);
|
||||
mtx_init(&instance->ring_idx_mutex, mtx_plain);
|
||||
|
||||
if (!vn_icd_supports_api_version(
|
||||
|
|
@ -650,7 +649,7 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
|
|||
|
||||
vn_cs_renderer_protocol_info_init(instance);
|
||||
|
||||
vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem.pool,
|
||||
vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem_pool,
|
||||
8u << 20);
|
||||
|
||||
vn_renderer_shmem_pool_init(instance->renderer,
|
||||
|
|
@ -719,13 +718,12 @@ out_ring_fini:
|
|||
out_shmem_pool_fini:
|
||||
vn_renderer_shmem_pool_fini(instance->renderer,
|
||||
&instance->reply_shmem_pool);
|
||||
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem.pool);
|
||||
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
|
||||
vn_renderer_destroy(instance->renderer, alloc);
|
||||
|
||||
out_mtx_destroy:
|
||||
mtx_destroy(&instance->physical_device.mutex);
|
||||
mtx_destroy(&instance->ring_idx_mutex);
|
||||
mtx_destroy(&instance->cs_shmem.mutex);
|
||||
|
||||
vn_instance_base_fini(&instance->base);
|
||||
vk_free(alloc, instance);
|
||||
|
|
@ -761,8 +759,7 @@ vn_DestroyInstance(VkInstance _instance,
|
|||
vn_renderer_shmem_pool_fini(instance->renderer,
|
||||
&instance->reply_shmem_pool);
|
||||
|
||||
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem.pool);
|
||||
mtx_destroy(&instance->cs_shmem.mutex);
|
||||
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
|
||||
|
||||
vn_renderer_destroy(instance->renderer, alloc);
|
||||
|
||||
|
|
|
|||
|
|
@ -41,10 +41,7 @@ struct vn_instance {
|
|||
struct vn_renderer *renderer;
|
||||
|
||||
/* for VN_CS_ENCODER_STORAGE_SHMEM_POOL */
|
||||
struct {
|
||||
mtx_t mutex;
|
||||
struct vn_renderer_shmem_pool pool;
|
||||
} cs_shmem;
|
||||
struct vn_renderer_shmem_pool cs_shmem_pool;
|
||||
|
||||
struct vn_renderer_shmem_pool reply_shmem_pool;
|
||||
|
||||
|
|
@ -169,14 +166,8 @@ vn_instance_cs_shmem_alloc(struct vn_instance *instance,
|
|||
size_t size,
|
||||
size_t *out_offset)
|
||||
{
|
||||
struct vn_renderer_shmem *shmem;
|
||||
|
||||
mtx_lock(&instance->cs_shmem.mutex);
|
||||
shmem = vn_renderer_shmem_pool_alloc(
|
||||
instance->renderer, &instance->cs_shmem.pool, size, out_offset);
|
||||
mtx_unlock(&instance->cs_shmem.mutex);
|
||||
|
||||
return shmem;
|
||||
return vn_renderer_shmem_pool_alloc(
|
||||
instance->renderer, &instance->cs_shmem_pool, size, out_offset);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ vn_renderer_shmem_pool_init(UNUSED struct vn_renderer *renderer,
|
|||
/* power-of-two to hit shmem cache */
|
||||
.min_alloc_size = util_next_power_of_two(min_alloc_size),
|
||||
};
|
||||
mtx_init(&pool->mutex, mtx_plain);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -22,12 +23,13 @@ vn_renderer_shmem_pool_fini(struct vn_renderer *renderer,
|
|||
{
|
||||
if (pool->shmem)
|
||||
vn_renderer_shmem_unref(renderer, pool->shmem);
|
||||
mtx_destroy(&pool->mutex);
|
||||
}
|
||||
|
||||
static bool
|
||||
vn_renderer_shmem_pool_grow(struct vn_renderer *renderer,
|
||||
struct vn_renderer_shmem_pool *pool,
|
||||
size_t size)
|
||||
vn_renderer_shmem_pool_grow_locked(struct vn_renderer *renderer,
|
||||
struct vn_renderer_shmem_pool *pool,
|
||||
size_t size)
|
||||
{
|
||||
VN_TRACE_FUNC();
|
||||
/* power-of-two to hit shmem cache */
|
||||
|
|
@ -59,9 +61,12 @@ vn_renderer_shmem_pool_alloc(struct vn_renderer *renderer,
|
|||
size_t size,
|
||||
size_t *out_offset)
|
||||
{
|
||||
mtx_lock(&pool->mutex);
|
||||
if (unlikely(size > pool->size - pool->used)) {
|
||||
if (!vn_renderer_shmem_pool_grow(renderer, pool, size))
|
||||
if (!vn_renderer_shmem_pool_grow_locked(renderer, pool, size)) {
|
||||
mtx_unlock(&pool->mutex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
assert(size <= pool->size - pool->used);
|
||||
}
|
||||
|
|
@ -70,6 +75,7 @@ vn_renderer_shmem_pool_alloc(struct vn_renderer *renderer,
|
|||
vn_renderer_shmem_ref(renderer, pool->shmem);
|
||||
*out_offset = pool->used;
|
||||
pool->used += size;
|
||||
mtx_unlock(&pool->mutex);
|
||||
|
||||
return shmem;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,8 +8,9 @@
|
|||
|
||||
#include "vn_renderer.h"
|
||||
|
||||
/* for suballocations of short-lived shmems, not thread-safe */
|
||||
/* for suballocations of short-lived shmems, thread-safe */
|
||||
struct vn_renderer_shmem_pool {
|
||||
mtx_t mutex;
|
||||
size_t min_alloc_size;
|
||||
|
||||
struct vn_renderer_shmem *shmem;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue