From 37ef2cb600af2c7534f15466e501dbf487c4351c Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 16 Jul 2026 19:13:25 -0400 Subject: [PATCH] [Fix] (MG_Backend/DirectVulkan): materialize mid-pass pending color clears at the subpass color slot index, not the compacted description index --- .../MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp | 1 + .../MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h | 5 +++++ MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp index 143e2412..9a6ca4ce 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp @@ -718,6 +718,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { if (hasClear) { pendingClearAttachments.emplace_back(PendingClearAttachmentInfo { .attachmentIndex = attachmentIndex, + .colorAttachmentSlot = i, .key = VkClearManager::MakePendingClearKey(att) }); } diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h index 7364dc46..7fe370a6 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.h @@ -27,7 +27,12 @@ namespace MobileGL::MG_Backend::DirectVulkan { }; struct PendingClearAttachmentInfo { + // Index into the render pass attachment descriptions (VkRenderPassBeginInfo::pClearValues space). Uint32 attachmentIndex = 0; + // Index into the subpass pColorAttachments (VkClearAttachment::colorAttachment space) — the GL + // draw-buffer slot. Differs from attachmentIndex when earlier slots are GL_NONE/incomplete. + // Only meaningful for color clears. + Uint32 colorAttachmentSlot = 0; PendingClearKey key{}; MG_State::GLState::RenderbufferObject* renderbuffer = nullptr; Bool hasInlinePayload = false; diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index a10f7fd6..973cfdc7 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -6908,7 +6908,9 @@ void main() { clearAttachment.clearValue.depthStencil = {1.0f, 0}; if ((clearPayload.mask & GL_COLOR_BUFFER_BIT) != 0) { clearAttachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - clearAttachment.colorAttachment = pending.attachmentIndex; + // VkClearAttachment::colorAttachment indexes the subpass pColorAttachments (draw-buffer + // slot space, with UNUSED holes), not the compacted attachment descriptions. + clearAttachment.colorAttachment = pending.colorAttachmentSlot; clearAttachment.clearValue.color = { clearPayload.color.x(), clearPayload.color.y(),