tu: Parse multiview render pass info
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 2 Jul 2020 09:16:50 +0000 (11:16 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 20 Aug 2020 19:21:17 +0000 (19:21 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5720>

src/freedreno/vulkan/tu_pass.c
src/freedreno/vulkan/tu_private.h

index bef3c3b1e39e279ba095911d211bdd73d329d7a8..fd9104523009b2772d4c7fa9d32451dd8d7682a6 100644 (file)
@@ -699,6 +699,8 @@ tu_CreateRenderPass2(VkDevice _device,
       subpass->samples = 0;
       subpass->srgb_cntl = 0;
 
+      subpass->multiview_mask = desc->viewMask;
+
       if (desc->inputAttachmentCount > 0) {
          subpass->input_attachments = p;
          p += desc->inputAttachmentCount;
@@ -725,6 +727,8 @@ tu_CreateRenderPass2(VkDevice _device,
 
                if (vk_format_is_srgb(pass->attachments[a].format))
                   subpass->srgb_cntl |= 1 << j;
+
+               pass->attachments[a].clear_views |= subpass->multiview_mask;
             }
          }
       }
@@ -759,7 +763,20 @@ tu_CreateRenderPass2(VkDevice _device,
       }
    }
 
-   tu_render_pass_gmem_config(pass, device->physical_device);
+   /* From the VK_KHR_multiview spec:
+    *
+    *    Multiview is all-or-nothing for a render pass - that is, either all
+    *    subpasses must have a non-zero view mask (though some subpasses may
+    *    have only one view) or all must be zero.
+    *
+    * This means we only have to check one of the view masks.
+    */
+   if (pCreateInfo->pSubpasses[0].viewMask) {
+      /* It seems multiview must use sysmem rendering. */
+      pass->gmem_pixels = 0;
+   } else {
+      tu_render_pass_gmem_config(pass, device->physical_device);
+   }
 
    for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
       tu_render_pass_add_subpass_dep(pass, &pCreateInfo->pDependencies[i]);
index 7470d69b868a0a2b7224e236f2b465826d6f19ee..3d180fbecf69c1b99d3c7de616b64e8cb21b9434 100644 (file)
@@ -1484,6 +1484,7 @@ struct tu_subpass
    VkSampleCountFlagBits samples;
 
    uint32_t srgb_cntl;
+   uint32_t multiview_mask;
 
    struct tu_subpass_barrier start_barrier;
 };
@@ -1494,6 +1495,7 @@ struct tu_render_pass_attachment
    uint32_t samples;
    uint32_t cpp;
    VkImageAspectFlags clear_mask;
+   uint32_t clear_views;
    bool load;
    bool store;
    int32_t gmem_offset;