1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Create strings that declare built-in definitions, add built-ins that
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// cannot be expressed in the files, and establish mappings between
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// built-in functions and operators.
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "compiler/Initialize.h"
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "compiler/intermediate.h"
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Prototypes for built-in functions seen by both vertex and fragment shaders.
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstatic TString BuiltInFunctionsCommon()
23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Angle and Trigonometric Functions.
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float radians(float degrees);"));
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  radians(vec2  degrees);"));
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  radians(vec3  degrees);"));
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  radians(vec4  degrees);"));
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float degrees(float radians);"));
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  degrees(vec2  radians);"));
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  degrees(vec3  radians);"));
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  degrees(vec4  radians);"));
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float sin(float angle);"));
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  sin(vec2  angle);"));
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  sin(vec3  angle);"));
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  sin(vec4  angle);"));
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float cos(float angle);"));
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  cos(vec2  angle);"));
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  cos(vec3  angle);"));
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  cos(vec4  angle);"));
48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float tan(float angle);"));
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  tan(vec2  angle);"));
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  tan(vec3  angle);"));
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  tan(vec4  angle);"));
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float asin(float x);"));
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  asin(vec2  x);"));
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  asin(vec3  x);"));
57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  asin(vec4  x);"));
58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float acos(float x);"));
60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  acos(vec2  x);"));
61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  acos(vec3  x);"));
62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  acos(vec4  x);"));
63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float atan(float y, float x);"));
65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  atan(vec2  y, vec2  x);"));
66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  atan(vec3  y, vec3  x);"));
67a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  atan(vec4  y, vec4  x);"));
68a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float atan(float y_over_x);"));
70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  atan(vec2  y_over_x);"));
71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  atan(vec3  y_over_x);"));
72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  atan(vec4  y_over_x);"));
73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
74a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Exponential Functions.
76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float pow(float x, float y);"));
78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  pow(vec2  x, vec2  y);"));
79a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  pow(vec3  x, vec3  y);"));
80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  pow(vec4  x, vec4  y);"));
81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
82a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float exp(float x);"));
83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  exp(vec2  x);"));
84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  exp(vec3  x);"));
85a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  exp(vec4  x);"));
86a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float log(float x);"));
88a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  log(vec2  x);"));
89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  log(vec3  x);"));
90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  log(vec4  x);"));
91a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
92a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float exp2(float x);"));
93a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  exp2(vec2  x);"));
94a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  exp2(vec3  x);"));
95a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  exp2(vec4  x);"));
96a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
97a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float log2(float x);"));
98a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  log2(vec2  x);"));
99a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  log2(vec3  x);"));
100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  log2(vec4  x);"));
101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float sqrt(float x);"));
103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  sqrt(vec2  x);"));
104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  sqrt(vec3  x);"));
105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  sqrt(vec4  x);"));
106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float inversesqrt(float x);"));
108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  inversesqrt(vec2  x);"));
109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  inversesqrt(vec3  x);"));
110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  inversesqrt(vec4  x);"));
111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Common Functions.
114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float abs(float x);"));
116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  abs(vec2  x);"));
117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  abs(vec3  x);"));
118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  abs(vec4  x);"));
119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float sign(float x);"));
121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  sign(vec2  x);"));
122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  sign(vec3  x);"));
123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  sign(vec4  x);"));
124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float floor(float x);"));
126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  floor(vec2  x);"));
127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  floor(vec3  x);"));
128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  floor(vec4  x);"));
129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float ceil(float x);"));
131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  ceil(vec2  x);"));
132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  ceil(vec3  x);"));
133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  ceil(vec4  x);"));
134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float fract(float x);"));
136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  fract(vec2  x);"));
137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  fract(vec3  x);"));
138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  fract(vec4  x);"));
139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float mod(float x, float y);"));
141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  mod(vec2  x, float y);"));
142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  mod(vec3  x, float y);"));
143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  mod(vec4  x, float y);"));
144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  mod(vec2  x, vec2  y);"));
145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  mod(vec3  x, vec3  y);"));
146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  mod(vec4  x, vec4  y);"));
147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float min(float x, float y);"));
149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  min(vec2  x, float y);"));
150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  min(vec3  x, float y);"));
151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  min(vec4  x, float y);"));
152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  min(vec2  x, vec2  y);"));
153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  min(vec3  x, vec3  y);"));
154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  min(vec4  x, vec4  y);"));
155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float max(float x, float y);"));
157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  max(vec2  x, float y);"));
158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  max(vec3  x, float y);"));
159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  max(vec4  x, float y);"));
160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  max(vec2  x, vec2  y);"));
161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  max(vec3  x, vec3  y);"));
162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  max(vec4  x, vec4  y);"));
163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float clamp(float x, float minVal, float maxVal);"));
165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  clamp(vec2  x, float minVal, float maxVal);"));
166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  clamp(vec3  x, float minVal, float maxVal);"));
167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  clamp(vec4  x, float minVal, float maxVal);"));
168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  clamp(vec2  x, vec2  minVal, vec2  maxVal);"));
169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  clamp(vec3  x, vec3  minVal, vec3  maxVal);"));
170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  clamp(vec4  x, vec4  minVal, vec4  maxVal);"));
171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float mix(float x, float y, float a);"));
173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  mix(vec2  x, vec2  y, float a);"));
174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  mix(vec3  x, vec3  y, float a);"));
175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  mix(vec4  x, vec4  y, float a);"));
176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  mix(vec2  x, vec2  y, vec2  a);"));
177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  mix(vec3  x, vec3  y, vec3  a);"));
178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  mix(vec4  x, vec4  y, vec4  a);"));
179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float step(float edge, float x);"));
181a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  step(vec2  edge, vec2  x);"));
182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  step(vec3  edge, vec3  x);"));
183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  step(vec4  edge, vec4  x);"));
184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  step(float edge, vec2  x);"));
185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  step(float edge, vec3  x);"));
186a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  step(float edge, vec4  x);"));
187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
188a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float smoothstep(float edge0, float edge1, float x);"));
189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  smoothstep(vec2  edge0, vec2  edge1, vec2  x);"));
190a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  smoothstep(vec3  edge0, vec3  edge1, vec3  x);"));
191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  smoothstep(vec4  edge0, vec4  edge1, vec4  x);"));
192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  smoothstep(float edge0, float edge1, vec2  x);"));
193a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  smoothstep(float edge0, float edge1, vec3  x);"));
194a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  smoothstep(float edge0, float edge1, vec4  x);"));
195a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
196a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Geometric Functions.
198a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float length(float x);"));
200a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float length(vec2  x);"));
201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float length(vec3  x);"));
202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float length(vec4  x);"));
203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float distance(float p0, float p1);"));
205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float distance(vec2  p0, vec2  p1);"));
206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float distance(vec3  p0, vec3  p1);"));
207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float distance(vec4  p0, vec4  p1);"));
208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float dot(float x, float y);"));
210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float dot(vec2  x, vec2  y);"));
211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float dot(vec3  x, vec3  y);"));
212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float dot(vec4  x, vec4  y);"));
213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3 cross(vec3 x, vec3 y);"));
215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float normalize(float x);"));
216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  normalize(vec2  x);"));
217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  normalize(vec3  x);"));
218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  normalize(vec4  x);"));
219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float faceforward(float N, float I, float Nref);"));
221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  faceforward(vec2  N, vec2  I, vec2  Nref);"));
222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  faceforward(vec3  N, vec3  I, vec3  Nref);"));
223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  faceforward(vec4  N, vec4  I, vec4  Nref);"));
224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float reflect(float I, float N);"));
226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  reflect(vec2  I, vec2  N);"));
227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  reflect(vec3  I, vec3  N);"));
228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  reflect(vec4  I, vec4  N);"));
229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("float refract(float I, float N, float eta);"));
231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec2  refract(vec2  I, vec2  N, float eta);"));
232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec3  refract(vec3  I, vec3  N, float eta);"));
233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4  refract(vec4  I, vec4  N, float eta);"));
234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Matrix Functions.
237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);"));
239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);"));
240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);"));
241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Vector relational functions.
244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 lessThan(vec2 x, vec2 y);"));
246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 lessThan(vec3 x, vec3 y);"));
247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 lessThan(vec4 x, vec4 y);"));
248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);"));
250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);"));
251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);"));
252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);"));
254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);"));
255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);"));
256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);"));
258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);"));
259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);"));
260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);"));
262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);"));
263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);"));
264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);"));
266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);"));
267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);"));
268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);"));
270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);"));
271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);"));
272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);"));
274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);"));
275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);"));
276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 equal(vec2 x, vec2 y);"));
278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 equal(vec3 x, vec3 y);"));
279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 equal(vec4 x, vec4 y);"));
280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 equal(ivec2 x, ivec2 y);"));
282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 equal(ivec3 x, ivec3 y);"));
283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 equal(ivec4 x, ivec4 y);"));
284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 equal(bvec2 x, bvec2 y);"));
286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 equal(bvec3 x, bvec3 y);"));
287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 equal(bvec4 x, bvec4 y);"));
288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 notEqual(vec2 x, vec2 y);"));
290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 notEqual(vec3 x, vec3 y);"));
291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 notEqual(vec4 x, vec4 y);"));
292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);"));
294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);"));
295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);"));
296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);"));
298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);"));
299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);"));
300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool any(bvec2 x);"));
302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool any(bvec3 x);"));
303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool any(bvec4 x);"));
304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool all(bvec2 x);"));
306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool all(bvec3 x);"));
307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bool all(bvec4 x);"));
308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec2 not(bvec2 x);"));
310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec3 not(bvec3 x);"));
311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("bvec4 not(bvec4 x);"));
312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Noise functions.
315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("float noise1(float x);"));
317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("float noise1(vec2  x);"));
318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("float noise1(vec3  x);"));
319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("float noise1(vec4  x);"));
320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec2 noise2(float x);"));
322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec2 noise2(vec2  x);"));
323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec2 noise2(vec3  x);"));
324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec2 noise2(vec4  x);"));
325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec3 noise3(float x);"));
327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec3 noise3(vec2  x);"));
328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec3 noise3(vec3  x);"));
329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec3 noise3(vec4  x);"));
330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec4 noise4(float x);"));
332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec4 noise4(vec2  x);"));
333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec4 noise4(vec3  x);"));
334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec4 noise4(vec4  x);"));
335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Prototypes for built-in functions seen by vertex shaders only.
342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
344ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic TString BuiltInFunctionsVertex(const ShBuiltInResources& resources)
345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Geometric Functions.
350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //s.append(TString("vec4 ftransform();"));
352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Texture Functions.
355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
356ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (resources.MaxVertexTextureImageUnits > 0) {
357ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
358ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
359ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
360ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
361ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
362ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);"));
363ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);"));
364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);"));
365ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);"));
366ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Prototypes for built-in functions seen by fragment shaders only.
374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
376ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic TString BuiltInFunctionsFragment(const ShBuiltInResources& resources)
377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Texture Functions.
382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
383ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
384ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
385ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
386ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
387ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);"));
389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);"));
390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);"));
391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);"));
392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
393ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (resources.OES_standard_derivatives) {
394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("float dFdx(float p);"));
395ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec2  dFdx(vec2  p);"));
396ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec3  dFdx(vec3  p);"));
397ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4  dFdx(vec4  p);"));
398ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
399ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("float dFdy(float p);"));
400ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec2  dFdy(vec2  p);"));
401ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec3  dFdy(vec3  p);"));
402ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4  dFdy(vec4  p);"));
403ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
404ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("float fwidth(float p);"));
405ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec2  fwidth(vec2  p);"));
406ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec3  fwidth(vec3  p);"));
407ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        s.append(TString("vec4  fwidth(vec4  p);"));
408ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Standard uniforms.
416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstatic TString StandardUniforms()
419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Depth range in window coordinates
424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("struct gl_DepthRangeParameters {"));
426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("    highp float near;"));        // n
427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("    highp float far;"));         // f
428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("    highp float diff;"));        // f - n
429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("};"));
430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;"));
431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Default precision for vertex shaders.
438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstatic TString DefaultPrecisionVertex()
441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("precision highp int;"));
445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("precision highp float;"));
446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Default precision for fragment shaders.
453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstatic TString DefaultPrecisionFragment()
456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TString s;
458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    s.append(TString("precision mediump int;"));
460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // No default precision for float in fragment shaders
461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s;
463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Implementation dependent built-in constants.
468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//============================================================================
470ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic TString BuiltInConstants(const ShBuiltInResources &resources)
471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TStringStream s;
473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxVertexAttribs = " << resources.MaxVertexAttribs << ";";
4755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxVertexUniformVectors = " << resources.MaxVertexUniformVectors << ";";
476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxVaryingVectors = " << resources.MaxVaryingVectors << ";";
4785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxVertexTextureImageUnits = " << resources.MaxVertexTextureImageUnits << ";";
4795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxCombinedTextureImageUnits = " << resources.MaxCombinedTextureImageUnits << ";";
4805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxTextureImageUnits = " << resources.MaxTextureImageUnits << ";";
4815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxFragmentUniformVectors = " << resources.MaxFragmentUniformVectors << ";";
4825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    s << "const int gl_MaxDrawBuffers = " << resources.MaxDrawBuffers << ";";
483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return s.str();
485a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
487ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid TBuiltIns::initialize(ShShaderType type, ShShaderSpec spec,
488ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                           const ShBuiltInResources& resources)
489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
490ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    switch (type) {
491ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_FRAGMENT_SHADER:
492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(DefaultPrecisionFragment());
493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(BuiltInFunctionsCommon());
494ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        builtInStrings.push_back(BuiltInFunctionsFragment(resources));
495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(StandardUniforms());
496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        break;
497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
498ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_VERTEX_SHADER:
499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(DefaultPrecisionVertex());
500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(BuiltInFunctionsCommon());
501ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        builtInStrings.push_back(BuiltInFunctionsVertex(resources));
502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        builtInStrings.push_back(StandardUniforms());
503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        break;
504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    default: assert(false && "Language not supported");
506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    builtInStrings.push_back(BuiltInConstants(resources));
509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
511ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
512ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                      const ShBuiltInResources& resources,
513ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                      TSymbolTable& symbolTable)
514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // First, insert some special built-in variables that are not in
517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // the built-in header files.
518a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
519ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    switch(type) {
520ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_FRAGMENT_SHADER:
521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"),                   TType(EbtFloat, EbpMedium, EvqFragCoord,   4)));
522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"),                 TType(EbtBool,  EbpUndefined, EvqFrontFacing, 1)));
523a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),                   TType(EbtFloat, EbpMedium, EvqFragColor,   4)));
524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData,    4)));
525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"),                  TType(EbtFloat, EbpMedium, EvqPointCoord,  2)));
526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        break;
527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
528ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_VERTEX_SHADER:
529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"),    TType(EbtFloat, EbpHigh, EvqPosition,    4)));
530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"),   TType(EbtFloat, EbpMedium, EvqPointSize,   1)));
531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        break;
532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    default: assert(false && "Language not supported");
534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Next, identify which built-ins from the already loaded headers have
538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // a mapping to an operator.  Those that are not identified as such are
539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // expected to be resolved through a library of functions, versus as
540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // operations.
541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    //
542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("not",              EOpVectorLogicalNot);
543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("matrixCompMult",   EOpMul);
545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("equal",            EOpVectorEqual);
547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("notEqual",         EOpVectorNotEqual);
548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("lessThan",         EOpLessThan);
549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("greaterThan",      EOpGreaterThan);
550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("lessThanEqual",    EOpLessThanEqual);
551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("radians",      EOpRadians);
554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("degrees",      EOpDegrees);
555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("sin",          EOpSin);
556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("cos",          EOpCos);
557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("tan",          EOpTan);
558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("asin",         EOpAsin);
559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("acos",         EOpAcos);
560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("atan",         EOpAtan);
561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("pow",          EOpPow);
563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("exp2",         EOpExp2);
564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("log",          EOpLog);
565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("exp",          EOpExp);
566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("log2",         EOpLog2);
567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("sqrt",         EOpSqrt);
568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("inversesqrt",  EOpInverseSqrt);
569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("abs",          EOpAbs);
571a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("sign",         EOpSign);
572a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("floor",        EOpFloor);
573a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("ceil",         EOpCeil);
574a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("fract",        EOpFract);
575a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("mod",          EOpMod);
576a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("min",          EOpMin);
577a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("max",          EOpMax);
578a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("clamp",        EOpClamp);
579a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("mix",          EOpMix);
580a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("step",         EOpStep);
581a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("smoothstep",   EOpSmoothStep);
582a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
583a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("length",       EOpLength);
584a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("distance",     EOpDistance);
585a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("dot",          EOpDot);
586a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("cross",        EOpCross);
587a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("normalize",    EOpNormalize);
588a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("faceforward",  EOpFaceForward);
589a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("reflect",      EOpReflect);
590a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("refract",      EOpRefract);
591a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
592a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("any",          EOpAny);
593a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    symbolTable.relateToOperator("all",          EOpAll);
594a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
595a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Map language-specific operators.
596ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    switch(type) {
597ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_VERTEX_SHADER:
5985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        break;
599ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_FRAGMENT_SHADER:
600ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (resources.OES_standard_derivatives) {
601ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToOperator("dFdx",   EOpDFdx);
602ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToOperator("dFdy",   EOpDFdy);
603ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToOperator("fwidth", EOpFwidth);
604ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
605ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives");
606ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives");
607ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives");
608ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
6095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        break;
6105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    default: break;
6115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    // Finally add resource-specific variables.
614ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    switch(type) {
615ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    case SH_FRAGMENT_SHADER: {
616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            // Set up gl_FragData.  The array size.
617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            TType fragData(EbtFloat, EbpMedium, EvqFragColor,   4, false, true);
6185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            fragData.setArraySize(resources.MaxDrawBuffers);
619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"),    fragData));
620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        break;
622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    default: break;
623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
626ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid InitExtensionBehavior(const ShBuiltInResources& resources,
627ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                           TExtensionBehavior& extBehavior)
628ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
629ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (resources.OES_standard_derivatives)
630ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        extBehavior["GL_OES_standard_derivatives"] = EBhDisable;
631ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
632