summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/Makefile1
-rw-r--r--src/glsl/SConscript1
-rw-r--r--src/glsl/ast_to_hir.cpp34
-rw-r--r--src/glsl/builtin_function.cpp121
-rw-r--r--src/glsl/builtin_types.h3
-rw-r--r--src/glsl/builtins/ir/smoothstep121
-rw-r--r--src/glsl/glsl_lexer.cpp443
-rw-r--r--src/glsl/glsl_lexer.lpp11
-rw-r--r--src/glsl/glsl_types.cpp4
-rw-r--r--src/glsl/glsl_types.h3
-rw-r--r--src/glsl/linker.cpp37
-rw-r--r--src/glsl/s_expression.cpp2
-rw-r--r--src/glsl/s_expression.h1
-rw-r--r--src/glsl/strtod.c56
-rw-r--r--src/glsl/strtod.h43
15 files changed, 452 insertions, 429 deletions
diff --git a/src/glsl/Makefile b/src/glsl/Makefile
index 2674c6ec485..86a577e0aeb 100644
--- a/src/glsl/Makefile
+++ b/src/glsl/Makefile
@@ -16,6 +16,7 @@ GLCPP_SOURCES = \
glcpp/glcpp.c
C_SOURCES = \
+ strtod.c \
$(LIBGLCPP_SOURCES)
CXX_SOURCES = \
diff --git a/src/glsl/SConscript b/src/glsl/SConscript
index b5b1728beef..f179721d527 100644
--- a/src/glsl/SConscript
+++ b/src/glsl/SConscript
@@ -76,6 +76,7 @@ sources = [
'opt_swizzle_swizzle.cpp',
'opt_tree_grafting.cpp',
's_expression.cpp',
+ 'strtod.c',
]
glsl = env.ConvenienceLibrary(
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 1f4972cfca2..741cd19e9d3 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -598,17 +598,15 @@ ir_rvalue *
validate_assignment(struct _mesa_glsl_parse_state *state,
const glsl_type *lhs_type, ir_rvalue *rhs)
{
- const glsl_type *rhs_type = rhs->type;
-
/* If there is already some error in the RHS, just return it. Anything
* else will lead to an avalanche of error message back to the user.
*/
- if (rhs_type->is_error())
+ if (rhs->type->is_error())
return rhs;
/* If the types are identical, the assignment can trivially proceed.
*/
- if (rhs_type == lhs_type)
+ if (rhs->type == lhs_type)
return rhs;
/* If the array element types are the same and the size of the LHS is zero,
@@ -625,8 +623,7 @@ validate_assignment(struct _mesa_glsl_parse_state *state,
/* Check for implicit conversion in GLSL 1.20 */
if (apply_implicit_conversion(lhs_type, rhs, state)) {
- rhs_type = rhs->type;
- if (rhs_type == lhs_type)
+ if (rhs->type == lhs_type)
return rhs;
}
@@ -2242,6 +2239,17 @@ ast_declarator_list::hir(exec_list *instructions,
if (this->type->qualifier.flags.q.constant)
var->read_only = false;
+ /* Never emit code to initialize a uniform.
+ */
+ const glsl_type *initializer_type;
+ if (!this->type->qualifier.flags.q.uniform) {
+ result = do_assignment(&initializer_instructions, state,
+ lhs, rhs,
+ this->get_location());
+ initializer_type = result->type;
+ } else
+ initializer_type = rhs->type;
+
/* If the declared variable is an unsized array, it must inherrit
* its full type from the initializer. A declaration such as
*
@@ -2256,16 +2264,14 @@ ast_declarator_list::hir(exec_list *instructions,
*
* If the declared variable is not an array, the types must
* already match exactly. As a result, the type assignment
- * here can be done unconditionally.
+ * here can be done unconditionally. For non-uniforms the call
+ * to do_assignment can change the type of the initializer (via
+ * the implicit conversion rules). For uniforms the initializer
+ * must be a constant expression, and the type of that expression
+ * was validated above.
*/
- var->type = rhs->type;
+ var->type = initializer_type;
- /* Never emit code to initialize a uniform.
- */
- if (!this->type->qualifier.flags.q.uniform)
- result = do_assignment(&initializer_instructions, state,
- lhs, rhs,
- this->get_location());
var->read_only = temp;
}
}
diff --git a/src/glsl/builtin_function.cpp b/src/glsl/builtin_function.cpp
index 631aeac12ce..1c6d59d5a21 100644
--- a/src/glsl/builtin_function.cpp
+++ b/src/glsl/builtin_function.cpp
@@ -3010,40 +3010,26 @@ static const char builtin_smoothstep[] =
" (declare (in) float edge1)\n"
" (declare (in) float x))\n"
" ((declare () float t)\n"
- "\n"
" (assign (constant bool (1)) (x) (var_ref t)\n"
" (expression float max\n"
" (expression float min\n"
" (expression float / (expression float - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
" (constant float (1.0)))\n"
" (constant float (0.0))))\n"
- " (return (expression float * (var_ref t) (expression float * (var_ref t) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (var_ref t))))))))\n"
- "\n"
+ " (return (expression float * (var_ref t) (expression float * (var_ref t) (expression float - (constant float (3.0)) (expression float * (constant float (2.0)) (var_ref t))))))))\n"
" (signature vec2\n"
" (parameters\n"
" (declare (in) float edge0)\n"
" (declare (in) float edge1)\n"
" (declare (in) vec2 x))\n"
" ((declare () vec2 t)\n"
- " (declare () vec2 retval)\n"
- "\n"
- " (assign (constant bool (1)) (x) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (y) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
+ " (assign (constant bool (1)) (xy) (var_ref t)\n"
+ " (expression vec2 max\n"
+ " (expression vec2 min\n"
+ " (expression vec2 / (expression vec2 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
" (constant float (1.0)))\n"
" (constant float (0.0))))\n"
- " (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))\n"
- " (return (var_ref retval))\n"
- " ))\n"
+ " (return (expression vec2 * (var_ref t) (expression vec2 * (var_ref t) (expression vec2 - (constant float (3.0)) (expression vec2 * (constant float (2.0)) (var_ref t))))))))\n"
"\n"
" (signature vec3\n"
" (parameters\n"
@@ -3051,33 +3037,13 @@ static const char builtin_smoothstep[] =
" (declare (in) float edge1)\n"
" (declare (in) vec3 x))\n"
" ((declare () vec3 t)\n"
- " (declare () vec3 retval)\n"
- "\n"
- " (assign (constant bool (1)) (x) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (y) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (z) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz z (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
+ " (assign (constant bool (1)) (xyz) (var_ref t)\n"
+ " (expression vec3 max\n"
+ " (expression vec3 min\n"
+ " (expression vec3 / (expression vec3 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
" (constant float (1.0)))\n"
" (constant float (0.0))))\n"
- " (assign (constant bool (1)) (z) (var_ref retval) (expression float * (swiz z (var_ref t)) (expression float * (swiz z (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz z (var_ref t)))))))\n"
- " (return (var_ref retval))\n"
- " ))\n"
+ " (return (expression vec3 * (var_ref t) (expression vec3 * (var_ref t) (expression vec3 - (constant float (3.0)) (expression vec3 * (constant float (2.0)) (var_ref t))))))))\n"
"\n"
"\n"
" (signature vec4\n"
@@ -3086,74 +3052,55 @@ static const char builtin_smoothstep[] =
" (declare (in) float edge1)\n"
" (declare (in) vec4 x))\n"
" ((declare () vec4 t)\n"
- " (declare () vec4 retval)\n"
- "\n"
- " (assign (constant bool (1)) (x) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (y) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (z) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz z (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
- " (constant float (1.0)))\n"
- " (constant float (0.0))))\n"
- " (assign (constant bool (1)) (z) (var_ref retval) (expression float * (swiz z (var_ref t)) (expression float * (swiz z (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz z (var_ref t)))))))\n"
- "\n"
- " (assign (constant bool (1)) (w) (var_ref t)\n"
- " (expression float max\n"
- " (expression float min\n"
- " (expression float / (expression float - (swiz w (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
+ " (assign (constant bool (1)) (xyzw) (var_ref t)\n"
+ " (expression vec4 max\n"
+ " (expression vec4 min\n"
+ " (expression vec4 / (expression vec4 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))\n"
" (constant float (1.0)))\n"
" (constant float (0.0))))\n"
- " (assign (constant bool (1)) (w) (var_ref retval) (expression float * (swiz w (var_ref t)) (expression float * (swiz w (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz w (var_ref t)))))))\n"
- " (return (var_ref retval))\n"
- " ))\n"
+ " (return (expression vec4 * (var_ref t) (expression vec4 * (var_ref t) (expression vec4 - (constant float (3.0)) (expression vec4 * (constant float (2.0)) (var_ref t))))))))\n"
"\n"
" (signature vec2\n"
" (parameters\n"
" (declare (in) vec2 edge0)\n"
" (declare (in) vec2 edge1)\n"
" (declare (in) vec2 x))\n"
- " ((return (expression vec2 max\n"
+ " ((declare () vec2 t)\n"
+ " (assign (constant bool (1)) (xy) (var_ref t)\n"
+ " (expression vec2 max\n"
" (expression vec2 min\n"
" (expression vec2 / (expression vec2 - (var_ref x) (var_ref edge0)) (expression vec2 - (var_ref edge1) (var_ref edge0)))\n"
- " (constant vec2 (1.0 1.0)))\n"
- " (constant vec2 (0.0 0.0))))))\n"
+ " (constant float (1.0)))\n"
+ " (constant float (0.0))))\n"
+ " (return (expression vec2 * (var_ref t) (expression vec2 * (var_ref t) (expression vec2 - (constant float (3.0)) (expression vec2 * (constant float (2.0)) (var_ref t))))))))\n"
"\n"
" (signature vec3\n"
" (parameters\n"
" (declare (in) vec3 edge0)\n"
" (declare (in) vec3 edge1)\n"
" (declare (in) vec3 x))\n"
- " ((return (expression vec3 max\n"
+ " ((declare () vec3 t)\n"
+ " (assign (constant bool (1)) (xyz) (var_ref t)\n"
+ " (expression vec3 max\n"
" (expression vec3 min\n"
" (expression vec3 / (expression vec3 - (var_ref x) (var_ref edge0)) (expression vec3 - (var_ref edge1) (var_ref edge0)))\n"
- " (constant vec3 (1.0 1.0 1.0)))\n"
- " (constant vec3 (0.0 0.0 0.0))))))\n"
+ " (constant float (1.0)))\n"
+ " (constant float (0.0))))\n"
+ " (return (expression vec3 * (var_ref t) (expression vec3 * (var_ref t) (expression vec3 - (constant float (3.0)) (expression vec3 * (constant float (2.0)) (var_ref t))))))))\n"
"\n"
" (signature vec4\n"
" (parameters\n"
" (declare (in) vec4 edge0)\n"
" (declare (in) vec4 edge1)\n"
" (declare (in) vec4 x))\n"
- " ((return (expression vec4 max\n"
+ " ((declare () vec4 t)\n"
+ " (assign (constant bool (1)) (xyzw) (var_ref t)\n"
+ " (expression vec4 max\n"
" (expression vec4 min\n"
" (expression vec4 / (expression vec4 - (var_ref x) (var_ref edge0)) (expression vec4 - (var_ref edge1) (var_ref edge0)))\n"
- " (constant vec4 (1.0 1.0 1.0 1.0)))\n"
- " (constant vec4 (0.0 0.0 0.0 0.0))))))\n"
+ " (constant float (1.0)))\n"
+ " (constant float (0.0))))\n"
+ " (return (expression vec4 * (var_ref t) (expression vec4 * (var_ref t) (expression vec4 - (constant float (3.0)) (expression vec4 * (constant float (2.0)) (var_ref t))))))))\n"
"))\n"
"\n"
""
diff --git a/src/glsl/builtin_types.h b/src/glsl/builtin_types.h
index 443ae1606ed..8ccbf6e312f 100644
--- a/src/glsl/builtin_types.h
+++ b/src/glsl/builtin_types.h
@@ -24,10 +24,11 @@
const glsl_type glsl_type::_error_type =
glsl_type(GL_INVALID_ENUM, GLSL_TYPE_ERROR, 0, 0, "");
-const glsl_type glsl_type::void_type =
+const glsl_type glsl_type::_void_type =
glsl_type(GL_INVALID_ENUM, GLSL_TYPE_VOID, 0, 0, "void");
const glsl_type *const glsl_type::error_type = & glsl_type::_error_type;
+const glsl_type *const glsl_type::void_type = & glsl_type::_void_type;
/** \name Core built-in types
*
diff --git a/src/glsl/builtins/ir/smoothstep b/src/glsl/builtins/ir/smoothstep
index 0164219a056..b283f73d8d3 100644
--- a/src/glsl/builtins/ir/smoothstep
+++ b/src/glsl/builtins/ir/smoothstep
@@ -5,40 +5,26 @@
(declare (in) float edge1)
(declare (in) float x))
((declare () float t)
-
(assign (constant bool (1)) (x) (var_ref t)
(expression float max
(expression float min
(expression float / (expression float - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
(constant float (1.0)))
(constant float (0.0))))
- (return (expression float * (var_ref t) (expression float * (var_ref t) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (var_ref t))))))))
-
+ (return (expression float * (var_ref t) (expression float * (var_ref t) (expression float - (constant float (3.0)) (expression float * (constant float (2.0)) (var_ref t))))))))
(signature vec2
(parameters
(declare (in) float edge0)
(declare (in) float edge1)
(declare (in) vec2 x))
((declare () vec2 t)
- (declare () vec2 retval)
-
- (assign (constant bool (1)) (x) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
+ (assign (constant bool (1)) (xy) (var_ref t)
+ (expression vec2 max
+ (expression vec2 min
+ (expression vec2 / (expression vec2 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
(constant float (1.0)))
(constant float (0.0))))
- (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))
-
- (assign (constant bool (1)) (y) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))
- (return (var_ref retval))
- ))
+ (return (expression vec2 * (var_ref t) (expression vec2 * (var_ref t) (expression vec2 - (constant float (3.0)) (expression vec2 * (constant float (2.0)) (var_ref t))))))))
(signature vec3
(parameters
@@ -46,33 +32,13 @@
(declare (in) float edge1)
(declare (in) vec3 x))
((declare () vec3 t)
- (declare () vec3 retval)
-
- (assign (constant bool (1)) (x) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))
-
- (assign (constant bool (1)) (y) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
+ (assign (constant bool (1)) (xyz) (var_ref t)
+ (expression vec3 max
+ (expression vec3 min
+ (expression vec3 / (expression vec3 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
(constant float (1.0)))
(constant float (0.0))))
- (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))
-
- (assign (constant bool (1)) (z) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz z (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (z) (var_ref retval) (expression float * (swiz z (var_ref t)) (expression float * (swiz z (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz z (var_ref t)))))))
- (return (var_ref retval))
- ))
+ (return (expression vec3 * (var_ref t) (expression vec3 * (var_ref t) (expression vec3 - (constant float (3.0)) (expression vec3 * (constant float (2.0)) (var_ref t))))))))
(signature vec4
@@ -81,73 +47,54 @@
(declare (in) float edge1)
(declare (in) vec4 x))
((declare () vec4 t)
- (declare () vec4 retval)
-
- (assign (constant bool (1)) (x) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz x (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (x) (var_ref retval) (expression float * (swiz x (var_ref t)) (expression float * (swiz x (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz x (var_ref t)))))))
-
- (assign (constant bool (1)) (y) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz y (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
+ (assign (constant bool (1)) (xyzw) (var_ref t)
+ (expression vec4 max
+ (expression vec4 min
+ (expression vec4 / (expression vec4 - (var_ref x) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
(constant float (1.0)))
(constant float (0.0))))
- (assign (constant bool (1)) (y) (var_ref retval) (expression float * (swiz y (var_ref t)) (expression float * (swiz y (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz y (var_ref t)))))))
-
- (assign (constant bool (1)) (z) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz z (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (z) (var_ref retval) (expression float * (swiz z (var_ref t)) (expression float * (swiz z (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz z (var_ref t)))))))
-
- (assign (constant bool (1)) (w) (var_ref t)
- (expression float max
- (expression float min
- (expression float / (expression float - (swiz w (var_ref x)) (var_ref edge0)) (expression float - (var_ref edge1) (var_ref edge0)))
- (constant float (1.0)))
- (constant float (0.0))))
- (assign (constant bool (1)) (w) (var_ref retval) (expression float * (swiz w (var_ref t)) (expression float * (swiz w (var_ref t)) (expression float - (constant float (3.000000)) (expression float * (constant float (2.000000)) (swiz w (var_ref t)))))))
- (return (var_ref retval))
- ))
+ (return (expression vec4 * (var_ref t) (expression vec4 * (var_ref t) (expression vec4 - (constant float (3.0)) (expression vec4 * (constant float (2.0)) (var_ref t))))))))
(signature vec2
(parameters
(declare (in) vec2 edge0)
(declare (in) vec2 edge1)
(declare (in) vec2 x))
- ((return (expression vec2 max
+ ((declare () vec2 t)
+ (assign (constant bool (1)) (xy) (var_ref t)
+ (expression vec2 max
(expression vec2 min
(expression vec2 / (expression vec2 - (var_ref x) (var_ref edge0)) (expression vec2 - (var_ref edge1) (var_ref edge0)))
- (constant vec2 (1.0 1.0)))
- (constant vec2 (0.0 0.0))))))
+ (constant float (1.0)))
+ (constant float (0.0))))
+ (return (expression vec2 * (var_ref t) (expression vec2 * (var_ref t) (expression vec2 - (constant float (3.0)) (expression vec2 * (constant float (2.0)) (var_ref t))))))))
(signature vec3
(parameters
(declare (in) vec3 edge0)
(declare (in) vec3 edge1)
(declare (in) vec3 x))
- ((return (expression vec3 max
+ ((declare () vec3 t)
+ (assign (constant bool (1)) (xyz) (var_ref t)
+ (expression vec3 max
(expression vec3 min
(expression vec3 / (expression vec3 - (var_ref x) (var_ref edge0)) (expression vec3 - (var_ref edge1) (var_ref edge0)))
- (constant vec3 (1.0 1.0 1.0)))
- (constant vec3 (0.0 0.0 0.0))))))
+ (constant float (1.0)))
+ (constant float (0.0))))
+ (return (expression vec3 * (var_ref t) (expression vec3 * (var_ref t) (expression vec3 - (constant float (3.0)) (expression vec3 * (constant float (2.0)) (var_ref t))))))))
(signature vec4
(parameters
(declare (in) vec4 edge0)
(declare (in) vec4 edge1)
(declare (in) vec4 x))
- ((return (expression vec4 max
+ ((declare () vec4 t)
+ (assign (constant bool (1)) (xyzw) (var_ref t)
+ (expression vec4 max
(expression vec4 min
(expression vec4 / (expression vec4 - (var_ref x) (var_ref edge0)) (expression vec4 - (var_ref edge1) (var_ref edge0)))
- (constant vec4 (1.0 1.0 1.0 1.0)))
- (constant vec4 (0.0 0.0 0.0 0.0))))))
+ (constant float (1.0)))
+ (constant float (0.0))))
+ (return (expression vec4 * (var_ref t) (expression vec4 * (var_ref t) (expression vec4 - (constant float (3.0)) (expression vec4 * (constant float (2.0)) (var_ref t))))))))
))
diff --git a/src/glsl/glsl_lexer.cpp b/src/glsl/glsl_lexer.cpp
index e3d0a3cfc9d..39c119001fd 100644
--- a/src/glsl/glsl_lexer.cpp
+++ b/src/glsl/glsl_lexer.cpp
@@ -1001,6 +1001,7 @@ static yyconst flex_int16_t yy_chk[1255] =
* DEALINGS IN THE SOFTWARE.
*/
#include <ctype.h>
+#include "strtod.h"
#include "ast.h"
#include "glsl_parser_extras.h"
#include "glsl_parser.h"
@@ -1054,7 +1055,7 @@ static yyconst flex_int16_t yy_chk[1255] =
*/
#define ES yyextra->es_shader
-#line 1058 "glsl_lexer.cpp"
+#line 1059 "glsl_lexer.cpp"
#define INITIAL 0
#define PP 1
@@ -1141,10 +1142,6 @@ int _mesa_glsl_get_lineno (yyscan_t yyscanner );
void _mesa_glsl_set_lineno (int line_number ,yyscan_t yyscanner );
-int _mesa_glsl_get_column (yyscan_t yyscanner );
-
-void _mesa_glsl_set_column (int column_no ,yyscan_t yyscanner );
-
YYSTYPE * _mesa_glsl_get_lval (yyscan_t yyscanner );
void _mesa_glsl_set_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
@@ -1292,10 +1289,10 @@ YY_DECL
register int yy_act;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-#line 94 "glsl_lexer.lpp"
+#line 95 "glsl_lexer.lpp"
-#line 1299 "glsl_lexer.cpp"
+#line 1296 "glsl_lexer.cpp"
yylval = yylval_param;
@@ -1381,7 +1378,7 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
-#line 96 "glsl_lexer.lpp"
+#line 97 "glsl_lexer.lpp"
;
YY_BREAK
/* Preprocessor tokens. */
@@ -1390,17 +1387,17 @@ case 2:
yyg->yy_c_buf_p = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 99 "glsl_lexer.lpp"
+#line 100 "glsl_lexer.lpp"
;
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 100 "glsl_lexer.lpp"
+#line 101 "glsl_lexer.lpp"
{ BEGIN PP; return VERSION; }
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 101 "glsl_lexer.lpp"
+#line 102 "glsl_lexer.lpp"
{ BEGIN PP; return EXTENSION; }
YY_BREAK
case 5:
@@ -1408,7 +1405,7 @@ case 5:
yyg->yy_c_buf_p = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 102 "glsl_lexer.lpp"
+#line 103 "glsl_lexer.lpp"
{
/* Eat characters until the first digit is
* encountered
@@ -1430,7 +1427,7 @@ case 6:
yyg->yy_c_buf_p = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 117 "glsl_lexer.lpp"
+#line 118 "glsl_lexer.lpp"
{
/* Eat characters until the first digit is
* encountered
@@ -1448,7 +1445,7 @@ YY_RULE_SETUP
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 131 "glsl_lexer.lpp"
+#line 132 "glsl_lexer.lpp"
{
BEGIN PP;
return PRAGMA_DEBUG_ON;
@@ -1456,7 +1453,7 @@ YY_RULE_SETUP
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 135 "glsl_lexer.lpp"
+#line 136 "glsl_lexer.lpp"
{
BEGIN PP;
return PRAGMA_DEBUG_OFF;
@@ -1464,7 +1461,7 @@ YY_RULE_SETUP
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 139 "glsl_lexer.lpp"
+#line 140 "glsl_lexer.lpp"
{
BEGIN PP;
return PRAGMA_OPTIMIZE_ON;
@@ -1472,7 +1469,7 @@ YY_RULE_SETUP
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 143 "glsl_lexer.lpp"
+#line 144 "glsl_lexer.lpp"
{
BEGIN PP;
return PRAGMA_OPTIMIZE_OFF;
@@ -1480,38 +1477,38 @@ YY_RULE_SETUP
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 147 "glsl_lexer.lpp"
+#line 148 "glsl_lexer.lpp"
{ BEGIN PRAGMA; }
YY_BREAK
case 12:
/* rule 12 can match eol */
YY_RULE_SETUP
-#line 149 "glsl_lexer.lpp"
+#line 150 "glsl_lexer.lpp"
{ BEGIN 0; yylineno++; yycolumn = 0; }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 150 "glsl_lexer.lpp"
+#line 151 "glsl_lexer.lpp"
{ }
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 152 "glsl_lexer.lpp"
+#line 153 "glsl_lexer.lpp"
{ }
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 153 "glsl_lexer.lpp"
+#line 154 "glsl_lexer.lpp"
{ }
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 154 "glsl_lexer.lpp"
+#line 155 "glsl_lexer.lpp"
return COLON;
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 155 "glsl_lexer.lpp"
+#line 156 "glsl_lexer.lpp"
{
yylval->identifier = strdup(yytext);
return IDENTIFIER;
@@ -1519,7 +1516,7 @@ YY_RULE_SETUP
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 159 "glsl_lexer.lpp"
+#line 160 "glsl_lexer.lpp"
{
yylval->n = strtol(yytext, NULL, 10);
return INTCONSTANT;
@@ -1528,388 +1525,388 @@ YY_RULE_SETUP
case 19:
/* rule 19 can match eol */
YY_RULE_SETUP
-#line 163 "glsl_lexer.lpp"
+#line 164 "glsl_lexer.lpp"
{ BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
YY_BREAK
case 20:
/* rule 20 can match eol */
YY_RULE_SETUP
-#line 165 "glsl_lexer.lpp"
+#line 166 "glsl_lexer.lpp"
{ yylineno++; yycolumn = 0; }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 167 "glsl_lexer.lpp"
+#line 168 "glsl_lexer.lpp"
return ATTRIBUTE;
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 168 "glsl_lexer.lpp"
+#line 169 "glsl_lexer.lpp"
return CONST_TOK;
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 169 "glsl_lexer.lpp"
+#line 170 "glsl_lexer.lpp"
return BOOL_TOK;
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 170 "glsl_lexer.lpp"
+#line 171 "glsl_lexer.lpp"
return FLOAT_TOK;
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 171 "glsl_lexer.lpp"
+#line 172 "glsl_lexer.lpp"
return INT_TOK;
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 172 "glsl_lexer.lpp"
+#line 173 "glsl_lexer.lpp"
KEYWORD(130, 130, UINT_TOK);
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 174 "glsl_lexer.lpp"
+#line 175 "glsl_lexer.lpp"
return BREAK;
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 175 "glsl_lexer.lpp"
+#line 176 "glsl_lexer.lpp"
return CONTINUE;
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 176 "glsl_lexer.lpp"
+#line 177 "glsl_lexer.lpp"
return DO;
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 177 "glsl_lexer.lpp"
+#line 178 "glsl_lexer.lpp"
return WHILE;
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 178 "glsl_lexer.lpp"
+#line 179 "glsl_lexer.lpp"
return ELSE;
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 179 "glsl_lexer.lpp"
+#line 180 "glsl_lexer.lpp"
return FOR;
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 180 "glsl_lexer.lpp"
+#line 181 "glsl_lexer.lpp"
return IF;
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 181 "glsl_lexer.lpp"
+#line 182 "glsl_lexer.lpp"
return DISCARD;
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 182 "glsl_lexer.lpp"
+#line 183 "glsl_lexer.lpp"
return RETURN;
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 184 "glsl_lexer.lpp"
+#line 185 "glsl_lexer.lpp"
return BVEC2;
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 185 "glsl_lexer.lpp"
+#line 186 "glsl_lexer.lpp"
return BVEC3;
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 186 "glsl_lexer.lpp"
+#line 187 "glsl_lexer.lpp"
return BVEC4;
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 187 "glsl_lexer.lpp"
+#line 188 "glsl_lexer.lpp"
return IVEC2;
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 188 "glsl_lexer.lpp"
+#line 189 "glsl_lexer.lpp"
return IVEC3;
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 189 "glsl_lexer.lpp"
+#line 190 "glsl_lexer.lpp"
return IVEC4;
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 190 "glsl_lexer.lpp"
+#line 191 "glsl_lexer.lpp"
KEYWORD(130, 130, UVEC2);
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 191 "glsl_lexer.lpp"
+#line 192 "glsl_lexer.lpp"
KEYWORD(130, 130, UVEC3);
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 192 "glsl_lexer.lpp"
+#line 193 "glsl_lexer.lpp"
KEYWORD(130, 130, UVEC4);
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 193 "glsl_lexer.lpp"
+#line 194 "glsl_lexer.lpp"
return VEC2;
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 194 "glsl_lexer.lpp"
+#line 195 "glsl_lexer.lpp"
return VEC3;
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 195 "glsl_lexer.lpp"
+#line 196 "glsl_lexer.lpp"
return VEC4;
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 196 "glsl_lexer.lpp"
+#line 197 "glsl_lexer.lpp"
return MAT2X2;
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 197 "glsl_lexer.lpp"
+#line 198 "glsl_lexer.lpp"
return MAT3X3;
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 198 "glsl_lexer.lpp"
+#line 199 "glsl_lexer.lpp"
return MAT4X4;
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 199 "glsl_lexer.lpp"
+#line 200 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT2X2);
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 200 "glsl_lexer.lpp"
+#line 201 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT2X3);
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 201 "glsl_lexer.lpp"
+#line 202 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT2X4);
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 202 "glsl_lexer.lpp"
+#line 203 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT3X2);
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 203 "glsl_lexer.lpp"
+#line 204 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT3X3);
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 204 "glsl_lexer.lpp"
+#line 205 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT3X4);
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 205 "glsl_lexer.lpp"
+#line 206 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT4X2);
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 206 "glsl_lexer.lpp"
+#line 207 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT4X3);
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 207 "glsl_lexer.lpp"
+#line 208 "glsl_lexer.lpp"
KEYWORD(120, 120, MAT4X4);
YY_BREAK
case 60:
YY_RULE_SETUP
-#line 209 "glsl_lexer.lpp"
+#line 210 "glsl_lexer.lpp"
return IN_TOK;
YY_BREAK
case 61:
YY_RULE_SETUP
-#line 210 "glsl_lexer.lpp"
+#line 211 "glsl_lexer.lpp"
return OUT_TOK;
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 211 "glsl_lexer.lpp"
+#line 212 "glsl_lexer.lpp"
return INOUT_TOK;
YY_BREAK
case 63:
YY_RULE_SETUP
-#line 212 "glsl_lexer.lpp"
+#line 213 "glsl_lexer.lpp"
return UNIFORM;
YY_BREAK
case 64:
YY_RULE_SETUP
-#line 213 "glsl_lexer.lpp"
+#line 214 "glsl_lexer.lpp"
return VARYING;
YY_BREAK
case 65:
YY_RULE_SETUP
-#line 214 "glsl_lexer.lpp"
+#line 215 "glsl_lexer.lpp"
KEYWORD(120, 120, CENTROID);
YY_BREAK
case 66:
YY_RULE_SETUP
-#line 215 "glsl_lexer.lpp"
+#line 216 "glsl_lexer.lpp"
KEYWORD(120 || ES, 120 || ES, INVARIANT);
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 216 "glsl_lexer.lpp"
+#line 217 "glsl_lexer.lpp"
KEYWORD(130 || ES, 130, FLAT);
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 217 "glsl_lexer.lpp"
+#line 218 "glsl_lexer.lpp"
KEYWORD(130, 130, SMOOTH);
YY_BREAK
case 69:
YY_RULE_SETUP
-#line 218 "glsl_lexer.lpp"
+#line 219 "glsl_lexer.lpp"
KEYWORD(130, 130, NOPERSPECTIVE);
YY_BREAK
case 70:
YY_RULE_SETUP
-#line 220 "glsl_lexer.lpp"
+#line 221 "glsl_lexer.lpp"
return SAMPLER1D;
YY_BREAK
case 71:
YY_RULE_SETUP
-#line 221 "glsl_lexer.lpp"
+#line 222 "glsl_lexer.lpp"
return SAMPLER2D;
YY_BREAK
case 72:
YY_RULE_SETUP
-#line 222 "glsl_lexer.lpp"
+#line 223 "glsl_lexer.lpp"
return SAMPLER3D;
YY_BREAK
case 73:
YY_RULE_SETUP
-#line 223 "glsl_lexer.lpp"
+#line 224 "glsl_lexer.lpp"
return SAMPLERCUBE;
YY_BREAK
case 74:
YY_RULE_SETUP
-#line 224 "glsl_lexer.lpp"
+#line 225 "glsl_lexer.lpp"
KEYWORD(130, 130, SAMPLER1DARRAY);
YY_BREAK
case 75:
YY_RULE_SETUP
-#line 225 "glsl_lexer.lpp"
+#line 226 "glsl_lexer.lpp"
KEYWORD(130, 130, SAMPLER2DARRAY);
YY_BREAK
case 76:
YY_RULE_SETUP
-#line 226 "glsl_lexer.lpp"
+#line 227 "glsl_lexer.lpp"
return SAMPLER1DSHADOW;
YY_BREAK
case 77:
YY_RULE_SETUP
-#line 227 "glsl_lexer.lpp"
+#line 228 "glsl_lexer.lpp"
return SAMPLER2DSHADOW;
YY_BREAK
case 78:
YY_RULE_SETUP
-#line 228 "glsl_lexer.lpp"
+#line 229 "glsl_lexer.lpp"
KEYWORD(130, 130, SAMPLERCUBESHADOW);
YY_BREAK
case 79:
YY_RULE_SETUP
-#line 229 "glsl_lexer.lpp"
+#line 230 "glsl_lexer.lpp"
KEYWORD(130, 130, SAMPLER1DARRAYSHADOW);
YY_BREAK
case 80:
YY_RULE_SETUP
-#line 230 "glsl_lexer.lpp"
+#line 231 "glsl_lexer.lpp"
KEYWORD(130, 130, SAMPLER2DARRAYSHADOW);
YY_BREAK
case 81:
YY_RULE_SETUP
-#line 231 "glsl_lexer.lpp"
+#line 232 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLER1D);
YY_BREAK
case 82:
YY_RULE_SETUP
-#line 232 "glsl_lexer.lpp"
+#line 233 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLER2D);
YY_BREAK
case 83:
YY_RULE_SETUP
-#line 233 "glsl_lexer.lpp"
+#line 234 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLER3D);
YY_BREAK
case 84:
YY_RULE_SETUP
-#line 234 "glsl_lexer.lpp"
+#line 235 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLERCUBE);
YY_BREAK
case 85:
YY_RULE_SETUP
-#line 235 "glsl_lexer.lpp"
+#line 236 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLER1DARRAY);
YY_BREAK
case 86:
YY_RULE_SETUP
-#line 236 "glsl_lexer.lpp"
+#line 237 "glsl_lexer.lpp"
KEYWORD(130, 130, ISAMPLER2DARRAY);
YY_BREAK
case 87:
YY_RULE_SETUP
-#line 237 "glsl_lexer.lpp"
+#line 238 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLER1D);
YY_BREAK
case 88:
YY_RULE_SETUP
-#line 238 "glsl_lexer.lpp"
+#line 239 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLER2D);
YY_BREAK
case 89:
YY_RULE_SETUP
-#line 239 "glsl_lexer.lpp"
+#line 240 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLER3D);
YY_BREAK
case 90:
YY_RULE_SETUP
-#line 240 "glsl_lexer.lpp"
+#line 241 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLERCUBE);
YY_BREAK
case 91:
YY_RULE_SETUP
-#line 241 "glsl_lexer.lpp"
+#line 242 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLER1DARRAY);
YY_BREAK
case 92:
YY_RULE_SETUP
-#line 242 "glsl_lexer.lpp"
+#line 243 "glsl_lexer.lpp"
KEYWORD(130, 130, USAMPLER2DARRAY);
YY_BREAK
case 93:
YY_RULE_SETUP
-#line 245 "glsl_lexer.lpp"
+#line 246 "glsl_lexer.lpp"
return STRUCT;
YY_BREAK
case 94:
YY_RULE_SETUP
-#line 246 "glsl_lexer.lpp"
+#line 247 "glsl_lexer.lpp"
return VOID_TOK;
YY_BREAK
case 95:
YY_RULE_SETUP
-#line 248 "glsl_lexer.lpp"
+#line 249 "glsl_lexer.lpp"
{
if ((yyextra->language_version >= 140)
|| yyextra->ARB_explicit_attrib_location_enable
@@ -1923,112 +1920,112 @@ YY_RULE_SETUP
YY_BREAK
case 96:
YY_RULE_SETUP
-#line 259 "glsl_lexer.lpp"
+#line 260 "glsl_lexer.lpp"
return INC_OP;
YY_BREAK
case 97:
YY_RULE_SETUP
-#line 260 "glsl_lexer.lpp"
+#line 261 "glsl_lexer.lpp"
return DEC_OP;
YY_BREAK
case 98:
YY_RULE_SETUP
-#line 261 "glsl_lexer.lpp"
+#line 262 "glsl_lexer.lpp"
return LE_OP;
YY_BREAK
case 99:
YY_RULE_SETUP
-#line 262 "glsl_lexer.lpp"
+#line 263 "glsl_lexer.lpp"
return GE_OP;
YY_BREAK
case 100:
YY_RULE_SETUP
-#line 263 "glsl_lexer.lpp"
+#line 264 "glsl_lexer.lpp"
return EQ_OP;
YY_BREAK
case 101:
YY_RULE_SETUP
-#line 264 "glsl_lexer.lpp"
+#line 265 "glsl_lexer.lpp"
return NE_OP;
YY_BREAK
case 102:
YY_RULE_SETUP
-#line 265 "glsl_lexer.lpp"
+#line 266 "glsl_lexer.lpp"
return AND_OP;
YY_BREAK
case 103:
YY_RULE_SETUP
-#line 266 "glsl_lexer.lpp"
+#line 267 "glsl_lexer.lpp"
return OR_OP;
YY_BREAK
case 104:
YY_RULE_SETUP
-#line 267 "glsl_lexer.lpp"
+#line 268 "glsl_lexer.lpp"
return XOR_OP;
YY_BREAK
case 105:
YY_RULE_SETUP
-#line 268 "glsl_lexer.lpp"
+#line 269 "glsl_lexer.lpp"
return LEFT_OP;
YY_BREAK
case 106:
YY_RULE_SETUP
-#line 269 "glsl_lexer.lpp"
+#line 270 "glsl_lexer.lpp"
return RIGHT_OP;
YY_BREAK
case 107:
YY_RULE_SETUP
-#line 271 "glsl_lexer.lpp"
+#line 272 "glsl_lexer.lpp"
return MUL_ASSIGN;
YY_BREAK
case 108:
YY_RULE_SETUP
-#line 272 "glsl_lexer.lpp"
+#line 273 "glsl_lexer.lpp"
return DIV_ASSIGN;
YY_BREAK
case 109:
YY_RULE_SETUP
-#line 273 "glsl_lexer.lpp"
+#line 274 "glsl_lexer.lpp"
return ADD_ASSIGN;
YY_BREAK
case 110:
YY_RULE_SETUP
-#line 274 "glsl_lexer.lpp"
+#line 275 "glsl_lexer.lpp"
return MOD_ASSIGN;
YY_BREAK
case 111:
YY_RULE_SETUP
-#line 275 "glsl_lexer.lpp"
+#line 276 "glsl_lexer.lpp"
return LEFT_ASSIGN;
YY_BREAK
case 112:
YY_RULE_SETUP
-#line 276 "glsl_lexer.lpp"
+#line 277 "glsl_lexer.lpp"
return RIGHT_ASSIGN;
YY_BREAK
case 113:
YY_RULE_SETUP
-#line 277 "glsl_lexer.lpp"
+#line 278 "glsl_lexer.lpp"
return AND_ASSIGN;
YY_BREAK
case 114:
YY_RULE_SETUP
-#line 278 "glsl_lexer.lpp"
+#line 279 "glsl_lexer.lpp"
return XOR_ASSIGN;
YY_BREAK
case 115:
YY_RULE_SETUP
-#line 279 "glsl_lexer.lpp"
+#line 280 "glsl_lexer.lpp"
return OR_ASSIGN;
YY_BREAK
case 116:
YY_RULE_SETUP
-#line 280 "glsl_lexer.lpp"
+#line 281 "glsl_lexer.lpp"
return SUB_ASSIGN;
YY_BREAK
case 117:
YY_RULE_SETUP
-#line 282 "glsl_lexer.lpp"
+#line 283 "glsl_lexer.lpp"
{
yylval->n = strtol(yytext, NULL, 10);
return IS_UINT ? UINTCONSTANT : INTCONSTANT;
@@ -2036,7 +2033,7 @@ YY_RULE_SETUP
YY_BREAK
case 118:
YY_RULE_SETUP
-#line 286 "glsl_lexer.lpp"
+#line 287 "glsl_lexer.lpp"
{
yylval->n = strtol(yytext + 2, NULL, 16);
return IS_UINT ? UINTCONSTANT : INTCONSTANT;
@@ -2044,7 +2041,7 @@ YY_RULE_SETUP
YY_BREAK
case 119:
YY_RULE_SETUP
-#line 290 "glsl_lexer.lpp"
+#line 291 "glsl_lexer.lpp"
{
yylval->n = strtol(yytext, NULL, 8);
return IS_UINT ? UINTCONSTANT : INTCONSTANT;
@@ -2052,47 +2049,47 @@ YY_RULE_SETUP
YY_BREAK
case 120:
YY_RULE_SETUP
-#line 295 "glsl_lexer.lpp"
+#line 296 "glsl_lexer.lpp"
{
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
YY_BREAK
case 121:
YY_RULE_SETUP
-#line 299 "glsl_lexer.lpp"
+#line 300 "glsl_lexer.lpp"
{
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
YY_BREAK
case 122:
YY_RULE_SETUP
-#line 303 "glsl_lexer.lpp"
+#line 304 "glsl_lexer.lpp"
{
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
YY_BREAK
case 123:
YY_RULE_SETUP
-#line 307 "glsl_lexer.lpp"
+#line 308 "glsl_lexer.lpp"
{
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
YY_BREAK
case 124:
YY_RULE_SETUP
-#line 311 "glsl_lexer.lpp"
+#line 312 "glsl_lexer.lpp"
{
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
YY_BREAK
case 125:
YY_RULE_SETUP
-#line 316 "glsl_lexer.lpp"
+#line 317 "glsl_lexer.lpp"
{
yylval->n = 1;
return BOOLCONSTANT;
@@ -2100,7 +2097,7 @@ YY_RULE_SETUP
YY_BREAK
case 126:
YY_RULE_SETUP
-#line 320 "glsl_lexer.lpp"
+#line 321 "glsl_lexer.lpp"
{
yylval->n = 0;
return BOOLCONSTANT;
@@ -2109,409 +2106,409 @@ YY_RULE_SETUP
/* Reserved words in GLSL 1.10. */
case 127:
YY_RULE_SETUP
-#line 327 "glsl_lexer.lpp"
+#line 328 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, ASM);
YY_BREAK
case 128:
YY_RULE_SETUP
-#line 328 "glsl_lexer.lpp"
+#line 329 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, CLASS);
YY_BREAK
case 129:
YY_RULE_SETUP
-#line 329 "glsl_lexer.lpp"
+#line 330 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, UNION);
YY_BREAK
case 130:
YY_RULE_SETUP
-#line 330 "glsl_lexer.lpp"
+#line 331 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, ENUM);
YY_BREAK
case 131:
YY_RULE_SETUP
-#line 331 "glsl_lexer.lpp"
+#line 332 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, TYPEDEF);
YY_BREAK
case 132:
YY_RULE_SETUP
-#line 332 "glsl_lexer.lpp"
+#line 333 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, TEMPLATE);
YY_BREAK
case 133:
YY_RULE_SETUP
-#line 333 "glsl_lexer.lpp"
+#line 334 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, THIS);
YY_BREAK
case 134:
YY_RULE_SETUP
-#line 334 "glsl_lexer.lpp"
+#line 335 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, PACKED_TOK);
YY_BREAK
case 135:
YY_RULE_SETUP
-#line 335 "glsl_lexer.lpp"
+#line 336 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, GOTO);
YY_BREAK
case 136:
YY_RULE_SETUP
-#line 336 "glsl_lexer.lpp"
+#line 337 "glsl_lexer.lpp"
KEYWORD(110 || ES, 130, SWITCH);
YY_BREAK
case 137:
YY_RULE_SETUP
-#line 337 "glsl_lexer.lpp"
+#line 338 "glsl_lexer.lpp"
KEYWORD(110 || ES, 130, DEFAULT);
YY_BREAK
case 138:
YY_RULE_SETUP
-#line 338 "glsl_lexer.lpp"
+#line 339 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, INLINE_TOK);
YY_BREAK
case 139:
YY_RULE_SETUP
-#line 339 "glsl_lexer.lpp"
+#line 340 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, NOINLINE);
YY_BREAK
case 140:
YY_RULE_SETUP
-#line 340 "glsl_lexer.lpp"
+#line 341 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, VOLATILE);
YY_BREAK
case 141:
YY_RULE_SETUP
-#line 341 "glsl_lexer.lpp"
+#line 342 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, PUBLIC_TOK);
YY_BREAK
case 142:
YY_RULE_SETUP
-#line 342 "glsl_lexer.lpp"
+#line 343 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, STATIC);
YY_BREAK
case 143:
YY_RULE_SETUP
-#line 343 "glsl_lexer.lpp"
+#line 344 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, EXTERN);
YY_BREAK
case 144:
YY_RULE_SETUP
-#line 344 "glsl_lexer.lpp"
+#line 345 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, EXTERNAL);
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 345 "glsl_lexer.lpp"
+#line 346 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, INTERFACE);
YY_BREAK
case 146:
YY_RULE_SETUP
-#line 346 "glsl_lexer.lpp"
+#line 347 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, LONG_TOK);
YY_BREAK
case 147:
YY_RULE_SETUP
-#line 347 "glsl_lexer.lpp"
+#line 348 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, SHORT_TOK);
YY_BREAK
case 148:
YY_RULE_SETUP
-#line 348 "glsl_lexer.lpp"
+#line 349 "glsl_lexer.lpp"
KEYWORD(110 || ES, 400, DOUBLE_TOK);
YY_BREAK
case 149:
YY_RULE_SETUP
-#line 349 "glsl_lexer.lpp"
+#line 350 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, HALF);
YY_BREAK
case 150:
YY_RULE_SETUP
-#line 350 "glsl_lexer.lpp"
+#line 351 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, FIXED_TOK);
YY_BREAK
case 151:
YY_RULE_SETUP
-#line 351 "glsl_lexer.lpp"
+#line 352 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, UNSIGNED);
YY_BREAK
case 152:
YY_RULE_SETUP
-#line 352 "glsl_lexer.lpp"
+#line 353 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, INPUT_TOK);
YY_BREAK
case 153:
YY_RULE_SETUP
-#line 353 "glsl_lexer.lpp"
+#line 354 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, OUTPUT);
YY_BREAK
case 154:
YY_RULE_SETUP
-#line 354 "glsl_lexer.lpp"
+#line 355 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, HVEC2);
YY_BREAK
case 155:
YY_RULE_SETUP
-#line 355 "glsl_lexer.lpp"
+#line 356 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, HVEC3);
YY_BREAK
case 156:
YY_RULE_SETUP
-#line 356 "glsl_lexer.lpp"
+#line 357 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, HVEC4);
YY_BREAK
case 157:
YY_RULE_SETUP
-#line 357 "glsl_lexer.lpp"
+#line 358 "glsl_lexer.lpp"
KEYWORD(110 || ES, 400, DVEC2);
YY_BREAK
case 158:
YY_RULE_SETUP
-#line 358 "glsl_lexer.lpp"
+#line 359 "glsl_lexer.lpp"
KEYWORD(110 || ES, 400, DVEC3);
YY_BREAK
case 159:
YY_RULE_SETUP
-#line 359 "glsl_lexer.lpp"
+#line 360 "glsl_lexer.lpp"
KEYWORD(110 || ES, 400, DVEC4);
YY_BREAK
case 160:
YY_RULE_SETUP
-#line 360 "glsl_lexer.lpp"
+#line 361 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, FVEC2);
YY_BREAK
case 161:
YY_RULE_SETUP
-#line 361 "glsl_lexer.lpp"
+#line 362 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, FVEC3);
YY_BREAK
case 162:
YY_RULE_SETUP
-#line 362 "glsl_lexer.lpp"
+#line 363 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, FVEC4);
YY_BREAK
case 163:
YY_RULE_SETUP
-#line 363 "glsl_lexer.lpp"
+#line 364 "glsl_lexer.lpp"
return SAMPLER2DRECT;
YY_BREAK
case 164:
YY_RULE_SETUP
-#line 364 "glsl_lexer.lpp"
+#line 365 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, SAMPLER3DRECT);
YY_BREAK
case 165:
YY_RULE_SETUP
-#line 365 "glsl_lexer.lpp"
+#line 366 "glsl_lexer.lpp"
return SAMPLER2DRECTSHADOW;
YY_BREAK
case 166:
YY_RULE_SETUP
-#line 366 "glsl_lexer.lpp"
+#line 367 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, SIZEOF);
YY_BREAK
case 167:
YY_RULE_SETUP
-#line 367 "glsl_lexer.lpp"
+#line 368 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, CAST);
YY_BREAK
case 168:
YY_RULE_SETUP
-#line 368 "glsl_lexer.lpp"
+#line 369 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, NAMESPACE);
YY_BREAK
case 169:
YY_RULE_SETUP
-#line 369 "glsl_lexer.lpp"
+#line 370 "glsl_lexer.lpp"
KEYWORD(110 || ES, 999, USING);
YY_BREAK
/* Additional reserved words in GLSL 1.20. */
case 170:
YY_RULE_SETUP
-#line 372 "glsl_lexer.lpp"
+#line 373 "glsl_lexer.lpp"
KEYWORD(120, 130 || ES, LOWP);
YY_BREAK
case 171:
YY_RULE_SETUP
-#line 373 "glsl_lexer.lpp"
+#line 374 "glsl_lexer.lpp"
KEYWORD(120, 130 || ES, MEDIUMP);
YY_BREAK
case 172:
YY_RULE_SETUP
-#line 374 "glsl_lexer.lpp"
+#line 375 "glsl_lexer.lpp"
KEYWORD(120, 130 || ES, HIGHP);
YY_BREAK
case 173:
YY_RULE_SETUP
-#line 375 "glsl_lexer.lpp"
+#line 376 "glsl_lexer.lpp"
KEYWORD(120, 130 || ES, PRECISION);
YY_BREAK
/* Additional reserved words in GLSL 1.30. */
case 174:
YY_RULE_SETUP
-#line 378 "glsl_lexer.lpp"
+#line 379 "glsl_lexer.lpp"
KEYWORD(130, 130, CASE);
YY_BREAK
case 175:
YY_RULE_SETUP
-#line 379 "glsl_lexer.lpp"
+#line 380 "glsl_lexer.lpp"
KEYWORD(130, 999, COMMON);
YY_BREAK
case 176:
YY_RULE_SETUP
-#line 380 "glsl_lexer.lpp"
+#line 381 "glsl_lexer.lpp"
KEYWORD(130, 999, PARTITION);
YY_BREAK
case 177:
YY_RULE_SETUP
-#line 381 "glsl_lexer.lpp"
+#line 382 "glsl_lexer.lpp"
KEYWORD(130, 999, ACTIVE);
YY_BREAK
case 178:
YY_RULE_SETUP
-#line 382 "glsl_lexer.lpp"
+#line 383 "glsl_lexer.lpp"
KEYWORD(130 || ES, 999, SUPERP);
YY_BREAK
case 179:
YY_RULE_SETUP
-#line 383 "glsl_lexer.lpp"
+#line 384 "glsl_lexer.lpp"
KEYWORD(130, 140, SAMPLERBUFFER);
YY_BREAK
case 180:
YY_RULE_SETUP
-#line 384 "glsl_lexer.lpp"
+#line 385 "glsl_lexer.lpp"
KEYWORD(130, 999, FILTER);
YY_BREAK
case 181:
YY_RULE_SETUP
-#line 385 "glsl_lexer.lpp"
+#line 386 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE1D);
YY_BREAK
case 182:
YY_RULE_SETUP
-#line 386 "glsl_lexer.lpp"
+#line 387 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE2D);
YY_BREAK
case 183:
YY_RULE_SETUP
-#line 387 "glsl_lexer.lpp"
+#line 388 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE3D);
YY_BREAK
case 184:
YY_RULE_SETUP
-#line 388 "glsl_lexer.lpp"
+#line 389 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGECUBE);
YY_BREAK
case 185:
YY_RULE_SETUP
-#line 389 "glsl_lexer.lpp"
+#line 390 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGE1D);
YY_BREAK
case 186:
YY_RULE_SETUP
-#line 390 "glsl_lexer.lpp"
+#line 391 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGE2D);
YY_BREAK
case 187:
YY_RULE_SETUP
-#line 391 "glsl_lexer.lpp"
+#line 392 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGE3D);
YY_BREAK
case 188:
YY_RULE_SETUP
-#line 392 "glsl_lexer.lpp"
+#line 393 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGECUBE);
YY_BREAK
case 189:
YY_RULE_SETUP
-#line 393 "glsl_lexer.lpp"
+#line 394 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGE1D);
YY_BREAK
case 190:
YY_RULE_SETUP
-#line 394 "glsl_lexer.lpp"
+#line 395 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGE2D);
YY_BREAK
case 191:
YY_RULE_SETUP
-#line 395 "glsl_lexer.lpp"
+#line 396 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGE3D);
YY_BREAK
case 192:
YY_RULE_SETUP
-#line 396 "glsl_lexer.lpp"
+#line 397 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGECUBE);
YY_BREAK
case 193:
YY_RULE_SETUP
-#line 397 "glsl_lexer.lpp"
+#line 398 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE1DARRAY);
YY_BREAK
case 194:
YY_RULE_SETUP
-#line 398 "glsl_lexer.lpp"
+#line 399 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE2DARRAY);
YY_BREAK
case 195:
YY_RULE_SETUP
-#line 399 "glsl_lexer.lpp"
+#line 400 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGE1DARRAY);
YY_BREAK
case 196:
YY_RULE_SETUP
-#line 400 "glsl_lexer.lpp"
+#line 401 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGE2DARRAY);
YY_BREAK
case 197:
YY_RULE_SETUP
-#line 401 "glsl_lexer.lpp"
+#line 402 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGE1DARRAY);
YY_BREAK
case 198:
YY_RULE_SETUP
-#line 402 "glsl_lexer.lpp"
+#line 403 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGE2DARRAY);
YY_BREAK
case 199:
YY_RULE_SETUP
-#line 403 "glsl_lexer.lpp"
+#line 404 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE1DSHADOW);
YY_BREAK
case 200:
YY_RULE_SETUP
-#line 404 "glsl_lexer.lpp"
+#line 405 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE2DSHADOW);
YY_BREAK
case 201:
YY_RULE_SETUP
-#line 405 "glsl_lexer.lpp"
+#line 406 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE1DARRAYSHADOW);
YY_BREAK
case 202:
YY_RULE_SETUP
-#line 406 "glsl_lexer.lpp"
+#line 407 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGE2DARRAYSHADOW);
YY_BREAK
case 203:
YY_RULE_SETUP
-#line 407 "glsl_lexer.lpp"
+#line 408 "glsl_lexer.lpp"
KEYWORD(130, 999, IMAGEBUFFER);
YY_BREAK
case 204:
YY_RULE_SETUP
-#line 408 "glsl_lexer.lpp"
+#line 409 "glsl_lexer.lpp"
KEYWORD(130, 999, IIMAGEBUFFER);
YY_BREAK
case 205:
YY_RULE_SETUP
-#line 409 "glsl_lexer.lpp"
+#line 410 "glsl_lexer.lpp"
KEYWORD(130, 999, UIMAGEBUFFER);
YY_BREAK
case 206:
YY_RULE_SETUP
-#line 410 "glsl_lexer.lpp"
+#line 411 "glsl_lexer.lpp"
KEYWORD(130, 999, ROW_MAJOR);
YY_BREAK
case 207:
YY_RULE_SETUP
-#line 412 "glsl_lexer.lpp"
+#line 413 "glsl_lexer.lpp"
{
struct _mesa_glsl_parse_state *state = yyextra;
void *ctx = state;
@@ -2521,15 +2518,15 @@ YY_RULE_SETUP
YY_BREAK
case 208:
YY_RULE_SETUP
-#line 419 "glsl_lexer.lpp"
+#line 420 "glsl_lexer.lpp"
{ return yytext[0]; }
YY_BREAK
case 209:
YY_RULE_SETUP
-#line 421 "glsl_lexer.lpp"
+#line 422 "glsl_lexer.lpp"
ECHO;
YY_BREAK
-#line 2533 "glsl_lexer.cpp"
+#line 2530 "glsl_lexer.cpp"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(PP):
case YY_STATE_EOF(PRAGMA):
@@ -3672,7 +3669,7 @@ void _mesa_glsl_free (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
-#line 421 "glsl_lexer.lpp"
+#line 422 "glsl_lexer.lpp"
diff --git a/src/glsl/glsl_lexer.lpp b/src/glsl/glsl_lexer.lpp
index 7a3f1a67e66..15742ac3636 100644
--- a/src/glsl/glsl_lexer.lpp
+++ b/src/glsl/glsl_lexer.lpp
@@ -22,6 +22,7 @@
* DEALINGS IN THE SOFTWARE.
*/
#include <ctype.h>
+#include "strtod.h"
#include "ast.h"
#include "glsl_parser_extras.h"
#include "glsl_parser.h"
@@ -293,23 +294,23 @@ layout {
}
[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? {
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
\.[0-9]+([eE][+-]?[0-9]+)?[fF]? {
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
[0-9]+\.([eE][+-]?[0-9]+)?[fF]? {
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
[0-9]+[eE][+-]?[0-9]+[fF]? {
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
[0-9]+[fF] {
- yylval->real = strtod(yytext, NULL);
+ yylval->real = glsl_strtod(yytext, NULL);
return FLOATCONSTANT;
}
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 8c33cfa20d0..95b85926482 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -120,7 +120,7 @@ glsl_type::generate_100ES_types(glsl_symbol_table *symtab)
add_types_to_symbol_table(symtab, builtin_structure_types,
Elements(builtin_structure_types),
false);
- add_types_to_symbol_table(symtab, &void_type, 1, false);
+ add_types_to_symbol_table(symtab, void_type, 1, false);
}
void
@@ -279,7 +279,7 @@ const glsl_type *
glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
{
if (base_type == GLSL_TYPE_VOID)
- return &void_type;
+ return void_type;
if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
return error_type;
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index d62d493c8e8..57e7b09d98c 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -142,6 +142,7 @@ struct glsl_type {
*/
/*@{*/
static const glsl_type *const error_type;
+ static const glsl_type *const void_type;
static const glsl_type *const int_type;
static const glsl_type *const ivec4_type;
static const glsl_type *const uint_type;
@@ -424,7 +425,7 @@ private:
*/
/*@{*/
static const glsl_type _error_type;
- static const glsl_type void_type;
+ static const glsl_type _void_type;
static const glsl_type builtin_core_types[];
static const glsl_type builtin_structure_types[];
static const glsl_type builtin_110_deprecated_structure_types[];
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index e62fe6d7e9f..d8c42ac4624 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -487,14 +487,35 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
/* Check that the types match between stages.
*/
if (input->type != output->type) {
- linker_error_printf(prog,
- "%s shader output `%s' declared as "
- "type `%s', but %s shader input declared "
- "as type `%s'\n",
- producer_stage, output->name,
- output->type->name,
- consumer_stage, input->type->name);
- return false;
+ /* There is a bit of a special case for gl_TexCoord. This
+ * built-in is unsized by default. Appliations that variable
+ * access it must redeclare it with a size. There is some
+ * language in the GLSL spec that implies the fragment shader
+ * and vertex shader do not have to agree on this size. Other
+ * driver behave this way, and one or two applications seem to
+ * rely on it.
+ *
+ * Neither declaration needs to be modified here because the array
+ * sizes are fixed later when update_array_sizes is called.
+ *
+ * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec:
+ *
+ * "Unlike user-defined varying variables, the built-in
+ * varying variables don't have a strict one-to-one
+ * correspondence between the vertex language and the
+ * fragment language."
+ */
+ if (!output->type->is_array()
+ || (strncmp("gl_", output->name, 3) != 0)) {
+ linker_error_printf(prog,
+ "%s shader output `%s' declared as "
+ "type `%s', but %s shader input declared "
+ "as type `%s'\n",
+ producer_stage, output->name,
+ output->type->name,
+ consumer_stage, input->type->name);
+ return false;
+ }
}
/* Check that all of the qualifiers match between stages.
diff --git a/src/glsl/s_expression.cpp b/src/glsl/s_expression.cpp
index 4c8829fea9a..e420cd6e7ec 100644
--- a/src/glsl/s_expression.cpp
+++ b/src/glsl/s_expression.cpp
@@ -62,7 +62,7 @@ read_atom(void *ctx, const char *& src)
// Check if the atom is a number.
char *float_end = NULL;
- double f = strtod(src, &float_end);
+ double f = glsl_strtod(src, &float_end);
if (float_end != src) {
char *int_end = NULL;
int i = strtol(src, &int_end, 10);
diff --git a/src/glsl/s_expression.h b/src/glsl/s_expression.h
index aa22475a1bf..29d800e394a 100644
--- a/src/glsl/s_expression.h
+++ b/src/glsl/s_expression.h
@@ -26,6 +26,7 @@
#ifndef S_EXPRESSION_H
#define S_EXPRESSION_H
+#include "strtod.h"
#include "list.h"
#define SX_AS_(t,x) ((x) && ((s_expression*) x)->is_##t()) ? ((s_##t*) (x)) \
diff --git a/src/glsl/strtod.c b/src/glsl/strtod.c
new file mode 100644
index 00000000000..ff34591488c
--- /dev/null
+++ b/src/glsl/strtod.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include <stdlib.h>
+
+#ifdef _GNU_SOURCE
+#include <locale.h>
+#ifdef __APPLE__
+#include <xlocale.h>
+#endif
+#endif
+
+#include "strtod.h"
+
+
+
+/**
+ * Wrapper around strtod which uses the "C" locale so the decimal
+ * point is always '.'
+ */
+double
+glsl_strtod(const char *s, char **end)
+{
+#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__)
+ static locale_t loc = NULL;
+ if (!loc) {
+ loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+ }
+ return strtod_l(s, end, loc);
+#else
+ return strtod(s, end);
+#endif
+}
diff --git a/src/glsl/strtod.h b/src/glsl/strtod.h
new file mode 100644
index 00000000000..0cf6409d425
--- /dev/null
+++ b/src/glsl/strtod.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2010 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef STRTOD_H
+#define STRTOD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern double
+glsl_strtod(const char *s, char **end);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif