blob: daeebcf0adb6888f4fa35988a4d35cb13668b0aa [file] [log] [blame]
// 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_