venus: use vn_renderer_shmem_pool for reply shmems
Signed-off-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: Ryan Neph <ryanneph@google.com> Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14179>
This commit is contained in:
@@ -548,54 +548,38 @@ vn_instance_ring_submit(struct vn_instance *instance,
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool
|
||||
vn_instance_grow_reply_shmem_locked(struct vn_instance *instance, size_t size)
|
||||
{
|
||||
const size_t min_shmem_size = 1 << 20;
|
||||
|
||||
size_t shmem_size =
|
||||
instance->reply.size ? instance->reply.size : min_shmem_size;
|
||||
while (shmem_size < size) {
|
||||
shmem_size <<= 1;
|
||||
if (!shmem_size)
|
||||
return false;
|
||||
}
|
||||
|
||||
struct vn_renderer_shmem *shmem =
|
||||
vn_renderer_shmem_create(instance->renderer, shmem_size);
|
||||
if (!shmem)
|
||||
return false;
|
||||
|
||||
if (instance->reply.shmem)
|
||||
vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
|
||||
instance->reply.shmem = shmem;
|
||||
instance->reply.size = shmem_size;
|
||||
instance->reply.used = 0;
|
||||
instance->reply.ptr = shmem->mmap_ptr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct vn_renderer_shmem *
|
||||
vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
|
||||
size_t size,
|
||||
void **ptr)
|
||||
void **out_ptr)
|
||||
{
|
||||
if (unlikely(instance->reply.used + size > instance->reply.size)) {
|
||||
if (!vn_instance_grow_reply_shmem_locked(instance, size))
|
||||
return NULL;
|
||||
struct vn_renderer_shmem_pool *pool = &instance->reply_shmem_pool;
|
||||
const struct vn_renderer_shmem *saved_pool_shmem = pool->shmem;
|
||||
|
||||
size_t offset;
|
||||
struct vn_renderer_shmem *shmem =
|
||||
vn_renderer_shmem_pool_alloc(instance->renderer, pool, size, &offset);
|
||||
if (!shmem)
|
||||
return NULL;
|
||||
|
||||
assert(shmem == pool->shmem);
|
||||
*out_ptr = shmem->mmap_ptr + offset;
|
||||
|
||||
if (shmem != saved_pool_shmem) {
|
||||
uint32_t set_reply_command_stream_data[16];
|
||||
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
|
||||
set_reply_command_stream_data,
|
||||
sizeof(set_reply_command_stream_data));
|
||||
const struct VkCommandStreamDescriptionMESA stream = {
|
||||
.resourceId = instance->reply.shmem->res_id,
|
||||
.size = instance->reply.size,
|
||||
.resourceId = shmem->res_id,
|
||||
.size = pool->size,
|
||||
};
|
||||
vn_encode_vkSetReplyCommandStreamMESA(&local_enc, 0, &stream);
|
||||
vn_cs_encoder_commit(&local_enc);
|
||||
|
||||
/* vn_instance_init_experimental_features calls this before the ring is
|
||||
* created
|
||||
*/
|
||||
if (likely(instance->ring.id)) {
|
||||
vn_instance_roundtrip(instance);
|
||||
vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
|
||||
@@ -610,10 +594,12 @@ vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
|
||||
uint32_t seek_reply_command_stream_data[8];
|
||||
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
|
||||
seek_reply_command_stream_data, sizeof(seek_reply_command_stream_data));
|
||||
const size_t offset = instance->reply.used;
|
||||
vn_encode_vkSeekReplyCommandStreamMESA(&local_enc, 0, offset);
|
||||
vn_cs_encoder_commit(&local_enc);
|
||||
|
||||
/* vn_instance_init_experimental_features calls this before the ring is
|
||||
* created
|
||||
*/
|
||||
if (likely(instance->ring.id)) {
|
||||
vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL);
|
||||
} else {
|
||||
@@ -622,10 +608,7 @@ vn_instance_get_reply_shmem_locked(struct vn_instance *instance,
|
||||
vn_cs_encoder_get_len(&local_enc));
|
||||
}
|
||||
|
||||
*ptr = instance->reply.ptr + offset;
|
||||
instance->reply.used += size;
|
||||
|
||||
return vn_renderer_shmem_ref(instance->renderer, instance->reply.shmem);
|
||||
return shmem;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -743,6 +726,9 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
vn_renderer_shmem_pool_init(instance->renderer,
|
||||
&instance->reply_shmem_pool, 1u << 20);
|
||||
|
||||
result = vn_instance_init_experimental_features(instance);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
@@ -795,9 +781,6 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
|
||||
return VK_SUCCESS;
|
||||
|
||||
fail:
|
||||
if (instance->reply.shmem)
|
||||
vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
|
||||
|
||||
if (instance->ring.shmem) {
|
||||
uint32_t destroy_ring_data[4];
|
||||
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
|
||||
@@ -813,6 +796,9 @@ fail:
|
||||
mtx_destroy(&instance->ring.mutex);
|
||||
}
|
||||
|
||||
vn_renderer_shmem_pool_fini(instance->renderer,
|
||||
&instance->reply_shmem_pool);
|
||||
|
||||
if (instance->renderer)
|
||||
vn_renderer_destroy(instance->renderer, alloc);
|
||||
|
||||
@@ -845,8 +831,6 @@ vn_DestroyInstance(VkInstance _instance,
|
||||
|
||||
vn_call_vkDestroyInstance(instance, _instance, NULL);
|
||||
|
||||
vn_renderer_shmem_unref(instance->renderer, instance->reply.shmem);
|
||||
|
||||
uint32_t destroy_ring_data[4];
|
||||
struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
|
||||
destroy_ring_data, sizeof(destroy_ring_data));
|
||||
@@ -860,6 +844,9 @@ vn_DestroyInstance(VkInstance _instance,
|
||||
mtx_destroy(&instance->ring.mutex);
|
||||
vn_renderer_shmem_unref(instance->renderer, instance->ring.shmem);
|
||||
|
||||
vn_renderer_shmem_pool_fini(instance->renderer,
|
||||
&instance->reply_shmem_pool);
|
||||
|
||||
vn_renderer_destroy(instance->renderer, alloc);
|
||||
|
||||
driDestroyOptionCache(&instance->dri_options);
|
||||
|
@@ -40,6 +40,8 @@ struct vn_instance {
|
||||
struct vn_renderer *renderer;
|
||||
struct vn_renderer_info renderer_info;
|
||||
|
||||
struct vn_renderer_shmem_pool reply_shmem_pool;
|
||||
|
||||
/* XXX staged features to be merged to core venus protocol */
|
||||
VkVenusExperimentalFeatures100000MESA experimental;
|
||||
|
||||
@@ -57,13 +59,6 @@ struct vn_instance {
|
||||
uint32_t roundtrip_next;
|
||||
} ring;
|
||||
|
||||
struct {
|
||||
struct vn_renderer_shmem *shmem;
|
||||
size_t size;
|
||||
size_t used;
|
||||
void *ptr;
|
||||
} reply;
|
||||
|
||||
/* Between the driver and the app, VN_MAX_API_VERSION is what we advertise
|
||||
* and base.base.app_info.api_version is what the app requests.
|
||||
*
|
||||
|
Reference in New Issue
Block a user