From cef08f0557b4ff515964a45b30fffd117c8bd9d1 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 4 Jun 2021 13:42:25 +0200 Subject: [PATCH] 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 Part-of: --- .../llvmpipe/ci/deqp-llvmpipe-fails.txt | 2 -- src/gallium/drivers/llvmpipe/lp_setup_line.c | 20 ++++++++++++++++--- .../drivers/virgl/ci/deqp-virgl-gl-fails.txt | 2 -- .../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