Mesa (master): gallium/draw: Fix rasterizer_discard for wide points/lines.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 12 20:54:07 UTC 2020


Module: Mesa
Branch: master
Commit: 0b4825c872558b1e21f6b9c6e8256482988ee243
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0b4825c872558b1e21f6b9c6e8256482988ee243

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Nov 11 11:03:57 2020 -0800

gallium/draw: Fix rasterizer_discard for wide points/lines.

Fixes the rasterizer_discard failures for softpipe, because the wide paths
(which we hit for points in the CTS) were dropping the discard state when
making the no_cull shadow state.

Cc: mesa-stable
Reviewed-by: Brian Paul <brianp at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7558>

---

 .gitlab-ci/deqp-softpipe-fails.txt                |  7 -------
 src/gallium/auxiliary/draw/draw_context.c         | 22 ++++++++++++----------
 src/gallium/auxiliary/draw/draw_pipe_aaline.c     |  2 +-
 src/gallium/auxiliary/draw/draw_pipe_aapoint.c    |  2 +-
 src/gallium/auxiliary/draw/draw_pipe_wide_line.c  |  2 +-
 src/gallium/auxiliary/draw/draw_pipe_wide_point.c |  2 +-
 src/gallium/auxiliary/draw/draw_private.h         |  5 ++---
 7 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/.gitlab-ci/deqp-softpipe-fails.txt b/.gitlab-ci/deqp-softpipe-fails.txt
index 7ac9e19b4e1..bb1cd2c634f 100644
--- a/.gitlab-ci/deqp-softpipe-fails.txt
+++ b/.gitlab-ci/deqp-softpipe-fails.txt
@@ -93,12 +93,6 @@ dEQP-GLES3.functional.rasterization.interpolation.basic.lines_wide,Fail
 dEQP-GLES3.functional.rasterization.interpolation.projected.line_loop_wide,Fail
 dEQP-GLES3.functional.rasterization.interpolation.projected.line_strip_wide,Fail
 dEQP-GLES3.functional.rasterization.interpolation.projected.lines_wide,Fail
-dEQP-GLES3.functional.rasterizer_discard.basic.write_depth_points,Fail
-dEQP-GLES3.functional.rasterizer_discard.basic.write_stencil_points,Fail
-dEQP-GLES3.functional.rasterizer_discard.fbo.write_depth_points,Fail
-dEQP-GLES3.functional.rasterizer_discard.fbo.write_stencil_points,Fail
-dEQP-GLES3.functional.rasterizer_discard.scissor.write_depth_points,Fail
-dEQP-GLES3.functional.rasterizer_discard.scissor.write_stencil_points,Fail
 dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4.float_highp,Fail
 dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4.float_mediump,Fail
 dEQP-GLES3.functional.shaders.derivate.dfdx.fastest.fbo_msaa4.vec2_highp,Fail
@@ -848,7 +842,6 @@ KHR-GL33.transform_feedback.capture_geometry_interleaved_test,Fail
 KHR-GL33.transform_feedback.capture_geometry_separate_test,Fail
 KHR-GL33.transform_feedback.capture_vertex_interleaved_test,Fail
 KHR-GL33.transform_feedback.capture_vertex_separate_test,Fail
-KHR-GL33.transform_feedback.discard_geometry_test,Fail
 KHR-GL33.transform_feedback.discard_vertex_test,Fail
 KHR-GL33.transform_feedback.draw_xfb_instanced_test,Crash
 KHR-GL33.transform_feedback.draw_xfb_stream_instanced_test,Crash
diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index ac8c812707c..86fa5b9d8d5 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -200,7 +200,7 @@ void draw_new_instance(struct draw_context *draw)
 void draw_destroy( struct draw_context *draw )
 {
    struct pipe_context *pipe;
-   unsigned i, j;
+   unsigned i, j, k;
 
    if (!draw)
       return;
@@ -211,8 +211,10 @@ void draw_destroy( struct draw_context *draw )
     */
    for (i = 0; i < 2; i++) {
       for (j = 0; j < 2; j++) {
-         if (draw->rasterizer_no_cull[i][j]) {
-            pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]);
+         for (k = 0; k < 2; k++) {
+            if (draw->rasterizer_no_cull[i][j][k]) {
+               pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j][k]);
+            }
          }
       }
    }
@@ -1056,26 +1058,26 @@ draw_current_shader_num_written_culldistances(const struct draw_context *draw)
  */
 void *
 draw_get_rasterizer_no_cull( struct draw_context *draw,
-                             boolean scissor,
-                             boolean flatshade )
+                             const struct pipe_rasterizer_state *base_rast )
 {
-   if (!draw->rasterizer_no_cull[scissor][flatshade]) {
+   if (!draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard]) {
       /* create now */
       struct pipe_context *pipe = draw->pipe;
       struct pipe_rasterizer_state rast;
 
       memset(&rast, 0, sizeof(rast));
-      rast.scissor = scissor;
-      rast.flatshade = flatshade;
+      rast.scissor = base_rast->scissor;
+      rast.flatshade = base_rast->flatshade;
+      rast.rasterizer_discard = base_rast->rasterizer_discard;
       rast.front_ccw = 1;
       rast.half_pixel_center = draw->rasterizer->half_pixel_center;
       rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule;
       rast.clip_halfz = draw->rasterizer->clip_halfz;
 
-      draw->rasterizer_no_cull[scissor][flatshade] =
+      draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard] =
          pipe->create_rasterizer_state(pipe, &rast);
    }
-   return draw->rasterizer_no_cull[scissor][flatshade];
+   return draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard];
 }
 
 void
diff --git a/src/gallium/auxiliary/draw/draw_pipe_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
index 71a84f29efd..e559d7f2adc 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_aaline.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
@@ -523,7 +523,7 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
    draw->suspend_flushing = TRUE;
 
    /* Disable triangle culling, stippling, unfilled mode etc. */
-   r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
+   r = draw_get_rasterizer_no_cull(draw, rast);
    pipe->bind_rasterizer_state(pipe, r);
 
    draw->suspend_flushing = FALSE;
diff --git a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
index 2df5bf1a6f3..ada9044de25 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
@@ -597,7 +597,7 @@ aapoint_first_point(struct draw_stage *stage, struct prim_header *header)
    draw->suspend_flushing = TRUE;
 
    /* Disable triangle culling, stippling, unfilled mode etc. */
-   r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
+   r = draw_get_rasterizer_no_cull(draw, rast);
    pipe->bind_rasterizer_state(pipe, r);
 
    draw->suspend_flushing = FALSE;
diff --git a/src/gallium/auxiliary/draw/draw_pipe_wide_line.c b/src/gallium/auxiliary/draw/draw_pipe_wide_line.c
index cdcc43a13d8..bcf7ca6ba7f 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_wide_line.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_wide_line.c
@@ -147,7 +147,7 @@ static void wideline_first_line( struct draw_stage *stage,
    void *r;
 
    /* Disable triangle culling, stippling, unfilled mode etc. */
-   r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
+   r = draw_get_rasterizer_no_cull(draw, rast);
    draw->suspend_flushing = TRUE;
    pipe->bind_rasterizer_state(pipe, r);
    draw->suspend_flushing = FALSE;
diff --git a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
index 2f2c1072540..26593236383 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
@@ -213,7 +213,7 @@ widepoint_first_point(struct draw_stage *stage,
    }
 
    /* Disable triangle culling, stippling, unfilled mode etc. */
-   r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
+   r = draw_get_rasterizer_no_cull(draw, rast);
    draw->suspend_flushing = TRUE;
    pipe->bind_rasterizer_state(pipe, r);
    draw->suspend_flushing = FALSE;
diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h
index 05969faab73..3c02c8fe19f 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -265,7 +265,7 @@ struct draw_context
    void *rast_handle;
 
    /** Rasterizer CSOs without culling/stipple/etc */
-   void *rasterizer_no_cull[2][2];
+   void *rasterizer_no_cull[2][2][2];
 
    struct pipe_viewport_state viewports[PIPE_MAX_VIEWPORTS];
    boolean identity_viewport;
@@ -536,8 +536,7 @@ void draw_do_flush( struct draw_context *draw, unsigned flags );
 
 void *
 draw_get_rasterizer_no_cull( struct draw_context *draw,
-                             boolean scissor,
-                             boolean flatshade );
+                             const struct pipe_rasterizer_state *rast );
 
 void
 draw_stats_clipper_primitives(struct draw_context *draw,



More information about the mesa-commit mailing list