// Reduced set of intrinsics that are available to public SkSL (RuntimeEffect and Interpreter)

// See "The OpenGL ES Shading Language, Version 1.00, Section 8"
// For all of the TODO comments, refer to skbug.com/10913

// 8.1 : Angle and Trigonometry Functions
float  radians(float  deg) { return deg * 0.0174532925; }
float2 radians(float2 deg) { return deg * 0.0174532925; }
float3 radians(float3 deg) { return deg * 0.0174532925; }
float4 radians(float4 deg) { return deg * 0.0174532925; }

float  degrees(float  rad) { return rad * 57.2957795; }
float2 degrees(float2 rad) { return rad * 57.2957795; }
float3 degrees(float3 rad) { return rad * 57.2957795; }
float4 degrees(float4 rad) { return rad * 57.2957795; }

$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.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.4 : 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);

inline float3 cross(float3 a, float3 b) {
    return float3(a.y * b.z - a.z * b.y,
                  a.z * b.x - a.x * b.z,
                  a.x * b.y - a.y * b.x);
}

$genType  normalize($genType  x);
$genHType normalize($genHType x);

inline float  faceforward(float  N, float  I, float  Nref) {
    float v = dot(Nref, I) < 0 ? N : -N;
    return v;
}
inline float2 faceforward(float2 N, float2 I, float2 Nref) {
    float2 v = dot(Nref, I) < 0 ? N : -N;
    return v;
}
inline float3 faceforward(float3 N, float3 I, float3 Nref) {
    float3 v = dot(Nref, I) < 0 ? N : -N;
    return v;
}
inline float4 faceforward(float4 N, float4 I, float4 Nref) {
    float4 v = dot(Nref, I) < 0 ? N : -N;
    return v;
}

inline float  reflect(float  I, float  N) { return I - 2 * dot(N, I) * N; }
inline float2 reflect(float2 I, float2 N) { return I - 2 * dot(N, I) * N; }
inline float3 reflect(float3 I, float3 N) { return I - 2 * dot(N, I) * N; }
inline float4 reflect(float4 I, float4 N) { return I - 2 * dot(N, I) * N; }

inline float refract(float I, float N, float eta) {
    float k = 1 - eta * eta * (1 - dot(N, I) * dot(N, I));
    float v = k < 0 ? float(0)
                    : eta * I - (eta * dot(N, I) + sqrt(k)) * N;
    return v;
}
inline float2 refract(float2 I, float2 N, float eta) {
    float k = 1 - eta * eta * (1 - dot(N, I) * dot(N, I));
    float2 v = k < 0 ? float2(0)
                     : eta * I - (eta * dot(N, I) + sqrt(k)) * N;
    return v;
}
inline float3 refract(float3 I, float3 N, float eta) {
    float k = 1 - eta * eta * (1 - dot(N, I) * dot(N, I));
    float3 v = k < 0 ? float3(0)
                     : eta * I - (eta * dot(N, I) + sqrt(k)) * N;
    return v;
}
inline float4 refract(float4 I, float4 N, float eta) {
    float k = 1 - eta * eta * (1 - dot(N, I) * dot(N, I));
    float4 v = k < 0 ? float4(0)
                     : eta * I - (eta * dot(N, I) + sqrt(k)) * N;
    return v;
}

// 8.5 : Matrix Functions
$squareMat  matrixCompMult($squareMat  x, $squareMat  y);
$squareHMat matrixCompMult($squareHMat x, $squareHMat y);

// Not supported until GLSL 1.40. Poly-filled by SkSL:
$squareMat  inverse($squareMat  m);
$squareHMat inverse($squareHMat m);

// 8.6 : 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);

// Miscellaneous 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_float(float4 color) { return float4(color.rgb / max(color.a, 0.0001), color.a); }
