From 674ef46355739f5e9ceb94d7dd97db7c7451700e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 18 Dec 2022 21:02:28 +0100 Subject: [PATCH] Vk: don't access and call conversion methods on items in empty arrays. Triggers the new OOB assertion in ArrayView element access APIs. "Technically" this was okay, since converting a BufferMemoryBarrier to VkBufferMemoryBarrier is just `return this;` (and a cast), which if `this == nullptr` returns `nullptr`. But practically this probably triggered all sorts of UB. Haha. --- src/Magnum/Vk/Pipeline.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Vk/Pipeline.cpp b/src/Magnum/Vk/Pipeline.cpp index 8e2cbee1e..5a1a80e17 100644 --- a/src/Magnum/Vk/Pipeline.cpp +++ b/src/Magnum/Vk/Pipeline.cpp @@ -428,7 +428,10 @@ CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, sizeof(BufferMemoryBarrier) == sizeof(VkBufferMemoryBarrier) && sizeof(ImageMemoryBarrier) == sizeof(VkImageMemoryBarrier), ""); - (**_device).CmdPipelineBarrier(_handle, VkPipelineStageFlags(sourceStages), VkPipelineStageFlags(destinationStages), VkDependencyFlags(dependencyFlags), memoryBarriers.size(), memoryBarriers[0], bufferMemoryBarriers.size(), bufferMemoryBarriers[0], imageMemoryBarriers.size(), imageMemoryBarriers[0]); + (**_device).CmdPipelineBarrier(_handle, VkPipelineStageFlags(sourceStages), VkPipelineStageFlags(destinationStages), VkDependencyFlags(dependencyFlags), + memoryBarriers.size(), memoryBarriers.isEmpty() ? nullptr : &*memoryBarriers.front(), + bufferMemoryBarriers.size(), bufferMemoryBarriers.isEmpty() ? nullptr : &*bufferMemoryBarriers.front(), + imageMemoryBarriers.size(), imageMemoryBarriers.isEmpty() ? nullptr : &*imageMemoryBarriers.front()); return *this; }