[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