[Mesa-dev] [PATCH 15/15] radeonsi: emit VGT_REUSE_OFF in the right place

Nicolai Hähnle nhaehnle at gmail.com
Tue Aug 22 08:23:32 UTC 2017


I have sent comments on patches 2 & 9. Apart from those, the series is

Reviewed-by: Marek Olšák <marek.olsak at amd.com>


On 21.08.2017 23:54, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> clip_regs aren't marked dirty when writes_viewport_index is changed.
> 
> Cc: 17.2 <mesa-stable at lists.freedesktop.org>
> ---
>   src/gallium/drivers/radeonsi/si_state.c         |  6 ------
>   src/gallium/drivers/radeonsi/si_state_shaders.c | 11 +++++++++--
>   2 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index e571201..17e2dc5 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -712,26 +712,20 @@ static void si_emit_clip_regs(struct si_context *sctx, struct r600_atom *atom)
>   
>   	radeon_set_context_reg(cs, R_02881C_PA_CL_VS_OUT_CNTL,
>   		vs_sel->pa_cl_vs_out_cntl |
>   		S_02881C_VS_OUT_CCDIST0_VEC_ENA((total_mask & 0x0F) != 0) |
>   		S_02881C_VS_OUT_CCDIST1_VEC_ENA((total_mask & 0xF0) != 0) |
>   		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));
> -
> -	if (sctx->b.chip_class <= VI) {
> -		/* 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));
> -	}
>   }
>   
>   /*
>    * inferred state between framebuffer and rasterizer
>    */
>   static void si_update_poly_offset_state(struct si_context *sctx)
>   {
>   	struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
>   
>   	if (!rs || !rs->uses_poly_offset || !sctx->framebuffer.state.zsbuf) {
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 66cd902..d34f2f6 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -829,28 +829,29 @@ static void si_shader_gs(struct si_screen *sscreen, struct si_shader *shader)
>   /**
>    * Compute the state for \p shader, which will run as a vertex shader on the
>    * hardware.
>    *
>    * If \p gs is non-NULL, it points to the geometry shader for which this shader
>    * is the copy shader.
>    */
>   static void si_shader_vs(struct si_screen *sscreen, struct si_shader *shader,
>                            struct si_shader_selector *gs)
>   {
> +	const struct tgsi_shader_info *info = &shader->selector->info;
>   	struct si_pm4_state *pm4;
>   	unsigned num_user_sgprs;
>   	unsigned nparams, vgpr_comp_cnt;
>   	uint64_t va;
>   	unsigned oc_lds_en;
>   	unsigned window_space =
> -	   shader->selector->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
> -	bool enable_prim_id = shader->key.mono.u.vs_export_prim_id || shader->selector->info.uses_primid;
> +	   info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
> +	bool enable_prim_id = shader->key.mono.u.vs_export_prim_id || info->uses_primid;
>   
>   	pm4 = si_get_shader_pm4_state(shader);
>   	if (!pm4)
>   		return;
>   
>   	/* We always write VGT_GS_MODE in the VS state, because every switch
>   	 * between different shader pipelines involving a different GS or no
>   	 * GS at all involves a switch of the VS (different GS use different
>   	 * copy shaders). On the other hand, when the API switches from a GS to
>   	 * no GS and then back to the same GS used originally, the GS state is
> @@ -863,20 +864,26 @@ static void si_shader_vs(struct si_screen *sscreen, struct si_shader *shader,
>   		if (enable_prim_id)
>   			mode = V_028A40_GS_SCENARIO_A;
>   
>   		si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, S_028A40_MODE(mode));
>   		si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, enable_prim_id);
>   	} else {
>   		si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, si_vgt_gs_mode(gs));
>   		si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0);
>   	}
>   
> +	if (sscreen->b.chip_class <= VI) {
> +		/* Reuse needs to be set off if we write oViewport. */
> +		si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF,
> +			       S_028AB4_REUSE_OFF(info->writes_viewport_index));
> +	}
> +
>   	va = shader->bo->gpu_address;
>   	si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ, RADEON_PRIO_SHADER_BINARY);
>   
>   	if (gs) {
>   		vgpr_comp_cnt = 0; /* only VertexID is needed for GS-COPY. */
>   		num_user_sgprs = SI_GSCOPY_NUM_USER_SGPR;
>   	} else if (shader->selector->type == PIPE_SHADER_VERTEX) {
>   		/* VGPR0-3: (VertexID, InstanceID / StepRate0, PrimID, InstanceID)
>   		 * If PrimID is disabled. InstanceID / StepRate1 is loaded instead.
>   		 * StepRate0 is set to 1. so that VGPR3 doesn't have to be loaded.
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list