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(),