nir: Use a single list for all shader variables
[mesa.git] / src / compiler / glsl / ir_builder_print_visitor.cpp
index d7bba9b81a2d05a1eff14f70368a2f3576c2f192..5ab50a58415ff8d560ec03ffc8364d7fda8fa802 100644 (file)
@@ -21,6 +21,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
+#include <inttypes.h> /* for PRIx64 macro */
 #include "ir.h"
 #include "ir_hierarchical_visitor.h"
 #include "ir_builder_print_visitor.h"
@@ -28,6 +29,7 @@
 #include "glsl_parser_extras.h"
 #include "main/macros.h"
 #include "util/hash_table.h"
+#include "util/u_string.h"
 
 class ir_builder_print_visitor : public ir_hierarchical_visitor {
 public:
@@ -58,6 +60,8 @@ public:
    virtual ir_visitor_status visit_leave(class ir_swizzle *);
    virtual ir_visitor_status visit_leave(class ir_return *);
 
+   virtual ir_visitor_status visit_enter(ir_texture *ir);
+
 private:
    void print_with_indent(const char *fmt, ...);
    void print_without_indent(const char *fmt, ...);
@@ -116,7 +120,7 @@ is_simple_operand(const ir_rvalue *ir, unsigned depth = 1)
    case ir_type_expression: {
       const ir_expression *expr = (ir_expression *) ir;
 
-      for (unsigned i = 0; i < expr->get_num_operands(); i++) {
+      for (unsigned i = 0; i < expr->num_operands; i++) {
          if (!is_simple_operand(expr->operands[i], depth - 1))
             return false;
       }
@@ -139,8 +143,7 @@ _mesa_print_builder_for_ir(FILE *f, exec_list *instructions)
 ir_builder_print_visitor::ir_builder_print_visitor(FILE *f)
    : next_ir_index(1), f(f), indentation(0)
 {
-   index_map =
-      _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
+   index_map = _mesa_pointer_hash_table_create(NULL);
 }
 
 ir_builder_print_visitor::~ir_builder_print_visitor()
@@ -371,17 +374,17 @@ ir_builder_print_visitor::visit(ir_constant *ir)
          switch (ir->type->base_type) {
          case GLSL_TYPE_UINT:
             if (ir->value.u[i] != 0)
-               print_without_indent("r%04X_data.u[%u] = %u;\n",
+               print_with_indent("r%04X_data.u[%u] = %u;\n",
                                     my_index, i, ir->value.u[i]);
             break;
          case GLSL_TYPE_INT:
             if (ir->value.i[i] != 0)
-               print_without_indent("r%04X_data.i[%u] = %i;\n",
+               print_with_indent("r%04X_data.i[%u] = %i;\n",
                                     my_index, i, ir->value.i[i]);
             break;
          case GLSL_TYPE_FLOAT:
             if (ir->value.u[i] != 0)
-               print_without_indent("r%04X_data.u[%u] = 0x%08x; /* %f */\n",
+               print_with_indent("r%04X_data.u[%u] = 0x%08x; /* %f */\n",
                                     my_index,
                                     i,
                                     ir->value.u[i],
@@ -394,16 +397,27 @@ ir_builder_print_visitor::visit(ir_constant *ir)
 
             memcpy(&v, &ir->value.d[i], sizeof(v));
             if (v != 0)
-               /* FIXME: This won't actually work until ARB_gpu_shader_int64
-                * support lands.
-                */
-               print_without_indent("r%04X_data.u64[%u] = 0x%016" PRIx64 "; /* %g */\n",
+               print_with_indent("r%04X_data.u64[%u] = 0x%016" PRIx64 "; /* %g */\n",
                                     my_index, i, v, ir->value.d[i]);
             break;
          }
+         case GLSL_TYPE_UINT64:
+            if (ir->value.u64[i] != 0)
+               print_with_indent("r%04X_data.u64[%u] = %" PRIu64 ";\n",
+                                    my_index,
+                                    i,
+                                    ir->value.u64[i]);
+            break;
+         case GLSL_TYPE_INT64:
+            if (ir->value.i64[i] != 0)
+               print_with_indent("r%04X_data.i64[%u] = %" PRId64 ";\n",
+                                    my_index,
+                                    i,
+                                    ir->value.i64[i]);
+            break;
          case GLSL_TYPE_BOOL:
             if (ir->value.u[i] != 0)
-               print_without_indent("r%04X_data.u[%u] = 1;\n", my_index, i);
+               print_with_indent("r%04X_data.u[%u] = 1;\n", my_index, i);
             break;
          default:
             unreachable("Invalid constant type");
@@ -433,6 +447,7 @@ ir_builder_print_visitor::print_without_declaration(const ir_swizzle *ir)
          print_without_declaration(ir->val);
          print_without_indent(")");
       } else {
+         assert(he);
          print_without_indent("swizzle_%c(r%04X)",
                               swiz[ir->mask.x],
                               (unsigned)(uintptr_t) he->data);
@@ -440,6 +455,7 @@ ir_builder_print_visitor::print_without_declaration(const ir_swizzle *ir)
    } else {
       static const char swiz[4] = { 'X', 'Y', 'Z', 'W' };
 
+      assert(he);
       print_without_indent("swizzle(r%04X, MAKE_SWIZZLE4(SWIZZLE_%c, SWIZZLE_%c, SWIZZLE_%c, SWIZZLE_%c), %u)",
                            (unsigned)(uintptr_t) he->data,
                            swiz[ir->mask.x],
@@ -473,7 +489,7 @@ ir_builder_print_visitor::visit_enter(ir_assignment *ir)
       return visit_continue;
 
    if (rhs_expr != NULL) {
-      const unsigned num_op = rhs_expr->get_num_operands();
+      const unsigned num_op = rhs_expr->num_operands;
 
       for (unsigned i = 0; i < num_op; i++) {
          if (is_simple_operand(rhs_expr->operands[i]))
@@ -514,6 +530,7 @@ ir_builder_print_visitor::visit_leave(ir_assignment *ir)
       _mesa_hash_table_search(index_map, ir->rhs);
 
    assert(ir->condition == NULL);
+   assert(ir->lhs && ir->rhs);
 
    print_with_indent("body.emit(assign(r%04X, r%04X, 0x%02x));\n\n",
                      (unsigned)(uintptr_t) he_lhs->data,
@@ -526,7 +543,7 @@ ir_builder_print_visitor::visit_leave(ir_assignment *ir)
 void
 ir_builder_print_visitor::print_without_declaration(const ir_expression *ir)
 {
-   const unsigned num_op = ir->get_num_operands();
+   const unsigned num_op = ir->num_operands;
 
    static const char *const arity[] = {
       "", "unop", "binop", "triop", "quadop"
@@ -539,8 +556,6 @@ ir_builder_print_visitor::print_without_declaration(const ir_expression *ir)
    case ir_binop_mul:
    case ir_binop_imul_high:
    case ir_binop_less:
-   case ir_binop_greater:
-   case ir_binop_lequal:
    case ir_binop_gequal:
    case ir_binop_equal:
    case ir_binop_nequal:
@@ -582,7 +597,7 @@ ir_builder_print_visitor::print_without_declaration(const ir_expression *ir)
 ir_visitor_status
 ir_builder_print_visitor::visit_enter(ir_expression *ir)
 {
-   const unsigned num_op = ir->get_num_operands();
+   const unsigned num_op = ir->num_operands;
 
    for (unsigned i = 0; i < num_op; i++) {
       if (is_simple_operand(ir->operands[i]))
@@ -630,7 +645,7 @@ ir_builder_print_visitor::visit_enter(ir_if *ir)
    if (s != visit_continue_with_parent) {
       s = visit_list_elements(this, &ir->then_instructions);
       if (s == visit_stop)
-        return s;
+        return s;
    }
 
    print_without_indent("\n");
@@ -672,6 +687,14 @@ ir_builder_print_visitor::visit_leave(ir_return *ir)
    return visit_continue;
 }
 
+ir_visitor_status
+ir_builder_print_visitor::visit_enter(ir_texture *ir)
+{
+   print_with_indent("\nUnsupported IR is encountered: texture functions are not supported. Exiting.\n");
+
+   return visit_stop;
+}
+
 ir_visitor_status
 ir_builder_print_visitor::visit_leave(ir_call *ir)
 {
@@ -696,8 +719,7 @@ ir_builder_print_visitor::visit_leave(ir_call *ir)
          _mesa_hash_table_search(index_map, ir->return_deref);
 
       snprintf(return_deref_string, sizeof(return_deref_string),
-               "operand(r%04X).val",
-               (unsigned)(uintptr_t) he->data);
+               "operand(r%04X).val", (unsigned)(uintptr_t) he->data);
    } else {
       strcpy(return_deref_string, "NULL");
    }