Program Listing for File VkCore.h

Return to documentation for file (Source\Azura\RenderSystem\Inc\Vulkan\VkCore.h)

#pragma once

#include <vulkan/vulkan_core.h>

#include "Containers/Vector.h"
#include "Generic/Renderer.h"
#include "Types.h"
#include "VkTypes.h"
#include "Log/Log.h"

namespace Azura {
namespace Vulkan {
class VkScopedSwapChain;
class VkScopedBuffer;
}
}

namespace Azura {
namespace Vulkan {
namespace VkCore {

#ifdef BUILD_DEBUG
VkDebugReportCallbackEXT SetupDebug(::VkInstance_T* instance, const Log& log_VulkanRenderSystem);
void DestroyDebugReportCallbackEXT(VkInstance instance,
                                   VkDebugReportCallbackEXT callback,
                                   const VkAllocationCallbacks* pAllocator);
VkResult CreateDebugReportCallbackEXT(VkInstance instance,
                                      const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
                                      const VkAllocationCallbacks* pAllocator,
                                      VkDebugReportCallbackEXT* pCallback);
#endif

VkInstance CreateInstance(const ApplicationInfo& applicationData,
                          const Containers::Vector<const char*>& vkExtensions,
                          const Log&
                          log_VulkanRenderSystem);

SwapChainDeviceSupport QuerySwapChainSupport(VkPhysicalDevice device,
                                             VkSurfaceKHR surface,
                                             Memory::Allocator& allocator);

VkPhysicalDevice SelectPhysicalDevice(VkInstance instance,
                                      VkSurfaceKHR surface,
                                      const DeviceRequirements& requirements,
                                      const Log& log_VulkanRenderSystem);
VkDevice CreateLogicalDevice(VkPhysicalDevice physicalDevice,
                             const VkQueueIndices& queueIndices,
                             const DeviceRequirements& requirements,
                             const Log& log_VulkanRenderSystem);

VkQueueIndices FindQueueFamiliesInDevice(VkPhysicalDevice device,
                                         VkSurfaceKHR surface,
                                         const DeviceRequirements& requirements,
                                         const Log& log_VulkanRenderSystem);

VkQueue GetQueueFromDevice(VkDevice device, int queueIndex);

VkImage CreateImage(VkDevice device,
                    RawStorageFormat format,
                    ImageType imageType,
                    const Bounds2D& bounds,
                    U32 depth,
                    U32 layers,
                    U32 mips,
                    VkImageTiling tiling,
                    VkImageUsageFlags imageUsage,
                    const Log& log_VulkanRenderSystem);

VkImageView CreateImageView(VkDevice device,
                            VkImage sourceImage,
                            VkImageViewType viewType,
                            VkFormat viewFormat,
                            VkImageAspectFlags aspectMask,
                            const Log& log_VulkanRenderSystem,
                            U32 baseMip        = 0,
                            U32 levelCount     = 1,
                            U32 baseArrayLayer = 0,
                            U32 layerCount     = 1);

VkRenderPass CreateRenderPass(VkDevice device, const VkScopedSwapChain& swapChain, const Log& log_VulkanRenderSystem);

void CreateUniformBufferBinding(Containers::Vector<VkDescriptorSetLayoutBinding>& bindings,
                                U32 binding,
                                U32 count,
                                VkShaderStageFlags stageFlag);

void CreateSamplerBinding(Containers::Vector<VkDescriptorSetLayoutBinding>& bindings, U32 binding, U32 count, VkShaderStageFlags stageFlag);

void CreateSampledImageBinding(Containers::Vector<VkDescriptorSetLayoutBinding>& bindings, U32 binding, U32 count, VkShaderStageFlags stageFlag);

void CreateCombinedImageSamplerBinding(Containers::Vector<VkDescriptorSetLayoutBinding>& bindings, U32 binding, U32 count, VkShaderStageFlags stageFlag);

VkDescriptorSetLayout CreateDescriptorSetLayout(VkDevice device,
                                                const Containers::Vector<VkDescriptorSetLayoutBinding>& bindings,
                                                const Log& log_VulkanRenderSystem);
VkPipelineLayout CreatePipelineLayout(VkDevice device,
                                      const Containers::Vector<VkDescriptorSetLayout>& descriptorSets,
                                      const Log& log_VulkanRenderSystem);

VkShaderModule CreateShaderModule(VkDevice device,
                                  const Containers::Vector<U8>& code,
                                  const Log& log_VulkanRenderSystem);

Containers::Vector<VkFramebuffer> CreateFrameBuffers(VkDevice device,
                                                     VkRenderPass renderPass,
                                                     const VkScopedSwapChain& scopedSwapChain,
                                                     Memory::Allocator& allocator,
                                                     const Log& log_VulkanRenderSystem);

void CreateFrameBuffers(VkDevice device,
                        VkRenderPass renderPass,
                        const VkScopedSwapChain& scopedSwapChain,
                        Containers::Vector<VkFramebuffer>& frameBuffers,
                        const Log& log_VulkanRenderSystem);

VkCommandPool CreateCommandPool(VkDevice device,
                                int queueIndex,
                                VkCommandPoolCreateFlags flags,
                                const Log& log_VulkanRenderSystem);

U32 FindMemoryType(U32 typeFilter,
                   VkMemoryPropertyFlags properties,
                   const VkPhysicalDeviceMemoryProperties& physicalDeviceMemoryProperties);

VkDescriptorPoolSize CreateDescriptorPoolSize(VkDescriptorType type, U32 descriptorCount);

VkDescriptorPool CreateDescriptorPool(VkDevice device,
                                      const Containers::Vector<VkDescriptorPoolSize>& pools,
                                      U32 maxSets,
                                      const Log& log_VulkanRenderSystem);

VkDescriptorSet CreateDescriptorSet(VkDevice device,
                                    VkDescriptorPool descriptorPool,
                                    const Containers::Vector<VkDescriptorSetLayout>& descriptorSets,
                                    const Log& log_VulkanRenderSystem);

VkWriteDescriptorSet CreateWriteDescriptorForUniformBuffer(
  VkDescriptorSet set,
  U32 layoutIndex,
  U32 binding,
  const Containers::Vector<VkDescriptorBufferInfo>& bufferInfos);

void UpdateDescriptorSets(VkDevice device, const Containers::Vector<VkWriteDescriptorSet>& descriptorWrites);

VkCommandBuffer CreateCommandBuffer(VkDevice device,
                                    VkCommandPool commandPool,
                                    VkCommandBufferLevel level,
                                    const Log& log_VulkanRenderSystem);

Containers::Vector<VkCommandBuffer> CreateCommandBuffers(
  VkDevice device,
  U32 count,
  VkCommandPool commandPool,
  VkCommandBufferLevel level,
  Memory::Allocator& allocator,
  const Log& log_VulkanRenderSystem);

void CreateCommandBuffers(VkDevice device,
                          VkCommandPool commandPool,
                          VkCommandBufferLevel level,
                          Containers::Vector<VkCommandBuffer>& commandBuffers,
                          const Log& log_VulkanRenderSystem);

void BeginCommandBuffer(VkCommandBuffer buffer, VkCommandBufferUsageFlags flags, const Log& log_VulkanRenderSystem);
void BeginCommandBuffer(VkCommandBuffer buffer,
                        VkCommandBufferUsageFlags flags,
                        const VkCommandBufferInheritanceInfo& inheritanceInfo,
                        const Log& log_VulkanRenderSystem);

void EndCommandBuffer(VkCommandBuffer buffer, const Log& log_VulkanRenderSystem);

VkSemaphore CreateSemaphore(VkDevice device, const Log& log_VulkanRenderSystem);

void CreateSemaphores(VkDevice device,
                      U32 count,
                      Containers::Vector<VkSemaphore>& semaphores,
                      const Log& log_VulkanRenderSystem);

Containers::Vector<VkSemaphore> CreateSemaphores(VkDevice device,
                                                 U32 count,
                                                 Memory::Allocator& allocator,
                                                 const Log& log_VulkanRenderSystem);

VkFence CreateFence(VkDevice device, VkFenceCreateFlags flags, const Log& log_VulkanRenderSystem);

void CreateFences(VkDevice device,
                  U32 count,
                  VkFenceCreateFlags flags,
                  Containers::Vector<VkFence>& fences,
                  const Log& log_VulkanRenderSystem);

Containers::Vector<VkFence> CreateFences(VkDevice device,
                                         U32 count,
                                         VkFenceCreateFlags flags,
                                         Memory::Allocator& allocator,
                                         const Log& log_VulkanRenderSystem);

void CopyBuffer(VkDevice device,
                VkQueue queue,
                const VkScopedBuffer& srcBuffer,
                const VkScopedBuffer& dstBuffer,
                const VkDeviceSize size,
                const VkCommandPool commandPool);

void TransitionImageLayout(VkCommandBuffer cmdBuffer,
                           VkImage image,
                           VkAccessFlags srcAccessMask,
                           VkAccessFlags dstAccessMask,
                           VkImageLayout oldImageLayout,
                           VkImageLayout newImageLayout,
                           VkPipelineStageFlags srcStageMask,
                           VkPipelineStageFlags dstStageMask,
                           VkImageSubresourceRange imageSubresourceRange);

void ImageBlit(VkCommandBuffer cmdBuffer,
               VkImage srcImage,
               VkImage dstImage,
               VkImageAspectFlagBits srcAspect,
               VkImageAspectFlagBits dstAspect,
               const Bounds3D& blitRegion,
               const LayerSubresource& srcLayerResource,
               const LayerSubresource& dstLayerResource,
               U32 srcMipLevel,
               U32 dstMipLevel,
               VkFilter blitFilter);

void ImageBlit(VkCommandBuffer cmdBuffer,
               VkImage srcImage,
               VkImage dstImage,
               VkImageAspectFlagBits srcAspect,
               VkImageAspectFlagBits dstAspect,
               const Bounds3D& blitRegion);

void ImageCopy(VkCommandBuffer cmdBuffer,
               VkImage srcImage,
               VkImage dstImage,
               const Containers::Vector<VkImageCopy>& copyRegions);

VkImageCopy GetImageCopyRegion(VkImageAspectFlagBits srcAspect,
                               VkImageAspectFlagBits dstAspect,
                               const Bounds3D& copyRegion,
                               const TextureSubresource& srcSubresource,
                               const TextureSubresource& dstSubresource);

void ImageCopy(VkCommandBuffer cmdBuffer,
               VkImage srcImage,
               VkImage dstImage,
               VkImageAspectFlagBits srcAspect,
               VkImageAspectFlagBits dstAspect,
               const Bounds3D& copyRegion,
               const TextureSubresource& srcSubresource,
               const TextureSubresource& dstSubresource);

void ImageCopy(VkCommandBuffer cmdBuffer,
               VkImage srcImage,
               VkImage dstImage,
               VkImageAspectFlagBits srcAspect,
               VkImageAspectFlagBits dstAspect,
               const Bounds3D& copyRegion);

void FlushCommandBuffer(VkDevice device, VkCommandBuffer cmdBuffer, VkQueue queue, const Log& log_VulkanRenderSystem);

bool QueryFormatFeatureSupport(VkPhysicalDevice physicalDevice, VkFormat format, std::function<bool(const VkFormatProperties&)>
                               queryFunction);

VkFormat GetVkFormat(RawStorageFormat rawFormat, const Log & log_VulkanRenderSystem);


} // namespace VkCore
} // namespace Vulkan
} // namespace Azura