glsl2: Add support for non-float constants in Mesa IR.
Fixes glsl-vs-vec4-indexing-4.
This commit is contained in:
@@ -980,22 +980,41 @@ void
|
|||||||
ir_to_mesa_visitor::visit(ir_constant *ir)
|
ir_to_mesa_visitor::visit(ir_constant *ir)
|
||||||
{
|
{
|
||||||
ir_to_mesa_src_reg src_reg;
|
ir_to_mesa_src_reg src_reg;
|
||||||
|
GLfloat stack_vals[4];
|
||||||
|
GLfloat *values = stack_vals;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
assert(ir->type->base_type == GLSL_TYPE_FLOAT ||
|
if (ir->type->is_matrix() || ir->type->is_array()) {
|
||||||
ir->type->base_type == GLSL_TYPE_UINT ||
|
assert(!"FINISHME: array/matrix constants");
|
||||||
ir->type->base_type == GLSL_TYPE_INT ||
|
|
||||||
ir->type->base_type == GLSL_TYPE_BOOL);
|
|
||||||
|
|
||||||
if (ir->type->base_type == GLSL_TYPE_FLOAT &&
|
|
||||||
!ir->type->is_matrix() && !ir->type->is_array()) {
|
|
||||||
src_reg.file = PROGRAM_CONSTANT;
|
|
||||||
src_reg.index =
|
|
||||||
_mesa_add_unnamed_constant(this->prog->Parameters,
|
|
||||||
&ir->value.f[0], ir->type->vector_elements,
|
|
||||||
&src_reg.swizzle);
|
|
||||||
} else {
|
|
||||||
assert(!"FINISHME: non-float constants");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
src_reg.file = PROGRAM_CONSTANT;
|
||||||
|
switch (ir->type->base_type) {
|
||||||
|
case GLSL_TYPE_FLOAT:
|
||||||
|
values = &ir->value.f[0];
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_UINT:
|
||||||
|
for (i = 0; i < ir->type->vector_elements; i++) {
|
||||||
|
values[i] = ir->value.u[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_INT:
|
||||||
|
for (i = 0; i < ir->type->vector_elements; i++) {
|
||||||
|
values[i] = ir->value.i[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GLSL_TYPE_BOOL:
|
||||||
|
for (i = 0; i < ir->type->vector_elements; i++) {
|
||||||
|
values[i] = ir->value.b[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(!"Non-float/uint/int/bool constant");
|
||||||
|
}
|
||||||
|
|
||||||
|
src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters,
|
||||||
|
values, ir->type->vector_elements,
|
||||||
|
&src_reg.swizzle);
|
||||||
src_reg.reladdr = false;
|
src_reg.reladdr = false;
|
||||||
src_reg.negate = 0;
|
src_reg.negate = 0;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user