compiler/glsl: explicitly store NumUniformBlocks
[mesa.git] / src / compiler / glsl / lower_named_interface_blocks.cpp
index 064694128bf42e351e71024a55452deb9497faf0..01c50932a9a4c17a1e209a77f7a5ab0faa5eb8f2 100644 (file)
@@ -64,6 +64,7 @@
 #include "ir_optimization.h"
 #include "ir_rvalue_visitor.h"
 #include "util/hash_table.h"
+#include "main/mtypes.h"
 
 static const glsl_type *
 process_array_type(const glsl_type *type, unsigned idx)
@@ -115,6 +116,7 @@ public:
    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);
 };
 
@@ -123,7 +125,7 @@ public:
 void
 flatten_named_interface_blocks_declarations::run(exec_list *instructions)
 {
-   interface_namespace = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   interface_namespace = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                                  _mesa_key_string_equal);
 
    /* First pass: adjust instance block variables with an instance name
@@ -238,6 +240,23 @@ flatten_named_interface_blocks_declarations::visit_leave(ir_assignment *ir)
    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)
 {