// 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_
