<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 17, 2017 at 11:23 PM, Iago Toral Quiroga <span dir="ltr"><<a href="mailto:itoral@igalia.com" target="_blank">itoral@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">According to the VK_KHX_multiview spec:<br>
<span class=""><br>
"Multiview causes all drawing and clear commands in the subpass to<br>
behave as if they were broadcast to each view, where each view is<br>
represented by one layer of the framebuffer attachments."<br>
<br>
</span>This adds support for multiview clears, which were missing in the<br>
initial implementation.<br>
<br>
v2 (Jason):<br>
  - split multiview from regular case<br>
  - Use for_each_bit() macro<br>
<span class=""><br>
Fixes new CTS multiview tests:<br>
dEQP-VK.multiview.clear_<wbr>attachments.*<br>
---<br>
</span> src/intel/vulkan/anv_blorp.c | 41 ++++++++++++++++++++++++++++++<wbr>+++++++++++<br>
 1 file changed, 41 insertions(+)<br>
<br>
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
index 7b6944a..974ea31 100644<br>
--- a/src/intel/vulkan/anv_blorp.c<br>
+++ b/src/intel/vulkan/anv_blorp.c<br>
@@ -999,6 +999,25 @@ clear_color_attachment(struct anv_cmd_buffer *cmd_buffer,<br>
<span class="">    union isl_color_value clear_color =<br>
       vk_to_isl_color(attachment-><wbr>clearValue.color);<br>
<br>
</span>+   /* If multiview is enabled we ignore baseArrayLayer and layerCount */<br>
+   if (subpass->view_mask) {<br>
+      uint32_t view_idx;<br>
+      for_each_bit(view_idx, subpass->view_mask) {<br>
<span class="">+         for (uint32_t r = 0; r < rectCount; ++r) {<br>
+            const VkOffset2D offset = pRects[r].rect.offset;<br>
+            const VkExtent2D extent = pRects[r].rect.extent;<br>
+            blorp_clear_attachments(batch, binding_table,<br>
+                                    ISL_FORMAT_UNSUPPORTED, pass_att->samples,<br>
</span>+                                    view_idx, 1,<br>
<span class="">+                                    offset.x, offset.y,<br>
+                                    offset.x + extent.width,<br>
</span>+                                    offset.y + extent.height,<br>
<span class="">+                                    true, clear_color, false, 0.0f, 0, 0);<br>
+         }<br>
</span>+      }<br>
+      return;<br>
<span class="">+   }<br>
+<br>
    for (uint32_t r = 0; r < rectCount; ++r) {<br>
</span><span class="">       const VkOffset2D offset = pRects[r].rect.offset;<br>
</span><span class="">       const VkExtent2D extent = pRects[r].rect.extent;<br>
</span>@@ -1047,6 +1066,28 @@ clear_depth_stencil_<wbr>attachment(struct anv_cmd_buffer *cmd_buffer,<br>
<span class="">    if (result != VK_SUCCESS)<br>
       return;<br>
<br>
</span>+   /* If multiview is enabled we ignore baseArrayLayer and layerCount */<br>
+   if (subpass->view_mask) {<br>
+      uint32_t view_idx;<br>
+      for_each_bit(view_idx, subpass->view_mask) {<br>
<span class="">+         for (uint32_t r = 0; r < rectCount; ++r) {<br>
+            const VkOffset2D offset = pRects[r].rect.offset;<br>
+            const VkExtent2D extent = pRects[r].rect.extent;<br>
+            VkClearDepthStencilValue value = attachment->clearValue.<wbr>depthStencil;<br>
+            blorp_clear_attachments(batch, binding_table,<br>
+                                    depth_format, pass_att->samples,<br>
</span>+                                    view_idx, 1,<br>
<span class="">+                                    offset.x, offset.y,<br>
+                                    offset.x + extent.width,<br>
</span>+                                    offset.y + extent.height,<br>
<span class="">+                                    false, color_value,<br>
+                                    clear_depth, value.depth,<br>
+                                    clear_stencil ? 0xff : 0, value.stencil);<br>
+         }<br>
</span>+      }<br>
+      return;<br>
<span class="im HOEnZb">+   }<br>
+<br>
    for (uint32_t r = 0; r < rectCount; ++r) {<br>
</span><span class="im HOEnZb">       const VkOffset2D offset = pRects[r].rect.offset;<br>
</span><div class="HOEnZb"><div class="h5">       const VkExtent2D extent = pRects[r].rect.extent;<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
2.7.4<br>
<br>
</font></span></blockquote></div><br></div>