/* -*- tab-width: 4; -*- */ /* vi: set sw=2 ts=4 expandtab: */ #ifndef VULKAN_TEXTURE_H_229895365400979164311947449304284143508 #define VULKAN_TEXTURE_H_229895365400979164311947449304284143508 /* * Copyright 2017-2020 Mark Callow. * SPDX-License-Identifier: Apache-2.0 */ #include #define VK_ENABLE_BETA_EXTENSIONS 1 #include #include "VulkanSwapchain.h" struct VulkanDepthBuffer { VkFormat format; VkImage image; VkMemoryAllocateInfo memAlloc; VkDeviceMemory mem; VkImageView view; }; struct VulkanContext { vk::Instance instance; vk::PhysicalDevice gpu; vk::PhysicalDeviceFeatures gpuFeatures; #if VK_KHR_portability_subset vk::PhysicalDevicePortabilitySubsetFeaturesKHR gpuPortabilityFeatures; #endif vk::PhysicalDeviceProperties gpuProperties; vk::PhysicalDeviceMemoryProperties memoryProperties; vk::Device device; vk::CommandPool commandPool; vk::Queue queue; bool gpuIsPortabilitySubsetDevice = false; struct { bool pvrtc = false; bool astc_hdr = false; bool astc_3d = false; } enabledDeviceExtensions; std::vector drawCmdBuffers; std::vector postPresentCmdBuffers; std::vector prePresentCmdBuffers; VkRenderPass renderPass; // Pipeline stage flags for the submit info structure const VkPipelineStageFlags submitPipelineStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; // Contains command buffers and semaphores to be presented to the queue VkSubmitInfo drawCmdSubmitInfo; vk::DescriptorPool descriptorPool; VkPipelineCache pipelineCache; VulkanSwapchain swapchain; // List of frame buffers (same as number of swap chain images) std::vectorframebuffers; VulkanDepthBuffer depthBuffer; // Create a new command buffer, opening it for command entry, // if requested. vk::CommandBuffer createCommandBuffer(vk::CommandBufferLevel level, bool begin); // End a command buffer, submit it to the queue and free, if requested. // Note : Waits for the queue to become idle void flushCommandBuffer(vk::CommandBuffer& commandBuffer, bool free); // Create a command buffer for each image in the swap chain. bool createDrawCommandBuffers(); bool createPresentCommandBuffers(); bool checkDrawCommandBuffers(); void destroyDrawCommandBuffers(); void destroyPresentCommandBuffers(); bool getMemoryType(uint32_t typeBits, vk::MemoryPropertyFlags requirementsMask, uint32_t *typeIndex) const; uint32_t getMemoryType(uint32_t typeBits, vk::MemoryPropertyFlags requirementsMask) const; // Create a buffer, fill it with data (if != NULL) and bind buffer memory bool createBuffer( vk::BufferUsageFlags usageFlags, vk::MemoryPropertyFlags memoryPropertyFlags, vk::DeviceSize size, void *data, vk::Buffer *buffer, vk::DeviceMemory *memory); // This version always uses HOST_VISIBLE memory bool createBuffer( vk::BufferUsageFlags usage, vk::DeviceSize size, void *data, vk::Buffer *buffer, vk::DeviceMemory *memory); // Overload that assigns buffer info to descriptor bool createBuffer( vk::BufferUsageFlags usage, vk::DeviceSize size, void* data, vk::Buffer* buffer, vk::DeviceMemory* memory, vk::DescriptorBufferInfo* descriptor); // Overload to pass memory property flags bool createBuffer( vk::BufferUsageFlags usage, vk::MemoryPropertyFlags memoryPropertyFlags, vk::DeviceSize size, void* data, vk::Buffer* buffer, vk::DeviceMemory* memory, vk::DescriptorBufferInfo* descriptor); vk::PipelineShaderStageCreateInfo loadShader(std::string filename, vk::ShaderStageFlagBits stage, const char* const modname = "main"); vk::ShaderModule loadShader(std::string filename); uint32_t* readSpv(const char *filename, size_t *pSize); bool gpuSupportsSwizzle() { #if VK_KHR_portability_subset return !gpuIsPortabilitySubsetDevice || gpuPortabilityFeatures.imageViewFormatSwizzle; #else return true; #endif } }; #endif /* VULKAN_TEXTURE_H_229895365400979164311947449304284143508 */