summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-03-27 21:30:42 -0700
committerEric Anholt <[email protected]>2018-03-28 17:48:41 -0700
commit2f4c4e10c268a8b9a013b422d85439c5933d8075 (patch)
tree9a7fd409a2de55963655269e5af7a958f9d9c9ca /src/gallium/drivers
parent0349c79bdc2c04b3d64d144159f3268ad74e2b7c (diff)
broadcom/vc5: Work around scissor w/h==0 bug same as rasterizer discard.
The 7268 HW apparently lets some rendering through in this case. Fixes GTF-GLES2.gtf.GL2FixedTests.scissor.scissor
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/vc5/vc5_emit.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c
index deb46228dad..0d11d7e1ad1 100644
--- a/src/gallium/drivers/vc5/vc5_emit.c
+++ b/src/gallium/drivers/vc5/vc5_emit.c
@@ -308,6 +308,7 @@ v3dX(emit_state)(struct pipe_context *pctx)
{
struct vc5_context *vc5 = vc5_context(pctx);
struct vc5_job *job = vc5->job;
+ bool rasterizer_discard = vc5->rasterizer->base.rasterizer_discard;
if (vc5->dirty & (VC5_DIRTY_SCISSOR | VC5_DIRTY_VIEWPORT |
VC5_DIRTY_RASTERIZER)) {
@@ -344,6 +345,18 @@ v3dX(emit_state)(struct pipe_context *pctx)
clip.clip_window_bottom_pixel_coordinate = miny;
clip.clip_window_width_in_pixels = maxx - minx;
clip.clip_window_height_in_pixels = maxy - miny;
+
+#if V3D_VERSION < 41
+ /* The HW won't entirely clip out when scissor w/h is
+ * 0. Just treat it the same as rasterizer discard.
+ */
+ if (clip.clip_window_width_in_pixels == 0 ||
+ clip.clip_window_height_in_pixels == 0) {
+ rasterizer_discard = true;
+ clip.clip_window_width_in_pixels = 1;
+ clip.clip_window_height_in_pixels = 1;
+ }
+#endif
}
job->draw_min_x = MIN2(job->draw_min_x, minx);
@@ -358,11 +371,11 @@ v3dX(emit_state)(struct pipe_context *pctx)
VC5_DIRTY_COMPILED_FS)) {
cl_emit(&job->bcl, CONFIGURATION_BITS, config) {
config.enable_forward_facing_primitive =
- !vc5->rasterizer->base.rasterizer_discard &&
+ !rasterizer_discard &&
!(vc5->rasterizer->base.cull_face &
PIPE_FACE_FRONT);
config.enable_reverse_facing_primitive =
- !vc5->rasterizer->base.rasterizer_discard &&
+ !rasterizer_discard &&
!(vc5->rasterizer->base.cull_face &
PIPE_FACE_BACK);
/* This seems backwards, but it's what gets the