From 8c2f95e3e7b59a8df6d7a640a738635cb8506fa9 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:52 -0600 Subject: [PATCH] nvk: Color attachments clears via image clears This is a bit of a hack but it's good enough for now. Part-of: --- src/nouveau/vulkan/nvk_cmd_draw.c | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index aabda82afa3..7f6a23e0aa3 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -307,7 +307,37 @@ nvk_CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t rectCount, const VkClearRect *pRects) { - unreachable("TODO: Attachment clears"); + VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + struct nvk_rendering_state *render = &cmd->state.gfx.render; + + for (unsigned i = 0; i < attachmentCount; i++) { + assert(pAttachments[i].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT); + if (pAttachments[i].colorAttachment == VK_ATTACHMENT_UNUSED) + return; + + struct nvk_image_view *iview = + render->color_att[pAttachments[i].colorAttachment].iview; + for (unsigned r = 0; r < rectCount; r++) { + assert(pRects[r].rect.offset.x == 0); + assert(pRects[r].rect.offset.y == 0); + assert(pRects[r].rect.extent.width == iview->vk.extent.width); + assert(pRects[r].rect.extent.height == iview->vk.extent.height); + + const VkImageSubresourceRange subres = { + .aspectMask = pAttachments[i].aspectMask, + .baseMipLevel = iview->vk.base_mip_level, + .levelCount = 1, + .baseArrayLayer = iview->vk.base_array_layer + + pRects[r].baseArrayLayer, + .layerCount = pRects[r].layerCount, + }; + nvk_CmdClearColorImage(commandBuffer, + vk_image_to_handle(iview->vk.image), + VK_IMAGE_LAYOUT_GENERAL, + &pAttachments[i].clearValue.color, + 1, &subres); + } + } } static void