[Mesa-dev] [PATCH] r600: Scale integer valued texture border colors to float (v2)

Roland Scheidegger sroland at vmware.com
Wed Jul 25 04:49:47 UTC 2018


Am 24.07.2018 um 21:27 schrieb Gert Wollny:
> It seems the hardware always expects floating point border color values
> [0,1] for unsigned, and [-1,1] for signed texture component, regardless
> of pixel type, but the border colors are passed according to texture
> component type. Hence, before submitting the border color, convert and
> scale it these ranges accordingly.
> 
> This doesn't seem to work for textures with 32 bit integer components
> though, here, it seems that the border color is always set to zero,
> regardless of the BORDER_COLOR_TYPE state set in Q_TEX_SAMPLER_WORD0_0.
> 
> v2: Simplyfy logic as suggested by Roland Schneidegger
> 
> Fixes:
>   dEQP-GLES31.functional.texture.border_clamp.formats.compressed*
>   dEQP-GLES31.functional.texture.border_clamp.formats.r* (non 32 bit integer)
>   dEQP-GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d*
>  and a number of piglits out of 
>   piglit run gpu -t texture -t gather -t formats 
> 
> Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
> ---
>  src/gallium/drivers/r600/evergreen_state.c | 45 +++++++++++++++++++++++++++++-
>  1 file changed, 44 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index d100cfab1d..e7207a500b 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -2402,6 +2402,37 @@ static void evergreen_emit_cs_sampler_views(struct r600_context *rctx, struct r6
>  	                             EG_FETCH_CONSTANTS_OFFSET_CS + R600_MAX_CONST_BUFFERS, RADEON_CP_PACKET3_COMPUTE_MODE);
>  }
>  
> +static void evergreen_convert_border_color(union pipe_color_union *in,
> +                                           union pipe_color_union *out,
> +                                           enum pipe_format format)
> +{
> +	if (util_format_is_pure_integer(format) &&
> +		 !util_format_is_depth_or_stencil(format)) {
> +		const struct util_format_description *d = util_format_description(format);
> +
> +		for (int i = 0; i < d->nr_channels; ++i) {
> +			int cs = d->channel[i].size;
> +			if (d->channel[i].type == UTIL_FORMAT_TYPE_SIGNED)
> +				out->f[i] = (double)(in->i[i]) / ((1ul << (cs - 1)) - 1 );
> +			else if (d->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED)
> +				out->f[i] = (double)(in->ui[i]) / ((1ul << cs) - 1 );
> +			else
> +				out->f[i] = 0;
> +		}
> +
> +	} else {
> +		switch (format) {
> +      case PIPE_FORMAT_X24S8_UINT:
> +      case PIPE_FORMAT_X32_S8X24_UINT:
whitespace.

Looks alright to me (though as mentioned, I consider trying to fix up
border color a futile attempt on eg :-)).
btw I suppose it would apply to pre-eg chips as well? Not that I'd
suggest you fix it up there too ;-).

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

> +			out->f[0] = (double)(in->ui[0]) / 255.0;
> +			out->f[1] = out->f[2] = out->f[3] = 0.0f;
> +			break;
> +		default:
> +			memcpy(out->f, in->f, 4 * sizeof(float));
> +		}
> +	}
> +}
> +
>  static void evergreen_emit_sampler_states(struct r600_context *rctx,
>  				struct r600_textures_info *texinfo,
>  				unsigned resource_id_base,
> @@ -2410,6 +2441,8 @@ static void evergreen_emit_sampler_states(struct r600_context *rctx,
>  {
>  	struct radeon_cmdbuf *cs = rctx->b.gfx.cs;
>  	uint32_t dirty_mask = texinfo->states.dirty_mask;
> +	union pipe_color_union border_color = {{0,0,0,1}};
> +	union pipe_color_union *border_color_ptr = &border_color;
>  
>  	while (dirty_mask) {
>  		struct r600_pipe_sampler_state *rstate;
> @@ -2418,6 +2451,16 @@ static void evergreen_emit_sampler_states(struct r600_context *rctx,
>  		rstate = texinfo->states.states[i];
>  		assert(rstate);
>  
> +		if (rstate->border_color_use) {
> +			struct r600_pipe_sampler_view	*rview = texinfo->views.views[i];
> +			if (rview) {
> +				evergreen_convert_border_color(&rstate->border_color,
> +				                               &border_color, rview->base.format);
> +			} else {
> +				border_color_ptr = &rstate->border_color;
> +			}
> +		}
> +
>  		radeon_emit(cs, PKT3(PKT3_SET_SAMPLER, 3, 0) | pkt_flags);
>  		radeon_emit(cs, (resource_id_base + i) * 3);
>  		radeon_emit_array(cs, rstate->tex_sampler_words, 3);
> @@ -2425,7 +2468,7 @@ static void evergreen_emit_sampler_states(struct r600_context *rctx,
>  		if (rstate->border_color_use) {
>  			radeon_set_config_reg_seq(cs, border_index_reg, 5);
>  			radeon_emit(cs, i);
> -			radeon_emit_array(cs, rstate->border_color.ui, 4);
> +			radeon_emit_array(cs, border_color_ptr->ui, 4);
>  		}
>  	}
>  	texinfo->states.dirty_mask = 0;
> 



More information about the mesa-dev mailing list