Mesa (main): llvmpipe: adjust scissor planes for multisample.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 31 23:53:57 UTC 2021


Module: Mesa
Branch: main
Commit: a5786a2e717c127ce40e07ca9e1159ffbdf75a0c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a5786a2e717c127ce40e07ca9e1159ffbdf75a0c

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Aug 30 14:44:47 2021 +1000

llvmpipe: adjust scissor planes for multisample.

For the inclusive x0/y0 planes, add a half pixel adjustment

For the exclusive x1/y1 planes, remove a half pixel adjustment

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12504>

---

 src/gallium/drivers/llvmpipe/lp_setup.c         | 9 ++++++---
 src/gallium/drivers/llvmpipe/lp_setup_context.h | 2 +-
 src/gallium/drivers/llvmpipe/lp_setup_line.c    | 2 +-
 src/gallium/drivers/llvmpipe/lp_setup_tri.c     | 2 +-
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 031fc41b157..cc0651ab46c 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -1755,7 +1755,7 @@ lp_setup_flush_and_restart(struct lp_setup_context *setup)
 void
 lp_setup_add_scissor_planes(const struct u_rect *scissor,
                             struct lp_rast_plane *plane_s,
-                            boolean s_planes[4])
+                            boolean s_planes[4], bool multisample)
 {
    /*
     * When rasterizing scissored tris, use the intersection of the
@@ -1778,11 +1778,13 @@ lp_setup_add_scissor_planes(const struct u_rect *scissor,
     * scissor edge this is, so rasterization would treat them differently
     * (easier to evaluate) to ordinary planes.)
     */
+   int adj = multisample ? 127 : 0;
    if (s_planes[0]) {
       int x0 = scissor->x0 - 1;
       plane_s->dcdx = ~0U << 8;
       plane_s->dcdy = 0;
       plane_s->c = x0 << 8;
+      plane_s->c += adj;
       plane_s->c = -plane_s->c; /* flip sign */
       plane_s->eo = 1 << 8;
       plane_s++;
@@ -1792,7 +1794,7 @@ lp_setup_add_scissor_planes(const struct u_rect *scissor,
       plane_s->dcdx = 1 << 8;
       plane_s->dcdy = 0;
       plane_s->c = x1 << 8;
-      plane_s->c += 255;
+      plane_s->c += 127 + adj;
       plane_s->eo = 0 << 8;
       plane_s++;
    }
@@ -1801,6 +1803,7 @@ lp_setup_add_scissor_planes(const struct u_rect *scissor,
       plane_s->dcdx = 0;
       plane_s->dcdy = 1 << 8;
       plane_s->c = y0 << 8;
+      plane_s->c += adj;
       plane_s->c = -plane_s->c; /* flip sign */
       plane_s->eo = 1 << 8;
       plane_s++;
@@ -1810,7 +1813,7 @@ lp_setup_add_scissor_planes(const struct u_rect *scissor,
       plane_s->dcdx = 0;
       plane_s->dcdy = ~0U << 8;
       plane_s->c = y1 << 8;
-      plane_s->c += 255;
+      plane_s->c += 127 + adj;
       plane_s->eo = 0;
       plane_s++;
    }
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
index 2a974e78ed6..656a64f4056 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
@@ -210,7 +210,7 @@ scissor_planes_needed(boolean scis_planes[4], const struct u_rect *bbox,
 void
 lp_setup_add_scissor_planes(const struct u_rect *scissor,
                             struct lp_rast_plane *plane_s,
-                            boolean s_planes[4]);
+                            boolean s_planes[4], bool multisample);
 
 void lp_setup_choose_triangle( struct lp_setup_context *setup );
 void lp_setup_choose_line( struct lp_setup_context *setup );
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c
index 60b30463853..1f812e8eacc 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_line.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c
@@ -712,7 +712,7 @@ try_setup_line( struct lp_setup_context *setup,
    }
 
    if (nr_planes > 4) {
-      lp_setup_add_scissor_planes(scissor, &plane[4], s_planes);
+      lp_setup_add_scissor_planes(scissor, &plane[4], s_planes, setup->multisample);
    }
 
    return lp_setup_bin_triangle(setup, line, &bbox, &bboxpos, nr_planes, viewport_index);
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index a3d34ef65ea..347f0a61c10 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -735,7 +735,7 @@ do_triangle_ccw(struct lp_setup_context *setup,
    }
 
    if (nr_planes > 3) {
-      lp_setup_add_scissor_planes(scissor, &plane[3], s_planes);
+      lp_setup_add_scissor_planes(scissor, &plane[3], s_planes, setup->multisample);
    }
 
    return lp_setup_bin_triangle(setup, tri, &bbox, &bboxpos, nr_planes, viewport_index);



More information about the mesa-commit mailing list