22 #include <unordered_set>
28 #include "VulkanDevice.h"
29 #include "VulkanDebug.h"
30 #include "VulkanTools.h"
40 extern PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;
50 using StringList = std::list<std::string>;
51 using CStringVector = std::vector<const char*>;
54 friend class ::VKWindow;
55 friend class ::VKWidget;
57 static CStringVector filterLayers(
const StringList& desiredLayers);
61 static Context& get();
64 static std::set<std::string> getAvailableLayers();
66 static std::vector<VkExtensionProperties> getExtensions();
68 static std::set<std::string> getExtensionNames();
70 static bool isExtensionPresent(
const std::string& extensionName) {
return getExtensionNames().count(extensionName) != 0; }
72 static std::vector<VkExtensionProperties> getDeviceExtensions(
const VkPhysicalDevice& physicalDevice);
74 static std::set<std::string> getDeviceExtensionNames(
const VkPhysicalDevice& physicalDevice);
76 void requireExtensions(
const std::set<std::string>& requestedExtensions) {
77 requiredExtensions.insert(requestedExtensions.begin(), requestedExtensions.end());
80 void requireDeviceExtensions(
const std::set<std::string>& requestedExtensions) {
81 requiredDeviceExtensions.insert(requestedExtensions.begin(), requestedExtensions.end());
84 void setValidationEnabled(
bool enable);
86 void createInstance();
88 void destroyContext();
101 std::vector<VkPhysicalDevice> physicalDevices;
103 VkPhysicalDevice physicalDevice;
105 VkPhysicalDeviceFeatures enabledFeatures{};
107 std::shared_ptr<vks::VulkanDevice> device;
109 VkQueue graphicsQueue;
110 VkQueue transferQueue;
112 VkCommandBuffer createCommandBuffer(VkCommandPool commandPool, VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY)
const;
116 bool enableValidation =
false;
118 bool enableDebugMarkers =
false;
120 std::set<std::string> requiredExtensions;
121 std::set<std::string> requiredDeviceExtensions;
125 VkFormat initBestDepthStencilFormat()
const;
130 VkFormat getBestDepthStencilFormat()
const {
return _bestDepthStencilFormat; };
132 void registerWindow(VKWindow *window);
134 void unregisterWindow(VKWindow *window);
136 void shutdownWindows();
145 void trashVkFence(VkFence& fence);
146 void trashVkSampler(VkSampler &sampler);
147 void trashVkFramebuffer(VkFramebuffer &framebuffer);
148 void trashVkImageView(VkImageView &imageView);
149 void trashVkImage(VkImage &image);
150 void trashVkBuffer(VkBuffer &buffer);
151 void trashVkRenderPass(VkRenderPass &renderPass);
152 void trashVkDescriptorSetLayout(VkDescriptorSetLayout& descriptorSetLayout);
153 void trashVkPipelineLayout(VkPipelineLayout& pipelineLayout);
154 void trashVkPipeline(VkPipeline &pipeline);
155 void trashVkShaderModule(VkShaderModule &module);
156 void trashVkSwapchainKHR(VkSwapchainKHR &swapchain);
157 void trashVKSurfaceKHR(VkSurfaceKHR &surface);
158 void trashVkSemaphore(VkSemaphore &semaphore);
159 void trashVkDeviceMemory(VkDeviceMemory &memory);
160 void trashVmaAllocation(VmaAllocation &allocation);
162 void framebufferDeleted(gpu::vk::VKFramebuffer *framebuffer);
163 void bufferDeleted(gpu::vk::VKBuffer *buffer);
164 void textureDeleted(gpu::vk::VKTexture *texture);
165 void queryDeleted(gpu::vk::VKQuery *query);
168 std::recursive_mutex recyclerMutex;
170 std::vector<VkFence> vkFences;
171 std::vector<VkFramebuffer> vkFramebuffers;
172 std::vector<VkSampler> vkSamplers;
173 std::vector<VkImageView> vkImageViews;
174 std::vector<VkImage> vkImages;
175 std::vector<VkBuffer> vkBuffers;
176 std::vector<VkRenderPass> vkRenderPasses;
177 std::vector<VkDescriptorSetLayout> vkDescriptorSetLayouts;
178 std::vector<VkPipelineLayout > vkPipelineLayouts;
179 std::vector<VkPipeline> vkPipelines;
180 std::vector<VkShaderModule> vkShaderModules;
181 std::vector<VkSwapchainKHR> vkSwapchainsKHR;
182 std::vector<VkSurfaceKHR> vkSurfacesKHR;
183 std::vector<VkSemaphore> vkSemaphores;
184 std::vector<VkDeviceMemory> vkDeviceMemories;
185 std::vector<VmaAllocation> vmaAllocations;
188 std::vector<gpu::vk::VKFramebuffer*> deletedFramebuffers;
189 std::vector<gpu::vk::VKBuffer*> deletedBuffers;
190 std::vector<gpu::vk::VKTexture*> deletedTextures;
191 std::vector<gpu::vk::VKQuery*> deletedQueries;
192 friend class gpu::vk::VKBackend;
196 std::recursive_mutex vulkanWindowsMutex;
197 std::list<VKWindow*> vulkanWindows;
198 VkFormat _bestDepthStencilFormat{ VK_FORMAT_UNDEFINED };