blob: 9e4863d0d93d3fcccfe8876f0abb54bbf985dd89 [file] [log] [blame]
 // Reduced set of intrinsics that are available to public SkSL (RuntimeEffect and Interpreter) // See "The OpenGL ES Shading Language, Section 8" // 8.1 : Angle and Trigonometry Functions \$genType radians(\$genType degrees); \$genHType radians(\$genHType degrees); \$genType degrees(\$genType radians); \$genHType degrees(\$genHType radians); \$genType sin(\$genType angle); \$genHType sin(\$genHType angle); \$genType cos(\$genType angle); \$genHType cos(\$genHType angle); \$genType tan(\$genType angle); \$genHType tan(\$genHType angle); \$genType asin(\$genType x); \$genHType asin(\$genHType x); \$genType acos(\$genType x); \$genHType acos(\$genHType x); \$genType atan(\$genType y, \$genType x); \$genHType atan(\$genHType y, \$genHType x); \$genType atan(\$genType y_over_x); \$genHType atan(\$genHType y_over_x); // 8.1 : Angle and Trigonometry Functions (GLSL ES 3.0) \$es3 \$genType sinh(\$genType x); \$es3 \$genHType sinh(\$genHType x); \$es3 \$genType cosh(\$genType x); \$es3 \$genHType cosh(\$genHType x); \$es3 \$genType tanh(\$genType x); \$es3 \$genHType tanh(\$genHType x); \$es3 \$genType asinh(\$genType x); \$es3 \$genHType asinh(\$genHType x); \$es3 \$genType acosh(\$genType x); \$es3 \$genHType acosh(\$genHType x); \$es3 \$genType atanh(\$genType x); \$es3 \$genHType atanh(\$genHType x); // 8.2 : Exponential Functions \$genType pow(\$genType x, \$genType y); \$genHType pow(\$genHType x, \$genHType y); \$genType exp(\$genType x); \$genHType exp(\$genHType x); \$genType log(\$genType x); \$genHType log(\$genHType x); \$genType exp2(\$genType x); \$genHType exp2(\$genHType x); \$genType log2(\$genType x); \$genHType log2(\$genHType x); \$genType sqrt(\$genType x); \$genHType sqrt(\$genHType x); \$genType inversesqrt(\$genType x); \$genHType inversesqrt(\$genHType x); // 8.3 : Common Functions \$genType abs(\$genType x); \$genHType abs(\$genHType x); \$genType sign(\$genType x); \$genHType sign(\$genHType x); \$genType floor(\$genType x); \$genHType floor(\$genHType x); \$genType ceil(\$genType x); \$genHType ceil(\$genHType x); \$genType fract(\$genType x); \$genHType fract(\$genHType x); \$genType mod(\$genType x, float y); \$genType mod(\$genType x, \$genType y); \$genHType mod(\$genHType x, half y); \$genHType mod(\$genHType x, \$genHType y); \$genType min(\$genType x, \$genType y); \$genType min(\$genType x, float y); \$genHType min(\$genHType x, \$genHType y); \$genHType min(\$genHType x, half y); \$genType max(\$genType x, \$genType y); \$genType max(\$genType x, float y); \$genHType max(\$genHType x, \$genHType y); \$genHType max(\$genHType x, half y); \$genType clamp(\$genType x, \$genType minVal, \$genType maxVal); \$genType clamp(\$genType x, float minVal, float maxVal); \$genHType clamp(\$genHType x, \$genHType minVal, \$genHType maxVal); \$genHType clamp(\$genHType x, half minVal, half maxVal); \$genType saturate(\$genType x); // SkSL extension \$genHType saturate(\$genHType x); // SkSL extension \$genType mix(\$genType x, \$genType y, \$genType a); \$genType mix(\$genType x, \$genType y, float a); \$genHType mix(\$genHType x, \$genHType y, \$genHType a); \$genHType mix(\$genHType x, \$genHType y, half a); \$genType step(\$genType edge, \$genType x); \$genType step(float edge, \$genType x); \$genHType step(\$genHType edge, \$genHType x); \$genHType step(half edge, \$genHType x); \$genType smoothstep(\$genType edge0, \$genType edge1, \$genType x); \$genType smoothstep(float edge0, float edge1, \$genType x); \$genHType smoothstep(\$genHType edge0, \$genHType edge1, \$genHType x); \$genHType smoothstep(half edge0, half edge1, \$genHType x); // 8.3 : Common Functions (GLSL ES 3.0) \$es3 \$genIType abs(\$genIType x); \$es3 \$genIType sign(\$genIType x); \$es3 \$genIType floatBitsToInt (\$genType value); \$es3 \$genUType floatBitsToUint(\$genType value); \$es3 \$genType intBitsToFloat (\$genIType value); \$es3 \$genType uintBitsToFloat(\$genUType value); \$es3 \$genType trunc(\$genType x); \$es3 \$genHType trunc(\$genHType x); \$es3 \$genType round(\$genType x); \$es3 \$genHType round(\$genHType x); \$es3 \$genType roundEven(\$genType x); \$es3 \$genHType roundEven(\$genHType x); \$es3 \$genIType min(\$genIType x, \$genIType y); \$es3 \$genIType min(\$genIType x, int y); \$es3 \$genIType max(\$genIType x, \$genIType y); \$es3 \$genIType max(\$genIType x, int y); \$es3 \$genIType clamp(\$genIType x, \$genIType minVal, \$genIType maxVal); \$es3 \$genIType clamp(\$genIType x, int minVal, int maxVal); \$es3 \$genUType clamp(\$genUType x, \$genUType minVal, \$genUType maxVal); \$es3 \$genUType clamp(\$genUType x, uint minVal, uint maxVal); \$es3 \$genType mix(\$genType x, \$genType y, \$genBType a); \$es3 \$genHType mix(\$genHType x, \$genHType y, \$genBType a); // 8.3 : Common Functions (GLSL ES 3.0) -- cannot be used in constant-expressions \$es3 \$genBType isnan(\$genType x); \$es3 \$genBType isnan(\$genHType x); \$es3 \$genBType isinf(\$genType x); \$es3 \$genBType isinf(\$genHType x); \$es3 \$genType modf(\$genType x, out \$genType i); \$es3 \$genHType modf(\$genHType x, out \$genHType i); // 8.4 : Floating-Point Pack and Unpack Functions (GLSL ES 3.0) \$es3 uint packUnorm2x16(float2 v); \$es3 float2 unpackUnorm2x16(uint p); // 8.5 : Geometric Functions float length(\$genType x); half length(\$genHType x); float distance(\$genType p0, \$genType p1); half distance(\$genHType p0, \$genHType p1); float dot(\$genType x, \$genType y); half dot(\$genHType x, \$genHType y); float3 cross(float3 x, float3 y); half3 cross(half3 x, half3 y); \$genType normalize(\$genType x); \$genHType normalize(\$genHType x); \$genType faceforward(\$genType N, \$genType I, \$genType Nref); \$genHType faceforward(\$genHType N, \$genHType I, \$genHType Nref); \$genType reflect(\$genType I, \$genType N); \$genHType reflect(\$genHType I, \$genHType N); \$genType refract(\$genType I, \$genType N, float eta); \$genHType refract(\$genHType I, \$genHType N, half eta); // 8.6 : Matrix Functions \$squareMat matrixCompMult(\$squareMat x, \$squareMat y); \$squareHMat matrixCompMult(\$squareHMat x, \$squareHMat y); \$es3 \$mat matrixCompMult(\$mat x, \$mat y); \$es3 \$hmat matrixCompMult(\$hmat x, \$hmat y); // 8.6 : Matrix Functions (GLSL 1.4, poly-filled by SkSL as needed) \$squareMat inverse(\$squareMat m); \$squareHMat inverse(\$squareHMat m); // 8.6 : Matrix Functions (GLSL ES 3.0) \$es3 float determinant(\$squareMat m); \$es3 half determinant(\$squareHMat m); \$es3 \$squareMat transpose(\$squareMat m); \$es3 \$squareHMat transpose(\$squareHMat m); \$es3 float2x3 transpose(float3x2 m); \$es3 half2x3 transpose(half3x2 m); \$es3 float2x4 transpose(float4x2 m); \$es3 half2x4 transpose(half4x2 m); \$es3 float3x2 transpose(float2x3 m); \$es3 half3x2 transpose(half2x3 m); \$es3 float3x4 transpose(float4x3 m); \$es3 half3x4 transpose(half4x3 m); \$es3 float4x2 transpose(float2x4 m); \$es3 half4x2 transpose(half2x4 m); \$es3 float4x3 transpose(float3x4 m); \$es3 half4x3 transpose(half3x4 m); \$es3 \$squareMat outerProduct(\$vec c, \$vec r); \$es3 \$squareHMat outerProduct(\$hvec c, \$hvec r); \$es3 float2x3 outerProduct(float3 c, float2 r); \$es3 half2x3 outerProduct(half3 c, half2 r); \$es3 float3x2 outerProduct(float2 c, float3 r); \$es3 half3x2 outerProduct(half2 c, half3 r); \$es3 float2x4 outerProduct(float4 c, float2 r); \$es3 half2x4 outerProduct(half4 c, half2 r); \$es3 float4x2 outerProduct(float2 c, float4 r); \$es3 half4x2 outerProduct(half2 c, half4 r); \$es3 float3x4 outerProduct(float4 c, float3 r); \$es3 half3x4 outerProduct(half4 c, half3 r); \$es3 float4x3 outerProduct(float3 c, float4 r); \$es3 half4x3 outerProduct(half3 c, half4 r); // 8.7 : Vector Relational Functions \$bvec lessThan(\$vec x, \$vec y); \$bvec lessThan(\$hvec x, \$hvec y); \$bvec lessThan(\$ivec x, \$ivec y); \$bvec lessThanEqual(\$vec x, \$vec y); \$bvec lessThanEqual(\$hvec x, \$hvec y); \$bvec lessThanEqual(\$ivec x, \$ivec y); \$bvec greaterThan(\$vec x, \$vec y); \$bvec greaterThan(\$hvec x, \$hvec y); \$bvec greaterThan(\$ivec x, \$ivec y); \$bvec greaterThanEqual(\$vec x, \$vec y); \$bvec greaterThanEqual(\$hvec x, \$hvec y); \$bvec greaterThanEqual(\$ivec x, \$ivec y); \$bvec equal(\$vec x, \$vec y); \$bvec equal(\$hvec x, \$hvec y); \$bvec equal(\$ivec x, \$ivec y); \$bvec equal(\$bvec x, \$bvec y); \$bvec notEqual(\$vec x, \$vec y); \$bvec notEqual(\$hvec x, \$hvec y); \$bvec notEqual(\$ivec x, \$ivec y); \$bvec notEqual(\$bvec x, \$bvec y); bool any(\$bvec x); bool all(\$bvec x); \$bvec not(\$bvec x); // 8.9 : Fragment Processing Functions (GLSL ES 3.0) \$es3 \$genType dFdx(\$genType p); \$es3 \$genType dFdy(\$genType p); \$es3 \$genHType dFdx(\$genHType p); \$es3 \$genHType dFdy(\$genHType p); \$es3 \$genType fwidth(\$genType p); \$es3 \$genHType fwidth(\$genHType p); // SkSL intrinsics that are not part of GLSL: // The max() guards against division by zero when the incoming color is transparent black half4 unpremul(half4 color) { return half4 (color.rgb / max(color.a, 0.0001), color.a); } float4 unpremul(float4 color) { return float4(color.rgb / max(color.a, 0.0001), color.a); } // Color space transformation, between the working (destination) space and fixed (known) spaces: half3 toLinearSrgb(half3 color); half3 fromLinearSrgb(half3 color); // SkSL intrinsics that reflect Skia's C++ object model: half4 \$eval(float2 coords, shader s); half4 \$eval(half4 color, colorFilter f); half4 \$eval(half4 src, half4 dst, blender b);