Home | History | Annotate | Download | only in sksl
      1 STRINGIFY(
      2 
      3 // defines built-in functions supported by SkiaSL
      4 
      5 $genType radians($genType degrees);
      6 $genType sin($genType angle);
      7 $genType cos($genType angle);
      8 $genType tan($genType angle);
      9 $genType asin($genType x);
     10 $genType acos($genType x);
     11 $genType atan($genType y, $genType x);
     12 $genType atan($genType y_over_x);
     13 $genType sinh($genType x);
     14 $genType cosh($genType x);
     15 $genType tanh($genType x);
     16 $genType asinh($genType x);
     17 $genType acosh($genType x);
     18 $genType atanh($genType x);
     19 $genType pow($genType x, $genType y);
     20 $genType exp($genType x);
     21 $genType log($genType x);
     22 $genType exp2($genType x);
     23 $genType log2($genType x);
     24 $genType sqrt($genType x);
     25 //$genDType sqrt($genDType x);
     26 $genType inversesqrt($genType x);
     27 //$genDType inversesqrt($genDType x);
     28 $genType abs($genType x);
     29 $genIType abs($genIType x);
     30 //$genDType abs($genDType x);
     31 $genType sign($genType x);
     32 $genIType sign($genIType x);
     33 //$genDType sign($genDType x);
     34 $genType floor($genType x);
     35 //$genDType floor($genDType x);
     36 $genType trunc($genType x);
     37 //$genDType trunc($genDType x);
     38 $genType round($genType x);
     39 //$genDType round($genDType x);
     40 $genType roundEven($genType x);
     41 //$genDType roundEven($genDType x);
     42 $genType ceil($genType x);
     43 //$genDType ceil($genDType x);
     44 $genType fract($genType x);
     45 //$genDType fract($genDType x);
     46 $genType mod($genType x, float y);
     47 $genType mod($genType x, $genType y);
     48 //$genDType mod($genDType x, double y);
     49 //$genDType mod($genDType x, $genDType y);
     50 $genType modf($genType x, out $genType i);
     51 //$genDType modf($genDType x, out $genDType i);
     52 $genType min($genType x, $genType y);
     53 $genType min($genType x, float y);
     54 //$genDType min($genDType x, $genDType y);
     55 //$genDType min($genDType x, double y);
     56 $genIType min($genIType x, $genIType y);
     57 $genIType min($genIType x, int y);
     58 //$genUType min($genUType x, $genUType y);
     59 //$genUType min($genUType x, uint y);
     60 $genType max($genType x, $genType y);
     61 $genType max($genType x, float y);
     62 //$genDType max($genDType x, $genDType y);
     63 //$genDType max($genDType x, double y);
     64 $genIType max($genIType x, $genIType y);
     65 $genIType max($genIType x, int y);
     66 //$genUType max($genUType x, $genUType y);
     67 //$genUType max($genUType x, uint y);
     68 $genType clamp($genType x, $genType minVal, $genType maxVal);
     69 $genType clamp($genType x, float minVal, float maxVal);
     70 //$genDType clamp($genDType x, $genDType minVal, $genDType maxVal);
     71 //$genDType clamp($genDType x, double minVal, double maxVal);
     72 $genIType clamp($genIType x, $genIType minVal, $genIType maxVal);
     73 $genIType clamp($genIType x, int minVal, int maxVal);
     74 //$genUType clamp($genUType x, $genUType minVal, $genUType maxVal);
     75 //$genUType clamp($genUType x, uint minVal, uint maxVal);
     76 $genType mix($genType x, $genType y, $genType a);
     77 $genType mix($genType x, $genType y, float a);
     78 //$genDType mix($genDType x, $genDType y, $genDType a);
     79 //$genDType mix($genDType x, $genDType y, double a);
     80 $genType mix($genType x, $genType y, $genBType a);
     81 //$genDType mix($genDType x, $genDType y, $genBType a);
     82 $genIType mix($genIType x, $genIType y, $genBType a);
     83 //$genUType mix($genUType x, $genUType y, $genBType a);
     84 $genBType mix($genBType x, $genBType y, $genBType a);
     85 $genType step($genType edge, $genType x);
     86 $genType step(float edge, $genType x);
     87 //$genDType step($genDType edge, $genDType x);
     88 //$genDType step(double edge, $genDType x);
     89 $genType smoothstep($genType edge0, $genType edge1, $genType x);
     90 $genType smoothstep(float edge0, float edge1, $genType x);
     91 //$genDType smoothstep($genDType edge0, $genDType edge1, $genDType x);
     92 //$genDType smoothstep(double edge0, double edge1, $genDType x);
     93 $genBType isnan($genType x);
     94 $genBType isnan($genDType x);
     95 $genBType isinf($genType x);
     96 $genBType isinf($genDType x);
     97 $genIType floatBitsToInt($genType value);
     98 //$genUType floatBitsToUint($genType value);
     99 $genType intBitsToFloat($genIType value);
    100 $genType uintBitsToFloat($genUType value);
    101 $genType fma($genType a, $genType b, $genType c);
    102 //$genDType fma($genDType a, $genDType b, $genDType c);
    103 $genType frexp($genType x, out $genIType exp);
    104 //$genDType frexp($genDType x, out $genIType exp);
    105 $genType ldexp($genType x, in $genIType exp);
    106 //$genDType ldexp($genDType x, in $genIType exp);
    107 uint packUnorm2x16(vec2 v);
    108 uint packSnorm2x16(vec2 v);
    109 uint packUnorm4x8(vec4 v);
    110 uint packSnorm4x8(vec4 v);
    111 vec2 unpackUnorm2x16(uint p);
    112 vec2 unpackSnorm2x16(uint p);
    113 vec4 unpackUnorm4x8(uint p);
    114 vec4 unpackSnorm4x8(uint p);
    115 //double packDouble2x32(uvec2 v);
    116 uvec2 unpackDouble2x32(double v);
    117 uint packHalf2x16(vec2 v);
    118 vec2 unpackHalf2x16(uint v);
    119 float length($genType x);
    120 //double length($genDType x);
    121 float distance($genType p0, $genType p1);
    122 //double distance($genDType p0, $genDType p1);
    123 float dot($genType x, $genType y);
    124 //double dot($genDType x, $genDType y);
    125 vec3 cross(vec3 x, vec3 y);
    126 //dvec3 cross(dvec3 x, dvec3 y);
    127 $genType normalize($genType x);
    128 //$genDType normalize($genDType x);
    129 vec4 ftransform();
    130 $genType faceforward($genType N, $genType I, $genType Nref);
    131 //$genDType faceforward($genDType N, $genDType I, $genDType Nref);
    132 $genType reflect($genType I, $genType N);
    133 //$genDType reflect($genDType I, $genDType N);
    134 $genType refract($genType I, $genType N, float eta);
    135 //$genDType refract($genDType I, $genDType N, float eta);
    136 $mat matrixCompMult($mat x, $mat y);
    137 mat2 outerProduct(vec2 c, vec2 r);
    138 mat3 outerProduct(vec3 c, vec3 r);
    139 mat4 outerProduct(vec4 c, vec4 r);
    140 mat2x3 outerProduct(vec3 c, vec2 r);
    141 mat3x2 outerProduct(vec2 c, vec3 r);
    142 mat2x4 outerProduct(vec4 c, vec2 r);
    143 mat4x2 outerProduct(vec2 c, vec4 r);
    144 mat3x4 outerProduct(vec4 c, vec3 r);
    145 mat4x3 outerProduct(vec3 c, vec4 r);
    146 mat2 transpose(mat2 m);
    147 mat3 transpose(mat3 m);
    148 mat4 transpose(mat4 m);
    149 mat2x3 transpose(mat3x2 m);
    150 mat3x2 transpose(mat2x3 m);
    151 mat2x4 transpose(mat4x2 m);
    152 mat4x2 transpose(mat2x4 m);
    153 mat3x4 transpose(mat4x3 m);
    154 mat4x3 transpose(mat3x4 m);
    155 float determinant(mat2 m);
    156 float determinant(mat3 m);
    157 float determinant(mat4 m);
    158 mat2 inverse(mat2 m);
    159 mat3 inverse(mat3 m);
    160 mat4 inverse(mat4 m);
    161 $bvec lessThan($vec x, $vec y);
    162 $bvec lessThan($ivec x, $ivec y);
    163 $bvec lessThan($uvec x, $uvec y);
    164 $bvec lessThanEqual($vec x, $vec y);
    165 $bvec lessThanEqual($ivec x, $ivec y);
    166 $bvec lessThanEqual($uvec x, $uvec y);
    167 $bvec greaterThan($vec x, $vec y);
    168 $bvec greaterThan($ivec x, $ivec y);
    169 $bvec greaterThan($uvec x, $uvec y);
    170 $bvec greaterThanEqual($vec x, $vec y);
    171 $bvec greaterThanEqual($ivec x, $ivec y);
    172 $bvec greaterThanEqual($uvec x, $uvec y);
    173 $bvec equal($vec x, $vec y);
    174 $bvec equal($ivec x, $ivec y);
    175 $bvec equal($uvec x, $uvec y);
    176 $bvec equal($bvec x, $bvec y);
    177 $bvec notEqual($vec x, $vec y);
    178 $bvec notEqual($ivec x, $ivec y);
    179 $bvec notEqual($uvec x, $uvec y);
    180 $bvec notEqual($bvec x, $bvec y);
    181 bool any($bvec x);
    182 bool all($bvec x);
    183 $bvec not($bvec x);
    184 
    185 $genIType bitCount($genIType value);
    186 $genIType bitCount($genUType value);
    187 $genIType findLSB($genIType value);
    188 $genIType findLSB($genUType value);
    189 $genIType findMSB($genIType value);
    190 $genIType findMSB($genUType value);
    191 
    192 /*
    193 //$genUType uaddCarry($genUType x, $genUType y, out $genUType carry);
    194 //$genUType usubBorrow($genUType x, $genUType y, out $genUType borrow);
    195 void umulExtended($genUType x, $genUType y, out $genUType msb, out $genUType lsb);
    196 void imulExtended($genIType x, $genIType y, out $genIType msb, out $genIType lsb);
    197 $genIType bitfieldExtract($genIType value, int offset, int bits);
    198 //$genUType bitfieldExtract($genUType value, int offset, int bits);
    199 $genIType bitfieldInsert($genIType base, $genIType insert, int offset, int bits);
    200 //$genUType bitfieldInsert($genUType base, $genUType insert, int offset, int bits);
    201 $genIType bitfieldReverse($genIType value);
    202 //$genUType bitfieldReverse($genUType value);
    203 int textureSize($gsampler1D sampler, int lod);
    204 ivec2 textureSize($gsampler2D sampler, int lod);
    205 ivec3 textureSize($gsampler3D sampler, int lod);
    206 ivec2 textureSize($gsamplerCube sampler, int lod);
    207 int textureSize(sampler1DShadow sampler, int lod);
    208 ivec2 textureSize(sampler2DShadow sampler, int lod);
    209 ivec2 textureSize(samplerCubeShadow sampler, int lod);
    210 ivec3 textureSize($gsamplerCubeArray sampler, int lod);
    211 ivec3 textureSize(samplerCubeArrayShadow sampler, int lod);
    212 */
    213 ivec2 textureSize($gsampler2DRect sampler);
    214 /*
    215 ivec2 textureSize(sampler2DRectShadow sampler);
    216 ivec2 textureSize($gsampler1DArray sampler, int lod);
    217 ivec3 textureSize($gsampler2DArray sampler, int lod);
    218 ivec2 textureSize(sampler1DArrayShadow sampler, int lod);
    219 ivec3 textureSize(sampler2DArrayShadow sampler, int lod);
    220 int textureSize($gsamplerBuffer sampler);
    221 ivec2 textureSize($gsampler2DMS sampler);
    222 ivec3 textureSize($gsampler2DMSArray sampler);
    223 vec2 textureQueryLod($gsampler1D sampler, float P);
    224 vec2 textureQueryLod($gsampler2D sampler, vec2 P);
    225 vec2 textureQueryLod($gsampler3D sampler, vec3 P);
    226 vec2 textureQueryLod($gsamplerCube sampler, vec3 P);
    227 vec2 textureQueryLod($gsampler1DArray sampler, float P);
    228 vec2 textureQueryLod($gsampler2DArray sampler, vec2 P);
    229 vec2 textureQueryLod($gsamplerCubeArray sampler, vec3 P);
    230 vec2 textureQueryLod(sampler1DShadow sampler, float P);
    231 vec2 textureQueryLod(sampler2DShadow sampler, vec2 P);
    232 vec2 textureQueryLod(samplerCubeShadow sampler, vec3 P);
    233 vec2 textureQueryLod(sampler1DArrayShadow sampler, float P);
    234 vec2 textureQueryLod(sampler2DArrayShadow sampler, vec2 P);
    235 vec2 textureQueryLod(samplerCubeArrayShadow sampler, vec3 P);
    236 int textureQueryLevels($gsampler1D sampler);
    237 int textureQueryLevels($gsampler2D sampler);
    238 int textureQueryLevels($gsampler3D sampler);
    239 int textureQueryLevels($gsamplerCube sampler);
    240 int textureQueryLevels($gsampler1DArray sampler);
    241 int textureQueryLevels($gsampler2DArray sampler);
    242 int textureQueryLevels($gsamplerCubeArray sampler);
    243 int textureQueryLevels(sampler1DShadow sampler);
    244 int textureQueryLevels(sampler2DShadow sampler);
    245 int textureQueryLevels(samplerCubeShadow sampler);
    246 int textureQueryLevels(sampler1DArrayShadow sampler);
    247 int textureQueryLevels(sampler2DArrayShadow sampler);
    248 int textureQueryLevels(samplerCubeArrayShadow sampler);
    249 */
    250 
    251 $gvec4 texture($gsampler1D sampler, float P);
    252 $gvec4 texture($gsampler1D sampler, float P, float bias);
    253 $gvec4 texture($gsampler2D sampler, vec2 P);
    254 // The above currently only expand to handle the float/fixed case. So we also declare this integer
    255 // version of texture().
    256 ivec4 texture(isampler2D sampler, vec2 P);
    257 vec4 texture(samplerExternalOES sampler, vec2 P, float bias);
    258 vec4 texture(samplerExternalOES sampler, vec2 P);
    259 
    260 /*
    261 $gvec4 texture($gsampler2D sampler, vec2 P, float bias);
    262 $gvec4 texture($gsampler3D sampler, vec3 P);
    263 $gvec4 texture($gsampler3D sampler, vec3 P, float bias);
    264 $gvec4 texture($gsamplerCube sampler, vec3 P);
    265 $gvec4 texture($gsamplerCube sampler, vec3 P, float bias);
    266 float texture(sampler1DShadow sampler, vec3 P);
    267 float texture(sampler1DShadow sampler, vec3 P, float bias);
    268 float texture(sampler2DShadow sampler, vec3 P);
    269 float texture(sampler2DShadow sampler, vec3 P, float bias);
    270 float texture(samplerCubeShadow sampler, vec4 P);
    271 float texture(samplerCubeShadow sampler, vec4 P, float bias);
    272 $gvec4 texture($gsampler1DArray sampler, vec2 P);
    273 $gvec4 texture($gsampler1DArray sampler, vec2 P, float bias);
    274 $gvec4 texture($gsampler2DArray sampler, vec3 P);
    275 $gvec4 texture($gsampler2DArray sampler, vec3 P, float bias);
    276 $gvec4 texture($gsamplerCubeArray sampler, vec4 P);
    277 $gvec4 texture($gsamplerCubeArray sampler, vec4 P, float bias);
    278 float texture(sampler1DArrayShadow sampler, vec3 P);
    279 float texture(sampler1DArrayShadow sampler, vec3 P, float bias);
    280 float texture(sampler2DArrayShadow sampler, vec4 P);
    281 */
    282 
    283 $gvec4 texture($gsampler2DRect sampler, vec2 P);
    284 
    285 /*
    286 float texture(sampler2DRectShadow sampler, vec3 P);
    287 float texture($gsamplerCubeArrayShadow sampler, vec4 P, float compare);
    288 */
    289 
    290 // Currently we do not support the generic types of loading subpassInput so we have some explicit
    291 // versions that we currently use
    292 vec4 subpassLoad(subpassInput subpass);
    293 vec4 subpassLoad(subpassInputMS subpass, int sample);
    294 /*
    295 $gvec4 subpassLoad(gsubpassInput subpass);
    296 $gvec4 subpassLoad(gsubpassInputMS subpass, int sample);
    297 */
    298 )
    299 
    300 // split into multiple chunks, as MSVC++ complains if a single string is too long
    301 
    302 STRINGIFY(
    303 
    304 $gvec4 texture($gsampler1D sampler, vec2 P);
    305 $gvec4 texture($gsampler1D sampler, vec2 P, float bias);
    306 $gvec4 texture($gsampler2D sampler, vec3 P);
    307 $gvec4 texture($gsampler2D sampler, vec3 P, float bias);
    308 /*
    309 $gvec4 textureProj($gsampler3D sampler, vec4 P);
    310 $gvec4 textureProj($gsampler3D sampler, vec4 P, float bias);
    311 float textureProj(sampler1DShadow sampler, vec4 P);
    312 float textureProj(sampler1DShadow sampler, vec4 P, float bias);
    313 float textureProj(sampler2DShadow sampler, vec4 P);
    314 float textureProj(sampler2DShadow sampler, vec4 P, float bias);
    315 $gvec4 textureProj($gsampler2DRect sampler, vec3 P);
    316 $gvec4 textureProj($gsampler2DRect sampler, vec4 P);
    317 float textureProj(sampler2DRectShadow sampler, vec4 P);
    318 $gvec4 textureLod($gsampler1D sampler, float P, float lod);
    319 $gvec4 textureLod($gsampler2D sampler, vec2 P, float lod);
    320 $gvec4 textureLod($gsampler3D sampler, vec3 P, float lod);
    321 $gvec4 textureLod($gsamplerCube sampler, vec3 P, float lod);
    322 float textureLod(sampler1DShadow sampler, vec3 P, float lod);
    323 float textureLod(sampler2DShadow sampler, vec3 P, float lod);
    324 $gvec4 textureLod($gsampler1DArray sampler, vec2 P, float lod);
    325 $gvec4 textureLod($gsampler2DArray sampler, vec3 P, float lod);
    326 float textureLod(sampler1DArrayShadow sampler, vec3 P, float lod);
    327 $gvec4 textureLod($gsamplerCubeArray sampler, vec4 P, float lod);
    328 $gvec4 textureOffset($gsampler1D sampler, float P, int offset);
    329 $gvec4 textureOffset($gsampler1D sampler, float P, int offset, float bias);
    330 $gvec4 textureOffset($gsampler2D sampler, vec2 P, ivec2 offset);
    331 $gvec4 textureOffset($gsampler2D sampler, vec2 P, ivec2 offset, float bias);
    332 $gvec4 textureOffset($gsampler3D sampler, vec3 P, ivec3 offset);
    333 $gvec4 textureOffset($gsampler3D sampler, vec3 P, ivec3 offset, float bias);
    334 $gvec4 textureOffset($gsampler2DRect sampler, vec2 P, ivec2 offset);
    335 float textureOffset(sampler2DRectShadow sampler, vec3 P, ivec2 offset);
    336 float textureOffset(sampler1DShadow sampler, vec3 P, int offset);
    337 float textureOffset(sampler1DShadow sampler, vec3 P, int offset, float bias);
    338 float textureOffset(sampler2DShadow sampler, vec3 P, ivec2 offset);
    339 float textureOffset(sampler2DShadow sampler, vec3 P, ivec2 offset, float bias);
    340 $gvec4 textureOffset($gsampler1DArray sampler, vec2 P, int offset);
    341 $gvec4 textureOffset($gsampler1DArray sampler, vec2 P, int offset, float bias);
    342 $gvec4 textureOffset($gsampler2DArray sampler, vec3 P, ivec2 offset);
    343 $gvec4 textureOffset($gsampler2DArray sampler, vec3 P, ivec2 offset, float bias);
    344 float textureOffset(sampler1DArrayShadow sampler, vec3 P, int offset);
    345 float textureOffset(sampler1DArrayShadow sampler, vec3 P, int offset, float bias);
    346 float textureOffset(sampler2DArrayShadow sampler, vec4 P, ivec2 offset);
    347 */
    348 $gvec4 texelFetch($gsampler1D sampler, int P, int lod);
    349 $gvec4 texelFetch($gsampler2D sampler, ivec2 P, int lod);
    350 $gvec4 texelFetch($gsamplerBuffer sampler, int P);
    351 $gvec4 texelFetch($gsampler2DRect sampler, ivec2 P);
    352 /*
    353 $gvec4 texelFetch($gsampler3D sampler, ivec3 P, int lod);
    354 $gvec4 texelFetch($gsampler1DArray sampler, ivec2 P, int lod);
    355 $gvec4 texelFetch($gsampler2DArray sampler, ivec3 P, int lod);
    356 $gvec4 texelFetch($gsampler2DMS sampler, ivec2 P, int sample);
    357 $gvec4 texelFetch($gsampler2DMSArray sampler, ivec3 P, int sample);
    358 $gvec4 texelFetchOffset($gsampler1D sampler, int P, int lod, int offset);
    359 $gvec4 texelFetchOffset($gsampler2D sampler, ivec2 P, int lod, ivec2 offset);
    360 $gvec4 texelFetchOffset($gsampler3D sampler, ivec3 P, int lod, ivec3 offset);
    361 $gvec4 texelFetchOffset($gsampler2DRect sampler, ivec2 P, ivec2 offset);
    362 $gvec4 texelFetchOffset($gsampler1DArray sampler, ivec2 P, int lod, int offset);
    363 $gvec4 texelFetchOffset($gsampler2DArray sampler, ivec3 P, int lod, ivec2 offset);
    364 $gvec4 textureProjOffset($gsampler1D sampler, vec2 P, int offset);
    365 $gvec4 textureProjOffset($gsampler1D sampler, vec2 P, int offset, float bias);
    366 $gvec4 textureProjOffset($gsampler1D sampler, vec4 P, int offset);
    367 $gvec4 textureProjOffset($gsampler1D sampler, vec4 P, int offset, float bias);
    368 $gvec4 textureProjOffset($gsampler2D sampler, vec3 P, ivec2 offset);
    369 $gvec4 textureProjOffset($gsampler2D sampler, vec3 P, ivec2 offset, float bias);
    370 $gvec4 textureProjOffset($gsampler2D sampler, vec4 P, ivec2 offset);
    371 $gvec4 textureProjOffset($gsampler2D sampler, vec4 P, ivec2 offset, float bias);
    372 $gvec4 textureProjOffset($gsampler3D sampler, vec4 P, ivec3 offset);
    373 $gvec4 textureProjOffset($gsampler3D sampler, vec4 P, ivec3 offset, float bias);
    374 $gvec4 textureProjOffset($gsampler2DRect sampler, vec3 P, ivec2 offset);
    375 $gvec4 textureProjOffset($gsampler2DRect sampler, vec4 P, ivec2 offset);
    376 float textureProjOffset(sampler2DRectShadow sampler, vec4 P, ivec2 offset);
    377 float textureProjOffset(sampler1DShadow sampler, vec4 P, int offset);
    378 float textureProjOffset(sampler1DShadow sampler, vec4 P, int offset, float bias);
    379 float textureProjOffset(sampler2DShadow sampler, vec4 P, ivec2 offset);
    380 float textureProjOffset(sampler2DShadow sampler, vec4 P, ivec2 offset, float bias);
    381 $gvec4 textureLodOffset($gsampler1D sampler, float P, float lod, int offset);
    382 $gvec4 textureLodOffset($gsampler2D sampler, vec2 P, float lod, ivec2 offset);
    383 $gvec4 textureLodOffset($gsampler3D sampler, vec3 P, float lod, ivec3 offset);
    384 float textureLodOffset(sampler1DShadow sampler, vec3 P, float lod, int offset);
    385 float textureLodOffset(sampler2DShadow sampler, vec3 P, float lod, ivec2 offset);
    386 $gvec4 textureLodOffset($gsampler1DArray sampler, vec2 P, float lod, int offset);
    387 $gvec4 textureLodOffset($gsampler2DArray sampler, vec3 P, float lod, ivec2 offset);
    388 float textureLodOffset(sampler1DArrayShadow sampler, vec3 P, float lod, int offset);
    389 $gvec4 textureProjLod($gsampler1D sampler, vec2 P, float lod);
    390 $gvec4 textureProjLod($gsampler1D sampler, vec4 P, float lod);
    391 $gvec4 textureProjLod($gsampler2D sampler, vec3 P, float lod);
    392 $gvec4 textureProjLod($gsampler2D sampler, vec4 P, float lod);
    393 $gvec4 textureProjLod($gsampler3D sampler, vec4 P, float lod);
    394 float textureProjLod(sampler1DShadow sampler, vec4 P, float lod);
    395 float textureProjLod(sampler2DShadow sampler, vec4 P, float lod);
    396 $gvec4 textureProjLodOffset($gsampler1D sampler, vec2 P, float lod, int offset);
    397 $gvec4 textureProjLodOffset($gsampler1D sampler, vec4 P, float lod, int offset);
    398 $gvec4 textureProjLodOffset($gsampler2D sampler, vec3 P, float lod, ivec2 offset);
    399 $gvec4 textureProjLodOffset($gsampler2D sampler, vec4 P, float lod, ivec2 offset);
    400 $gvec4 textureProjLodOffset($gsampler3D sampler, vec4 P, float lod, ivec3 offset);
    401 float textureProjLodOffset(sampler1DShadow sampler, vec4 P, float lod, int offset);
    402 float textureProjLodOffset(sampler2DShadow sampler, vec4 P, float lod, ivec2 offset);
    403 $gvec4 textureGrad($gsampler1D sampler, float P, float dPdx, float dPdy);
    404 $gvec4 textureGrad($gsampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);
    405 $gvec4 textureGrad($gsampler3D sampler, vec3 P, vec3 dPdx, vec3 dPdy);
    406 $gvec4 textureGrad($gsamplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);
    407 $gvec4 textureGrad($gsampler2DRect sampler, vec2 P, vec2 dPdx, vec2 dPdy);
    408 float textureGrad(sampler2DRectShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy);
    409 float textureGrad(sampler1DShadow sampler, vec3 P, float dPdx, float dPdy);
    410 float textureGrad(sampler2DShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy);
    411 float textureGrad(samplerCubeShadow sampler, vec4 P, vec3 dPdx, vec3 dPdy);
    412 $gvec4 textureGrad($gsampler1DArray sampler, vec2 P, float dPdx, float dPdy);
    413 $gvec4 textureGrad($gsampler2DArray sampler, vec3 P, vec2 dPdx, vec2 dPdy);
    414 float textureGrad(sampler1DArrayShadow sampler, vec3 P, float dPdx, float dPdy);
    415 float textureGrad(sampler2DArrayShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
    416 $gvec4 textureGrad($gsamplerCubeArray sampler, vec4 P, vec3 dPdx, vec3 dPdy);
    417 $gvec4 textureGradOffset($gsampler1D sampler, float P, float dPdx, float dPdy, int offset);
    418 $gvec4 textureGradOffset($gsampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    419 $gvec4 textureGradOffset($gsampler3D sampler, vec3 P, vec3 dPdx, vec3 dPdy, ivec3 offset);
    420 $gvec4 textureGradOffset($gsampler2DRect sampler, vec2 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    421 float textureGradOffset(sampler2DRectShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    422 float textureGradOffset(sampler1DShadow sampler, vec3 P, float dPdx, float dPdy, int offset );
    423 float textureGradOffset(sampler2DShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    424 $gvec4 textureGradOffset($gsampler1DArray sampler, vec2 P, float dPdx, float dPdy, int offset);
    425 $gvec4 textureGradOffset($gsampler2DArray sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    426 float textureGradOffset(sampler1DArrayShadow sampler, vec3 P, float dPdx, float dPdy, int offset);
    427 float textureGradOffset(sampler2DArrayShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    428 $gvec4 textureProjGrad($gsampler1D sampler, vec2 P, float dPdx, float dPdy);
    429 $gvec4 textureProjGrad($gsampler1D sampler, vec4 P, float dPdx, float dPdy);
    430 $gvec4 textureProjGrad($gsampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);
    431 $gvec4 textureProjGrad($gsampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);
    432 $gvec4 textureProjGrad($gsampler3D sampler, vec4 P, vec3 dPdx, vec3 dPdy);
    433 $gvec4 textureProjGrad($gsampler2DRect sampler, vec3 P, vec2 dPdx, vec2 dPdy);
    434 $gvec4 textureProjGrad($gsampler2DRect sampler, vec4 P, vec2 dPdx, vec2 dPdy);
    435 float textureProjGrad(sampler2DRectShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
    436 float textureProjGrad(sampler1DShadow sampler, vec4 P, float dPdx, float dPdy);
    437 float textureProjGrad(sampler2DShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
    438 $gvec4 textureProjGradOffset($gsampler1D sampler, vec2 P, float dPdx, float dPdy, int offset);
    439 $gvec4 textureProjGradOffset($gsampler1D sampler, vec4 P, float dPdx, float dPdy, int offset);
    440 $gvec4 textureProjGradOffset($gsampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    441 $gvec4 textureProjGradOffset($gsampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    442 $gvec4 textureProjGradOffset($gsampler2DRect sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    443 $gvec4 textureProjGradOffset($gsampler2DRect sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    444 float textureProjGradOffset(sampler2DRectShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    445 $gvec4 textureProjGradOffset($gsampler3D sampler, vec4 P, vec3 dPdx, vec3 dPdy, ivec3 offset);
    446 float textureProjGradOffset(sampler1DShadow sampler, vec4 P, float dPdx, float dPdy, int offset);
    447 float textureProjGradOffset(sampler2DShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
    448 $gvec4 textureGather($gsampler2D sampler, vec2 P);
    449 $gvec4 textureGather($gsampler2D sampler, vec2 P, int comp);
    450 $gvec4 textureGather($gsampler2DArray sampler, vec3 P);
    451 $gvec4 textureGather($gsampler2DArray sampler, vec3 P, int comp);
    452 $gvec4 textureGather($gsamplerCube sampler, vec3 P);
    453 $gvec4 textureGather($gsamplerCube sampler, vec3 P, int comp);
    454 $gvec4 textureGather($gsamplerCubeArray sampler, vec4 P);
    455 $gvec4 textureGather($gsamplerCubeArray sampler, vec4 P, int comp);
    456 $gvec4 textureGather($gsampler2DRect sampler, vec2 P);
    457 $gvec4 textureGather($gsampler2DRect sampler, vec2 P, int comp);
    458 vec4 textureGather(sampler2DShadow sampler, vec2 P, float refZ);
    459 vec4 textureGather(sampler2DArrayShadow sampler, vec3 P, float refZ);
    460 vec4 textureGather(samplerCubeShadow sampler, vec3 P, float refZ);
    461 vec4 textureGather(samplerCubeArrayShadow sampler, vec4 P, float refZ);
    462 vec4 textureGather(sampler2DRectShadow sampler, vec2 P, float refZ);
    463 $gvec4 textureGatherOffset($gsampler2D sampler, vec2 P, ivec2 offset);
    464 $gvec4 textureGatherOffset($gsampler2D sampler, vec2 P, ivec2 offset, int comp);
    465 $gvec4 textureGatherOffset($gsampler2DArray sampler, vec3 P, ivec2 offset);
    466 $gvec4 textureGatherOffset($gsampler2DArray sampler, vec3 P, ivec2 offset, int comp);
    467 $gvec4 textureGatherOffset($gsampler2DRect sampler, vec2 P, ivec2 offset);
    468 $gvec4 textureGatherOffset($gsampler2DRect sampler, vec2 P, ivec2 offset, int comp);
    469 vec4 textureGatherOffset(sampler2DShadow sampler, vec2 P, float refZ, ivec2 offset);
    470 vec4 textureGatherOffset(sampler2DArrayShadow sampler, vec3 P, float refZ, ivec2 offset);
    471 vec4 textureGatherOffset(sampler2DRectShadow sampler, vec2 P, float refZ, ivec2 offset);
    472 $gvec4 textureGatherOffsets($gsampler2D sampler, vec2 P, ivec2 offsets[4]);
    473 $gvec4 textureGatherOffsets($gsampler2D sampler, vec2 P, ivec2 offsets[4], int comp);
    474 $gvec4 textureGatherOffsets($gsampler2DArray sampler, vec3 P, ivec2 offsets[4]);
    475 $gvec4 textureGatherOffsets($gsampler2DArray sampler, vec3 P, ivec2 offsets[4], int comp);
    476 $gvec4 textureGatherOffsets($gsampler2DRect sampler, vec2 P, ivec2 offsets[4]);
    477 $gvec4 textureGatherOffsets($gsampler2DRect sampler, vec2 P, ivec2 offsets[4], int comp);
    478 vec4 textureGatherOffsets(sampler2DShadow sampler, vec2 P, float refZ, ivec2 offsets[4]);
    479 vec4 textureGatherOffsets(sampler2DArrayShadow sampler, vec3 P, float refZ, ivec2 offsets[4]);
    480 vec4 textureGatherOffsets(sampler2DRectShadow sampler, vec2 P, float refZ, ivec2 offsets[4]);
    481 uint atomicCounterIncrement(atomic_uint c);
    482 uint atomicCounter(atomic_uint c);
    483 uint atomicAdd(inout uint mem, uint data);
    484 int atomicAdd(inout int mem, int data);
    485 uint atomicMin(inout uint mem, uint data);
    486 int atomicMin(inout int mem, int data);
    487 uint atomicMax(inout uint mem, uint data);
    488 int atomicMax(inout int mem, int data);
    489 uint atomicAnd(inout uint mem, uint data);
    490 int atomicAnd(inout int mem, int data);
    491 uint atomicOr(inout uint mem, uint data);
    492 int atomicOr(inout int mem, int data);
    493 uint atomicXor(inout uint mem, uint data);
    494 int atomicXor(inout int mem, int data);
    495 uint atomicExchange(inout uint mem, uint data);
    496 int atomicExchange(inout int mem, int data);
    497 uint atomicCompSwap(inout uint mem, uint compare, uint data);
    498 int atomicCompSwap(inout int mem, int compare, int data);
    499 */
    500 // section 8.12 Additional Image Functions will go here if and when we add
    501 // support for them
    502 vec4 imageLoad(image2D image, ivec2 P);
    503 ivec4 imageLoad(iimage2D image, ivec2 P);
    504 $genType dFdx($genType p);
    505 $genType dFdy($genType p);
    506 float interpolateAtSample(float interpolant, int sample);
    507 vec2 interpolateAtSample(vec2 interpolant, int sample);
    508 vec3 interpolateAtSample(vec3 interpolant, int sample);
    509 vec4 interpolateAtSample(vec4 interpolant, int sample);
    510 float interpolateAtOffset(float interpolant, vec2 offset);
    511 vec2 interpolateAtOffset(vec2 interpolant, vec2 offset);
    512 vec3 interpolateAtOffset(vec3 interpolant, vec2 offset);
    513 vec4 interpolateAtOffset(vec4 interpolant, vec2 offset);
    514 
    515 /*
    516 $genType fwidth($genType p);
    517 $genType fwidthCoarse($genType p);
    518 $genType fwidthFine($genType p);
    519 void barrier();
    520 void memoryBarrier();
    521 void memoryBarrierAtomicCounter();
    522 void memoryBarrierBuffer();
    523 void memoryBarrierShared();
    524 void memoryBarrierImage();
    525 void groupMemoryBarrier();
    526 */
    527 
    528 )
    529 
    530