22 vk::PhysicalDeviceType deviceType = vk::PhysicalDeviceType::eOther;
23 vk::PhysicalDeviceProperties physicalProperties;
56 [[nodiscard]] vk::SurfaceFormatKHR get_surface_format(
gfx_surface const &surface,
int *score =
nullptr) const noexcept;
66 [[nodiscard]] vk::PresentModeKHR get_present_mode(
gfx_surface const &surface,
int *score =
nullptr) const noexcept;
78 vk::Buffer quadIndexBuffer;
79 VmaAllocation quadIndexBufferAllocation = {};
90 bool supportsLazyTransientImages =
false;
91 vk::ImageUsageFlags transientImageUsageFlags = vk::ImageUsageFlags{};
92 VmaMemoryUsage lazyMemoryUsage = VMA_MEMORY_USAGE_GPU_ONLY;
102 int score(vk::SurfaceKHR surface)
const;
116 createBuffer(
const vk::BufferCreateInfo &bufferCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
118 void destroyBuffer(
const vk::Buffer &buffer,
const VmaAllocation &allocation)
const;
121 createImage(
const vk::ImageCreateInfo &imageCreateInfo,
const VmaAllocationCreateInfo &allocationCreateInfo)
const;
122 void destroyImage(
const vk::Image &image,
const VmaAllocation &allocation)
const;
124 vk::CommandBuffer beginSingleTimeCommands()
const;
125 void endSingleTimeCommands(vk::CommandBuffer commandBuffer)
const;
127 static void transition_layout(
128 vk::CommandBuffer command_buffer,
131 vk::ImageLayout src_layout,
132 vk::ImageLayout dst_layout);
133 void transition_layout(vk::Image image, vk::Format format, vk::ImageLayout src_layout, vk::ImageLayout dst_layout)
const;
137 vk::ImageLayout srcLayout,
139 vk::ImageLayout dstLayout,
140 vk::ArrayProxy<vk::ImageCopy const> regions)
const;
141 void clearColorImage(
143 vk::ImageLayout layout,
144 vk::ClearColorValue
const &
color,
145 vk::ArrayProxy<const vk::ImageSubresourceRange> ranges)
const;
148 std::span<T> mapMemory(
const VmaAllocation &allocation)
const
153 hilet result =
static_cast<vk::Result
>(vmaMapMemory(allocator, allocation, &mapping));
155 VmaAllocationInfo allocationInfo;
156 vmaGetAllocationInfo(allocator, allocation, &allocationInfo);
159 T *mappingT =
reinterpret_cast<T *
>(mapping);
160 hilet mappingSpan = std::span<T>(mappingT, allocationInfo.size /
sizeof(T));
162 return vk::createResultValue(result, mappingSpan,
"hi::gfx_device_vulkan::mapMemory");
165 void unmapMemory(
const VmaAllocation &allocation)
const;
167 void flushAllocation(
const VmaAllocation &allocation, VkDeviceSize offset, VkDeviceSize size)
const
174 hilet adjustedSize = size + (offset - alignedOffset);
177 vmaFlushAllocation(allocator, allocation, alignedOffset, alignedSize);
180 vk::ShaderModule loadShader(uint32_t
const *data,
std::size_t size)
const;
182 vk::ShaderModule loadShader(std::span<std::byte const> shaderObjectBytes)
const;
184 vk::ShaderModule loadShader(URL
const &shaderObjectLocation)
const;
186 void waitIdle()
const
189 return intrinsic.waitIdle();
192 vk::Result waitForFences(vk::ArrayProxy<const vk::Fence> fences, vk::Bool32 waitAll, uint64_t timeout)
const
195 return intrinsic.waitForFences(fences, waitAll, timeout);
198 vk::Result acquireNextImageKHR(
199 vk::SwapchainKHR swapchain,
201 vk::Semaphore semaphore,
203 uint32_t *pImageIndex)
const
206 return intrinsic.acquireNextImageKHR(swapchain, timeout, semaphore, fence, pImageIndex);
209 void resetFences(vk::ArrayProxy<const vk::Fence> fences)
const
212 return intrinsic.resetFences(fences);
215 vk::Result createSwapchainKHR(
216 const vk::SwapchainCreateInfoKHR *pCreateInfo,
217 const vk::AllocationCallbacks *pAllocator,
218 vk::SwapchainKHR *pSwapchain)
const
221 return intrinsic.createSwapchainKHR(pCreateInfo, pAllocator, pSwapchain);
227 return intrinsic.getSwapchainImagesKHR(swapchain);
230 vk::ImageView createImageView(
const vk::ImageViewCreateInfo &createInfo)
const
233 return intrinsic.createImageView(createInfo);
236 vk::Framebuffer createFramebuffer(
const vk::FramebufferCreateInfo &createInfo)
const
239 return intrinsic.createFramebuffer(createInfo);
242 vk::RenderPass createRenderPass(
const vk::RenderPassCreateInfo &createInfo)
const
245 return intrinsic.createRenderPass(createInfo);
248 vk::Extent2D getRenderAreaGranularity(
const vk::RenderPass &render_pass)
const noexcept
252 intrinsic.getRenderAreaGranularity(render_pass, &r);
256 vk::Semaphore createSemaphore(
const vk::SemaphoreCreateInfo &createInfo)
const
259 return intrinsic.createSemaphore(createInfo);
262 vk::Fence createFence(
const vk::FenceCreateInfo &createInfo)
const
265 return intrinsic.createFence(createInfo);
268 vk::DescriptorSetLayout createDescriptorSetLayout(
const vk::DescriptorSetLayoutCreateInfo &createInfo)
const
271 return intrinsic.createDescriptorSetLayout(createInfo);
274 vk::DescriptorPool createDescriptorPool(
const vk::DescriptorPoolCreateInfo &createInfo)
const
277 return intrinsic.createDescriptorPool(createInfo);
280 vk::PipelineLayout createPipelineLayout(
const vk::PipelineLayoutCreateInfo &createInfo)
const
283 return intrinsic.createPipelineLayout(createInfo);
286 vk::Pipeline createGraphicsPipeline(vk::PipelineCache pipelineCache,
const vk::GraphicsPipelineCreateInfo &createInfo)
const
289 return intrinsic.createGraphicsPipeline(pipelineCache, createInfo).value;
292 vk::Sampler createSampler(
const vk::SamplerCreateInfo &createInfo)
const
295 return intrinsic.createSampler(createInfo);
301 return intrinsic.allocateDescriptorSets(allocateInfo);
307 return intrinsic.allocateCommandBuffers(allocateInfo);
310 void updateDescriptorSets(
311 vk::ArrayProxy<const vk::WriteDescriptorSet> descriptorWrites,
312 vk::ArrayProxy<const vk::CopyDescriptorSet> descriptorCopies)
const
315 return intrinsic.updateDescriptorSets(descriptorWrites, descriptorCopies);
318 void freeCommandBuffers(vk::CommandPool commandPool, vk::ArrayProxy<const vk::CommandBuffer> commandBuffers)
const
321 return intrinsic.freeCommandBuffers(commandPool, commandBuffers);
324 void setDebugUtilsObjectNameEXT(vk::DebugUtilsObjectNameInfoEXT
const &name_info)
const;
326 void setDebugUtilsObjectNameEXT(vk::Image image,
char const *name)
const
328 return setDebugUtilsObjectNameEXT(
329 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eImage, std::bit_cast<uint64_t>(image), name});
332 void setDebugUtilsObjectNameEXT(vk::Buffer buffer,
char const *name)
const
334 return setDebugUtilsObjectNameEXT(
335 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eBuffer, std::bit_cast<uint64_t>(buffer), name});
338 void setDebugUtilsObjectNameEXT(vk::Sampler sampler,
char const *name)
const
340 return setDebugUtilsObjectNameEXT(
341 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eSampler, std::bit_cast<uint64_t>(sampler), name});
344 void setDebugUtilsObjectNameEXT(vk::ShaderModule shader_module,
char const *name)
const
346 return setDebugUtilsObjectNameEXT(
347 vk::DebugUtilsObjectNameInfoEXT{vk::ObjectType::eShaderModule, std::bit_cast<uint64_t>(shader_module), name});
350 void cmdBeginDebugUtilsLabelEXT(vk::CommandBuffer buffer, vk::DebugUtilsLabelEXT
const &create_info)
const;
351 void cmdEndDebugUtilsLabelEXT(vk::CommandBuffer buffer)
const;
353 void cmdBeginDebugUtilsLabelEXT(vk::CommandBuffer buffer,
char const *name)
const
355 return cmdBeginDebugUtilsLabelEXT(buffer, vk::DebugUtilsLabelEXT{name});
359 void destroy(T x)
const
362 intrinsic.destroy(x);
365 vk::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(vk::SurfaceKHR surface)
const
368 return physicalIntrinsic.getSurfaceCapabilitiesKHR(surface);
371 void log_memory_usage() const noexcept override;
374 vk::PhysicalDevice physicalIntrinsic;
375 vk::Device intrinsic;
376 VmaAllocator allocator;
379 [[nodiscard]]
std::vector<vk::DeviceQueueCreateInfo> make_device_queue_create_infos() const noexcept;
380 void initialize_queues(
std::vector<vk::DeviceQueueCreateInfo> const &device_queue_create_infos) noexcept;
381 void initialize_device();
382 void initialize_quad_index_buffer();
383 void destroy_quad_index_buffer();