draw: add view_mask rendering support
authorDave Airlie <airlied@redhat.com>
Thu, 4 Mar 2021 03:56:52 +0000 (13:56 +1000)
committerMarge Bot <eric+marge@anholt.net>
Fri, 12 Mar 2021 05:05:51 +0000 (05:05 +0000)
This loops the draws per-view above the instance rendering

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9399>

src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_pt.c

index d29fedd..e6609ee 100644 (file)
@@ -198,6 +198,7 @@ struct draw_context
          unsigned min_index;
          unsigned max_index;
          unsigned drawid;
+         unsigned viewid;
          
          /** vertex arrays */
          struct draw_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS];
index b89831c..8ee8bd7 100644 (file)
@@ -540,7 +540,7 @@ draw_vbo(struct draw_context *draw,
    draw->pt.user.max_index = info->index_bounds_valid ? info->max_index : ~0;
    draw->pt.user.eltSize = info->index_size ? draw->pt.user.eltSizeIB : 0;
    draw->pt.user.drawid = info->drawid;
-
+   draw->pt.user.viewid = 0;
    draw->pt.vertices_per_patch = info->vertices_per_patch;
 
    if (0)
@@ -604,7 +604,13 @@ draw_vbo(struct draw_context *draw,
     * the min_index/max_index hints given by gallium frontends.
     */
 
-   draw_instances(draw, info, draws, count);
+   if (info->view_mask) {
+      u_foreach_bit(i, info->view_mask) {
+         draw->pt.user.viewid = i;
+         draw_instances(draw, info, draws, count);
+      }
+   } else
+      draw_instances(draw, info, draws, count);
 
    /* If requested emit the pipeline statistics for this run */
    if (draw->collect_statistics) {