| // Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_VK_BUFFER_H_ | |
| #define SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_VK_BUFFER_H_ | |
| #include <stdint.h> | |
| #include <vulkan/vulkan.h> | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| // A convenience struct used to easily allocate and deallocate Vulkan | |
| // memory buffers (and its device memory) during testing. | |
| typedef struct vk_buffer | |
| { | |
| VkBuffer buffer; | |
| VkDeviceMemory memory; | |
| VkDeviceSize size; | |
| void * mapped; | |
| VkDevice device; | |
| const VkAllocationCallbacks * allocator; | |
| VkMemoryPropertyFlags memory_flags; | |
| // fields below are for debugging. | |
| VkMemoryRequirements memory_requirements; | |
| uint32_t memory_type_index; | |
| } vk_buffer_t; | |
| // Generic function to allocate a new GPU buffer and associated memory. | |
| // Using one of the convenience functions below, instead of this one, is | |
| // recommended. | |
| // | |
| // |buffer| is the target vk_buffer_t instance to initialize. | |
| // |buffer_size| is the desired buffer size. The actual allocation size | |
| // will be available as |buffer->size|. | |
| // |buffer_usage|, |memory_flags| and |memory_properties| are used to describe | |
| // the intended buffer usage and memory type for this allocation. | |
| // |queue_families| is either NULL, or an array of |queue_families_count| | |
| // queue family indices that this buffer will be used with. | |
| // |physical_device| is the Vulkan physical device handle for |device|. | |
| // |device| is the Vulkan device instance to allocate from. | |
| // |allocator| is the optional Vulkan host allocator. | |
| // | |
| // NOTE: This function aborts if the allocation cannot succeed. On return, | |
| // the |buffer| fields will be filled appropriately. Any host-visible buffer | |
| // is also automatically mapped by the function for convenience, and its | |
| // address will be available as |buffer.mapped|. | |
| extern void | |
| vk_buffer_alloc_generic(vk_buffer_t * buffer, | |
| VkDeviceSize buffer_size, | |
| VkBufferUsageFlags buffer_usage, | |
| VkMemoryPropertyFlags memory_flags, | |
| uint32_t queue_families_count, | |
| const uint32_t * queue_families, | |
| VkPhysicalDevice physical_device, | |
| VkDevice device, | |
| const VkAllocationCallbacks * allocator); | |
| // Allocate a new host-visible buffer and map it. | |
| // Assumes the buffer will only every be used by a single queue. | |
| // | |
| // |buffer| is the target vk_buffer_t instance. | |
| // |buffer_size| is the desired memory size, which will be rounded up | |
| // according to specific memory requirements. | |
| // |buffer_usage| describes the buffer's intended usage. | |
| // |physical_device| is the Vulkan physical device handle for |device|. | |
| // |device| is the Vulkan device instance to allocate from. | |
| // |allocator| is the optional Vulkan host allocator. | |
| extern void | |
| vk_buffer_alloc_host(vk_buffer_t * buffer, | |
| VkDeviceSize buffer_size, | |
| VkBufferUsageFlags buffer_usage, | |
| VkPhysicalDevice physical_device, | |
| VkDevice device, | |
| const VkAllocationCallbacks * allocator); | |
| // Allocate a new host-visible, coherent buffer and map it. | |
| // Assumes the buffer will only every be used by a single queue. | |
| // | |
| // |buffer| is the target vk_buffer_t instance. | |
| // |buffer_size| is the desired memory size, which will be rounded up | |
| // according to specific memory requirements. | |
| // |buffer_usage| describes the buffer's intended usage. | |
| // |physical_device| is the Vulkan physical device handle for |device|. | |
| // |device| is the Vulkan device instance to allocate from. | |
| // |allocator| is the optional Vulkan host allocator. | |
| extern void | |
| vk_buffer_alloc_host_coherent(vk_buffer_t * buffer, | |
| VkDeviceSize buffer_size, | |
| VkBufferUsageFlags buffer_usage, | |
| VkPhysicalDevice physical_device, | |
| VkDevice device, | |
| const VkAllocationCallbacks * allocator); | |
| // Allocate a new device-local buffer. | |
| // Assumes the buffer will only ever be used by a single queue. | |
| // | |
| // |buffer| is the target vk_buffer_t instance. | |
| // |buffer_size| is the desired memory size, which will be rounded up | |
| // according to specific memory requirements. | |
| // |buffer_usage| describes the buffer's intended usage. | |
| // |physical_device| is the Vulkan physical device handle for |device|. | |
| // |device| is the Vulkan device instance to allocate from. | |
| // |allocator| is the optional Vulkan host allocator. | |
| extern void | |
| vk_buffer_alloc_device_local(vk_buffer_t * buffer, | |
| VkDeviceSize buffer_size, | |
| VkBufferUsageFlags buffer_usage, | |
| VkPhysicalDevice physical_device, | |
| VkDevice device, | |
| const VkAllocationCallbacks * allocator); | |
| // Flush full content of a buffer. This only makes sense for host-visible | |
| // buffers that are not coherent. | |
| extern void | |
| vk_buffer_flush_all(const vk_buffer_t * buffer); | |
| // Map the buffer then refresh its content if needed. | |
| // This can be used to refresh an already-mapped buffer when non-coherent | |
| // memory is used. | |
| extern void | |
| vk_buffer_map(vk_buffer_t * buffer); | |
| // Unmap the buffer, after flushing it if necessary. | |
| extern void | |
| vk_buffer_unmap(vk_buffer_t * buffer); | |
| // Release a buffer and its memory. | |
| extern void | |
| vk_buffer_free(vk_buffer_t * buffer); | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif // SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_VK_BUFFER_H_ |