// 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_VK_RS_SPINEL_VK_RS_H_
#define SRC_GRAPHICS_LIB_COMPUTE_SPINEL_VK_RS_SPINEL_VK_RS_H_

//
// Simplify creation of the Vulkan and Spinel objects used by spinel-rs-sys.
//
// TODO(allanmac): Integration with Carnelian can determine what internal Vulkan
// objects must be made available to Carnelian.
//

#include <vulkan/vulkan_core.h>

#include "spinel/spinel.h"

//
//
//

#ifdef __cplusplus
extern "C" {
#endif

//
// Opaque spinel_vk_rs type
//
typedef struct spinel_vk_rs spinel_vk_rs_t;

//
// Create a Vulkan instance
//
// Returns VK_NULL_HANDLE if return result is not equal to VK_SUCCESS.
//
// It is the responsibility of caller to destroy the VkInstance but not until
// all child objects created using the VkInstance must have been destroyed.
//
typedef struct spinel_vk_rs_instance_create_info
{
  bool is_validation;  // Enable validation
  bool is_debug_info;  // Enable debug object naming
} spinel_vk_rs_instance_create_info_t;

VkResult
spinel_vk_rs_instance_create(spinel_vk_rs_instance_create_info_t const * instance_create_info,
                             VkInstance *                                instance);

//
// Helper function to list physical device properties without creating a Vulkan
// instance.
//
// If `props` is NULL, then the number of physical devices available is returned
// in `props_count`.  Otherwise, `props_count` must point to a variable set by
// the user to the number of elements in the `props` array, and on return the
// variable is overwritten with the number of VkPhysicalDeviceProperties
// structures actually written to `props`. If `props_count` is less than the
// number of physical devices available, at most `props_count` structures will
// be written, and VK_INCOMPLETE will be returned instead of VK_SUCCESS, to
// indicate that not all the available physical devices properties were returned.
//
VkResult
spinel_vk_rs_get_physical_device_props(VkInstance                   instance,
                                       uint32_t *                   props_count,
                                       VkPhysicalDeviceProperties * props);

//
// Create the Vulkan and Spinel state used by spinel-rs-sys
//
typedef struct spinel_vk_rs_create_info
{
  VkInstance instance;
  uint32_t   vendor_id;                // Will select first physical device if 0:0
  uint32_t   device_id;                // Will select first physical device if 0:0
  uint32_t   qfis[2];                  // Can default to {0,0} on all known devices
  uint64_t   context_block_pool_size;  // Block pool size in bytes
  uint32_t   context_handle_count;     // Handle count
} spinel_vk_rs_create_info_t;

spinel_vk_rs_t *
spinel_vk_rs_create(spinel_vk_rs_create_info_t const * create_info);

//
// Invoked when the rendering surface size is first known or has changed.
//
// Must be invoked at least once before the very first render.
//
void
spinel_vk_rs_regen(spinel_vk_rs_t * rs, uint32_t width, uint32_t height, uint32_t image_count);

//
// Render an image
//
typedef struct spinel_vk_rs_render_image_info
{
  uint32_t    image_index;
  VkImage     image;
  VkImageView image_view;

  struct
  {
    VkImageLayout prev;
    VkImageLayout curr;
  } layout;

  spinel_pixel_clip_t clip;
  bool                is_srgb;  // explicitly convert from linear to SRGB
} spinel_vk_rs_render_image_info_t;

void
spinel_vk_rs_render(spinel_vk_rs_t *                         rs,
                    spinel_styling_t                         styling,
                    spinel_composition_t                     composition,
                    spinel_vk_rs_render_image_info_t const * image_info);

//
// Destroy Vulkan and Spinel state
//
void
spinel_vk_rs_destroy(spinel_vk_rs_t * rs);

//
//
//

#ifdef __cplusplus
}
#endif

//
//
//

#endif  // SRC_GRAPHICS_LIB_COMPUTE_SPINEL_VK_RS_SPINEL_VK_RS_H_
