diff --git a/include/Nazara/OpenGLRenderer/OpenGLShaderBinding.hpp b/include/Nazara/OpenGLRenderer/OpenGLShaderBinding.hpp index 33fb89f40..dc7d144ef 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLShaderBinding.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLShaderBinding.hpp @@ -30,7 +30,7 @@ namespace Nz inline std::size_t GetPoolIndex() const; inline const OpenGLRenderPipelineLayout& GetOwner() const; - void Update(std::initializer_list bindings) override; + void Update(const Binding* bindings, std::size_t bindingCount) override; OpenGLShaderBinding& operator=(const OpenGLShaderBinding&) = delete; OpenGLShaderBinding& operator=(OpenGLShaderBinding&&) = delete; diff --git a/include/Nazara/Renderer/ShaderBinding.hpp b/include/Nazara/Renderer/ShaderBinding.hpp index 4105974bc..53f38b128 100644 --- a/include/Nazara/Renderer/ShaderBinding.hpp +++ b/include/Nazara/Renderer/ShaderBinding.hpp @@ -34,7 +34,8 @@ namespace Nz ShaderBinding(ShaderBinding&&) = delete; virtual ~ShaderBinding(); - virtual void Update(std::initializer_list bindings) = 0; + virtual void Update(const Binding* bindings, std::size_t bindingCount) = 0; + inline void Update(std::initializer_list bindings); ShaderBinding& operator=(const ShaderBinding&) = delete; ShaderBinding& operator=(ShaderBinding&&) = delete; diff --git a/include/Nazara/Renderer/ShaderBinding.inl b/include/Nazara/Renderer/ShaderBinding.inl index 6d1f7f3d0..971be9ffd 100644 --- a/include/Nazara/Renderer/ShaderBinding.inl +++ b/include/Nazara/Renderer/ShaderBinding.inl @@ -7,6 +7,11 @@ namespace Nz { + inline void ShaderBinding::Update(std::initializer_list bindings) + { + Update(bindings.begin(), bindings.size()); + } + inline void ShaderBindingDeleter::operator()(ShaderBinding* binding) { binding->Release(); diff --git a/include/Nazara/VulkanRenderer/VulkanShaderBinding.hpp b/include/Nazara/VulkanRenderer/VulkanShaderBinding.hpp index ee97ec66f..8d38b92dd 100644 --- a/include/Nazara/VulkanRenderer/VulkanShaderBinding.hpp +++ b/include/Nazara/VulkanRenderer/VulkanShaderBinding.hpp @@ -28,7 +28,7 @@ namespace Nz inline std::size_t GetPoolIndex() const; inline const VulkanRenderPipelineLayout& GetOwner() const; - void Update(std::initializer_list bindings) override; + void Update(const Binding* bindings, std::size_t bindingCount) override; VulkanShaderBinding& operator=(const VulkanShaderBinding&) = delete; VulkanShaderBinding& operator=(VulkanShaderBinding&&) = delete; diff --git a/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp b/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp index 492331cc0..d8fd7fa44 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLShaderBinding.cpp @@ -39,12 +39,14 @@ namespace Nz } } - void OpenGLShaderBinding::Update(std::initializer_list bindings) + void OpenGLShaderBinding::Update(const Binding* bindings, std::size_t bindingCount) { const auto& layoutInfo = m_owner.GetLayoutInfo(); - for (const Binding& binding : bindings) + for (std::size_t i = 0; i < bindingCount; ++i) { + const Binding& binding = bindings[i]; + assert(binding.bindingIndex < layoutInfo.bindings.size()); const auto& bindingDesc = layoutInfo.bindings[binding.bindingIndex]; diff --git a/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp b/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp index bf86a2989..abec596e4 100644 --- a/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp +++ b/src/Nazara/VulkanRenderer/VulkanShaderBinding.cpp @@ -13,14 +13,16 @@ namespace Nz { - void VulkanShaderBinding::Update(std::initializer_list bindings) + void VulkanShaderBinding::Update(const Binding* bindings, std::size_t bindingCount) { - StackVector bufferBinding = NazaraStackVector(VkDescriptorBufferInfo, bindings.size()); - StackVector imageBinding = NazaraStackVector(VkDescriptorImageInfo, bindings.size()); - StackVector writeOps = NazaraStackVector(VkWriteDescriptorSet, bindings.size()); + StackVector bufferBinding = NazaraStackVector(VkDescriptorBufferInfo, bindingCount); + StackVector imageBinding = NazaraStackVector(VkDescriptorImageInfo, bindingCount); + StackVector writeOps = NazaraStackVector(VkWriteDescriptorSet, bindingCount); - for (const Binding& binding : bindings) + for (std::size_t i = 0; i < bindingCount; ++i) { + const Binding& binding = bindings[i]; + VkWriteDescriptorSet& writeOp = writeOps.emplace_back(); writeOp.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeOp.dstSet = m_descriptorSet;