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