23 vk::PhysicalDevice physicalIntrinsic;
25 VmaAllocator allocator;
27 vk::PhysicalDeviceType deviceType = vk::PhysicalDeviceType::eOther;
28 vk::PhysicalDeviceProperties physicalProperties;
61 [[nodiscard]] vk::SurfaceFormatKHR get_surface_format(
gfx_surface const &surface,
int *score =
nullptr) const noexcept;
71 [[nodiscard]] vk::PresentModeKHR get_present_mode(
gfx_surface const &surface,
int *score =
nullptr) const noexcept;
83 vk::Buffer quadIndexBuffer;
84 VmaAllocation quadIndexBufferAllocation = {};
96 bool supportsLazyTransientImages =
false;
97 vk::ImageUsageFlags transientImageUsageFlags = vk::ImageUsageFlags{};
98 VmaMemoryUsage lazyMemoryUsage = VMA_MEMORY_USAGE_GPU_ONLY;
108 int score(vk::SurfaceKHR surface)
const;
122 createBuffer(
const vk::BufferCreateInfo &bufferCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
124 void destroyBuffer(
const vk::Buffer &buffer,
const VmaAllocation &allocation)
const;
127 createImage(
const vk::ImageCreateInfo &imageCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
128 void destroyImage(
const vk::Image &image,
const VmaAllocation &allocation)
const;
130 vk::CommandBuffer beginSingleTimeCommands()
const;
131 void endSingleTimeCommands(vk::CommandBuffer commandBuffer)
const;
133 static void transition_layout(
134 vk::CommandBuffer command_buffer,
137 vk::ImageLayout src_layout,
138 vk::ImageLayout dst_layout);
139 void transition_layout(vk::Image image, vk::Format format, vk::ImageLayout src_layout, vk::ImageLayout dst_layout)
const;
143 vk::ImageLayout srcLayout,
145 vk::ImageLayout dstLayout,
146 vk::ArrayProxy<vk::ImageCopy const> regions)
const;
147 void clearColorImage(
149 vk::ImageLayout layout,
150 vk::ClearColorValue
const &
color,
151 vk::ArrayProxy<const vk::ImageSubresourceRange> ranges)
const;
154 std::span<T> mapMemory(
const VmaAllocation &allocation)
const
159 hilet result = vk::Result{vmaMapMemory(allocator, allocation, &mapping)};
160 if (result != vk::Result::eSuccess) {
161 throw gui_error(std::format(
"vmaMapMemory failed {}", to_string(result)));
164 VmaAllocationInfo allocationInfo;
165 vmaGetAllocationInfo(allocator, allocation, &allocationInfo);
168 T *mappingT =
reinterpret_cast<T *
>(mapping);
169 return std::span<T>{mappingT, allocationInfo.size /
sizeof(T)};
172 void unmapMemory(
const VmaAllocation &allocation)
const;
174 void flushAllocation(
const VmaAllocation &allocation, VkDeviceSize offset, VkDeviceSize size)
const
178 hilet alignment = physicalProperties.limits.nonCoherentAtomSize;
180 hilet alignedOffset = (offset / alignment) * alignment;
181 hilet adjustedSize = size + (offset - alignedOffset);
182 hilet alignedSize = ((adjustedSize + (alignment - 1)) / alignment) * alignment;
184 vmaFlushAllocation(allocator, allocation, alignedOffset, alignedSize);
187 vk::ShaderModule loadShader(uint32_t
const *data,
std::size_t size)
const;
189 vk::ShaderModule loadShader(std::span<std::byte const> shaderObjectBytes)
const;
191 vk::ShaderModule loadShader(URL
const &shaderObjectLocation)
const;
193 void waitIdle()
const
196 return intrinsic.waitIdle();
199 vk::Result waitForFences(vk::ArrayProxy<const vk::Fence> fences, vk::Bool32 waitAll, uint64_t timeout)
const
202 return intrinsic.waitForFences(fences, waitAll, timeout);
205 vk::Result acquireNextImageKHR(
206 vk::SwapchainKHR swapchain,
208 vk::Semaphore semaphore,
210 uint32_t *pImageIndex)
const
213 return intrinsic.acquireNextImageKHR(swapchain, timeout, semaphore, fence, pImageIndex);
216 void resetFences(vk::ArrayProxy<const vk::Fence> fences)
const
219 return intrinsic.resetFences(fences);
222 vk::Result createSwapchainKHR(
223 const vk::SwapchainCreateInfoKHR *pCreateInfo,
224 const vk::AllocationCallbacks *pAllocator,
225 vk::SwapchainKHR *pSwapchain)
const
228 return intrinsic.createSwapchainKHR(pCreateInfo, pAllocator, pSwapchain);
234 return intrinsic.getSwapchainImagesKHR(swapchain);
237 vk::ImageView createImageView(
const vk::ImageViewCreateInfo &createInfo)
const
240 return intrinsic.createImageView(createInfo);
243 vk::Framebuffer createFramebuffer(
const vk::FramebufferCreateInfo &createInfo)
const
246 return intrinsic.createFramebuffer(createInfo);
249 vk::RenderPass createRenderPass(
const vk::RenderPassCreateInfo &createInfo)
const
252 return intrinsic.createRenderPass(createInfo);
255 vk::Extent2D getRenderAreaGranularity(
const vk::RenderPass &render_pass)
const noexcept
259 intrinsic.getRenderAreaGranularity(render_pass, &r);
263 vk::Semaphore createSemaphore(
const vk::SemaphoreCreateInfo& createInfo = vk::SemaphoreCreateInfo{})
const
266 return intrinsic.createSemaphore(createInfo);
269 vk::Fence createFence(
const vk::FenceCreateInfo &createInfo)
const
272 return intrinsic.createFence(createInfo);
275 vk::DescriptorSetLayout createDescriptorSetLayout(
const vk::DescriptorSetLayoutCreateInfo &createInfo)
const
278 return intrinsic.createDescriptorSetLayout(createInfo);
281 vk::DescriptorPool createDescriptorPool(
const vk::DescriptorPoolCreateInfo &createInfo)
const
284 return intrinsic.createDescriptorPool(createInfo);
287 vk::PipelineLayout createPipelineLayout(
const vk::PipelineLayoutCreateInfo &createInfo)
const
290 return intrinsic.createPipelineLayout(createInfo);
293 vk::Pipeline createGraphicsPipeline(vk::PipelineCache pipelineCache,
const vk::GraphicsPipelineCreateInfo &createInfo)
const
296 return intrinsic.createGraphicsPipeline(pipelineCache, createInfo).value;
299 vk::Sampler createSampler(
const vk::SamplerCreateInfo &createInfo)
const
302 return intrinsic.createSampler(createInfo);
308 return intrinsic.allocateDescriptorSets(allocateInfo);
314 return intrinsic.allocateCommandBuffers(allocateInfo);
317 void updateDescriptorSets(
318 vk::ArrayProxy<const vk::WriteDescriptorSet> descriptorWrites,
319 vk::ArrayProxy<const vk::CopyDescriptorSet> descriptorCopies)
const
322 return intrinsic.updateDescriptorSets(descriptorWrites, descriptorCopies);
325 void freeCommandBuffers(vk::CommandPool commandPool, vk::ArrayProxy<const vk::CommandBuffer> commandBuffers)
const
328 return intrinsic.freeCommandBuffers(commandPool, commandBuffers);
331 void setDebugUtilsObjectNameEXT(vk::DebugUtilsObjectNameInfoEXT
const &name_info)
const;
333 void setDebugUtilsObjectNameEXT(vk::Image image,
char const *name)
const
335 return setDebugUtilsObjectNameEXT(
336 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eImage, std::bit_cast<uint64_t>(image), name});
339 void setDebugUtilsObjectNameEXT(vk::Buffer buffer,
char const *name)
const
341 return setDebugUtilsObjectNameEXT(
342 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eBuffer, std::bit_cast<uint64_t>(buffer), name});
345 void setDebugUtilsObjectNameEXT(vk::Sampler sampler,
char const *name)
const
347 return setDebugUtilsObjectNameEXT(
348 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eSampler, std::bit_cast<uint64_t>(sampler), name});
351 void setDebugUtilsObjectNameEXT(vk::ShaderModule shader_module,
char const *name)
const
353 return setDebugUtilsObjectNameEXT(
354 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eShaderModule, std::bit_cast<uint64_t>(shader_module), name});
357 void cmdBeginDebugUtilsLabelEXT(vk::CommandBuffer buffer, vk::DebugUtilsLabelEXT
const &create_info)
const;
358 void cmdEndDebugUtilsLabelEXT(vk::CommandBuffer buffer)
const;
360 void cmdBeginDebugUtilsLabelEXT(vk::CommandBuffer buffer,
char const *name)
const
362 return cmdBeginDebugUtilsLabelEXT(buffer, vk::DebugUtilsLabelEXT{name});
366 void destroy(T x)
const
369 intrinsic.destroy(x);
372 vk::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(vk::SurfaceKHR surface)
const
375 return physicalIntrinsic.getSurfaceCapabilitiesKHR(surface);
378 void log_memory_usage() const noexcept override;
382 [[nodiscard]]
std::vector<vk::DeviceQueueCreateInfo> make_device_queue_create_infos() const noexcept;
383 void initialize_queues(
std::vector<vk::DeviceQueueCreateInfo> const &device_queue_create_infos) noexcept;
384 void initialize_device();
385 void initialize_quad_index_buffer();
386 void destroy_quad_index_buffer();