radeonsi: handle first_non_void correctly in si_create_vertex_elements
authorMarek Olšák <marek.olsak@amd.com>
Fri, 20 Jan 2017 15:02:04 +0000 (16:02 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 24 Jan 2017 22:52:01 +0000 (23:52 +0100)
This fixes R11G11B10_FLOAT, because it's in the category of "OTHER",
meaning that it doesn't have any channel description.

Cc: 17.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state.c

index 876cbf6a34b9ff78bcfe227e3a71644f57bcd9e1..01edff9cc0c0f3f8f71ebd1c3eeab83d257efdec 100644 (file)
@@ -3368,7 +3368,7 @@ static void *si_create_vertex_elements(struct pipe_context *ctx,
                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])) |
@@ -3390,12 +3390,12 @@ static void *si_create_vertex_elements(struct pipe_context *ctx,
                                /* 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)