blob: 78c4f334fd9572a55a61fcf2301cedd4af40c6b8 [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_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_