From 3d385021a8d822070fbdecfb05789172cb1deba0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 12 Jun 2026 18:59:21 +0100 Subject: [PATCH 01/11] Initial mapping of vertex array to descriptors --- .../vsg/utils/GraphicsPipelineConfigurator.h | 1 + .../utils/GraphicsPipelineConfigurator.cpp | 44 +++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/include/vsg/utils/GraphicsPipelineConfigurator.h b/include/vsg/utils/GraphicsPipelineConfigurator.h index cde9b24f55..312bc2bb0c 100644 --- a/include/vsg/utils/GraphicsPipelineConfigurator.h +++ b/include/vsg/utils/GraphicsPipelineConfigurator.h @@ -132,6 +132,7 @@ namespace vsg ref_ptr shaderHints; ref_ptr descriptorConfigurator; StateCommands inheritedState; + std::map vertexInputRates; int compare(const Object& rhs) const override; diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index 0a5a698272..a8c9188fa6 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -427,6 +427,9 @@ void GraphicsPipelineConfigurator::reset() shaderHints->defines.clear(); if (descriptorConfigurator) descriptorConfigurator->reset(); + vertexInputRates.clear(); + + _assignShaderSetSettings(); } @@ -456,8 +459,7 @@ struct SetPipelineStates : public Visitor bool GraphicsPipelineConfigurator::enableArray(const std::string& name, VkVertexInputRate vertexInputRate, uint32_t stride, VkFormat format) { - auto& attributeBinding = shaderSet->getAttributeBinding(name); - if (attributeBinding) + if (auto& attributeBinding = shaderSet->getAttributeBinding(name)) { if (!attributeBinding.define.empty()) shaderHints->defines.insert(attributeBinding.define); @@ -465,6 +467,13 @@ bool GraphicsPipelineConfigurator::enableArray(const std::string& name, VkVertex accept(setVertexAttributeState); return true; } + + if (const auto& descriptorBinding = shaderSet->getDescriptorBinding(name)) + { + enableDescriptor(name); + vertexInputRates[descriptorBinding.binding] = vertexInputRate; + } + return false; } @@ -482,8 +491,7 @@ bool GraphicsPipelineConfigurator::enableDescriptor(const std::string& name) bool GraphicsPipelineConfigurator::assignArray(DataList& arrays, const std::string& name, VkVertexInputRate vertexInputRate, ref_ptr array) { - const auto& attributeBinding = shaderSet->getAttributeBinding(name); - if (attributeBinding) + if (const auto& attributeBinding = shaderSet->getAttributeBinding(name)) { if (!attributeBinding.define.empty()) shaderHints->defines.insert(attributeBinding.define); @@ -495,6 +503,14 @@ bool GraphicsPipelineConfigurator::assignArray(DataList& arrays, const std::stri arrays.push_back(array); return true; } + + + if (const auto& descriptorBinding = shaderSet->getDescriptorBinding(name)) + { + assignDescriptor(name, array, 0); + vertexInputRates[descriptorBinding.binding] = vertexInputRate; + } + return false; } @@ -740,6 +756,25 @@ void GraphicsPipelineConfigurator::_assignInheritedSets() void GraphicsPipelineConfigurator::init() { + if (!vertexInputRates.empty()) + { + vsg::info("vertexInputRates max entry: ", vertexInputRates.rbegin()->first); + for(auto [binding, rate] : vertexInputRates) + { + vsg::info(" { ", binding, ", ", rate, " }"); + } + + if (const auto& descriptorBinding = shaderSet->getDescriptorBinding("vertexInputRates")) + { + vsg::info(" we have descriptor to assign vertexInputRates to { ", descriptorBinding.set, ", ", descriptorBinding.binding, " }"); + } + else + { + vsg::warn("Missing DescriptorBinding for vertexInputRates."); + + } + } + _assignInheritedSets(); if (descriptorConfigurator) @@ -749,6 +784,7 @@ void GraphicsPipelineConfigurator::init() shaderHints->defines.insert(descriptorConfigurator->defines.begin(), descriptorConfigurator->defines.end()); } + layout = shaderSet->createPipelineLayout(shaderHints->defines); graphicsPipeline = GraphicsPipeline::create(layout, shaderSet->getShaderStages(shaderHints), pipelineStates, subpass); bindGraphicsPipeline = vsg::BindGraphicsPipeline::create(graphicsPipeline); From bc0cd9eb410fe6935396c92af14b29e86e283c31 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 12 Jun 2026 19:05:39 +0100 Subject: [PATCH 02/11] Added setup of vertex index rates --- src/vsg/utils/GraphicsPipelineConfigurator.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index a8c9188fa6..2974f0d041 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -758,19 +758,19 @@ void GraphicsPipelineConfigurator::init() { if (!vertexInputRates.empty()) { - vsg::info("vertexInputRates max entry: ", vertexInputRates.rbegin()->first); - for(auto [binding, rate] : vertexInputRates) - { - vsg::info(" { ", binding, ", ", rate, " }"); - } - if (const auto& descriptorBinding = shaderSet->getDescriptorBinding("vertexInputRates")) { - vsg::info(" we have descriptor to assign vertexInputRates to { ", descriptorBinding.set, ", ", descriptorBinding.binding, " }"); + auto vir = vsg::uintArray::create(vertexInputRates.rbegin()->first+1, 0); + for(auto [binding, rate] : vertexInputRates) + { + vir->set(binding, rate); + } + + assignDescriptor(descriptorBinding.name, vir, 0); } else { - vsg::warn("Missing DescriptorBinding for vertexInputRates."); + vsg::warn("GraphicsPipelineConfigurator::init() - missing DescriptorBinding for vertexInputRates."); } } From 85465141f30a61445f1f6753c6b700040d39ade4 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 24 Jun 2026 17:05:00 +0100 Subject: [PATCH 03/11] Added ShaderSet::geometryHints mask to help prompt scene graph builders to generate particular types of geometry/meshshaders --- CMakeLists.txt | 2 +- include/vsg/utils/ShaderSet.h | 13 +++++++++++++ src/vsg/utils/ShaderSet.cpp | 13 ++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02a3e047f0..78dd44c854 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.10) project(vsg - VERSION 1.1.15 + VERSION 1.1.16 DESCRIPTION "VulkanSceneGraph library" LANGUAGES CXX ) diff --git a/include/vsg/utils/ShaderSet.h b/include/vsg/utils/ShaderSet.h index fe4c74f0ed..87a6762c8c 100644 --- a/include/vsg/utils/ShaderSet.h +++ b/include/vsg/utils/ShaderSet.h @@ -128,6 +128,19 @@ namespace vsg GraphicsPipelineStates defaultGraphicsPipelineStates; std::vector> customDescriptorSetBindings; + /// Hints mask for scene graph builders for what ShaderSet prefers/requires. + enum GeometryHints : uint32_t + { + NO_PREFERENCE = 0, + GEOMETRY = 1 << 0, + VERTEXDRAW = 1 << 1, + VERTEXINDEXDRAW = 1 << 2, + DRAWMESHTASKS = 1 << 3, + MESHLETS = 1 << 4 + }; + + uint32_t geometryHints = GeometryHints::NO_PREFERENCE; + ref_ptr defaultShaderHints; /// variants of the rootShaderModule compiled for different combinations of ShaderCompileSettings std::map, ShaderStages, DereferenceLess> variants; diff --git a/src/vsg/utils/ShaderSet.cpp b/src/vsg/utils/ShaderSet.cpp index 1313b6d5b0..9143dd0e79 100644 --- a/src/vsg/utils/ShaderSet.cpp +++ b/src/vsg/utils/ShaderSet.cpp @@ -294,7 +294,8 @@ int ShaderSet::compare(const Object& rhs_object) const if ((result = compare_container(pushConstantRanges, rhs.pushConstantRanges))) return result; if ((result = compare_container(definesArrayStates, rhs.definesArrayStates))) return result; if ((result = compare_container(optionalDefines, rhs.optionalDefines))) return result; - return compare_pointer_container(defaultGraphicsPipelineStates, rhs.defaultGraphicsPipelineStates); + if ((result = compare_pointer_container(defaultGraphicsPipelineStates, rhs.defaultGraphicsPipelineStates))) return result; + return compare_value(geometryHints, rhs.geometryHints); } void ShaderSet::read(Input& input) @@ -377,6 +378,11 @@ void ShaderSet::read(Input& input) } } } + + if (input.version_greater_equal(1, 1, 16)) + { + input.readValue("geometryHints", geometryHints); + } } void ShaderSet::write(Output& output) const @@ -450,6 +456,11 @@ void ShaderSet::write(Output& output) const output.writeObject("customDescriptorSetBinding", custom); } } + + if (output.version_greater_equal(1, 1, 16)) + { + output.writeValue("geometryHints", geometryHints); + } } ref_ptr vsg::createFlatShadedShaderSet(ref_ptr options) From eaf9b3c15905628c23dfc25b2bfd8aa3fc087383 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 25 Jun 2026 18:26:31 +0100 Subject: [PATCH 04/11] Added clone to DescriptorConfigurator and ArrayConfigurator. Simplified ShaderSet::GeometryHints enum --- .../vsg/utils/GraphicsPipelineConfigurator.h | 6 +++++ include/vsg/utils/ShaderSet.h | 4 ++-- .../utils/GraphicsPipelineConfigurator.cpp | 23 +++++++++++++++++++ src/vsg/utils/ShaderSet.cpp | 4 ++-- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/include/vsg/utils/GraphicsPipelineConfigurator.h b/include/vsg/utils/GraphicsPipelineConfigurator.h index 312bc2bb0c..f4d1e0b7c0 100644 --- a/include/vsg/utils/GraphicsPipelineConfigurator.h +++ b/include/vsg/utils/GraphicsPipelineConfigurator.h @@ -37,6 +37,9 @@ namespace vsg { public: explicit DescriptorConfigurator(ref_ptr in_shaderSet = {}); + explicit DescriptorConfigurator(const DescriptorConfigurator& rhs, const CopyOp& copyop = {}); + + ref_ptr clone(const CopyOp& copyop = {}) const override { return DescriptorConfigurator::create(*this, copyop); } ref_ptr shaderSet; bool blending = false; @@ -76,6 +79,9 @@ namespace vsg { public: explicit ArrayConfigurator(ref_ptr in_shaderSet = {}); + explicit ArrayConfigurator(const ArrayConfigurator& rhs, const CopyOp& copyop = {}); + + ref_ptr clone(const CopyOp& copyop = {}) const override { return ArrayConfigurator::create(*this, copyop); } ref_ptr shaderSet; diff --git a/include/vsg/utils/ShaderSet.h b/include/vsg/utils/ShaderSet.h index 87a6762c8c..7bf1094aea 100644 --- a/include/vsg/utils/ShaderSet.h +++ b/include/vsg/utils/ShaderSet.h @@ -129,7 +129,7 @@ namespace vsg std::vector> customDescriptorSetBindings; /// Hints mask for scene graph builders for what ShaderSet prefers/requires. - enum GeometryHints : uint32_t + enum GeometryHints { NO_PREFERENCE = 0, GEOMETRY = 1 << 0, @@ -139,7 +139,7 @@ namespace vsg MESHLETS = 1 << 4 }; - uint32_t geometryHints = GeometryHints::NO_PREFERENCE; + int geometryHints = GeometryHints::NO_PREFERENCE; ref_ptr defaultShaderHints; /// variants of the rootShaderModule compiled for different combinations of ShaderCompileSettings diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index 2974f0d041..3412887454 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -94,6 +94,17 @@ DescriptorConfigurator::DescriptorConfigurator(ref_ptr in_shaderSet) { } +DescriptorConfigurator::DescriptorConfigurator(const DescriptorConfigurator& rhs, const CopyOp& copyop) : + Inherit(rhs, copyop), + shaderSet(rhs.shaderSet), + blending(rhs.blending), + two_sided(rhs.two_sided), + assigned(rhs.assigned), + defines(rhs.defines), + descriptorSets(rhs.descriptorSets) +{ +} + int DescriptorConfigurator::compare(const Object& rhs_object) const { int result = Object::compare(rhs_object); @@ -339,6 +350,18 @@ ArrayConfigurator::ArrayConfigurator(ref_ptr in_shaderSet) : { } +ArrayConfigurator::ArrayConfigurator(const ArrayConfigurator& rhs, const CopyOp& copyop) : + Inherit(rhs, copyop), + shaderSet(rhs.shaderSet), + baseAttributeBinding(rhs.baseAttributeBinding), + assigned(rhs.assigned), + defines(rhs.defines), + vertexBindingDescriptions(rhs.vertexBindingDescriptions), + vertexAttributeDescriptions(rhs.vertexAttributeDescriptions), + arrays(rhs.arrays) +{ +} + int ArrayConfigurator::compare(const Object& rhs_object) const { int result = Object::compare(rhs_object); diff --git a/src/vsg/utils/ShaderSet.cpp b/src/vsg/utils/ShaderSet.cpp index 9143dd0e79..340a5cb8eb 100644 --- a/src/vsg/utils/ShaderSet.cpp +++ b/src/vsg/utils/ShaderSet.cpp @@ -381,7 +381,7 @@ void ShaderSet::read(Input& input) if (input.version_greater_equal(1, 1, 16)) { - input.readValue("geometryHints", geometryHints); + input.readValue("geometryHints", geometryHints); } } @@ -459,7 +459,7 @@ void ShaderSet::write(Output& output) const if (output.version_greater_equal(1, 1, 16)) { - output.writeValue("geometryHints", geometryHints); + output.writeValue("geometryHints", geometryHints); } } From 3a5b23efaf0c682274594a6f8ffe69501f1355a7 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 30 Jun 2026 12:01:52 +0100 Subject: [PATCH 05/11] Added check for repeated assignment of the same descriptors --- src/vsg/utils/GraphicsPipelineConfigurator.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index 3412887454..2ba818d943 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -274,6 +274,14 @@ bool DescriptorConfigurator::assignDescriptor(uint32_t set, uint32_t binding, Vk ds->setLayout = DescriptorSetLayout::create(); } + for(const auto& layout_binding : ds->setLayout->bindings) + { + if (layout_binding.binding == binding) + { + return false; + } + } + ds->descriptors.push_back(descriptor); auto& descriptorBindings = ds->setLayout->bindings; From 3026364058840b70d44bc1d8817bb82767bb8884 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 5 Jul 2026 12:37:20 +0100 Subject: [PATCH 06/11] Added .h to supported GLSL extensions --- src/vsg/io/glsl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vsg/io/glsl.cpp b/src/vsg/io/glsl.cpp index c9fa895624..3b6398719e 100644 --- a/src/vsg/io/glsl.cpp +++ b/src/vsg/io/glsl.cpp @@ -34,7 +34,8 @@ namespace {".rmiss", VK_SHADER_STAGE_MISS_BIT_KHR}, {".rcall", VK_SHADER_STAGE_CALLABLE_BIT_KHR}, {".glsl", VK_SHADER_STAGE_ALL}, - {".hlsl", VK_SHADER_STAGE_ALL}}; + {".hlsl", VK_SHADER_STAGE_ALL}, + {".h", VK_SHADER_STAGE_ALL}}; } // namespace glsl::glsl() From 992ace82205de590b8aeb8b795af53dabe928330 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 13 Jul 2026 18:45:27 +0100 Subject: [PATCH 07/11] Added support for combinging adjacent vsg::BindDescriptorSet into a single vsg::BindDescriptorSets --- .../utils/GraphicsPipelineConfigurator.cpp | 116 +++++++++++++++--- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index 2ba818d943..a76f969fd3 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -852,45 +852,123 @@ bool GraphicsPipelineConfigurator::copyTo(StateCommands& stateCommands, ref_ptr< if (descriptorConfigurator) { - for (size_t set = 0; set < descriptorConfigurator->descriptorSets.size(); ++set) + struct DisableInheritedState : public Visitor { - if (auto ds = descriptorConfigurator->descriptorSets[set]) + DescriptorSets descritorSets; + + DisableInheritedState(DescriptorConfigurator& dc) : + descritorSets(dc.descriptorSets.size()) { - auto bindDescriptorSet = BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, static_cast(set), ds); + for (size_t set = 0; set < dc.descriptorSets.size(); ++set) + { + descritorSets[set] = dc.descriptorSets[set]; + } + } - bool dsUnique = true; - for (const auto& sc : inheritedState) + void apply(BindViewDescriptorSets& bvds) override + { + if (bvds.firstSet < static_cast(descritorSets.size())) { - if (compare_pointer(sc, bindDescriptorSet) == 0) dsUnique = false; + descritorSets[bvds.firstSet].reset(); } + } - if (dsUnique) + void apply(BindDescriptorSet& bds) override + { + if (bds.firstSet < static_cast(descritorSets.size())) { - if (sharedObjects) + descritorSets[bds.firstSet].reset(); + } + } + + void apply(BindDescriptorSets& bds) override + { + if (bds.firstSet < static_cast(descritorSets.size())) + { + uint32_t end_set = bds.firstSet + static_cast(bds.descriptorSets.size()); + for(uint32_t set = bds.firstSet; set < end_set; ++set) { - for (auto& descriptor : ds->descriptors) + descritorSets[set].reset(); + } + } + } + } active(*descriptorConfigurator); + + for (const auto& sc : inheritedState) + { + sc->accept(active); + } + + if (sharedObjects) + { + for(auto& ds : active.descritorSets) + { + if (ds) + { + for (auto& descriptor : ds->descriptors) + { + if (auto descriptor_image = descriptor.cast()) { - if (auto descriptor_image = descriptor.cast()) + for (auto& image_info : descriptor_image->imageInfoList) { - for (auto& image_info : descriptor_image->imageInfoList) + if (image_info->imageView && image_info->imageView->image) { - if (image_info->imageView && image_info->imageView->image) - { - sharedObjects->share(image_info->imageView->image); - } + sharedObjects->share(image_info->imageView->image); } } - sharedObjects->share(descriptor); } - sharedObjects->share(ds->setLayout); - sharedObjects->share(ds); + sharedObjects->share(descriptor); + } + sharedObjects->share(ds->setLayout); + sharedObjects->share(ds); + } + } + } + + for(uint32_t set = 0; set < active.descritorSets.size();) + { + if (active.descritorSets[set]) + { + uint32_t last = set+1; + for(; (last < active.descritorSets.size()) && active.descritorSets[last]; ++last) {} + + if ((last-set) == 1) + { + auto bindDescriptorSet = BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, static_cast(set), active.descritorSets[set]); + + if (sharedObjects) + { sharedObjects->share(bindDescriptorSet); } stateCommands.push_back(bindDescriptorSet); stateAssigned = true; } - } + else + { + DescriptorSets descriptorSets; + for(auto si = set; si(set), descriptorSets); + + if (sharedObjects) + { + sharedObjects->share(bindDescriptorSets); + } + + stateCommands.push_back(bindDescriptorSets); + stateAssigned = true; + } + + set = last; + } + else + { + ++set; + } } } From f70c68d3a478d4afdcd8489c69e7790960ae3893 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 13 Jul 2026 18:52:24 +0100 Subject: [PATCH 08/11] Added int64/uint64 variants --- include/vsg/core/Array.h | 2 ++ include/vsg/core/Value.h | 10 ++++++++-- src/vsg/io/ObjectFactory.cpp | 8 ++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/vsg/core/Array.h b/include/vsg/core/Array.h index ec70eb4280..2c8fe6fc0b 100644 --- a/include/vsg/core/Array.h +++ b/include/vsg/core/Array.h @@ -392,6 +392,8 @@ namespace vsg VSG_array(ushortArray, uint16_t); VSG_array(intArray, int32_t); VSG_array(uintArray, uint32_t); + VSG_array(int64Array, int64_t); + VSG_array(uint64Array, uint64_t); VSG_array(floatArray, float); VSG_array(doubleArray, double); diff --git a/include/vsg/core/Value.h b/include/vsg/core/Value.h index a5c02bd704..e5a5df9c54 100644 --- a/include/vsg/core/Value.h +++ b/include/vsg/core/Value.h @@ -208,8 +208,14 @@ namespace vsg VSG_value(pathValue, vsg::Path); VSG_value(boolValue, bool); - VSG_value(intValue, int); - VSG_value(uintValue, unsigned int); + VSG_value(byteValue, int8_t); + VSG_value(ubyteValue, uint8_t); + VSG_value(shortValue, int16_t); + VSG_value(ushortValue, uint16_t); + VSG_value(intValue, int32_t); + VSG_value(uintValue, uint32_t); + VSG_value(int64Value, int64_t); + VSG_value(uint64Value, uint64_t); VSG_value(floatValue, float); VSG_value(doubleValue, double); diff --git a/src/vsg/io/ObjectFactory.cpp b/src/vsg/io/ObjectFactory.cpp index 0f261bbf06..f8842b844d 100644 --- a/src/vsg/io/ObjectFactory.cpp +++ b/src/vsg/io/ObjectFactory.cpp @@ -36,8 +36,14 @@ ObjectFactory::ObjectFactory() add(); add(); add(); + add(); + add(); + add(); + add(); add(); add(); + add(); + add(); add(); add(); add(); @@ -75,6 +81,8 @@ ObjectFactory::ObjectFactory() add(); add(); add(); + add(); + add(); add(); add(); add(); From 7affe4cbbd2b2d47b1f1a351209b3a53df5ce663 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 15 Jul 2026 10:41:54 +0100 Subject: [PATCH 09/11] Added call to Context::reserve() to preallocate memory resources on GPU --- include/vsg/app/CompileManager.h | 2 +- src/vsg/app/CompileManager.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/vsg/app/CompileManager.h b/include/vsg/app/CompileManager.h index fefdd3e25e..e6f6352802 100644 --- a/include/vsg/app/CompileManager.h +++ b/include/vsg/app/CompileManager.h @@ -82,7 +82,7 @@ namespace vsg CompileResult compile(ref_ptr object, ContextSelectionFunction contextSelection = {}); /// compile all the command graphs in a task - CompileResult compileTask(ref_ptr task, const ResourceRequirements& resourceRequirements = {}); + CompileResult compileTask(ref_ptr task, ResourceRequirements& resourceRequirements); /// mechanism for releasing and reusing used resources ref_ptr resourceScavenger; diff --git a/src/vsg/app/CompileManager.cpp b/src/vsg/app/CompileManager.cpp index 0db9a10a58..55a1c53c64 100644 --- a/src/vsg/app/CompileManager.cpp +++ b/src/vsg/app/CompileManager.cpp @@ -350,7 +350,7 @@ CompileResult CompileManager::compile(ref_ptr object, ContextSelectionFu return result; } -CompileResult CompileManager::compileTask(ref_ptr task, const ResourceRequirements& resourceRequirements) +CompileResult CompileManager::compileTask(ref_ptr task, ResourceRequirements& resourceRequirements) { CompileResult result; @@ -360,6 +360,7 @@ CompileResult CompileManager::compileTask(ref_ptr task, con try { auto compileTraversal = CompileTraversal::create(task->device, resourceRequirements); + auto deviceMemoryBufferPools = task->device->deviceMemoryBufferPools.ref_ptr(); for (const auto& context : compileTraversal->contexts) { @@ -369,6 +370,14 @@ CompileResult CompileManager::compileTask(ref_ptr task, con } } + if (deviceMemoryBufferPools && deviceMemoryBufferPools->compileTraversalUseReserve) + { + for (auto& context : compileTraversal->contexts) + { + context->reserve(resourceRequirements); + } + } + for (auto& cg : task->commandGraphs) { cg->accept(*compileTraversal); From 4ccb2c0935bc5516e9f4d61716e5dd4cccda1612 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 15 Jul 2026 11:36:01 +0100 Subject: [PATCH 10/11] Removed stray line --- src/vsg/utils/GraphicsPipelineConfigurator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index a76f969fd3..20201257c9 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -815,7 +815,6 @@ void GraphicsPipelineConfigurator::init() shaderHints->defines.insert(descriptorConfigurator->defines.begin(), descriptorConfigurator->defines.end()); } - layout = shaderSet->createPipelineLayout(shaderHints->defines); graphicsPipeline = GraphicsPipeline::create(layout, shaderSet->getShaderStages(shaderHints), pipelineStates, subpass); bindGraphicsPipeline = vsg::BindGraphicsPipeline::create(graphicsPipeline); From 3ad7df9a15932b2d65041d1d01f38efea144d846 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 15 Jul 2026 11:38:12 +0100 Subject: [PATCH 11/11] Removed stray line --- src/vsg/utils/GraphicsPipelineConfigurator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vsg/utils/GraphicsPipelineConfigurator.cpp b/src/vsg/utils/GraphicsPipelineConfigurator.cpp index 20201257c9..8094d056d5 100644 --- a/src/vsg/utils/GraphicsPipelineConfigurator.cpp +++ b/src/vsg/utils/GraphicsPipelineConfigurator.cpp @@ -535,7 +535,6 @@ bool GraphicsPipelineConfigurator::assignArray(DataList& arrays, const std::stri return true; } - if (const auto& descriptorBinding = shaderSet->getDescriptorBinding(name)) { assignDescriptor(name, array, 0);