anv/meta_clear: Call emit_clear directly in ClearImage
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 19 Jan 2016 23:52:03 +0000 (15:52 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 20 Jan 2016 00:53:35 +0000 (16:53 -0800)
Using the load op means that we end up with recursive meta.  We shouldn't
be doing that.

src/vulkan/anv_meta_clear.c

index b5e257b160280527642914393a738ff74a353400..1bc470fb5de617f8632a6b050aa8ab60a1d000dd 100644 (file)
@@ -888,18 +888,9 @@ anv_cmd_clear_image(struct anv_cmd_buffer *cmd_buffer,
             };
 
             if (range->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
-               att_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
-
                subpass_desc.colorAttachmentCount = 1;
                subpass_desc.pColorAttachments = &att_ref;
             } else {
-               if (range->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
-                  att_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
-               }
-               if (range->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
-                  att_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
-               }
-
                subpass_desc.pDepthStencilAttachment = &att_ref;
             }
 
@@ -927,11 +918,28 @@ anv_cmd_clear_image(struct anv_cmd_buffer *cmd_buffer,
                   },
                   .renderPass = pass,
                   .framebuffer = fb,
-                  .clearValueCount = 1,
-                  .pClearValues = clear_value,
+                  .clearValueCount = 0,
+                  .pClearValues = NULL,
                },
                VK_SUBPASS_CONTENTS_INLINE);
 
+            VkClearAttachment clear_att = {
+               .aspectMask = range->aspectMask,
+               .colorAttachment = 0,
+               .clearValue = *clear_value,
+            };
+
+            VkClearRect clear_rect = {
+               .rect = {
+                  .offset = { 0, 0 },
+                  .extent = { iview.extent.width, iview.extent.height },
+               },
+               .baseArrayLayer = range->baseArrayLayer,
+               .layerCount = 1, /* FINISHME: clear multi-layer framebuffer */
+            };
+
+            emit_clear(cmd_buffer, &clear_att, &clear_rect);
+
             ANV_CALL(CmdEndRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer));
             ANV_CALL(DestroyRenderPass)(device_h, pass,
                                         &cmd_buffer->pool->alloc);