From f7fddf05f1a7d56eafcd82e2a3fb0a484fcb61de Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Wed, 1 Jul 2026 00:57:34 +0200 Subject: [PATCH] Updated DLSSG Vk barrier fixup Not fully tested --- OptiScaler/hooks/VulkanwDx12_Hooks.cpp | 30 +++++++++++++++----------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/OptiScaler/hooks/VulkanwDx12_Hooks.cpp b/OptiScaler/hooks/VulkanwDx12_Hooks.cpp index b2f48d3c..92da2609 100644 --- a/OptiScaler/hooks/VulkanwDx12_Hooks.cpp +++ b/OptiScaler/hooks/VulkanwDx12_Hooks.cpp @@ -1058,24 +1058,28 @@ void Vulkan_wDx12::hk_vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipe // AMD drivers on the cards around RDNA2 didn't treat VK_IMAGE_LAYOUT_UNDEFINED in the same way Nvidia does. // Doesn't seem like a bug, just a different way of handling an UB but we need to adjust. - // DLSSG Present - if (imageMemoryBarrierCount == 2) + for (size_t i = 0; i < imageMemoryBarrierCount; i++) { - if (pImageMemoryBarriers[0].oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && - pImageMemoryBarriers[0].newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && - pImageMemoryBarriers[1].oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && - pImageMemoryBarriers[1].newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) + if (pImageMemoryBarriers[i].oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && + pImageMemoryBarriers[i].newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) { - LOG_TRACE("Changing an UNDEFINED barrier in DLSSG Present"); + LOG_TRACE("Changing an UNDEFINED barrier in DLSSG Present, imageMemoryBarrierCount: {}", + imageMemoryBarrierCount); - VkImageMemoryBarrier newImageBarriers[2]; - std::memcpy(newImageBarriers, pImageMemoryBarriers, sizeof(newImageBarriers)); + VkImageMemoryBarrier* newImageBarriers = new VkImageMemoryBarrier[imageMemoryBarrierCount]; - newImageBarriers[1].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + std::memcpy(newImageBarriers, pImageMemoryBarriers, + sizeof(*newImageBarriers) * imageMemoryBarrierCount); - return o_vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, - memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, - pBufferMemoryBarriers, imageMemoryBarrierCount, newImageBarriers); + newImageBarriers[i].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + + o_vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, + pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, + imageMemoryBarrierCount, newImageBarriers); + + delete[] newImageBarriers; + + return; } }