| /* |
| * Copyright 2021 Google LLC |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "vn_renderer_util.h" |
| |
| VkResult |
| vn_renderer_submit_simple_sync(struct vn_renderer *renderer, |
| const void *cs_data, |
| size_t cs_size) |
| { |
| struct vn_renderer_sync *sync; |
| VkResult result = |
| vn_renderer_sync_create(renderer, 0, VN_RENDERER_SYNC_BINARY, &sync); |
| if (result != VK_SUCCESS) |
| return result; |
| |
| const struct vn_renderer_submit submit = { |
| .batches = |
| &(const struct vn_renderer_submit_batch){ |
| .cs_data = cs_data, |
| .cs_size = cs_size, |
| .sync_queue_cpu = true, |
| .syncs = &sync, |
| .sync_values = &(const uint64_t){ 1 }, |
| .sync_count = 1, |
| }, |
| .batch_count = 1, |
| }; |
| const struct vn_renderer_wait wait = { |
| .timeout = UINT64_MAX, |
| .syncs = &sync, |
| .sync_values = &(const uint64_t){ 1 }, |
| .sync_count = 1, |
| }; |
| |
| result = vn_renderer_submit(renderer, &submit); |
| if (result == VK_SUCCESS) |
| result = vn_renderer_wait(renderer, &wait); |
| |
| vn_renderer_sync_destroy(renderer, sync); |
| |
| return result; |
| } |
| |
| void |
| vn_renderer_shmem_pool_init(UNUSED struct vn_renderer *renderer, |
| struct vn_renderer_shmem_pool *pool, |
| size_t min_alloc_size) |
| { |
| *pool = (struct vn_renderer_shmem_pool){ |
| /* power-of-two to hit shmem cache */ |
| .min_alloc_size = util_next_power_of_two(min_alloc_size), |
| }; |
| } |
| |
| void |
| vn_renderer_shmem_pool_fini(struct vn_renderer *renderer, |
| struct vn_renderer_shmem_pool *pool) |
| { |
| if (pool->shmem) |
| vn_renderer_shmem_unref(renderer, pool->shmem); |
| } |
| |
| static bool |
| vn_renderer_shmem_pool_grow(struct vn_renderer *renderer, |
| struct vn_renderer_shmem_pool *pool, |
| size_t size) |
| { |
| VN_TRACE_FUNC(); |
| /* power-of-two to hit shmem cache */ |
| size_t alloc_size = pool->min_alloc_size; |
| while (alloc_size < size) { |
| alloc_size <<= 1; |
| if (!alloc_size) |
| return false; |
| } |
| |
| struct vn_renderer_shmem *shmem = |
| vn_renderer_shmem_create(renderer, alloc_size); |
| if (!shmem) |
| return false; |
| |
| if (pool->shmem) |
| vn_renderer_shmem_unref(renderer, pool->shmem); |
| |
| pool->shmem = shmem; |
| pool->size = alloc_size; |
| pool->used = 0; |
| |
| return true; |
| } |
| |
| struct vn_renderer_shmem * |
| vn_renderer_shmem_pool_alloc(struct vn_renderer *renderer, |
| struct vn_renderer_shmem_pool *pool, |
| size_t size, |
| size_t *out_offset) |
| { |
| if (unlikely(size > pool->size - pool->used)) { |
| if (!vn_renderer_shmem_pool_grow(renderer, pool, size)) |
| return NULL; |
| |
| assert(size <= pool->size - pool->used); |
| } |
| |
| struct vn_renderer_shmem *shmem = |
| vn_renderer_shmem_ref(renderer, pool->shmem); |
| *out_offset = pool->used; |
| pool->used += size; |
| |
| return shmem; |
| } |