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:
Chia-I Wu
2021-12-09 17:08:15 -08:00
committed by Marge Bot
parent 35c430e75a
commit 1fe8f0fea0
2 changed files with 33 additions and 51 deletions

View File

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

View File

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