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;
108 void destroyBuffer(
const vk::Buffer &buffer,
const VmaAllocation &allocation)
const;
111 void destroyImage(
const vk::Image &image,
const VmaAllocation &allocation)
const;
113 vk::CommandBuffer beginSingleTimeCommands()
const;
114 void endSingleTimeCommands(vk::CommandBuffer commandBuffer)
const;
116 void transitionLayout(vk::Image image, vk::Format format, vk::ImageLayout srcLayout, vk::ImageLayout dstLayout)
const;
117 void copyImage(vk::Image srcImage, vk::ImageLayout srcLayout, vk::Image dstImage, vk::ImageLayout dstLayout, vk::ArrayProxy<vk::ImageCopy const> regions)
const;
118 void clearColorImage(vk::Image image, vk::ImageLayout layout, vk::ClearColorValue
const &
color, vk::ArrayProxy<const vk::ImageSubresourceRange> ranges)
const;
120 template <
typename T>
121 std::span<T> mapMemory(
const VmaAllocation &allocation)
const {
122 ttlet lock = std::scoped_lock(gui_system_mutex);
125 ttlet result =
static_cast<vk::Result
>(vmaMapMemory(allocator, allocation, &mapping));
127 VmaAllocationInfo allocationInfo;
128 vmaGetAllocationInfo(allocator, allocation, &allocationInfo);
131 T *mappingT =
reinterpret_cast<T *
>(mapping);
132 ttlet mappingSpan = std::span<T>(mappingT, allocationInfo.size / sizeof (T));
134 return vk::createResultValue(result, mappingSpan,
"tt::gui_device_vulkan::mapMemory");
137 void unmapMemory(
const VmaAllocation &allocation)
const;
139 void flushAllocation(
const VmaAllocation &allocation, VkDeviceSize offset, VkDeviceSize size)
const {
140 ttlet lock = std::scoped_lock(gui_system_mutex);
142 ttlet alignment = physicalProperties.limits.nonCoherentAtomSize;
144 ttlet alignedOffset = (offset / alignment) * alignment;
145 ttlet adjustedSize = size + (offset - alignedOffset);
146 ttlet alignedSize = ((adjustedSize + (alignment - 1)) / alignment) * alignment;
148 vmaFlushAllocation(allocator, allocation, alignedOffset, alignedSize);
151 vk::ShaderModule loadShader(uint32_t
const *data,
size_t size)
const;
153 vk::ShaderModule loadShader(std::span<std::byte const> shaderObjectBytes)
const;
155 vk::ShaderModule loadShader(URL
const &shaderObjectLocation)
const;
158 void waitIdle()
const {
159 ttlet lock = std::scoped_lock(gui_system_mutex);
160 return intrinsic.waitIdle();
163 vk::Result waitForFences(vk::ArrayProxy<const vk::Fence> fences, vk::Bool32 waitAll, uint64_t timeout)
const {
164 ttlet
lock = std::scoped_lock(gui_system_mutex);
165 return intrinsic.waitForFences(fences, waitAll, timeout);
168 vk::Result acquireNextImageKHR(vk::SwapchainKHR swapchain, uint64_t timeout, vk::Semaphore semaphore, vk::Fence fence, uint32_t* pImageIndex)
const {
169 ttlet
lock = std::scoped_lock(gui_system_mutex);
170 return intrinsic.acquireNextImageKHR(swapchain, timeout, semaphore, fence, pImageIndex);
173 void resetFences(vk::ArrayProxy<const vk::Fence> fences)
const {
174 ttlet
lock = std::scoped_lock(gui_system_mutex);
175 return intrinsic.resetFences(fences);
178 vk::Result createSwapchainKHR(
const vk::SwapchainCreateInfoKHR* pCreateInfo,
const vk::AllocationCallbacks* pAllocator, vk::SwapchainKHR* pSwapchain)
const {
179 ttlet
lock = std::scoped_lock(gui_system_mutex);
180 return intrinsic.createSwapchainKHR(pCreateInfo, pAllocator, pSwapchain);
184 ttlet
lock = std::scoped_lock(gui_system_mutex);
185 return intrinsic.getSwapchainImagesKHR(swapchain);
188 vk::ImageView createImageView(
const vk::ImageViewCreateInfo& createInfo)
const {
189 ttlet
lock = std::scoped_lock(gui_system_mutex);
190 return intrinsic.createImageView(createInfo);
193 vk::Framebuffer createFramebuffer(
const vk::FramebufferCreateInfo& createInfo)
const {
194 ttlet
lock = std::scoped_lock(gui_system_mutex);
195 return intrinsic.createFramebuffer(createInfo);
198 vk::RenderPass createRenderPass(
const vk::RenderPassCreateInfo& createInfo)
const {
199 ttlet
lock = std::scoped_lock(gui_system_mutex);
200 return intrinsic.createRenderPass(createInfo);
203 vk::Semaphore createSemaphore(
const vk::SemaphoreCreateInfo& createInfo)
const {
204 ttlet
lock = std::scoped_lock(gui_system_mutex);
205 return intrinsic.createSemaphore(createInfo);
208 vk::Fence createFence(
const vk::FenceCreateInfo& createInfo)
const {
209 ttlet
lock = std::scoped_lock(gui_system_mutex);
210 return intrinsic.createFence(createInfo);
213 vk::DescriptorSetLayout createDescriptorSetLayout(
const vk::DescriptorSetLayoutCreateInfo& createInfo)
const {
214 ttlet
lock = std::scoped_lock(gui_system_mutex);
215 return intrinsic.createDescriptorSetLayout(createInfo);
218 vk::DescriptorPool createDescriptorPool(
const vk::DescriptorPoolCreateInfo& createInfo)
const {
219 ttlet
lock = std::scoped_lock(gui_system_mutex);
220 return intrinsic.createDescriptorPool(createInfo);
223 vk::PipelineLayout createPipelineLayout(
const vk::PipelineLayoutCreateInfo& createInfo)
const {
224 ttlet
lock = std::scoped_lock(gui_system_mutex);
225 return intrinsic.createPipelineLayout(createInfo);
228 vk::Pipeline createGraphicsPipeline(vk::PipelineCache pipelineCache,
const vk::GraphicsPipelineCreateInfo& createInfo)
const {
229 ttlet
lock = std::scoped_lock(gui_system_mutex);
230 return intrinsic.createGraphicsPipeline(pipelineCache, createInfo);
233 vk::Sampler createSampler(
const vk::SamplerCreateInfo& createInfo)
const {
234 ttlet
lock = std::scoped_lock(gui_system_mutex);
235 return intrinsic.createSampler(createInfo);
239 ttlet
lock = std::scoped_lock(gui_system_mutex);
240 return intrinsic.allocateDescriptorSets(allocateInfo);
244 ttlet
lock = std::scoped_lock(gui_system_mutex);
245 return intrinsic.allocateCommandBuffers(allocateInfo);
248 void updateDescriptorSets(vk::ArrayProxy<const vk::WriteDescriptorSet> descriptorWrites, vk::ArrayProxy<const vk::CopyDescriptorSet> descriptorCopies)
const {
249 ttlet
lock = std::scoped_lock(gui_system_mutex);
250 return intrinsic.updateDescriptorSets(descriptorWrites, descriptorCopies);
253 void freeCommandBuffers(vk::CommandPool commandPool, vk::ArrayProxy<const vk::CommandBuffer> commandBuffers)
const {
254 ttlet
lock = std::scoped_lock(gui_system_mutex);
255 return intrinsic.freeCommandBuffers(commandPool, commandBuffers);
259 void destroy(T x)
const {
260 ttlet
lock = std::scoped_lock(gui_system_mutex);
261 intrinsic.destroy(x);
264 vk::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(vk::SurfaceKHR surface)
const {
265 ttlet
lock = std::scoped_lock(gui_system_mutex);
266 return physicalIntrinsic.getSurfaceCapabilitiesKHR(surface);
270 vk::PhysicalDevice physicalIntrinsic;
271 vk::Device intrinsic;
272 VmaAllocator allocator;
275 void initialize_quad_index_buffer();
276 void destroy_quad_index_buffer();