From a02ba9d82b94c217cfad93f6cfbf6ba131db85e4 Mon Sep 17 00:00:00 2001 From: oltolm Date: Thu, 28 May 2026 13:04:46 +0200 Subject: [PATCH] Vulkan: Skip zero-size readback buffer barriers (#1929) --- src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp | 2 ++ .../HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp index a6690a3f..003360b6 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp @@ -21,6 +21,8 @@ void LatteTextureReadback_StartTransfer(LatteTextureView* textureView) HRTick currentTick = HighResolutionTimer().now().getTick(); // create info entry and store in ordered linked list LatteTextureReadbackInfo* readbackInfo = g_renderer->texture_createReadback(textureView); + if (!readbackInfo) + return; sTextureActiveReadbackQueue.push(readbackInfo); readbackInfo->StartTransfer(); readbackInfo->transferStartTime = currentTick; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index 796b7bda..b4d99e35 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -3670,14 +3670,14 @@ void VulkanRenderer::texture_copyImageSubData(LatteTexture* src, sint32 srcMip, LatteTextureReadbackInfo* VulkanRenderer::texture_createReadback(LatteTextureView* textureView) { auto* result = new LatteTextureReadbackInfoVk(m_logicalDevice, textureView); - - LatteTextureVk* vkTex = (LatteTextureVk*)textureView->baseTexture; - - VkMemoryRequirements memRequirements; - vkGetImageMemoryRequirements(m_logicalDevice, vkTex->GetImageObj()->m_image, &memRequirements); - const uint32 linearImageSize = result->GetImageSize(); - const uint32 uploadSize = (linearImageSize == 0) ? memRequirements.size : linearImageSize; + if (linearImageSize == 0) + { + delete result; + return nullptr; + } + + const uint32 uploadSize = linearImageSize; const uint32 uploadAlignment = 256; // todo - use Vk optimalBufferCopyOffsetAlignment m_textureReadbackBufferWriteIndex = (m_textureReadbackBufferWriteIndex + uploadAlignment - 1) & ~(uploadAlignment - 1);