From efc429120382aa8280cb0376c643d117ab22b948 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 6 Feb 2026 09:15:45 +0000 Subject: [PATCH 1/2] Added MemoryBufferPools::compileTraversalUseReserve bool hint to control whether the compile traversal should call MemoryBufferPools::reserve(requirements) --- include/vsg/vk/MemoryBufferPools.h | 3 +++ src/vsg/vk/Context.cpp | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/vsg/vk/MemoryBufferPools.h b/include/vsg/vk/MemoryBufferPools.h index 320cf631b..765b2315a 100644 --- a/include/vsg/vk/MemoryBufferPools.h +++ b/include/vsg/vk/MemoryBufferPools.h @@ -42,6 +42,9 @@ namespace vsg /// throw vsg::Exception when reserveMemory() fails to allocated memory on device. bool throwOutOfDeviceMemoryException = true; + /// hint whether the compile traversal should call MemoryBufferPools::reserve(requirements); + bool compileTraversalUseReserve = true; + VkDeviceSize computeMemoryTotalAvailable() const; VkDeviceSize computeMemoryTotalReserved() const; VkDeviceSize computeBufferTotalAvailable() const; diff --git a/src/vsg/vk/Context.cpp b/src/vsg/vk/Context.cpp index cfee9f707..dc4d9b8b6 100644 --- a/src/vsg/vk/Context.cpp +++ b/src/vsg/vk/Context.cpp @@ -197,7 +197,9 @@ VkResult Context::reserve(ResourceRequirements& requirements) { CPU_INSTRUMENTATION_L2_NC(instrumentation, "Context reserve", COLOR_COMPILE) - VkResult result = deviceMemoryBufferPools->reserve(requirements); + VkResult result = VK_SUCCESS; + + if (deviceMemoryBufferPools->compileTraversalUseReserve) result = deviceMemoryBufferPools->reserve(requirements); resourceRequirements.maxSlots.merge(requirements.maxSlots); From d48ae5f1a5ccf10de6468cc5ec421dd500eddb30 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 6 Feb 2026 10:40:28 +0000 Subject: [PATCH 2/2] Added debug messages to check alignment --- src/vsg/state/BufferInfo.cpp | 7 +++++-- src/vsg/state/DescriptorBuffer.cpp | 2 ++ src/vsg/vk/MemoryBufferPools.cpp | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vsg/state/BufferInfo.cpp b/src/vsg/state/BufferInfo.cpp index a95a420a0..b1ab68987 100644 --- a/src/vsg/state/BufferInfo.cpp +++ b/src/vsg/state/BufferInfo.cpp @@ -185,8 +185,6 @@ ref_ptr vsg::copyDataToStagingBuffer(Context& context, const Data* d // bool vsg::createBufferAndTransferData(Context& context, const BufferInfoList& bufferInfoList, VkBufferUsageFlags usage, VkSharingMode sharingMode) { - debug("vsg::createBufferAndTransferData(.., )"); - if (bufferInfoList.empty()) return false; Device* device = context.device; @@ -198,6 +196,9 @@ bool vsg::createBufferAndTransferData(Context& context, const BufferInfoList& bu else if (usage == VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) alignment = device->getPhysicalDevice()->getProperties().limits.minStorageBufferOffsetAlignment; + + debug("vsg::createBufferAndTransferData(Context& context, const BufferInfoList& bufferInfoList, VkBufferUsageFlags usage, VkSharingMode sharingMode) usage = ", usage, ", alignment = ", alignment); + //transferTask = nullptr; ref_ptr deviceBufferInfo; @@ -377,6 +378,8 @@ BufferInfoList vsg::createHostVisibleBuffer(Device* device, const DataList& data else if (usage == VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) alignment = device->getPhysicalDevice()->getProperties().limits.minStorageBufferOffsetAlignment; + debug("vsg::createHostVisibleBuffer(Device* device, const DataList& dataList, VkBufferUsageFlags usage, VkSharingMode sharingMode) usage = ", usage, ", alignment = ", alignment); + VkDeviceSize totalSize = 0; VkDeviceSize offset = 0; bufferInfoList.reserve(dataList.size()); diff --git a/src/vsg/state/DescriptorBuffer.cpp b/src/vsg/state/DescriptorBuffer.cpp index 6fa9defed..3d3ad666e 100644 --- a/src/vsg/state/DescriptorBuffer.cpp +++ b/src/vsg/state/DescriptorBuffer.cpp @@ -140,6 +140,8 @@ void DescriptorBuffer::compile(Context& context) VkDeviceSize totalSize = 0; + debug("DescriptorBuffer::compile() bufferUsageFlags = ",bufferUsageFlags, ", alignment = ", alignment); + // compute the total size of BufferInfo that needs to be allocated. { VkDeviceSize offset = 0; diff --git a/src/vsg/vk/MemoryBufferPools.cpp b/src/vsg/vk/MemoryBufferPools.cpp index 10fe7150b..c831da247 100644 --- a/src/vsg/vk/MemoryBufferPools.cpp +++ b/src/vsg/vk/MemoryBufferPools.cpp @@ -265,6 +265,8 @@ VkResult MemoryBufferPools::reserve(ResourceRequirements& requirements) else if ((properties.usageFlags & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0) alignment = limits.minStorageBufferOffsetAlignment; + debug("MemoryBufferPools::reserve(ResourceRequirements& requirements) properties.usageFlags = ", properties.usageFlags, ", alignment = ", alignment); + auto newBufferInfo = reserveBuffer(bufferInfo->data->dataSize(), alignment, properties.usageFlags, properties.sharingMode, memoryPropertiesFlags); if (newBufferInfo) {