From 4b06280ea34ce0e2ef9ec36df792c28c3828eabd Mon Sep 17 00:00:00 2001 From: Vadim Girlin Date: Thu, 5 Apr 2012 05:07:03 +0400 Subject: [PATCH] glsl: fix variable ordering in the output_read_remover Use the hash of the variable name instead of the pointer value. Signed-off-by: Vadim Girlin Reviewed-by: Ian Romanick --- src/glsl/lower_output_reads.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/glsl/lower_output_reads.cpp b/src/glsl/lower_output_reads.cpp index 415b541c3ef..90d71b04a1f 100644 --- a/src/glsl/lower_output_reads.cpp +++ b/src/glsl/lower_output_reads.cpp @@ -54,11 +54,27 @@ public: virtual ir_visitor_status visit_leave(class ir_function_signature *); }; +/** + * Hash function for the output variables - computes the hash of the name. + * NOTE: We're using the name string to ensure that the hash doesn't depend + * on any random factors, otherwise the output_read_remover could produce + * the random order of the assignments. + * + * NOTE: If you want to reuse this function please take into account that + * generally the names of the variables are non-unique. + */ +static unsigned +hash_table_var_hash(const void *key) +{ + const ir_variable * var = static_cast(key); + return hash_table_string_hash(var->name); +} + output_read_remover::output_read_remover() { mem_ctx = ralloc_context(NULL); replacements = - hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); + hash_table_ctor(0, hash_table_var_hash, hash_table_pointer_compare); } output_read_remover::~output_read_remover() -- 2.30.2