From 93b975a1d9fcc4a10987676f7368809522f27d71 Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 3 Feb 2007 17:24:24 -0700 Subject: 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))" --- src/mesa/shader/slang/slang_typeinfo.c | 45 ++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'src/mesa/shader/slang/slang_typeinfo.c') 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: { -- cgit v1.2.3