summaryrefslogtreecommitdiff
path: root/src/mesa/shader/slang/slang_typeinfo.c
diff options
context:
space:
mode:
authorBrian <brian@yutani.localnet.net>2007-02-03 17:24:24 -0700
committerBrian <brian@yutani.localnet.net>2007-02-03 17:24:24 -0700
commit93b975a1d9fcc4a10987676f7368809522f27d71 (patch)
treeebf408cfd8fbca10dea39eb594346e4fe03636b9 /src/mesa/shader/slang/slang_typeinfo.c
parent5ee684cba9b1f63090e184125e5890da4fc1d28c (diff)
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))"
Diffstat (limited to 'src/mesa/shader/slang/slang_typeinfo.c')
-rw-r--r--src/mesa/shader/slang/slang_typeinfo.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index 5a3c2eac6b..eef2cb96db 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -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:
{