Mesa (main): llvmpipe: fix multisample lines again

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 11 08:13:09 UTC 2021


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

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Fri Jun  4 13:42:25 2021 +0200

llvmpipe: fix multisample lines again

This does a little bit better than what we did in 2c0a078fdb4
("llvmpipe: fix multisample lines."), where parts of the diamond-exit
rule stuff was bypassed. But we should actually bypass *all* of the
diamond-exit rule stuff here instead.

The reason is that multisampled lines have a completely differently
specified set of rasterization rules, as per the OpenGL 4.6 core spec,
section 14.5.4 ("Line Multisample Rasterization").

So let's give multisampled lines their own geometry-generation codepath
instead.

This fixes the following dEQP tests:
- dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.lines
- dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines

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

---

 .../drivers/llvmpipe/ci/deqp-llvmpipe-fails.txt      |  2 --
 src/gallium/drivers/llvmpipe/lp_setup_line.c         | 20 +++++++++++++++++---
 src/gallium/drivers/virgl/ci/deqp-virgl-gl-fails.txt |  2 --
 .../drivers/virgl/ci/deqp-virgl-gles-fails.txt       |  2 --
 4 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/ci/deqp-llvmpipe-fails.txt b/src/gallium/drivers/llvmpipe/ci/deqp-llvmpipe-fails.txt
index 77470094028..525d25f2aeb 100644
--- a/src/gallium/drivers/llvmpipe/ci/deqp-llvmpipe-fails.txt
+++ b/src/gallium/drivers/llvmpipe/ci/deqp-llvmpipe-fails.txt
@@ -47,9 +47,7 @@ dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_displacement_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.points,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.points,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_singlesample.interpolation.lines_wide,Fail
 dEQP-GLES3.functional.rasterization.fbo.texture_2d.interpolation.lines_wide,Fail
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c
index 0535138df25..5762b277ecd 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_line.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c
@@ -298,7 +298,7 @@ try_setup_line( struct lp_setup_context *setup,
    int nr_planes = 4;
    unsigned viewport_index = 0;
    unsigned layer = 0;
-   float pixel_offset = setup->multisample ? 0.0 : setup->pixel_offset;
+   float pixel_offset = setup->pixel_offset;
    /* linewidth should be interpreted as integer */
    int fixed_width = util_iround(width) * FIXED_ONE;
 
@@ -357,10 +357,24 @@ try_setup_line( struct lp_setup_context *setup,
    info.v2 = v2;
 
   
-   /* X-MAJOR LINE */
-   if (fabsf(dx) >= fabsf(dy)) {
+   if (setup->multisample) {
+      float scale = (setup->line_width * 0.5f) / sqrtf(area);
+      int tx = subpixel_snap(-dy * scale);
+      int ty = subpixel_snap(+dx * scale);
+
+      x[0] = subpixel_snap(v1[0][0]) - tx;
+      x[1] = subpixel_snap(v2[0][0]) - tx;
+      x[2] = subpixel_snap(v2[0][0]) + tx;
+      x[3] = subpixel_snap(v1[0][0]) + tx;
+
+      y[0] = subpixel_snap(v1[0][1]) - ty;
+      y[1] = subpixel_snap(v2[0][1]) - ty;
+      y[2] = subpixel_snap(v2[0][1]) + ty;
+      y[3] = subpixel_snap(v1[0][1]) + ty;
+   } else if (fabsf(dx) >= fabsf(dy)) {
       float dydx = dy / dx;
 
+      /* X-MAJOR LINE */
       x1diff = v1[0][0] - floorf(v1[0][0]) - 0.5f;
       y1diff = v1[0][1] - floorf(v1[0][1]) - 0.5f;
       x2diff = v2[0][0] - floorf(v2[0][0]) - 0.5f;
diff --git a/src/gallium/drivers/virgl/ci/deqp-virgl-gl-fails.txt b/src/gallium/drivers/virgl/ci/deqp-virgl-gl-fails.txt
index aa9a5487803..b4de9d91f01 100644
--- a/src/gallium/drivers/virgl/ci/deqp-virgl-gl-fails.txt
+++ b/src/gallium/drivers/virgl/ci/deqp-virgl-gl-fails.txt
@@ -38,9 +38,7 @@ dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_displacement_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.points,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.points,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_singlesample.interpolation.lines_wide,Fail
 dEQP-GLES3.functional.rasterization.fbo.texture_2d.interpolation.lines_wide,Fail
diff --git a/src/gallium/drivers/virgl/ci/deqp-virgl-gles-fails.txt b/src/gallium/drivers/virgl/ci/deqp-virgl-gles-fails.txt
index af1e745a464..5b7bafcda0a 100644
--- a/src/gallium/drivers/virgl/ci/deqp-virgl-gles-fails.txt
+++ b/src/gallium/drivers/virgl/ci/deqp-virgl-gles-fails.txt
@@ -37,9 +37,7 @@ dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_displacement_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units,Fail
 dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_4.primitives.points,Fail
-dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.points,Fail
 dEQP-GLES3.functional.rasterization.fbo.rbo_singlesample.interpolation.lines_wide,Fail
 dEQP-GLES3.functional.rasterization.fbo.texture_2d.interpolation.lines_wide,Fail



More information about the mesa-commit mailing list