24 vk::PhysicalDevice physicalIntrinsic;
26 VmaAllocator allocator;
29 void initializeQuadIndexBuffer();
30 void destroyQuadIndexBuffer();
33 vk::PhysicalDeviceType deviceType = vk::PhysicalDeviceType::eOther;
34 vk::PhysicalDeviceProperties physicalProperties;
36 uint32_t graphicsQueueFamilyIndex = 0;
37 uint32_t presentQueueFamilyIndex = 0;
38 uint32_t computeQueueFamilyIndex = 0;
39 uint32_t graphicsQueueIndex = 0;
40 uint32_t presentQueueIndex = 0;
41 uint32_t computeQueueIndex = 0;
42 vk::Queue graphicsQueue;
43 vk::Queue presentQueue;
44 vk::Queue computeQueue;
45 vk::CommandPool graphicsCommandPool;
46 vk::CommandPool presentCommandPool;
47 vk::CommandPool computeCommandPool;
60 VmaAllocation quadIndexBufferAllocation = {};
72 bool supportsLazyTransientImages =
false;
73 vk::ImageUsageFlags transientImageUsageFlags = vk::ImageUsageFlags{};
74 VmaMemoryUsage lazyMemoryUsage = VMA_MEMORY_USAGE_GPU_ONLY;
101 int score(vk::SurfaceKHR surface)
const;
116 void destroyBuffer(
const vk::Buffer &buffer,
const VmaAllocation &allocation)
const;
119 void destroyImage(
const vk::Image &image,
const VmaAllocation &allocation)
const;
121 vk::CommandBuffer beginSingleTimeCommands()
const;
122 void endSingleTimeCommands(vk::CommandBuffer commandBuffer)
const;
124 void transitionLayout(vk::Image image, vk::Format format, vk::ImageLayout srcLayout, vk::ImageLayout dstLayout)
const;
125 void copyImage(vk::Image srcImage, vk::ImageLayout srcLayout, vk::Image dstImage, vk::ImageLayout dstLayout, vk::ArrayProxy<vk::ImageCopy const> regions)
const;
126 void clearColorImage(vk::Image image, vk::ImageLayout layout, vk::ClearColorValue
const &color, vk::ArrayProxy<const vk::ImageSubresourceRange> ranges)
const;
128 template <
typename T>
129 nonstd::span<T> mapMemory(
const VmaAllocation &allocation)
const {
130 auto lock = std::scoped_lock(guiMutex);
133 ttlet result =
static_cast<vk::Result
>(vmaMapMemory(allocator, allocation, &mapping));
135 VmaAllocationInfo allocationInfo;
136 vmaGetAllocationInfo(allocator, allocation, &allocationInfo);
139 T *mappingT =
reinterpret_cast<T *
>(mapping);
140 ttlet mappingSpan = nonstd::span<T>(mappingT, allocationInfo.size / sizeof (T));
142 return vk::createResultValue(result, mappingSpan,
"tt::GUIDevice_vulkan::mapMemory");
145 void unmapMemory(
const VmaAllocation &allocation)
const;
147 void flushAllocation(
const VmaAllocation &allocation, VkDeviceSize offset, VkDeviceSize size)
const {
148 auto lock = std::scoped_lock(guiMutex);
150 ttlet alignment = physicalProperties.limits.nonCoherentAtomSize;
152 ttlet alignedOffset = (offset / alignment) * alignment;
153 ttlet adjustedSize = size + (offset - alignedOffset);
154 ttlet alignedSize = ((adjustedSize + (alignment - 1)) / alignment) * alignment;
156 vmaFlushAllocation(allocator, allocation, alignedOffset, alignedSize);
159 vk::ShaderModule loadShader(uint32_t
const *data,
size_t size)
const;
161 vk::ShaderModule loadShader(nonstd::span<std::byte const> shaderObjectBytes)
const;
163 vk::ShaderModule loadShader(URL
const &shaderObjectLocation)
const;
166 void waitIdle()
const {
167 auto lock = std::scoped_lock(guiMutex);
168 return intrinsic.waitIdle();
171 vk::Result waitForFences(vk::ArrayProxy<const vk::Fence> fences, vk::Bool32 waitAll, uint64_t timeout)
const {
172 auto lock = std::scoped_lock(guiMutex);
173 return intrinsic.waitForFences(fences, waitAll, timeout);
176 vk::Result acquireNextImageKHR(vk::SwapchainKHR swapchain, uint64_t timeout, vk::Semaphore semaphore, vk::Fence fence, uint32_t* pImageIndex)
const {
177 auto lock = std::scoped_lock(guiMutex);
178 return intrinsic.acquireNextImageKHR(swapchain, timeout, semaphore, fence, pImageIndex);
181 void resetFences(vk::ArrayProxy<const vk::Fence> fences)
const {
182 auto lock = std::scoped_lock(guiMutex);
183 return intrinsic.resetFences(fences);
186 vk::Result createSwapchainKHR(
const vk::SwapchainCreateInfoKHR* pCreateInfo,
const vk::AllocationCallbacks* pAllocator, vk::SwapchainKHR* pSwapchain)
const {
187 auto lock = std::scoped_lock(guiMutex);
188 return intrinsic.createSwapchainKHR(pCreateInfo, pAllocator, pSwapchain);
192 auto lock = std::scoped_lock(guiMutex);
193 return intrinsic.getSwapchainImagesKHR(swapchain);
196 vk::ImageView createImageView(
const vk::ImageViewCreateInfo& createInfo)
const {
197 auto lock = std::scoped_lock(guiMutex);
198 return intrinsic.createImageView(createInfo);
201 vk::Framebuffer createFramebuffer(
const vk::FramebufferCreateInfo& createInfo)
const {
202 auto lock = std::scoped_lock(guiMutex);
203 return intrinsic.createFramebuffer(createInfo);
206 vk::RenderPass createRenderPass(
const vk::RenderPassCreateInfo& createInfo)
const {
207 auto lock = std::scoped_lock(guiMutex);
208 return intrinsic.createRenderPass(createInfo);
211 vk::Semaphore createSemaphore(
const vk::SemaphoreCreateInfo& createInfo)
const {
212 auto lock = std::scoped_lock(guiMutex);
213 return intrinsic.createSemaphore(createInfo);
216 vk::Fence createFence(
const vk::FenceCreateInfo& createInfo)
const {
217 auto lock = std::scoped_lock(guiMutex);
218 return intrinsic.createFence(createInfo);
221 vk::DescriptorSetLayout createDescriptorSetLayout(
const vk::DescriptorSetLayoutCreateInfo& createInfo)
const {
222 auto lock = std::scoped_lock(guiMutex);
223 return intrinsic.createDescriptorSetLayout(createInfo);
226 vk::DescriptorPool createDescriptorPool(
const vk::DescriptorPoolCreateInfo& createInfo)
const {
227 auto lock = std::scoped_lock(guiMutex);
228 return intrinsic.createDescriptorPool(createInfo);
231 vk::PipelineLayout createPipelineLayout(
const vk::PipelineLayoutCreateInfo& createInfo)
const {
232 auto lock = std::scoped_lock(guiMutex);
233 return intrinsic.createPipelineLayout(createInfo);
236 vk::Pipeline createGraphicsPipeline(vk::PipelineCache pipelineCache,
const vk::GraphicsPipelineCreateInfo& createInfo)
const {
237 auto lock = std::scoped_lock(guiMutex);
238 return intrinsic.createGraphicsPipeline(pipelineCache, createInfo);
241 vk::Sampler createSampler(
const vk::SamplerCreateInfo& createInfo)
const {
242 auto lock = std::scoped_lock(guiMutex);
243 return intrinsic.createSampler(createInfo);
247 auto lock = std::scoped_lock(guiMutex);
248 return intrinsic.allocateDescriptorSets(allocateInfo);
252 auto lock = std::scoped_lock(guiMutex);
253 return intrinsic.allocateCommandBuffers(allocateInfo);
256 void updateDescriptorSets(vk::ArrayProxy<const vk::WriteDescriptorSet> descriptorWrites, vk::ArrayProxy<const vk::CopyDescriptorSet> descriptorCopies)
const {
257 auto lock = std::scoped_lock(guiMutex);
258 return intrinsic.updateDescriptorSets(descriptorWrites, descriptorCopies);
261 void freeCommandBuffers(vk::CommandPool commandPool, vk::ArrayProxy<const vk::CommandBuffer> commandBuffers)
const {
262 auto lock = std::scoped_lock(guiMutex);
263 return intrinsic.freeCommandBuffers(commandPool, commandBuffers);
267 void destroy(T x)
const {
268 auto lock = std::scoped_lock(guiMutex);
269 intrinsic.destroy(x);
272 vk::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(vk::SurfaceKHR surface)
const {
273 auto lock = std::scoped_lock(guiMutex);
274 return physicalIntrinsic.getSurfaceCapabilitiesKHR(surface);