diff options
author | Marek Olšák <[email protected]> | 2016-02-23 00:37:39 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-02-23 16:42:16 +0100 |
commit | 190a291b03f799471110f95ae8a4d519d309696d (patch) | |
tree | 1a784f889fe2a95081ea53d9b400cabcb126a5f4 /src/gallium/auxiliary/tgsi/tgsi_scan.c | |
parent | 31a0affa280ef06261a2ed0135f72a7accc1bac6 (diff) |
tgsi/scan: handle holes between VS inputs, assert-fail in other cases
"st/mesa: overhaul vertex setup for clearing, glDrawPixels, glBitmap"
added a vertex shader declaring IN[0] and IN[2], but not IN[1].
Drivers relying on tgsi_shader_info can't handle holes in declarations,
because tgsi_shader_info doesn't track that.
This is just a quick workaround meant for stable that will work for vertex
shaders.
This fixes radeonsi DrawPixels and CopyPixels crashes.
Cc: [email protected]
Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/tgsi/tgsi_scan.c')
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 489423d7f12..4f85d2fda67 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -247,7 +247,14 @@ scan_declaration(struct tgsi_shader_info *info, info->input_interpolate[reg] = (ubyte)fulldecl->Interp.Interpolate; info->input_interpolate_loc[reg] = (ubyte)fulldecl->Interp.Location; info->input_cylindrical_wrap[reg] = (ubyte)fulldecl->Interp.CylindricalWrap; - info->num_inputs++; + + /* Vertex shaders can have inputs with holes between them. */ + if (info->processor == TGSI_PROCESSOR_VERTEX) + info->num_inputs = MAX2(info->num_inputs, reg + 1); + else { + info->num_inputs++; + assert(reg < info->num_inputs); + } /* Only interpolated varyings. Don't include POSITION. * Don't include integer varyings, because they are not @@ -341,6 +348,7 @@ scan_declaration(struct tgsi_shader_info *info, info->output_semantic_name[reg] = (ubyte) semName; info->output_semantic_index[reg] = (ubyte) semIndex; info->num_outputs++; + assert(reg < info->num_outputs); if (semName == TGSI_SEMANTIC_COLOR) info->colors_written |= 1 << semIndex; |