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