From b9ecfef0b66253090b19c677465889dae2e6a530 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Fri, 31 Jul 2026 16:15:50 -0400 Subject: [PATCH] [Fix] (DirectVulkan): handle renderbuffer attachments in color blit clears BlitFramebuffer's color path asserted that the read framebuffer's source attachment is a texture; a renderbuffer source (packed_depth_stencil.blit color checks) aborted the process. Materialize pending clears through the renderbuffer path for both source and destination, as ReadPixels already does. --- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 8938d266..93e0c876 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -6246,11 +6246,18 @@ void main() { if (!readIsDefaultFbo) { const auto& sourceAttachment = readFbo->GetAttachment(readFbo->GetReadBuffer()); auto sourceTexture = sourceAttachment.GetTexture(); - MOBILEGL_ASSERT(sourceTexture != nullptr, "BlitFramebuffer: source texture attachment is null"); - const Bool clearReady = MaterializePendingClearForTexture(frame.commandBuffer, *sourceTexture); - MOBILEGL_ASSERT(clearReady, - "BlitFramebuffer: failed to materialize pending clear for source textureId=%d", - sourceTexture->GetExternalIndex()); + if (sourceTexture != nullptr) { + const Bool clearReady = MaterializePendingClearForTexture(frame.commandBuffer, *sourceTexture); + MOBILEGL_ASSERT(clearReady, + "BlitFramebuffer: failed to materialize pending clear for source textureId=%d", + sourceTexture->GetExternalIndex()); + } else if (sourceAttachment.IsRenderbuffer()) { + const Bool clearReady = + MaterializePendingClearForRenderbuffer(frame.commandBuffer, sourceAttachment.GetRenderbuffer()); + MOBILEGL_ASSERT(clearReady, + "BlitFramebuffer: failed to materialize pending clear for source renderbuffer %u", + sourceAttachment.GetRenderbuffer()->GetExternalIndex()); + } } if (!drawIsDefaultFbo) { @@ -6263,6 +6270,12 @@ void main() { MOBILEGL_ASSERT(dstClearReady, "BlitFramebuffer: failed to materialize pending clear for destination textureId=%d", destTexture->GetExternalIndex()); + } else if (destAttachment.IsRenderbuffer()) { + const Bool dstClearReady = + MaterializePendingClearForRenderbuffer(frame.commandBuffer, destAttachment.GetRenderbuffer()); + MOBILEGL_ASSERT(dstClearReady, + "BlitFramebuffer: failed to materialize pending clear for destination renderbuffer %u", + destAttachment.GetRenderbuffer()->GetExternalIndex()); } }