mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 16:30:10 +01:00
ir_to_mesa: Add support for array constants.
Fixes: glsl1-GLSL 1.20 array constructor 1 glsl1-GLSL 1.20 array constructor 2 glsl1-GLSL 1.20 array.length() glsl1-GLSL 1.20 const array constructor 1 glsl1-GLSL 1.20 const array constructor 2
This commit is contained in:
parent
bf6ad0ab3d
commit
20c074ae28
1 changed files with 31 additions and 17 deletions
|
|
@ -518,19 +518,21 @@ ir_to_mesa_visitor::get_temp(const glsl_type *type)
|
|||
int swizzle[4];
|
||||
int i;
|
||||
|
||||
assert(!type->is_array());
|
||||
|
||||
src_reg.file = PROGRAM_TEMPORARY;
|
||||
src_reg.index = next_temp;
|
||||
src_reg.reladdr = NULL;
|
||||
next_temp += type_size(type);
|
||||
|
||||
for (i = 0; i < type->vector_elements; i++)
|
||||
swizzle[i] = i;
|
||||
for (; i < 4; i++)
|
||||
swizzle[i] = type->vector_elements - 1;
|
||||
src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1],
|
||||
swizzle[2], swizzle[3]);
|
||||
if (type->is_array() || type->is_record()) {
|
||||
src_reg.swizzle = SWIZZLE_NOOP;
|
||||
} else {
|
||||
for (i = 0; i < type->vector_elements; i++)
|
||||
swizzle[i] = i;
|
||||
for (; i < 4; i++)
|
||||
swizzle[i] = type->vector_elements - 1;
|
||||
src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1],
|
||||
swizzle[2], swizzle[3]);
|
||||
}
|
||||
src_reg.negate = 0;
|
||||
|
||||
return src_reg;
|
||||
|
|
@ -1329,8 +1331,6 @@ ir_to_mesa_visitor::visit(ir_assignment *ir)
|
|||
struct ir_to_mesa_src_reg r;
|
||||
int i;
|
||||
|
||||
assert(!ir->lhs->type->is_array());
|
||||
|
||||
ir->rhs->accept(this);
|
||||
r = this->result;
|
||||
|
||||
|
|
@ -1375,12 +1375,6 @@ ir_to_mesa_visitor::visit(ir_constant *ir)
|
|||
GLfloat *values = stack_vals;
|
||||
unsigned int i;
|
||||
|
||||
if (ir->type->is_array()) {
|
||||
ir->print();
|
||||
printf("\n");
|
||||
assert(!"FINISHME: array constants");
|
||||
}
|
||||
|
||||
/* Unfortunately, 4 floats is all we can get into
|
||||
* _mesa_add_unnamed_constant. So, make a temp to store an
|
||||
* aggregate constant and move each constant value into it. If we
|
||||
|
|
@ -1389,7 +1383,6 @@ ir_to_mesa_visitor::visit(ir_constant *ir)
|
|||
|
||||
if (ir->type->base_type == GLSL_TYPE_STRUCT) {
|
||||
ir_to_mesa_src_reg temp_base = get_temp(ir->type);
|
||||
temp_base.swizzle = SWIZZLE_NOOP;
|
||||
ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
|
||||
|
||||
foreach_iter(exec_list_iterator, iter, ir->components) {
|
||||
|
|
@ -1412,6 +1405,27 @@ ir_to_mesa_visitor::visit(ir_constant *ir)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ir->type->is_array()) {
|
||||
ir_to_mesa_src_reg temp_base = get_temp(ir->type);
|
||||
ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
|
||||
int size = type_size(ir->type->fields.array);
|
||||
|
||||
assert(size > 0);
|
||||
|
||||
for (i = 0; i < ir->type->length; i++) {
|
||||
ir->array_elements[i]->accept(this);
|
||||
src_reg = this->result;
|
||||
for (int j = 0; j < size; j++) {
|
||||
ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg);
|
||||
|
||||
src_reg.index++;
|
||||
temp.index++;
|
||||
}
|
||||
}
|
||||
this->result = temp_base;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ir->type->is_matrix()) {
|
||||
ir_to_mesa_src_reg mat = get_temp(ir->type);
|
||||
ir_to_mesa_dst_reg mat_column = ir_to_mesa_dst_reg_from_src(mat);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue