From 3ef6b27bded978d6f1c32dd682082964b480d3cd Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 1 Dec 2022 11:17:04 -0800 Subject: [PATCH] nir: fix nir_link_varying_precision link_varyings ignores precisions and can assign the same location to variables with different precisions. nir_link_varying_precision should check location_frac as well. Cc: mesa-stable Part-of: (cherry picked from commit 7244d885164aa59ca136358d256a0078b24a455d) --- .pick_status.json | 2 +- src/compiler/nir/nir_linking_helpers.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index bed66e0841c..91541082120 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3550,7 +3550,7 @@ "description": "nir: fix nir_link_varying_precision", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index 4a607b1c614..fa737835855 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -1322,6 +1322,18 @@ nir_link_precision(unsigned producer, unsigned consumer, bool fs) return fs ? MAX2(producer, consumer) : consumer; } +static nir_variable * +find_consumer_variable(const nir_shader *consumer, + const nir_variable *producer_var) +{ + nir_foreach_variable_with_modes(var, consumer, nir_var_shader_in) { + if (var->data.location == producer_var->data.location && + var->data.location_frac == producer_var->data.location_frac) + return var; + } + return NULL; +} + void nir_link_varying_precision(nir_shader *producer, nir_shader *consumer) { @@ -1332,8 +1344,8 @@ nir_link_varying_precision(nir_shader *producer, nir_shader *consumer) if (producer_var->data.location < 0) continue; - nir_variable *consumer_var = nir_find_variable_with_location(consumer, - nir_var_shader_in, producer_var->data.location); + nir_variable *consumer_var = find_consumer_variable(consumer, + producer_var); /* Skip if the variable will be eliminated */ if (!consumer_var)