mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
Add literal_size field to slang_operation.
Used to track the number of components in a float/int/bool literal. Helps with some typechecking things. Fixes problems with calls such as "distance(v2, vec2(1.0, 2.0))"
This commit is contained in:
parent
5ee684cba9
commit
93b975a1d9
6 changed files with 85 additions and 10 deletions
|
|
@ -1040,7 +1040,7 @@ slang_inline_function_call(slang_assemble_ctx * A, slang_function *fun,
|
|||
|
||||
static slang_ir_node *
|
||||
_slang_gen_function_call(slang_assemble_ctx *A, slang_function *fun,
|
||||
slang_operation *oper, slang_operation *dest)
|
||||
slang_operation *oper, slang_operation *dest)
|
||||
{
|
||||
slang_ir_node *n;
|
||||
slang_operation *inlined;
|
||||
|
|
@ -1694,6 +1694,7 @@ _slang_gen_logical_and(slang_assemble_ctx *A, slang_operation *oper)
|
|||
slang_operation_copy(&select->children[1], &oper->children[1]);
|
||||
select->children[2].type = slang_oper_literal_bool;
|
||||
ASSIGN_4V(select->children[2].literal, 0, 0, 0, 0);
|
||||
select->children[2].literal_size = 2;
|
||||
|
||||
n = _slang_gen_select(A, select);
|
||||
|
||||
|
|
@ -1724,6 +1725,7 @@ _slang_gen_logical_or(slang_assemble_ctx *A, slang_operation *oper)
|
|||
select->children[1].type = slang_oper_literal_bool;
|
||||
ASSIGN_4V(select->children[2].literal, 1, 1, 1, 1);
|
||||
slang_operation_copy(&select->children[2], &oper->children[1]);
|
||||
select->children[2].literal_size = 2;
|
||||
|
||||
n = _slang_gen_select(A, select);
|
||||
|
||||
|
|
@ -1867,9 +1869,19 @@ _slang_gen_declaration(slang_assemble_ctx *A, slang_operation *oper)
|
|||
if (!var) {
|
||||
RETURN_ERROR2("Undefined variable:", varName, 0);
|
||||
}
|
||||
#if 0
|
||||
/* XXX make copy of this initializer? */
|
||||
{
|
||||
slang_operation dup;
|
||||
slang_operation_construct(&dup);
|
||||
slang_operation_copy(&dup, v->initializer);
|
||||
_slang_simplify(&dup, &A->space, A->atoms);
|
||||
rhs = _slang_gen_operation(A, &dup);
|
||||
}
|
||||
#else
|
||||
_slang_simplify(v->initializer, &A->space, A->atoms);
|
||||
rhs = _slang_gen_operation(A, v->initializer);
|
||||
#endif
|
||||
assert(rhs);
|
||||
init = new_node(IR_MOVE, var, rhs);
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1029,6 +1029,7 @@ parse_expression(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
op->literal[1] =
|
||||
op->literal[2] =
|
||||
op->literal[3] = (GLfloat) number;
|
||||
op->literal_size = 1;
|
||||
break;
|
||||
case OP_PUSH_INT:
|
||||
op->type = slang_oper_literal_int;
|
||||
|
|
@ -1038,6 +1039,7 @@ parse_expression(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
op->literal[1] =
|
||||
op->literal[2] =
|
||||
op->literal[3] = (GLfloat) number;
|
||||
op->literal_size = 1;
|
||||
break;
|
||||
case OP_PUSH_FLOAT:
|
||||
op->type = slang_oper_literal_float;
|
||||
|
|
@ -1046,6 +1048,7 @@ parse_expression(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
op->literal[1] =
|
||||
op->literal[2] =
|
||||
op->literal[3] = op->literal[0];
|
||||
op->literal_size = 1;
|
||||
break;
|
||||
case OP_PUSH_IDENTIFIER:
|
||||
op->type = slang_oper_identifier;
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ slang_operation_destruct(slang_operation * oper)
|
|||
for (i = 0; i < oper->num_children; i++)
|
||||
slang_operation_destruct(oper->children + i);
|
||||
slang_alloc_free(oper->children);
|
||||
/*#define FREE_MEMORY*/
|
||||
#ifdef FREE_MEMORY
|
||||
/* XXX revisit and fix memory coruption here ! */
|
||||
slang_variable_scope_destruct(oper->locals);
|
||||
|
|
@ -106,6 +107,7 @@ slang_operation_copy(slang_operation * x, const slang_operation * y)
|
|||
z.literal[1] = y->literal[1];
|
||||
z.literal[2] = y->literal[2];
|
||||
z.literal[3] = y->literal[3];
|
||||
z.literal_size = y->literal_size;
|
||||
z.a_id = y->a_id;
|
||||
if (y->locals) {
|
||||
if (!slang_variable_scope_copy(z.locals, y->locals)) {
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ typedef struct slang_operation_
|
|||
struct slang_operation_ *children;
|
||||
GLuint num_children;
|
||||
GLfloat literal[4]; /**< Used for float, int and bool values */
|
||||
GLuint literal_size; /**< 1, 2, 3, or 4 */
|
||||
slang_atom a_id; /**< type: asm, identifier, call, field */
|
||||
slang_variable_scope *locals; /**< local vars for scope */
|
||||
struct slang_function_ *fun; /**< If type == slang_oper_call */
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ _slang_simplify(slang_operation *oper,
|
|||
isBool[i] = (oper->children[i].type == slang_oper_literal_bool);
|
||||
}
|
||||
|
||||
if (n == 2 && isFloat[0] && isFloat[1]) {
|
||||
if (oper->num_children == 2 && isFloat[0] && isFloat[1]) {
|
||||
/* probably simple arithmetic */
|
||||
switch (oper->type) {
|
||||
case slang_oper_add:
|
||||
|
|
@ -131,6 +131,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[i]
|
||||
= oper->children[0].literal[i] + oper->children[1].literal[i];
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -139,6 +140,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[i]
|
||||
= oper->children[0].literal[i] - oper->children[1].literal[i];
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -147,6 +149,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[i]
|
||||
= oper->children[0].literal[i] * oper->children[1].literal[i];
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -155,6 +158,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[i]
|
||||
= oper->children[0].literal[i] / oper->children[1].literal[i];
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -163,17 +167,19 @@ _slang_simplify(slang_operation *oper,
|
|||
}
|
||||
}
|
||||
|
||||
if (n == 1 && isFloat[0]) {
|
||||
if (oper->num_children == 1 && isFloat[0]) {
|
||||
switch (oper->type) {
|
||||
case slang_oper_minus:
|
||||
for (i = 0; i < 4; i++) {
|
||||
oper->literal[i] = -oper->children[0].literal[i];
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
case slang_oper_plus:
|
||||
COPY_4V(oper->literal, oper->children[0].literal);
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -182,7 +188,7 @@ _slang_simplify(slang_operation *oper,
|
|||
}
|
||||
}
|
||||
|
||||
if (n == 2 && isBool[0] && isBool[1]) {
|
||||
if (oper->num_children == 2 && isBool[0] && isBool[1]) {
|
||||
/* simple boolean expression */
|
||||
switch (oper->type) {
|
||||
case slang_oper_logicaland:
|
||||
|
|
@ -191,6 +197,7 @@ _slang_simplify(slang_operation *oper,
|
|||
const GLint b = oper->children[1].literal[i] ? 1 : 0;
|
||||
oper->literal[i] = (GLfloat) (a && b);
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_bool;
|
||||
return;
|
||||
|
|
@ -200,6 +207,7 @@ _slang_simplify(slang_operation *oper,
|
|||
const GLint b = oper->children[1].literal[i] ? 1 : 0;
|
||||
oper->literal[i] = (GLfloat) (a || b);
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_bool;
|
||||
return;
|
||||
|
|
@ -209,6 +217,7 @@ _slang_simplify(slang_operation *oper,
|
|||
const GLint b = oper->children[1].literal[i] ? 1 : 0;
|
||||
oper->literal[i] = (GLfloat) (a ^ b);
|
||||
}
|
||||
oper->literal_size = oper->children[0].literal_size;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_bool;
|
||||
return;
|
||||
|
|
@ -217,7 +226,8 @@ _slang_simplify(slang_operation *oper,
|
|||
}
|
||||
}
|
||||
|
||||
if (n == 4 && isFloat[0] && isFloat[1] && isFloat[2] && isFloat[3]) {
|
||||
if (oper->num_children == 4
|
||||
&& isFloat[0] && isFloat[1] && isFloat[2] && isFloat[3]) {
|
||||
/* vec4(flt, flt, flt, flt) constructor */
|
||||
if (oper->type == slang_oper_call) {
|
||||
if (strcmp((char *) oper->a_id, "vec4") == 0) {
|
||||
|
|
@ -225,6 +235,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[1] = oper->children[1].literal[0];
|
||||
oper->literal[2] = oper->children[2].literal[0];
|
||||
oper->literal[3] = oper->children[3].literal[0];
|
||||
oper->literal_size = 4;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -232,7 +243,7 @@ _slang_simplify(slang_operation *oper,
|
|||
}
|
||||
}
|
||||
|
||||
if (n == 3 && isFloat[0] && isFloat[1] && isFloat[2]) {
|
||||
if (oper->num_children == 3 && isFloat[0] && isFloat[1] && isFloat[2]) {
|
||||
/* vec3(flt, flt, flt) constructor */
|
||||
if (oper->type == slang_oper_call) {
|
||||
if (strcmp((char *) oper->a_id, "vec3") == 0) {
|
||||
|
|
@ -240,6 +251,7 @@ _slang_simplify(slang_operation *oper,
|
|||
oper->literal[1] = oper->children[1].literal[0];
|
||||
oper->literal[2] = oper->children[2].literal[0];
|
||||
oper->literal[3] = oper->literal[2];
|
||||
oper->literal_size = 3;
|
||||
slang_operation_destruct(oper);
|
||||
oper->type = slang_oper_literal_float;
|
||||
return;
|
||||
|
|
@ -247,16 +259,20 @@ _slang_simplify(slang_operation *oper,
|
|||
}
|
||||
}
|
||||
|
||||
if (n == 2 && isFloat[0] && isFloat[1]) {
|
||||
/* vec4(flt, flt) constructor */
|
||||
if (oper->num_children == 2 && isFloat[0] && isFloat[1]) {
|
||||
/* vec2(flt, flt) constructor */
|
||||
if (oper->type == slang_oper_call) {
|
||||
if (strcmp((char *) oper->a_id, "vec2") == 0) {
|
||||
printf("SIMPLIFY vec2 constructor scope = %p\n",
|
||||
(void*) oper->locals);
|
||||
oper->literal[0] = oper->children[0].literal[0];
|
||||
oper->literal[1] = oper->children[1].literal[0];
|
||||
oper->literal[2] = oper->literal[1];
|
||||
oper->literal[3] = oper->literal[1];
|
||||
oper->literal_size = 2;
|
||||
slang_operation_destruct(oper); /* XXX oper->locals goes NULL! */
|
||||
oper->type = slang_oper_literal_float;
|
||||
assert(oper->num_children == 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -341,6 +341,21 @@ _slang_typeof_operation_(const slang_operation * op,
|
|||
return GL_FALSE;
|
||||
break;
|
||||
case slang_oper_literal_bool:
|
||||
if (op->literal_size == 1)
|
||||
ti->spec.type = slang_spec_bool;
|
||||
else if (op->literal_size == 2)
|
||||
ti->spec.type = slang_spec_bvec2;
|
||||
else if (op->literal_size == 3)
|
||||
ti->spec.type = slang_spec_bvec3;
|
||||
else if (op->literal_size == 4)
|
||||
ti->spec.type = slang_spec_bvec4;
|
||||
else {
|
||||
_mesa_problem(NULL,
|
||||
"Unexpected bool literal_size %d in _slang_typeof_operation()",
|
||||
op->literal_size);
|
||||
ti->spec.type = slang_spec_bool;
|
||||
}
|
||||
break;
|
||||
case slang_oper_logicalor:
|
||||
case slang_oper_logicalxor:
|
||||
case slang_oper_logicaland:
|
||||
|
|
@ -354,10 +369,36 @@ _slang_typeof_operation_(const slang_operation * op,
|
|||
ti->spec.type = slang_spec_bool;
|
||||
break;
|
||||
case slang_oper_literal_int:
|
||||
ti->spec.type = slang_spec_int;
|
||||
if (op->literal_size == 1)
|
||||
ti->spec.type = slang_spec_int;
|
||||
else if (op->literal_size == 2)
|
||||
ti->spec.type = slang_spec_ivec2;
|
||||
else if (op->literal_size == 3)
|
||||
ti->spec.type = slang_spec_ivec3;
|
||||
else if (op->literal_size == 4)
|
||||
ti->spec.type = slang_spec_ivec4;
|
||||
else {
|
||||
_mesa_problem(NULL,
|
||||
"Unexpected int literal_size %d in _slang_typeof_operation()",
|
||||
op->literal_size);
|
||||
ti->spec.type = slang_spec_int;
|
||||
}
|
||||
break;
|
||||
case slang_oper_literal_float:
|
||||
ti->spec.type = slang_spec_float;
|
||||
if (op->literal_size == 1)
|
||||
ti->spec.type = slang_spec_float;
|
||||
else if (op->literal_size == 2)
|
||||
ti->spec.type = slang_spec_vec2;
|
||||
else if (op->literal_size == 3)
|
||||
ti->spec.type = slang_spec_vec3;
|
||||
else if (op->literal_size == 4)
|
||||
ti->spec.type = slang_spec_vec4;
|
||||
else {
|
||||
_mesa_problem(NULL,
|
||||
"Unexpected float literal_size %d in _slang_typeof_operation()",
|
||||
op->literal_size);
|
||||
ti->spec.type = slang_spec_float;
|
||||
}
|
||||
break;
|
||||
case slang_oper_identifier:
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue