LCOV - code coverage report
Current view: directory - gfx/angle/src/compiler - Initialize.cpp (source / functions) Found Hit Coverage
Test: app.info Lines: 379 0 0.0 %
Date: 2012-06-02 Functions: 10 0 0.0 %

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

Generated by: LCOV version 1.7