// 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_SPINEL_PLATFORMS_VK_INCLUDE_SPINEL_PLATFORMS_VK_SPINEL_VK_TYPES_H_
#define SRC_GRAPHICS_LIB_COMPUTE_SPINEL_PLATFORMS_VK_INCLUDE_SPINEL_PLATFORMS_VK_SPINEL_VK_TYPES_H_

//
//
//

#include <vulkan/vulkan_core.h>

#include "spinel/spinel_types.h"

//
//
//

#ifdef __cplusplus
extern "C" {
#endif

//
// Spinel Vulkan target read-only opaque type
//
typedef struct spinel_vk_target const spinel_vk_target_t;

//
// Spinel Vulkan target requiremets
//
typedef struct spinel_vk_target_requirements
{
  uint32_t                           ext_name_count;
  char const **                      ext_names;
  VkPhysicalDeviceFeatures *         pdf;
  VkPhysicalDeviceVulkan11Features * pdf11;
  VkPhysicalDeviceVulkan12Features * pdf12;
} spinel_vk_target_requirements_t;

//
// Spinel Vulkan queue creation info
//
// The queue `.family_index` must be compute-capable.
//
// The queue pool `.count` must be greater than 0.
//
typedef struct spinel_vk_context_create_info_vk_queue
{
  VkDeviceQueueCreateFlags flags;
  uint32_t                 count;
  uint32_t                 family_index;
} spinel_vk_context_create_info_vk_queue_t;

//
// Spinel Vulkan queue family indices for shared resources.
//
#define SPN_VK_CONTEXT_CREATE_INFO_VK_QUEUE_SHARED_MAX_FAMILIES 2

typedef struct spinel_vk_context_create_info_vk_queue_shared
{
  uint32_t family_count;
  uint32_t family_indices[SPN_VK_CONTEXT_CREATE_INFO_VK_QUEUE_SHARED_MAX_FAMILIES];
} spinel_vk_context_create_info_vk_queue_shared_t;

//
// Spinel Vulkan environment
//
typedef struct spinel_vk_context_create_info_vk
{
  VkPhysicalDevice              pd;
  VkDevice                      d;
  VkPipelineCache               pc;
  VkAllocationCallbacks const * ac;
  struct
  {
    spinel_vk_context_create_info_vk_queue_t        compute;
    spinel_vk_context_create_info_vk_queue_shared_t shared;
  } q;
} spinel_vk_context_create_info_vk_t;

//
// Spinel Vulkan context creation
//
typedef struct spinel_vk_context_create_info
{
  spinel_vk_context_create_info_vk_t vk;               // Vulkan environment
  spinel_vk_target_t const *         target;           // Device-specific configuration data
  uint64_t                           block_pool_size;  // Block pool size in bytes
  uint32_t                           handle_count;     // Total handle count
} spinel_vk_context_create_info_t;

//
// Vulkan render extensions
//
// Possible rendering use cases supported by these extensions include:
//
//  1) Render and then copy the results to a debug buffer.
//  2) Render and then copy all altered tiles to an image.
//
// These buffer rendering extensions can be chained in any order but will always
// be executed in listed order on the queues.
//
// The compute extensions are submitted to the Spinel-managed compute queue.
//
// Optional graphics extensions are submitted to the provided graphics-capable
// queue.
//
//  COMPUTE QUEUE:
//
//   * COMPUTE_WAIT    : Wait before executing compute queue submission.
//   * COMPUTE_ACQUIRE : Acquire swapchain resources back from a queue family.
//   * COMPUTE_FILL    : Fill buffer.  This is a convenience extension.
//   * COMPUTE_RENDER  : Render tiles to a Spinel-managed surface.
//   * COMPUTE_COPY    : Copy to buffer for debugging.
//   * COMPUTE_RELEASE : Release swapchain resources to another queue family.
//   * COMPUTE_SIGNAL  : Signal compute queue submission is complete.
//
//  GRAPHICS QUEUE:
//
//   * GRAPHICS_WAIT   : Wait before executing the graphics queue submission.
//   * GRAPHICS_CLEAR  : Clear the image before storing altered tiles.
//   * GRAPHICS_STORE  : Store altered tiles to an image.
//   * GRAPHICS_SIGNAL : Signal submission is complete.
//
// TODO(allanmac):
//
//  * Copy changed buffer tiles to an image via a vertex+fragment pass in
//    order to benefit from fast clear and frame buffer compression.
//
typedef enum spinel_vk_swapchain_submit_ext_type_e
{
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_WAIT,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_ACQUIRE,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_FILL,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_RENDER,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_COPY,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_RELEASE,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_COMPUTE_SIGNAL,

  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_GRAPHICS_WAIT,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_GRAPHICS_CLEAR,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_GRAPHICS_STORE,
  SPN_VK_SWAPCHAIN_SUBMIT_EXT_TYPE_GRAPHICS_SIGNAL,

  SPN_VK_SWAPCHAIN_SUBMIT_EXT_COUNT

} spinel_vk_swapchain_submit_ext_type_e;

//
// BASE extension simplifies walking a chain of extensions.
//
typedef struct spinel_vk_swapchain_submit_ext_base
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
} spinel_vk_swapchain_submit_ext_base_t;

//
// Imported semaphore waits
//
// Note that binary semaphores ignore associated values.
//
#define SPN_VK_SEMAPHORE_IMPORT_WAIT_SIZE 1

typedef struct spinel_vk_semaphore_import_wait
{
  // clang-format off
  uint32_t             count;
  VkPipelineStageFlags stages    [SPN_VK_SEMAPHORE_IMPORT_WAIT_SIZE];
  VkSemaphore          semaphores[SPN_VK_SEMAPHORE_IMPORT_WAIT_SIZE];
  uint64_t             values    [SPN_VK_SEMAPHORE_IMPORT_WAIT_SIZE];
  // clang-format on
} spinel_vk_semaphore_import_wait_t;

//
// Imported semaphore signals
//
// Note that binary semaphores ignore associated values.
//
#define SPN_VK_SEMAPHORE_IMPORT_SIGNAL_SIZE 2

typedef struct spinel_vk_semaphore_import_signal
{
  // clang-format off
  uint32_t    count;
  VkSemaphore semaphores[SPN_VK_SEMAPHORE_IMPORT_SIGNAL_SIZE];
  uint64_t    values    [SPN_VK_SEMAPHORE_IMPORT_SIGNAL_SIZE];
  // clang-format on
} spinel_vk_semaphore_import_signal_t;

//
// COMPUTE WAIT
//
typedef struct spinel_vk_swapchain_submit_ext_compute_wait
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  spinel_vk_semaphore_import_wait_t     wait;
} spinel_vk_swapchain_submit_ext_compute_wait_t;

//
// COMPUTE ACQUIRE
//
// Only necessary if Spinel swapchain storage buffer was created with
// VK_SHARING_MODE_EXCLUSIVE.
//
typedef struct spinel_vk_swapchain_submit_ext_compute_acquire
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  uint32_t                              from_queue_family_index;
} spinel_vk_swapchain_submit_ext_compute_acquire_t;

//
// COMPUTE FILL
//
typedef struct spinel_vk_swapchain_submit_ext_compute_fill
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  uint32_t                              dword;
} spinel_vk_swapchain_submit_ext_compute_fill_t;

//
// COMPUTE RENDER
//
//  - The clip is in pixels.
//  - Requires (x0<=x1) and (y0<=y1).
//  - Clip is dilated to tile boundaries.
//
typedef struct spinel_vk_swapchain_submit_ext_compute_render
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  spinel_pixel_clip_t                   clip;
  uint32_t                              extent_index;
} spinel_vk_swapchain_submit_ext_compute_render_t;

//
// COMPUTE COPY
//
// Requirements:
//
//  * `.dst.buffer` created with:
//
//    - VK_BUFFER_USAGE_TRANSFER_DST_BIT
//
//  * `.dst.range` is the number of bytes copied.
//
typedef struct spinel_vk_swapchain_submit_ext_compute_copy
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  VkDescriptorBufferInfo                dst;
} spinel_vk_swapchain_submit_ext_compute_copy_t;

//
// COMPUTE RELEASE
//
// Only necessary if Spinel swapchain storage buffer was created with
// VK_SHARING_MODE_EXCLUSIVE.
//
typedef struct spinel_vk_swapchain_submit_ext_compute_release
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  uint32_t                              to_queue_family_index;
} spinel_vk_swapchain_submit_ext_compute_release_t;

//
// COMPUTE SIGNAL
//
typedef struct spinel_vk_swapchain_submit_ext_compute_signal
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  spinel_vk_semaphore_import_signal_t   signal;
} spinel_vk_swapchain_submit_ext_compute_signal_t;

//
// GRAPHICS WAIT
//
// Binary or timeline semaphore signaled when the image is available.
//
typedef struct spinel_vk_swapchain_submit_ext_graphics_wait
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  spinel_vk_semaphore_import_wait_t     wait;
} spinel_vk_swapchain_submit_ext_graphics_wait_t;

//
// GRAPHICS CLEAR
//
// Fast clears `graphics_store.image` before storing changed swapchain tiles to
// the image.
//
typedef struct spinel_vk_swapchain_submit_ext_graphics_clear
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  VkClearColorValue                     color;
} spinel_vk_swapchain_submit_ext_graphics_clear_t;

//
// GRAPHICS STORE
//
// Stores changed swapchain tiles to `.image`.
//
// Necessary queue ownership transfers and layout transitions are implicitly
// handled.
//
typedef struct spinel_vk_swapchain_submit_ext_graphics_store
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  uint32_t                              extent_index;
  VkCommandBuffer                       cb;
  VkQueue                               queue;
  uint32_t                              queue_family_index;
  VkImageLayout                         layout_prev;
  VkImage                               image;
  VkDescriptorImageInfo                 image_info;
} spinel_vk_swapchain_submit_ext_graphics_store_t;

//
// GRAPHICS SIGNAL
//
// Binary or timeline semaphore signaled when the image is presentable.
//
typedef struct spinel_vk_swapchain_submit_ext_graphics_signal
{
  void *                                ext;
  spinel_vk_swapchain_submit_ext_type_e type;
  spinel_vk_semaphore_import_signal_t   signal;
} spinel_vk_swapchain_submit_ext_graphics_signal_t;

//
//
//

#ifdef __cplusplus
}
#endif

//
//
//

#endif  // SRC_GRAPHICS_LIB_COMPUTE_SPINEL_PLATFORMS_VK_INCLUDE_SPINEL_PLATFORMS_VK_SPINEL_VK_TYPES_H_
