Module: Mesa
Branch: main
Commit: 57acffbba8f539f5d2815f8cfa4f843ea400568b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=57acffbba8f539f5d2815f8cfa4f843ea400568b

Author: Timothy Arceri <[email protected]>
Date:   Fri Oct  6 12:57:19 2023 +1100

glsl: remove GLSL IR lower_named_interface_blocks()

We now use a NIR based lowering pass instead.

Acked-by: Marek Olšák <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26001>

---

 src/compiler/glsl/ir_optimization.h                |   1 -
 src/compiler/glsl/lower_named_interface_blocks.cpp | 323 ---------------------
 src/compiler/glsl/meson.build                      |   1 -
 3 files changed, 325 deletions(-)

diff --git a/src/compiler/glsl/ir_optimization.h 
b/src/compiler/glsl/ir_optimization.h
index d768ac0a3d2..b2ced464a22 100644
--- a/src/compiler/glsl/ir_optimization.h
+++ b/src/compiler/glsl/ir_optimization.h
@@ -61,7 +61,6 @@ bool lower_packing_builtins(exec_list *instructions,
                             bool has_gpu_shader5,
                             bool has_half_float_packing);
 bool lower_vector_derefs(gl_linked_shader *shader);
-void lower_named_interface_blocks(void *mem_ctx, gl_linked_shader *shader);
 void optimize_dead_builtin_variables(exec_list *instructions,
                                      enum ir_variable_mode other);
 
diff --git a/src/compiler/glsl/lower_named_interface_blocks.cpp 
b/src/compiler/glsl/lower_named_interface_blocks.cpp
deleted file mode 100644
index 5da38935767..00000000000
--- a/src/compiler/glsl/lower_named_interface_blocks.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (c) 2013 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * \file lower_named_interface_blocks.cpp
- *
- * This lowering pass converts all interface blocks with instance names
- * into interface blocks without an instance name.
- *
- * For example, the following shader:
- *
- *   out block {
- *     float block_var;
- *   } inst_name;
- *
- *   main()
- *   {
- *     inst_name.block_var = 0.0;
- *   }
- *
- * Is rewritten to:
- *
- *   out block {
- *     float block_var;
- *   };
- *
- *   main()
- *   {
- *     block_var = 0.0;
- *   }
- *
- * This takes place after the shader code has already been verified with
- * the interface name in place.
- *
- * The linking phase will use the interface block name rather than the
- * interface's instance name when linking interfaces.
- *
- * This modification to the ir allows our currently existing dead code
- * elimination to work with interface blocks without changes.
- */
-
-#include "glsl_symbol_table.h"
-#include "ir.h"
-#include "ir_optimization.h"
-#include "ir_rvalue_visitor.h"
-#include "util/hash_table.h"
-#include "main/shader_types.h"
-
-static const glsl_type *
-process_array_type(const glsl_type *type, unsigned idx)
-{
-   const glsl_type *element_type = type->fields.array;
-   if (element_type->is_array()) {
-      const glsl_type *new_array_type = process_array_type(element_type, idx);
-      return glsl_type::get_array_instance(new_array_type, type->length);
-   } else {
-      return glsl_type::get_array_instance(
-         element_type->fields.structure[idx].type, type->length);
-   }
-}
-
-static ir_rvalue *
-process_array_ir(void * const mem_ctx,
-                 ir_dereference_array *deref_array_prev,
-                 ir_rvalue *deref_var)
-{
-   ir_dereference_array *deref_array =
-      deref_array_prev->array->as_dereference_array();
-
-   if (deref_array == NULL) {
-      return new(mem_ctx) ir_dereference_array(deref_var,
-                                               deref_array_prev->array_index);
-   } else {
-      deref_array = (ir_dereference_array *) process_array_ir(mem_ctx,
-                                                              deref_array,
-                                                              deref_var);
-      return new(mem_ctx) ir_dereference_array(deref_array,
-                                               deref_array_prev->array_index);
-   }
-}
-
-namespace {
-
-class flatten_named_interface_blocks_declarations : public ir_rvalue_visitor
-{
-public:
-   void * const mem_ctx;
-   hash_table *interface_namespace;
-
-   flatten_named_interface_blocks_declarations(void *mem_ctx)
-      : mem_ctx(mem_ctx),
-        interface_namespace(NULL)
-   {
-   }
-
-   void run(exec_list *instructions);
-
-   virtual ir_visitor_status visit_leave(ir_assignment *);
-   virtual ir_visitor_status visit_leave(ir_expression *);
-   virtual void handle_rvalue(ir_rvalue **rvalue);
-};
-
-} /* anonymous namespace */
-
-void
-flatten_named_interface_blocks_declarations::run(exec_list *instructions)
-{
-   interface_namespace = _mesa_hash_table_create(NULL, _mesa_hash_string,
-                                                 _mesa_key_string_equal);
-
-   /* First pass: adjust instance block variables with an instance name
-    * to not have an instance name.
-    *
-    * The interface block variables are stored in the interface_namespace
-    * hash table so they can be used in the second pass.
-    */
-   foreach_in_list_safe(ir_instruction, node, instructions) {
-      ir_variable *var = node->as_variable();
-      if (!var || !var->is_interface_instance())
-         continue;
-
-      /* It should be possible to handle uniforms during this pass,
-       * but, this will require changes to the other uniform block
-       * support code.
-       */
-      if (var->data.mode == ir_var_uniform ||
-          var->data.mode == ir_var_shader_storage)
-         continue;
-
-      const glsl_type * iface_t = var->type->without_array();
-      exec_node *insert_pos = var;
-
-      assert (iface_t->is_interface());
-
-      for (unsigned i = 0; i < iface_t->length; i++) {
-         const char * field_name = iface_t->fields.structure[i].name;
-         char *iface_field_name =
-            ralloc_asprintf(mem_ctx, "%s %s.%s.%s",
-                            var->data.mode == ir_var_shader_in ? "in" : "out",
-                            glsl_get_type_name(iface_t), var->name, 
field_name);
-
-         hash_entry *entry = _mesa_hash_table_search(interface_namespace,
-                                                     iface_field_name);
-         ir_variable *found_var = entry ? (ir_variable *) entry->data : NULL;
-         if (!found_var) {
-            ir_variable *new_var;
-            char *var_name =
-               ralloc_strdup(mem_ctx, iface_t->fields.structure[i].name);
-            if (!var->type->is_array()) {
-               new_var =
-                  new(mem_ctx) ir_variable(iface_t->fields.structure[i].type,
-                                           var_name,
-                                           (ir_variable_mode) var->data.mode);
-            } else {
-               const glsl_type *new_array_type =
-                  process_array_type(var->type, i);
-               new_var =
-                  new(mem_ctx) ir_variable(new_array_type,
-                                           var_name,
-                                           (ir_variable_mode) var->data.mode);
-            }
-            new_var->data.location = iface_t->fields.structure[i].location;
-            new_var->data.location_frac =
-               iface_t->fields.structure[i].component >= 0 ?
-                  iface_t->fields.structure[i].component : 0;
-            new_var->data.explicit_location = (new_var->data.location >= 0);
-            new_var->data.explicit_component =
-               (iface_t->fields.structure[i].component >= 0);
-            new_var->data.offset = iface_t->fields.structure[i].offset;
-            new_var->data.explicit_xfb_offset =
-               (iface_t->fields.structure[i].offset >= 0);
-            new_var->data.xfb_buffer =
-               iface_t->fields.structure[i].xfb_buffer;
-            new_var->data.explicit_xfb_buffer =
-               iface_t->fields.structure[i].explicit_xfb_buffer;
-            new_var->data.interpolation =
-               iface_t->fields.structure[i].interpolation;
-            new_var->data.centroid = iface_t->fields.structure[i].centroid;
-            new_var->data.sample = iface_t->fields.structure[i].sample;
-            new_var->data.patch = iface_t->fields.structure[i].patch;
-            new_var->data.stream = var->data.stream;
-            new_var->data.how_declared = var->data.how_declared;
-            new_var->data.from_named_ifc_block = 1;
-
-            new_var->init_interface_type(var->type);
-            _mesa_hash_table_insert(interface_namespace, iface_field_name,
-                                    new_var);
-            insert_pos->insert_after(new_var);
-            insert_pos = new_var;
-         }
-      }
-      var->remove();
-   }
-
-   /* Second pass: visit all ir_dereference_record instances, and if they
-    * reference an interface block, then flatten the refererence out.
-    */
-   visit_list_elements(this, instructions);
-   _mesa_hash_table_destroy(interface_namespace, NULL);
-   interface_namespace = NULL;
-}
-
-ir_visitor_status
-flatten_named_interface_blocks_declarations::visit_leave(ir_assignment *ir)
-{
-   ir_dereference_record *lhs_rec = ir->lhs->as_dereference_record();
-
-   ir_variable *lhs_var =  ir->lhs->variable_referenced();
-   if (lhs_var && lhs_var->get_interface_type()) {
-      lhs_var->data.assigned = 1;
-   }
-
-   if (lhs_rec) {
-      ir_rvalue *lhs_rec_tmp = lhs_rec;
-      handle_rvalue(&lhs_rec_tmp);
-      if (lhs_rec_tmp != lhs_rec) {
-         ir->set_lhs(lhs_rec_tmp);
-      }
-
-      ir_variable *lhs_var =  lhs_rec_tmp->variable_referenced();
-      if (lhs_var) {
-         lhs_var->data.assigned = 1;
-      }
-   }
-   return rvalue_visit(ir);
-}
-
-ir_visitor_status
-flatten_named_interface_blocks_declarations::visit_leave(ir_expression *ir)
-{
-   ir_visitor_status status = rvalue_visit(ir);
-
-   if (ir->operation == ir_unop_interpolate_at_centroid ||
-       ir->operation == ir_binop_interpolate_at_offset ||
-       ir->operation == ir_binop_interpolate_at_sample) {
-      const ir_rvalue *val = ir->operands[0];
-
-      /* This disables varying packing for this input. */
-      val->variable_referenced()->data.must_be_shader_input = 1;
-   }
-
-   return status;
-}
-
-void
-flatten_named_interface_blocks_declarations::handle_rvalue(ir_rvalue **rvalue)
-{
-   if (*rvalue == NULL)
-      return;
-
-   ir_dereference_record *ir = (*rvalue)->as_dereference_record();
-   if (ir == NULL)
-      return;
-
-   ir_variable *var = ir->variable_referenced();
-   if (var == NULL)
-      return;
-
-   if (!var->is_interface_instance())
-      return;
-
-   /* It should be possible to handle uniforms during this pass,
-    * but, this will require changes to the other uniform block
-    * support code.
-    */
-   if (var->data.mode == ir_var_uniform || var->data.mode == 
ir_var_shader_storage)
-      return;
-
-   if (var->get_interface_type() != NULL) {
-      char *iface_field_name =
-         ralloc_asprintf(mem_ctx, "%s %s.%s.%s",
-                         var->data.mode == ir_var_shader_in ? "in" : "out",
-                         glsl_get_type_name(var->get_interface_type()),
-                         var->name,
-                         
ir->record->type->fields.structure[ir->field_idx].name);
-
-      /* Find the variable in the set of flattened interface blocks */
-      hash_entry *entry = _mesa_hash_table_search(interface_namespace,
-                                                  iface_field_name);
-      assert(entry);
-      ir_variable *found_var = (ir_variable *) entry->data;
-
-      ir_dereference_variable *deref_var =
-         new(mem_ctx) ir_dereference_variable(found_var);
-
-      ir_dereference_array *deref_array =
-         ir->record->as_dereference_array();
-      if (deref_array != NULL) {
-         *rvalue = process_array_ir(mem_ctx, deref_array,
-                                    (ir_rvalue *)deref_var);
-      } else {
-         *rvalue = deref_var;
-      }
-   }
-}
-
-void
-lower_named_interface_blocks(void *mem_ctx, gl_linked_shader *shader)
-{
-   flatten_named_interface_blocks_declarations v_decl(mem_ctx);
-   v_decl.run(shader->ir);
-}
-
diff --git a/src/compiler/glsl/meson.build b/src/compiler/glsl/meson.build
index ee83c000be4..cdb79ae134e 100644
--- a/src/compiler/glsl/meson.build
+++ b/src/compiler/glsl/meson.build
@@ -200,7 +200,6 @@ files_libglsl = files(
   'lower_instructions.cpp',
   'lower_jumps.cpp',
   'lower_mat_op_to_vec.cpp',
-  'lower_named_interface_blocks.cpp',
   'lower_packing_builtins.cpp',
   'lower_precision.cpp',
   'lower_subroutine.cpp',

Reply via email to