From 5427867fffde7665500215eb7fac3be19b7bbac7 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Fri, 10 Apr 2026 20:30:58 +0200 Subject: [PATCH] descriptor heap static offset method --- examples/VulkanUI/main.cpp | 2 +- ...Crafter.Graphics-DescriptorHeapVulkan.cppm | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/examples/VulkanUI/main.cpp b/examples/VulkanUI/main.cpp index 1695cab..50163fd 100644 --- a/examples/VulkanUI/main.cpp +++ b/examples/VulkanUI/main.cpp @@ -13,7 +13,7 @@ int main() { Window window(1280, 720, "HelloVulkan"); VkCommandBuffer cmd = window.StartInit(); DescriptorHeapVulkan descriptorHeap; - descriptorHeap.Initialize(1,1,0); + descriptorHeap.Initialize(1,2,0); VkSpecializationMapEntry entry = { .constantID = 0, diff --git a/interfaces/Crafter.Graphics-DescriptorHeapVulkan.cppm b/interfaces/Crafter.Graphics-DescriptorHeapVulkan.cppm index 659f18c..18627a4 100644 --- a/interfaces/Crafter.Graphics-DescriptorHeapVulkan.cppm +++ b/interfaces/Crafter.Graphics-DescriptorHeapVulkan.cppm @@ -31,10 +31,11 @@ import :VulkanBuffer; export namespace Crafter { struct DescriptorHeapVulkan { - inline static VulkanBuffer resourceHeap[Window::numFrames]; - inline static VulkanBuffer samplerHeap[Window::numFrames]; - inline static std::uint32_t bufferStartOffset; - inline static std::uint16_t bufferStartElement; + VulkanBuffer resourceHeap[Window::numFrames]; + VulkanBuffer samplerHeap[Window::numFrames]; + std::uint32_t bufferStartOffset; + std::uint16_t bufferStartElement; + void Initialize(std::uint16_t images, std::uint16_t buffers, std::uint16_t samplers) { std::uint32_t descriptorRegion = images * Device::descriptorHeapProperties.imageDescriptorSize + buffers * Device::descriptorHeapProperties.bufferDescriptorSize; std::uint32_t alignedDescriptorRegion = (descriptorRegion + Device::descriptorHeapProperties.imageDescriptorAlignment - 1) & ~(Device::descriptorHeapProperties.imageDescriptorAlignment - 1); @@ -47,10 +48,27 @@ export namespace Crafter { } bufferStartOffset = bufferStartElement * Device::descriptorHeapProperties.bufferDescriptorSize; for(std::uint8_t i = 0; i < Window::numFrames; i++) { - resourceHeap[i].Create(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, resourceSize); - samplerHeap[i].Create(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, samplerSize); + resourceHeap[i].Resize(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, resourceSize); + samplerHeap[i].Resize(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, samplerSize); } } + inline static std::uint32_t GetBufferOffset(std::uint16_t images, std::uint16_t buffers) { + std::uint32_t bufferStartElement = images * Device::descriptorHeapProperties.imageDescriptorSize / Device::descriptorHeapProperties.bufferDescriptorSize; + + if(images > 0 && bufferStartElement == 0) { + bufferStartElement = 1; + } + return bufferStartElement * Device::descriptorHeapProperties.bufferDescriptorSize; + } + inline static std::uint16_t GetBufferOffsetElement(std::uint16_t images, std::uint16_t buffers) { + std::uint16_t bufferStartElement = images * Device::descriptorHeapProperties.imageDescriptorSize / Device::descriptorHeapProperties.bufferDescriptorSize; + + if(images > 0 && bufferStartElement == 0) { + bufferStartElement = 1; + } + + return bufferStartElement; + } }; }