| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| */ |
| |
| // |
| // |
| // |
| |
| #include "event_pool.h" |
| #include "host_alloc.h" |
| #include "assert_vk.h" |
| |
| // |
| // |
| // |
| |
| struct vk_event_pool |
| { |
| VkEvent * events; |
| VkAllocationCallbacks const * allocator; |
| VkDevice device; |
| uint32_t resize; |
| uint32_t size; |
| uint32_t next; |
| }; |
| |
| static |
| void |
| vk_event_pool_resize(struct vk_event_pool * const event_pool) |
| { |
| static struct VkEventCreateInfo const eci = { |
| .sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, |
| .pNext = NULL, |
| .flags = 0 |
| }; |
| |
| // FIXME -- respect allocator |
| |
| event_pool->size += event_pool->resize; |
| event_pool->events = vk_host_realloc(event_pool->allocator, |
| event_pool->events, |
| sizeof(VkEvent) * event_pool->size); |
| |
| for (uint32_t ii=event_pool->next; ii<event_pool->size; ii++) |
| { |
| vk(CreateEvent(event_pool->device, |
| &eci, |
| event_pool->allocator, |
| event_pool->events+ii)); |
| } |
| } |
| |
| struct vk_event_pool * |
| vk_event_pool_create(VkDevice device, VkAllocationCallbacks const * allocator, uint32_t const resize) |
| { |
| struct vk_event_pool * const event_pool = vk_host_alloc(allocator,sizeof(*event_pool)); |
| |
| event_pool->events = NULL; |
| event_pool->allocator = allocator; |
| event_pool->device = device; |
| event_pool->resize = resize; |
| event_pool->size = 0; |
| event_pool->next = 0; |
| |
| vk_event_pool_resize(event_pool); |
| |
| return event_pool; |
| } |
| |
| void |
| vk_event_pool_release(struct vk_event_pool * const event_pool) |
| { |
| for (uint32_t ii=0; ii<event_pool->size; ii++) |
| { |
| vkDestroyEvent(event_pool->device, |
| event_pool->events[ii], |
| event_pool->allocator); |
| } |
| |
| vk_host_free(event_pool->allocator,event_pool->events); |
| vk_host_free(event_pool->allocator,event_pool); |
| } |
| |
| void |
| vk_event_pool_reset(struct vk_event_pool * const event_pool) |
| { |
| for (uint32_t ii=0; ii<event_pool->next; ii++) |
| vk(ResetEvent(event_pool->device,event_pool->events[ii])); |
| |
| event_pool->next = 0; |
| } |
| |
| VkEvent |
| vk_event_pool_acquire(struct vk_event_pool * const event_pool) |
| { |
| if (event_pool->next == event_pool->size) |
| vk_event_pool_resize(event_pool); |
| |
| return event_pool->events[event_pool->next++]; |
| } |
| |
| // |
| // |
| // |