[plasma/kwin] src: multigpuswapchain: also add barriers for the source texture

Xaver Hugl <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 4f12faaf6e4b09039c47ee871d6fb27971aed555 by Xaver Hugl.
Committed on 19/08/2026 at 10:22.
Pushed by zamundaaa into branch 'master'.

multigpuswapchain: also add barriers for the source texture

While lacking that barrier didn't seem to cause any problems in
practice so far, they are technically required.

M  +42   -20   src/multigpuswapchain.cpp

https://invent.kde.org/plasma/kwin/-/commit/4f12faaf6e4b09039c47ee871d6fb27971aed555

diff --git a/src/multigpuswapchain.cpp b/src/multigpuswapchain.cpp
index 8b00b034f9a..3ab71e59a4b 100644
--- a/src/multigpuswapchain.cpp
+++ b/src/multigpuswapchain.cpp
@@ -446,29 +446,49 @@ std::optional<MultiGpuSwapchain::Ret> VulkanMultiGpuCopy::copy(GraphicsBuffer *b
         query = VulkanRenderTimeQuery::begin(copyVk, commandBuffer, queue->familyIndex());
     }
 
-    vk::ImageMemoryBarrier2 memoryBarrier{
-        vk::PipelineStageFlagBits2::eAllCommands,
-        vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
-        vk::PipelineStageFlagBits2::eAllCommands,
-        vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
-        vk::ImageLayout::eGeneral,
-        vk::ImageLayout::eGeneral,
-        vk::QueueFamilyExternal,
-        queue->familyIndex(),
-        m_currentSlot->texture()->handle(),
-        vk::ImageSubresourceRange{
-            vk::ImageAspectFlagBits::eColor,
-            0,
-            1,
-            0,
-            1,
+    std::array<vk::ImageMemoryBarrier2, 2> memoryBarriers = {
+        vk::ImageMemoryBarrier2{
+            vk::PipelineStageFlagBits2::eAllCommands,
+            vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
+            vk::PipelineStageFlagBits2::eAllCommands,
+            vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
+            vk::ImageLayout::eGeneral,
+            vk::ImageLayout::eGeneral,
+            vk::QueueFamilyExternal,
+            queue->familyIndex(),
+            m_currentSlot->texture()->handle(),
+            vk::ImageSubresourceRange{
+                vk::ImageAspectFlagBits::eColor,
+                0,
+                1,
+                0,
+                1,
+            },
+        },
+        vk::ImageMemoryBarrier2{
+            vk::PipelineStageFlagBits2::eAllCommands,
+            vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
+            vk::PipelineStageFlagBits2::eAllCommands,
+            vk::AccessFlagBits2::eMemoryWrite | vk::AccessFlagBits2::eMemoryRead,
+            vk::ImageLayout::eGeneral,
+            vk::ImageLayout::eGeneral,
+            vk::QueueFamilyExternal,
+            queue->familyIndex(),
+            srcTexture->handle(),
+            vk::ImageSubresourceRange{
+                vk::ImageAspectFlagBits::eColor,
+                0,
+                1,
+                0,
+                1,
+            },
         },
     };
     commandBuffer.pipelineBarrier2(vk::DependencyInfo{
         vk::DependencyFlags{},
         {},
         {},
-        memoryBarrier,
+        memoryBarriers,
     });
 
     if (useTransferQueue) {
@@ -528,13 +548,15 @@ std::optional<MultiGpuSwapchain::Ret> VulkanMultiGpuCopy::copy(GraphicsBuffer *b
                                 regions, vk::Filter::eNearest);
     }
 
-    memoryBarrier.setSrcQueueFamilyIndex(queue->familyIndex());
-    memoryBarrier.setDstQueueFamilyIndex(vk::QueueFamilyExternal);
+    for (auto &barrier : memoryBarriers) {
+        barrier.setSrcQueueFamilyIndex(queue->familyIndex());
+        barrier.setDstQueueFamilyIndex(vk::QueueFamilyExternal);
+    }
     commandBuffer.pipelineBarrier2(vk::DependencyInfo{
         vk::DependencyFlags{},
         {},
         {},
-        memoryBarrier,
+        memoryBarriers,
     });
 
     if (query) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.