25 vk::PhysicalDeviceType deviceType = vk::PhysicalDeviceType::eOther;
26 vk::PhysicalDeviceProperties physicalProperties;
28 uint32_t graphicsQueueFamilyIndex = 0;
29 uint32_t presentQueueFamilyIndex = 0;
30 uint32_t computeQueueFamilyIndex = 0;
31 uint32_t graphicsQueueIndex = 0;
32 uint32_t presentQueueIndex = 0;
33 uint32_t computeQueueIndex = 0;
34 vk::Queue graphicsQueue;
35 vk::Queue presentQueue;
36 vk::Queue computeQueue;
37 vk::CommandPool graphicsCommandPool;
38 vk::CommandPool presentCommandPool;
39 vk::CommandPool computeCommandPool;
52 VmaAllocation quadIndexBufferAllocation = {};
64 bool supportsLazyTransientImages =
false;
65 vk::ImageUsageFlags transientImageUsageFlags = vk::ImageUsageFlags{};
66 VmaMemoryUsage lazyMemoryUsage = VMA_MEMORY_USAGE_GPU_ONLY;
93 int score(vk::SurfaceKHR surface)
const;
107 createBuffer(
const vk::BufferCreateInfo &bufferCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
109 void destroyBuffer(
const vk::Buffer &buffer,
const VmaAllocation &allocation)
const;
112 createImage(
const vk::ImageCreateInfo &imageCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
113 void destroyImage(
const vk::Image &image,
const VmaAllocation &allocation)
const;
115 vk::CommandBuffer beginSingleTimeCommands()
const;
116 void endSingleTimeCommands(vk::CommandBuffer commandBuffer)
const;
118 static void transition_layout(
119 vk::CommandBuffer command_buffer,
122 vk::ImageLayout src_layout,
123 vk::ImageLayout dst_layout);
124 void transition_layout(vk::Image image, vk::Format format, vk::ImageLayout src_layout, vk::ImageLayout dst_layout)
const;
128 vk::ImageLayout srcLayout,
130 vk::ImageLayout dstLayout,
131 vk::ArrayProxy<vk::ImageCopy const> regions)
const;
132 void clearColorImage(
134 vk::ImageLayout layout,
135 vk::ClearColorValue
const &
color,
136 vk::ArrayProxy<const vk::ImageSubresourceRange> ranges)
const;
139 std::span<T> mapMemory(
const VmaAllocation &allocation)
const
141 ttlet lock = std::scoped_lock(gui_system_mutex);
144 ttlet result =
static_cast<vk::Result
>(vmaMapMemory(allocator, allocation, &mapping));
146 VmaAllocationInfo allocationInfo;
147 vmaGetAllocationInfo(allocator, allocation, &allocationInfo);
150 T *mappingT =
reinterpret_cast<T *
>(mapping);
151 ttlet mappingSpan = std::span<T>(mappingT, allocationInfo.size /
sizeof(T));
153 return vk::createResultValue(result, mappingSpan,
"tt::gui_device_vulkan::mapMemory");
156 void unmapMemory(
const VmaAllocation &allocation)
const;
158 void flushAllocation(
const VmaAllocation &allocation, VkDeviceSize offset, VkDeviceSize size)
const
160 ttlet lock = std::scoped_lock(gui_system_mutex);
162 ttlet alignment = physicalProperties.limits.nonCoherentAtomSize;
164 ttlet alignedOffset = (offset / alignment) * alignment;
165 ttlet adjustedSize = size + (offset - alignedOffset);
166 ttlet alignedSize = ((adjustedSize + (alignment - 1)) / alignment) * alignment;
168 vmaFlushAllocation(allocator, allocation, alignedOffset, alignedSize);
171 vk::ShaderModule loadShader(uint32_t
const *data,
size_t size)
const;
173 vk::ShaderModule loadShader(std::span<std::byte const> shaderObjectBytes)
const;
175 vk::ShaderModule loadShader(URL
const &shaderObjectLocation)
const;
177 void waitIdle()
const
179 ttlet lock = std::scoped_lock(gui_system_mutex);
180 return intrinsic.waitIdle();
183 vk::Result waitForFences(vk::ArrayProxy<const vk::Fence> fences, vk::Bool32 waitAll, uint64_t timeout)
const
185 ttlet
lock = std::scoped_lock(gui_system_mutex);
186 return intrinsic.waitForFences(fences, waitAll, timeout);
189 vk::Result acquireNextImageKHR(
190 vk::SwapchainKHR swapchain,
192 vk::Semaphore semaphore,
194 uint32_t *pImageIndex)
const
196 ttlet
lock = std::scoped_lock(gui_system_mutex);
197 return intrinsic.acquireNextImageKHR(swapchain, timeout, semaphore, fence, pImageIndex);
200 void resetFences(vk::ArrayProxy<const vk::Fence> fences)
const
202 ttlet
lock = std::scoped_lock(gui_system_mutex);
203 return intrinsic.resetFences(fences);
206 vk::Result createSwapchainKHR(
207 const vk::SwapchainCreateInfoKHR *pCreateInfo,
208 const vk::AllocationCallbacks *pAllocator,
209 vk::SwapchainKHR *pSwapchain)
const
211 ttlet
lock = std::scoped_lock(gui_system_mutex);
212 return intrinsic.createSwapchainKHR(pCreateInfo, pAllocator, pSwapchain);
217 ttlet
lock = std::scoped_lock(gui_system_mutex);
218 return intrinsic.getSwapchainImagesKHR(swapchain);
221 vk::ImageView createImageView(
const vk::ImageViewCreateInfo &createInfo)
const
223 ttlet
lock = std::scoped_lock(gui_system_mutex);
224 return intrinsic.createImageView(createInfo);
227 vk::Framebuffer createFramebuffer(
const vk::FramebufferCreateInfo &createInfo)
const
229 ttlet
lock = std::scoped_lock(gui_system_mutex);
230 return intrinsic.createFramebuffer(createInfo);
233 vk::RenderPass createRenderPass(
const vk::RenderPassCreateInfo &createInfo)
const
235 ttlet
lock = std::scoped_lock(gui_system_mutex);
236 return intrinsic.createRenderPass(createInfo);
239 vk::Semaphore createSemaphore(
const vk::SemaphoreCreateInfo &createInfo)
const
241 ttlet
lock = std::scoped_lock(gui_system_mutex);
242 return intrinsic.createSemaphore(createInfo);
245 vk::Fence createFence(
const vk::FenceCreateInfo &createInfo)
const
247 ttlet
lock = std::scoped_lock(gui_system_mutex);
248 return intrinsic.createFence(createInfo);
251 vk::DescriptorSetLayout createDescriptorSetLayout(
const vk::DescriptorSetLayoutCreateInfo &createInfo)
const
253 ttlet
lock = std::scoped_lock(gui_system_mutex);
254 return intrinsic.createDescriptorSetLayout(createInfo);
257 vk::DescriptorPool createDescriptorPool(
const vk::DescriptorPoolCreateInfo &createInfo)
const
259 ttlet
lock = std::scoped_lock(gui_system_mutex);
260 return intrinsic.createDescriptorPool(createInfo);
263 vk::PipelineLayout createPipelineLayout(
const vk::PipelineLayoutCreateInfo &createInfo)
const
265 ttlet
lock = std::scoped_lock(gui_system_mutex);
266 return intrinsic.createPipelineLayout(createInfo);
269 vk::Pipeline createGraphicsPipeline(vk::PipelineCache pipelineCache,
const vk::GraphicsPipelineCreateInfo &createInfo)
const
271 ttlet
lock = std::scoped_lock(gui_system_mutex);
272 return intrinsic.createGraphicsPipeline(pipelineCache, createInfo).value;
275 vk::Sampler createSampler(
const vk::SamplerCreateInfo &createInfo)
const
277 ttlet
lock = std::scoped_lock(gui_system_mutex);
278 return intrinsic.createSampler(createInfo);
283 ttlet
lock = std::scoped_lock(gui_system_mutex);
284 return intrinsic.allocateDescriptorSets(allocateInfo);
289 ttlet
lock = std::scoped_lock(gui_system_mutex);
290 return intrinsic.allocateCommandBuffers(allocateInfo);
293 void updateDescriptorSets(
294 vk::ArrayProxy<const vk::WriteDescriptorSet> descriptorWrites,
295 vk::ArrayProxy<const vk::CopyDescriptorSet> descriptorCopies)
const
297 ttlet
lock = std::scoped_lock(gui_system_mutex);
298 return intrinsic.updateDescriptorSets(descriptorWrites, descriptorCopies);
301 void freeCommandBuffers(vk::CommandPool commandPool, vk::ArrayProxy<const vk::CommandBuffer> commandBuffers)
const
303 ttlet
lock = std::scoped_lock(gui_system_mutex);
304 return intrinsic.freeCommandBuffers(commandPool, commandBuffers);
308 void destroy(T x)
const
310 ttlet
lock = std::scoped_lock(gui_system_mutex);
311 intrinsic.destroy(x);
314 vk::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(vk::SurfaceKHR surface)
const
316 ttlet
lock = std::scoped_lock(gui_system_mutex);
317 return physicalIntrinsic.getSurfaceCapabilitiesKHR(surface);
321 vk::PhysicalDevice physicalIntrinsic;
322 vk::Device intrinsic;
323 VmaAllocator allocator;
326 void initialize_quad_index_buffer();
327 void destroy_quad_index_buffer();