radeonsi: fix gl_ClipDistance and gl_ClipVertex for points
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 15 Dec 2016 11:19:07 +0000 (12:19 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 22 Dec 2016 15:59:58 +0000 (16:59 +0100)
The clipper hardware doesn't consider points as primitives that can be
clipped. Simply setting the corresponding cull bits works, and should not
have an adverse effect on other primitive types according to the hardware
team.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
src/gallium/drivers/radeonsi/si_state.c

index afcd3ad26bc1990093c01257a0c776cc0009d1c8..11f9fb8449f8dfccfd0a747f9f655d8f8684d1f7 100644 (file)
@@ -678,6 +678,15 @@ static void si_emit_clip_regs(struct si_context *sctx, struct r600_atom *atom)
        }
        total_mask = clipdist_mask | culldist_mask;
 
+       /* Clip distances on points have no effect, so need to be implemented
+        * as cull distances. This applies for the clipvertex case as well.
+        *
+        * Setting this for primitives other than points should have no adverse
+        * effects.
+        */
+       clipdist_mask &= rs->clip_plane_enable;
+       culldist_mask |= clipdist_mask;
+
        misc_vec_ena = info->writes_psize || info->writes_edgeflag ||
                       info->writes_layer || info->writes_viewport_index;
 
@@ -690,8 +699,7 @@ static void si_emit_clip_regs(struct si_context *sctx, struct r600_atom *atom)
                S_02881C_VS_OUT_CCDIST1_VEC_ENA((total_mask & 0xF0) != 0) |
                S_02881C_VS_OUT_MISC_VEC_ENA(misc_vec_ena) |
                S_02881C_VS_OUT_MISC_SIDE_BUS_ENA(misc_vec_ena) |
-               (rs->clip_plane_enable &
-                clipdist_mask) | (culldist_mask << 8));
+               clipdist_mask | (culldist_mask << 8));
        radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
                rs->pa_cl_clip_cntl |
                ucp_mask |