<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, May 16, 2017 at 4:03 AM, 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 spec for VkRenderPassMultiviewCreateInf<wbr>oKHX:<br>
<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>
This patch implements the broadcast for clear commands, which was<br>
missing in the original implementation.<br>
<br>
Fixes new CTS multiview tests:<br>
dEQP-VK.multiview.clear_<wbr>attachments.*<br>
---<br>
 src/intel/vulkan/anv_blorp.c | 58 ++++++++++++++++++++++++++----<wbr>--------------<br>
 1 file changed, 35 insertions(+), 23 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
index 7b6944a..2e2f915 100644<br>
--- a/src/intel/vulkan/anv_blorp.c<br>
+++ b/src/intel/vulkan/anv_blorp.c<br>
@@ -999,16 +999,22 @@ clear_color_attachment(struct anv_cmd_buffer *cmd_buffer,<br>
    union isl_color_value clear_color =<br>
       vk_to_isl_color(attachment-><wbr>clearValue.color);<br>
<br>
-   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>
-                              pRects[r].baseArrayLayer,<br>
-                              pRects[r].layerCount,<br>
-                              offset.x, offset.y,<br>
-                              offset.x + extent.width, offset.y + extent.height,<br>
-                              true, clear_color, false, 0.0f, 0, 0);<br>
+   const uint32_t num_views = MAX2(1, util_last_bit(subpass->view_<wbr>mask));<br>
+   for(uint32_t view_idx = 0; view_idx < num_views; view_idx++) {<br></blockquote><div><br></div><div>This may be a good place to use anv_for_each_bit :-)  Then again, what you're doing here also handles the regular case.  I think I might still be inclined to split them because you don't want to respect layerCount and baseArrayLayer in multiview.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      if (subpass->view_mask && !(subpass->view_mask & (1 << view_idx)))<br>
+         continue;<br>
+<br>
+      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>
+                                 pRects[r].baseArrayLayer + view_idx,<br>
+                                 pRects[r].layerCount,<br>
+                                 offset.x, offset.y,<br>
+                                 offset.x + extent.width, offset.y + extent.height,<br>
+                                 true, clear_color, false, 0.0f, 0, 0);<br>
+      }<br>
    }<br>
 }<br>
<br>
@@ -1047,19 +1053,25 @@ clear_depth_stencil_<wbr>attachment(struct anv_cmd_buffer *cmd_buffer,<br>
    if (result != VK_SUCCESS)<br>
       return;<br>
<br>
-   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>
-                              pRects[r].baseArrayLayer,<br>
-                              pRects[r].layerCount,<br>
-                              offset.x, offset.y,<br>
-                              offset.x + extent.width, offset.y + extent.height,<br>
-                              false, color_value,<br>
-                              clear_depth, value.depth,<br>
-                              clear_stencil ? 0xff : 0, value.stencil);<br>
+   const uint32_t num_views = MAX2(1, util_last_bit(subpass->view_<wbr>mask));<br>
+   for(uint32_t view_idx = 0; view_idx < num_views; view_idx++) {<br>
+      if (subpass->view_mask && !(subpass->view_mask & (1 << view_idx)))<br>
+         continue;<br>
+<br>
+      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>
+                                 pRects[r].baseArrayLayer + view_idx,<br>
+                                 pRects[r].layerCount,<br>
+                                 offset.x, offset.y,<br>
+                                 offset.x + extent.width, offset.y + extent.height,<br>
+                                 false, color_value,<br>
+                                 clear_depth, value.depth,<br>
+                                 clear_stencil ? 0xff : 0, value.stencil);<br>
+      }<br>
    }<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.7.4<br>
<br>
</font></span></blockquote></div><br></div></div>