[Mesa-dev] [PATCH] gallium glsl: Fix crash with piglit fs-deref-literal-array-of-structs.shader_test

Maarten Lankhorst maarten.lankhorst at canonical.com
Tue Mar 18 08:16:19 PDT 2014


Use the recursive copy from emit_block_mov to allow constant declarations to work.

This allows the following code to work without a weird crash:

struct Foo {
   int value[1];
};

int actual_value = Foo[2](Foo(int[1](100)), Foo(int[1](200)))[i].value[0];

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
---
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 0871dd0..924f333 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -459,7 +459,7 @@ public:
     void merge_registers(void);
     void renumber_registers(void);
  
-   void emit_block_mov(ir_assignment *ir, const struct glsl_type *type,
+   void emit_block_mov(ir_instruction *ir, const struct glsl_type *type,
                         st_dst_reg *l, st_src_reg *r);
  
     void *mem_ctx;
@@ -2289,7 +2289,7 @@ glsl_to_tgsi_visitor::process_move_condition(ir_rvalue *ir)
  }
  
  void
-glsl_to_tgsi_visitor::emit_block_mov(ir_assignment *ir, const struct glsl_type *type,
+glsl_to_tgsi_visitor::emit_block_mov(ir_instruction *ir, const struct glsl_type *type,
                                       st_dst_reg *l, st_src_reg *r)
  {
     if (type->base_type == GLSL_TYPE_STRUCT) {
@@ -2465,10 +2465,7 @@ glsl_to_tgsi_visitor::visit(ir_constant *ir)
           src = this->result;
  
           for (i = 0; i < (unsigned int)size; i++) {
-            emit(ir, TGSI_OPCODE_MOV, temp, src);
-
-            src.index++;
-            temp.index++;
+            emit_block_mov(ir, field_value->type, &temp, &src);
           }
        }
        this->result = temp_base;
@@ -2487,10 +2484,7 @@ glsl_to_tgsi_visitor::visit(ir_constant *ir)
           ir->array_elements[i]->accept(this);
           src = this->result;
           for (int j = 0; j < size; j++) {
-            emit(ir, TGSI_OPCODE_MOV, temp, src);
-
-            src.index++;
-            temp.index++;
+            emit_block_mov(ir, ir->type->fields.array, &temp, &src);
           }
        }
        this->result = temp_base;



More information about the mesa-dev mailing list