For that, we use gls_symbol_table::set_default_precision_qualifier() that
can update an existing definition or add a new one if it doesn't exist.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97804
Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com>
---
 src/compiler/glsl/ast_to_hir.cpp        |  2 +-
 src/compiler/glsl/glsl_symbol_table.cpp | 15 +++++++++++++++
 src/compiler/glsl/glsl_symbol_table.h   |  2 ++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
index 6e2f253..cc50ff8 100644
--- a/src/compiler/glsl/ast_to_hir.cpp
+++ b/src/compiler/glsl/ast_to_hir.cpp
@@ -6559,7 +6559,7 @@ ast_type_specifier::hir(exec_list *instructions,
           * is a slight abuse of the symbol table, but it has the semantics
           * that we want.
           */
-         state->symbols->add_default_precision_qualifier(this->type_name,
+         state->symbols->set_default_precision_qualifier(this->type_name,
                                                          
this->default_precision);
       }
 
diff --git a/src/compiler/glsl/glsl_symbol_table.cpp 
b/src/compiler/glsl/glsl_symbol_table.cpp
index 6d7baad..11e5c00 100644
--- a/src/compiler/glsl/glsl_symbol_table.cpp
+++ b/src/compiler/glsl/glsl_symbol_table.cpp
@@ -258,6 +258,21 @@ int 
glsl_symbol_table::get_default_precision_qualifier(const char *type_name)
    return entry->a->default_precision;
 }
 
+bool glsl_symbol_table::set_default_precision_qualifier(const char *type_name,
+                                                        int precision)
+{
+   char *name = ralloc_asprintf(mem_ctx, "#default_precision_%s", type_name);
+   symbol_table_entry *entry = get_entry(name);
+   if (!entry)
+      return add_default_precision_qualifier(type_name, precision);
+
+   ast_type_specifier *default_specifier = new(mem_ctx) 
ast_type_specifier(name);
+   default_specifier->default_precision = precision;
+
+   entry = new(mem_ctx) symbol_table_entry(default_specifier);
+   return _mesa_symbol_table_replace_symbol(table, -1, name, entry) == 0;
+}
+
 symbol_table_entry *glsl_symbol_table::get_entry(const char *name)
 {
    return (symbol_table_entry *)
diff --git a/src/compiler/glsl/glsl_symbol_table.h 
b/src/compiler/glsl/glsl_symbol_table.h
index 2f94d4c..69a6912 100644
--- a/src/compiler/glsl/glsl_symbol_table.h
+++ b/src/compiler/glsl/glsl_symbol_table.h
@@ -90,6 +90,8 @@ struct glsl_symbol_table {
    const glsl_type *get_interface(const char *name,
                                   enum ir_variable_mode mode);
    int get_default_precision_qualifier(const char *type_name);
+   bool set_default_precision_qualifier(const char *type_name, int precision);
+
    /*@}*/
 
    /**
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to