[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) {