nir: Exclude non-generic patch variables from get_variable_io_mask.
These are I/O variables which are not going to be removed anyway.
However, get_variable_io_mask handles their location incorrectly.
Found using the GCC undefined behavior sanitizer.
Fixes the following error:
runtime error:
shift exponent 4294967258 is too large
for 64-bit type 'long unsigned int'
Closes: #5319
Fixes: cf5f8f55c3
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12719>
This commit is contained in:
parent
13e467a147
commit
872d21820f
|
@ -58,6 +58,15 @@ get_variable_io_mask(nir_variable *var, gl_shader_stage stage)
|
|||
return ((1ull << slots) - 1) << location;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_non_generic_patch_var(nir_variable *var)
|
||||
{
|
||||
return var->data.location == VARYING_SLOT_TESS_LEVEL_INNER ||
|
||||
var->data.location == VARYING_SLOT_TESS_LEVEL_OUTER ||
|
||||
var->data.location == VARYING_SLOT_BOUNDING_BOX0 ||
|
||||
var->data.location == VARYING_SLOT_BOUNDING_BOX1;
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
get_num_components(nir_variable *var)
|
||||
{
|
||||
|
@ -90,6 +99,9 @@ tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read)
|
|||
nir_variable *var = nir_deref_instr_get_variable(deref);
|
||||
for (unsigned i = 0; i < get_num_components(var); i++) {
|
||||
if (var->data.patch) {
|
||||
if (is_non_generic_patch_var(var))
|
||||
continue;
|
||||
|
||||
patches_read[var->data.location_frac + i] |=
|
||||
get_variable_io_mask(var, shader->info.stage);
|
||||
} else {
|
||||
|
@ -172,6 +184,9 @@ nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer)
|
|||
nir_foreach_shader_out_variable(var, producer) {
|
||||
for (unsigned i = 0; i < get_num_components(var); i++) {
|
||||
if (var->data.patch) {
|
||||
if (is_non_generic_patch_var(var))
|
||||
continue;
|
||||
|
||||
patches_written[var->data.location_frac + i] |=
|
||||
get_variable_io_mask(var, producer->info.stage);
|
||||
} else {
|
||||
|
@ -184,6 +199,9 @@ nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer)
|
|||
nir_foreach_shader_in_variable(var, consumer) {
|
||||
for (unsigned i = 0; i < get_num_components(var); i++) {
|
||||
if (var->data.patch) {
|
||||
if (is_non_generic_patch_var(var))
|
||||
continue;
|
||||
|
||||
patches_read[var->data.location_frac + i] |=
|
||||
get_variable_io_mask(var, consumer->info.stage);
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue