[Mesa-dev] [PATCH 2/2] radeonsi: fix gl_ClipDistance and gl_ClipVertex for points
Ilia Mirkin
imirkin at alum.mit.edu
Thu Dec 15 16:19:32 UTC 2016
Perhaps this is a point-specific function, but if this is applying to
all primitives, won't this end up culling primitives that have *any*
clip distance value < 0?
On Thu, Dec 15, 2016 at 10:42 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> 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.
> ---
> src/gallium/drivers/radeonsi/si_state.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index d86b99f..f6f61a6 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -671,34 +671,42 @@ static void si_emit_clip_regs(struct si_context *sctx, struct r600_atom *atom)
> unsigned total_mask;
> bool misc_vec_ena;
>
> if (vs->key.opt.hw_vs.clip_disable) {
> assert(!info->culldist_writemask);
> clipdist_mask = 0;
> culldist_mask = 0;
> }
> 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;
>
> radeon_set_context_reg(cs, R_02881C_PA_CL_VS_OUT_CNTL,
> S_02881C_USE_VTX_POINT_SIZE(info->writes_psize) |
> S_02881C_USE_VTX_EDGE_FLAG(info->writes_edgeflag) |
> S_02881C_USE_VTX_RENDER_TARGET_INDX(info->writes_layer) |
> S_02881C_USE_VTX_VIEWPORT_INDX(info->writes_viewport_index) |
> S_02881C_VS_OUT_CCDIST0_VEC_ENA((total_mask & 0x0F) != 0) |
> 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 |
> S_028810_CLIP_DISABLE(window_space));
>
> /* reuse needs to be set off if we write oViewport */
> radeon_set_context_reg(cs, R_028AB4_VGT_REUSE_OFF,
> S_028AB4_REUSE_OFF(info->writes_viewport_index));
> }
>
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list