nir: fix crash in varying packing on interface mismatch

For example when the outputs are scalars but the inputs are struct
members.

Fixes: 26aa460940 ("nir: rewrite varying component packing")

Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4351>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4351>
(cherry picked from commit 0f4a81430e)
This commit is contained in:
Timothy Arceri 2020-03-28 02:17:54 +11:00 committed by Eric Engestrom
parent 84531156ee
commit 9c8dab082f
2 changed files with 23 additions and 3 deletions

View file

@ -301,7 +301,7 @@
"description": "nir: fix crash in varying packing on interface mismatch",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": "26aa460940f6222565ad5eb40a21c2377c59c3a6"
},

View file

@ -569,6 +569,7 @@ gather_varying_component_info(nir_shader *producer, nir_shader *consumer,
vc_info->is_32bit = glsl_type_is_32bit(type);
vc_info->is_patch = in_var->data.patch;
vc_info->is_intra_stage_only = false;
vc_info->initialised = true;
}
}
}
@ -604,8 +605,14 @@ gather_varying_component_info(nir_shader *producer, nir_shader *consumer,
unsigned var_info_idx =
store_varying_info_idx[location][out_var->data.location_frac];
if (!var_info_idx)
continue;
if (!var_info_idx) {
/* Something went wrong, the shader interfaces didn't match, so
* abandon packing. This can happen for example when the
* inputs are scalars but the outputs are struct members.
*/
*varying_comp_info_size = 0;
break;
}
struct varying_component *vc_info =
&(*varying_comp_info)[var_info_idx-1];
@ -624,10 +631,23 @@ gather_varying_component_info(nir_shader *producer, nir_shader *consumer,
vc_info->is_32bit = glsl_type_is_32bit(type);
vc_info->is_patch = out_var->data.patch;
vc_info->is_intra_stage_only = true;
vc_info->initialised = true;
}
}
}
}
for (unsigned i = 0; i < *varying_comp_info_size; i++ ) {
struct varying_component *vc_info = &(*varying_comp_info)[i];
if (!vc_info->initialised) {
/* Something went wrong, the shader interfaces didn't match, so
* abandon packing. This can happen for example when the outputs are
* scalars but the inputs are struct members.
*/
*varying_comp_info_size = 0;
break;
}
}
}
static void