[Mesa-dev] [PATCH 7/7] radeonsi: handle first_non_void correctly in si_create_vertex_elements

Nicolai Hähnle nhaehnle at gmail.com
Mon Jan 23 15:10:00 UTC 2017


When does it happen that first_non_void < 0? Doesn't this require 
PIPE_FORMAT_NONE, and why would that occur?

Nicolai

On 20.01.2017 20:07, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> Cc: 17.0 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/radeonsi/si_state.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index 876cbf6..01edff9 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -3361,21 +3361,21 @@ static void *si_create_vertex_elements(struct pipe_context *ctx,
>
>  		if (!used[vbo_index]) {
>  			v->first_vb_use_mask |= 1 << i;
>  			used[vbo_index] = true;
>  		}
>
>  		desc = util_format_description(elements[i].src_format);
>  		first_non_void = util_format_get_first_non_void_channel(elements[i].src_format);
>  		data_format = si_translate_buffer_dataformat(ctx->screen, desc, first_non_void);
>  		num_format = si_translate_buffer_numformat(ctx->screen, desc, first_non_void);
> -		channel = &desc->channel[first_non_void];
> +		channel = first_non_void >= 0 ? &desc->channel[first_non_void] : NULL;
>
>  		v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
>  				   S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
>  				   S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
>  				   S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
>  				   S_008F0C_NUM_FORMAT(num_format) |
>  				   S_008F0C_DATA_FORMAT(data_format);
>  		v->format_size[i] = desc->block.bits / 8;
>
>  		/* The hardware always treats the 2-bit alpha channel as
> @@ -3383,26 +3383,26 @@ static void *si_create_vertex_elements(struct pipe_context *ctx,
>  		 */
>  		if (data_format == V_008F0C_BUF_DATA_FORMAT_2_10_10_10) {
>  			if (num_format == V_008F0C_BUF_NUM_FORMAT_SNORM) {
>  				v->fix_fetch |= (uint64_t)SI_FIX_FETCH_A2_SNORM << (4 * i);
>  			} else if (num_format == V_008F0C_BUF_NUM_FORMAT_SSCALED) {
>  				v->fix_fetch |= (uint64_t)SI_FIX_FETCH_A2_SSCALED << (4 * i);
>  			} else if (num_format == V_008F0C_BUF_NUM_FORMAT_SINT) {
>  				/* This isn't actually used in OpenGL. */
>  				v->fix_fetch |= (uint64_t)SI_FIX_FETCH_A2_SINT << (4 * i);
>  			}
> -		} else if (channel->type == UTIL_FORMAT_TYPE_FIXED) {
> +		} else if (channel && channel->type == UTIL_FORMAT_TYPE_FIXED) {
>  			if (desc->swizzle[3] == PIPE_SWIZZLE_1)
>  				v->fix_fetch |= (uint64_t)SI_FIX_FETCH_RGBX_32_FIXED << (4 * i);
>  			else
>  				v->fix_fetch |= (uint64_t)SI_FIX_FETCH_RGBA_32_FIXED << (4 * i);
> -		} else if (channel->size == 32 && !channel->pure_integer) {
> +		} else if (channel && channel->size == 32 && !channel->pure_integer) {
>  			if (channel->type == UTIL_FORMAT_TYPE_SIGNED) {
>  				if (channel->normalized) {
>  					if (desc->swizzle[3] == PIPE_SWIZZLE_1)
>  						v->fix_fetch |= (uint64_t)SI_FIX_FETCH_RGBX_32_SNORM << (4 * i);
>  					else
>  						v->fix_fetch |= (uint64_t)SI_FIX_FETCH_RGBA_32_SNORM << (4 * i);
>  				} else {
>  					v->fix_fetch |= (uint64_t)SI_FIX_FETCH_RGBA_32_SSCALED << (4 * i);
>  				}
>  			} else if (channel->type == UTIL_FORMAT_TYPE_UNSIGNED) {
>


More information about the mesa-dev mailing list