summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2022-12-01 11:17:04 -0800
committerEric Engestrom <eric@engestrom.ch>2022-12-14 20:47:01 +0000
commit3ef6b27bded978d6f1c32dd682082964b480d3cd (patch)
treef0bb520b04f55e302e59a9beddea0db709e8ab1d
parent7b5ba2d3639c6eb79a48645d6a2b9f311b552a86 (diff)
downloadmesa-3ef6b27bded978d6f1c32dd682082964b480d3cd.tar.gz
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20113> (cherry picked from commit 7244d885164aa59ca136358d256a0078b24a455d)
-rw-r--r--.pick_status.json2
-rw-r--r--src/compiler/nir/nir_linking_helpers.c16
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)