307 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			GLSL
		
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			GLSL
		
	
	
	
#version 450 core
 | 
						|
 | 
						|
#extension GL_AMD_gpu_shader_half_float: enable
 | 
						|
#extension GL_ARB_gpu_shader_int64: enable
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
// Half float literals
 | 
						|
void literal()
 | 
						|
{
 | 
						|
    const float16_t f16c  = 0.000001hf;
 | 
						|
    const f16vec2   f16cv = f16vec2(-0.25HF, 0.03HF);
 | 
						|
 | 
						|
    f16vec2 f16v;
 | 
						|
    f16v.x  = f16c;
 | 
						|
    f16v   += f16cv;
 | 
						|
}
 | 
						|
 | 
						|
// Block memory layout
 | 
						|
struct S
 | 
						|
{
 | 
						|
    float16_t  x;   // rule 1: align = 2, takes offsets 0-1
 | 
						|
    f16vec2    y;   // rule 2: align = 4, takes offsets 4-7
 | 
						|
    f16vec3    z;   // rule 3: align = 8, takes offsets 8-13
 | 
						|
};
 | 
						|
 | 
						|
layout(column_major, std140) uniform B1
 | 
						|
{
 | 
						|
    float16_t  a;     // rule 1:  align = 2, takes offsets 0-1
 | 
						|
    f16vec2    b;     // rule 2:  align = 4, takes offsets 4-7
 | 
						|
    f16vec3    c;     // rule 3:  align = 8, takes offsets 8-15
 | 
						|
    float16_t  d[2];  // rule 4:  align = 16, array stride = 16,
 | 
						|
                      //          takes offsets 16-47
 | 
						|
    f16mat2x3  e;     // rule 5:  align = 16, matrix stride = 16,
 | 
						|
                      //          takes offsets 48-79
 | 
						|
    f16mat2x3  f[2];  // rule 6:  align = 16, matrix stride = 16,
 | 
						|
                      //          array stride = 32, f[0] takes
 | 
						|
                      //          offsets 80-111, f[1] takes offsets
 | 
						|
                      //          112-143
 | 
						|
    S          g;     // rule 9:  align = 16, g.x takes offsets
 | 
						|
                      //          144-145, g.y takes offsets 148-151,
 | 
						|
                      //          g.z takes offsets 152-159
 | 
						|
    S          h[2];  // rule 10: align = 16, array stride = 16, h[0]
 | 
						|
                      //          takes offsets 160-175, h[1] takes
 | 
						|
                      //          offsets 176-191
 | 
						|
};
 | 
						|
 | 
						|
layout(row_major, std430) buffer B2
 | 
						|
{
 | 
						|
    float16_t  o;     // rule 1:  align = 2, takes offsets 0-1
 | 
						|
    f16vec2    p;     // rule 2:  align = 4, takes offsets 4-7
 | 
						|
    f16vec3    q;     // rule 3:  align = 8, takes offsets 8-13
 | 
						|
    float16_t  r[2];  // rule 4:  align = 2, array stride = 2, takes
 | 
						|
                      //          offsets 14-17
 | 
						|
    f16mat2x3  s;     // rule 7:  align = 4, matrix stride = 4, takes
 | 
						|
                      //          offsets 20-31
 | 
						|
    f16mat2x3  t[2];  // rule 8:  align = 4, matrix stride = 4, array
 | 
						|
                      //          stride = 12, t[0] takes offsets
 | 
						|
                      //          32-43, t[1] takes offsets 44-55
 | 
						|
    S          u;     // rule 9:  align = 8, u.x takes offsets
 | 
						|
                      //          56-57, u.y takes offsets 60-63, u.z
 | 
						|
                      //          takes offsets 64-69
 | 
						|
    S          v[2];  // rule 10: align = 8, array stride = 16, v[0]
 | 
						|
                      //          takes offsets 72-87, v[1] takes
 | 
						|
                      //          offsets 88-103
 | 
						|
};
 | 
						|
 | 
						|
// Specialization constant
 | 
						|
layout(constant_id = 100) const float16_t sf16 = 0.125hf;
 | 
						|
layout(constant_id = 101) const float     sf   = 0.25;
 | 
						|
layout(constant_id = 102) const double    sd   = 0.5lf;
 | 
						|
 | 
						|
const float  f16_to_f = float(sf16);
 | 
						|
const double f16_to_d = float(sf16);
 | 
						|
 | 
						|
const float16_t f_to_f16 = float16_t(sf);
 | 
						|
const float16_t d_to_f16 = float16_t(sd);
 | 
						|
 | 
						|
void operators()
 | 
						|
{
 | 
						|
    float16_t f16;
 | 
						|
    f16vec2   f16v;
 | 
						|
    f16mat2x2 f16m;
 | 
						|
    bool      b;
 | 
						|
 | 
						|
    // Arithmetic
 | 
						|
    f16v += f16v;
 | 
						|
    f16v -= f16v;
 | 
						|
    f16v *= f16v;
 | 
						|
    f16v /= f16v;
 | 
						|
    f16v++;
 | 
						|
    f16v--;
 | 
						|
    ++f16m;
 | 
						|
    --f16m;
 | 
						|
    f16v = -f16v;
 | 
						|
    f16m = -f16m;
 | 
						|
 | 
						|
    f16 = f16v.x + f16v.y;
 | 
						|
    f16 = f16v.x - f16v.y;
 | 
						|
    f16 = f16v.x * f16v.y;
 | 
						|
    f16 = f16v.x / f16v.y;
 | 
						|
 | 
						|
    // Relational
 | 
						|
    b = (f16v.x != f16);
 | 
						|
    b = (f16v.y == f16);
 | 
						|
    b = (f16v.x >  f16);
 | 
						|
    b = (f16v.y <  f16);
 | 
						|
    b = (f16v.x >= f16);
 | 
						|
    b = (f16v.y <= f16);
 | 
						|
 | 
						|
    // Vector/matrix operations
 | 
						|
    f16v = f16v * f16;
 | 
						|
    f16m = f16m * f16;
 | 
						|
    f16v = f16m * f16v;
 | 
						|
    f16v = f16v * f16m;
 | 
						|
    f16m = f16m * f16m;
 | 
						|
}
 | 
						|
 | 
						|
void typeCast()
 | 
						|
{
 | 
						|
    bvec3   bv;
 | 
						|
    vec3    fv;
 | 
						|
    dvec3   dv;
 | 
						|
    ivec3   iv;
 | 
						|
    uvec3   uv;
 | 
						|
    i64vec3 i64v;
 | 
						|
    u64vec3 u64v;
 | 
						|
 | 
						|
    f16vec3 f16v;
 | 
						|
 | 
						|
    f16v = f16vec3(bv);     // bool -> float16
 | 
						|
    bv   = bvec3(f16v);     // float16 -> bool
 | 
						|
 | 
						|
    f16v = f16vec3(fv);     // float -> float16
 | 
						|
    fv   = vec3(f16v);      // float16 -> float
 | 
						|
 | 
						|
    f16v = f16vec3(dv);     // double -> float16
 | 
						|
    dv   = dvec3(dv);       // float16 -> double
 | 
						|
 | 
						|
    f16v = f16vec3(iv);     // int -> float16
 | 
						|
    iv   = ivec3(f16v);     // float16 -> int
 | 
						|
 | 
						|
    f16v = f16vec3(uv);     // uint -> float16
 | 
						|
    uv   = uvec3(f16v);     // float16 -> uint
 | 
						|
 | 
						|
    f16v = f16vec3(i64v);   // int64 -> float16
 | 
						|
    i64v = i64vec3(f16v);   // float16 -> int64
 | 
						|
 | 
						|
    f16v = f16vec3(u64v);   // uint64 -> float16
 | 
						|
    u64v = u64vec3(f16v);   // float16 -> uint64
 | 
						|
}
 | 
						|
 | 
						|
void builtinAngleTrigFuncs()
 | 
						|
{
 | 
						|
    f16vec4 f16v1, f16v2;
 | 
						|
 | 
						|
    f16v2 = radians(f16v1);
 | 
						|
    f16v2 = degrees(f16v1);
 | 
						|
    f16v2 = sin(f16v1);
 | 
						|
    f16v2 = cos(f16v1);
 | 
						|
    f16v2 = tan(f16v1);
 | 
						|
    f16v2 = asin(f16v1);
 | 
						|
    f16v2 = acos(f16v1);
 | 
						|
    f16v2 = atan(f16v1, f16v2);
 | 
						|
    f16v2 = atan(f16v1);
 | 
						|
    f16v2 = sinh(f16v1);
 | 
						|
    f16v2 = cosh(f16v1);
 | 
						|
    f16v2 = tanh(f16v1);
 | 
						|
    f16v2 = asinh(f16v1);
 | 
						|
    f16v2 = acosh(f16v1);
 | 
						|
    f16v2 = atanh(f16v1);
 | 
						|
}
 | 
						|
 | 
						|
void builtinExpFuncs()
 | 
						|
{
 | 
						|
    f16vec2 f16v1, f16v2;
 | 
						|
 | 
						|
    f16v2 = pow(f16v1, f16v2);
 | 
						|
    f16v2 = exp(f16v1);
 | 
						|
    f16v2 = log(f16v1);
 | 
						|
    f16v2 = exp2(f16v1);
 | 
						|
    f16v2 = log2(f16v1);
 | 
						|
    f16v2 = sqrt(f16v1);
 | 
						|
    f16v2 = inversesqrt(f16v1);
 | 
						|
}
 | 
						|
 | 
						|
void builtinCommonFuncs()
 | 
						|
{
 | 
						|
    f16vec3   f16v1, f16v2, f16v3;
 | 
						|
    float16_t f16;
 | 
						|
    bool  b;
 | 
						|
    bvec3 bv;
 | 
						|
    ivec3 iv;
 | 
						|
 | 
						|
    f16v2 = abs(f16v1);
 | 
						|
    f16v2 = sign(f16v1);
 | 
						|
    f16v2 = floor(f16v1);
 | 
						|
    f16v2 = trunc(f16v1);
 | 
						|
    f16v2 = round(f16v1);
 | 
						|
    f16v2 = roundEven(f16v1);
 | 
						|
    f16v2 = ceil(f16v1);
 | 
						|
    f16v2 = fract(f16v1);
 | 
						|
    f16v2 = mod(f16v1, f16v2);
 | 
						|
    f16v2 = mod(f16v1, f16);
 | 
						|
    f16v3 = modf(f16v1, f16v2);
 | 
						|
    f16v3 = min(f16v1, f16v2);
 | 
						|
    f16v3 = min(f16v1, f16);
 | 
						|
    f16v3 = max(f16v1, f16v2);
 | 
						|
    f16v3 = max(f16v1, f16);
 | 
						|
    f16v3 = clamp(f16v1, f16, f16v2.x);
 | 
						|
    f16v3 = clamp(f16v1, f16v2, f16vec3(f16));
 | 
						|
    f16v3 = mix(f16v1, f16v2, f16);
 | 
						|
    f16v3 = mix(f16v1, f16v2, f16v3);
 | 
						|
    f16v3 = mix(f16v1, f16v2, bv);
 | 
						|
    f16v3 = step(f16v1, f16v2);
 | 
						|
    f16v3 = step(f16, f16v3);
 | 
						|
    f16v3 = smoothstep(f16v1, f16v2, f16v3);
 | 
						|
    f16v3 = smoothstep(f16, f16v1.x, f16v2);
 | 
						|
    b     = isnan(f16);
 | 
						|
    bv    = isinf(f16v1);
 | 
						|
    f16v3 = fma(f16v1, f16v2, f16v3);
 | 
						|
    f16v2 = frexp(f16v1, iv);
 | 
						|
    f16v2 = ldexp(f16v1, iv);
 | 
						|
}
 | 
						|
 | 
						|
void builtinPackUnpackFuncs()
 | 
						|
{
 | 
						|
    uint u;
 | 
						|
    f16vec2 f16v;
 | 
						|
 | 
						|
    u    = packFloat2x16(f16v);
 | 
						|
    f16v = unpackFloat2x16(u);
 | 
						|
}
 | 
						|
 | 
						|
void builtinGeometryFuncs()
 | 
						|
{
 | 
						|
    float16_t f16;
 | 
						|
    f16vec3   f16v1, f16v2, f16v3;
 | 
						|
 | 
						|
    f16   = length(f16v1);
 | 
						|
    f16   = distance(f16v1, f16v2);
 | 
						|
    f16   = dot(f16v1, f16v2);
 | 
						|
    f16v3 = cross(f16v1, f16v2);
 | 
						|
    f16v2 = normalize(f16v1);
 | 
						|
    f16v3 = faceforward(f16v1, f16v2, f16v3);
 | 
						|
    f16v3 = reflect(f16v1, f16v2);
 | 
						|
    f16v3 = refract(f16v1, f16v2, f16);
 | 
						|
}
 | 
						|
 | 
						|
void builtinMatrixFuncs()
 | 
						|
{
 | 
						|
    f16mat2x3 f16m1, f16m2, f16m3;
 | 
						|
    f16mat3x2 f16m4;
 | 
						|
    f16mat3   f16m5;
 | 
						|
    f16mat4   f16m6, f16m7;
 | 
						|
 | 
						|
    f16vec3 f16v1;
 | 
						|
    f16vec2 f16v2;
 | 
						|
 | 
						|
    float16_t f16;
 | 
						|
 | 
						|
    f16m3 = matrixCompMult(f16m1, f16m2);
 | 
						|
    f16m1 = outerProduct(f16v1, f16v2);
 | 
						|
    f16m4 = transpose(f16m1);
 | 
						|
    f16   = determinant(f16m5);
 | 
						|
    f16m6 = inverse(f16m7);
 | 
						|
}
 | 
						|
 | 
						|
void builtinVecRelFuncs()
 | 
						|
{
 | 
						|
    f16vec3 f16v1, f16v2;
 | 
						|
    bvec3   bv;
 | 
						|
 | 
						|
    bv = lessThan(f16v1, f16v2);
 | 
						|
    bv = lessThanEqual(f16v1, f16v2);
 | 
						|
    bv = greaterThan(f16v1, f16v2);
 | 
						|
    bv = greaterThanEqual(f16v1, f16v2);
 | 
						|
    bv = equal(f16v1, f16v2);
 | 
						|
    bv = notEqual(f16v1, f16v2);
 | 
						|
}
 | 
						|
 | 
						|
in f16vec3 if16v;
 | 
						|
 | 
						|
void builtinFragProcFuncs()
 | 
						|
{
 | 
						|
    f16vec3 f16v;
 | 
						|
 | 
						|
    // Derivative
 | 
						|
    f16v.x  = dFdx(if16v.x);
 | 
						|
    f16v.y  = dFdy(if16v.y);
 | 
						|
    f16v.xy = dFdxFine(if16v.xy);
 | 
						|
    f16v.xy = dFdyFine(if16v.xy);
 | 
						|
    f16v    = dFdxCoarse(if16v);
 | 
						|
    f16v    = dFdxCoarse(if16v);
 | 
						|
 | 
						|
    f16v.x  = fwidth(if16v.x);
 | 
						|
    f16v.xy = fwidthFine(if16v.xy);
 | 
						|
    f16v    = fwidthCoarse(if16v);
 | 
						|
 | 
						|
    // Interpolation
 | 
						|
    f16v.x  = interpolateAtCentroid(if16v.x);
 | 
						|
    f16v.xy = interpolateAtSample(if16v.xy, 1);
 | 
						|
    f16v    = interpolateAtOffset(if16v, f16vec2(0.5hf));
 | 
						|
}
 |