}
""",
r'\(expression +uint +/'),
+ Test("f32 sampler array",
+ """
+ #version 320 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform sampler2D tex[2];
+ // highp shouldn't affect the return value of texture2D
+ uniform highp vec2 coord;
+ uniform float divisor;
+ uniform int index;
+
+ out highp vec4 color;
+
+ void main()
+ {
+ color = texture2D(tex[index], coord) / divisor;
+ }
+ """,
+ r'\(expression +f16vec4 +/.*\(tex +f16vec4 +'),
Test("f32 texture sample",
"""
precision mediump float;
uniform sampler2D tex;
- uniform vec2 coord;
+ // highp shouldn't affect the return value of texture2D
+ uniform highp vec2 coord;
uniform float divisor;
void main()
precision mediump int;
uniform mediump isampler2D tex;
- uniform vec2 coord;
+ // highp shouldn't affect the return value of texture
+ uniform highp vec2 coord;
uniform int divisor;
out highp ivec4 color;
precision mediump int;
uniform mediump usampler2D tex;
- uniform vec2 coord;
+ // highp shouldn't affect the return value of texture
+ uniform highp vec2 coord;
uniform uint divisor;
out highp uvec4 color;
}
""",
r'\(expression +u16vec4 +/.*\(tex +u16vec4 +'),
+ Test("f32 image array",
+ """
+ #version 320 es
+ precision mediump float;
+
+ layout(rgba16f) readonly uniform mediump image2D img[2];
+ // highp shouldn't affect the return value of imageLoad
+ uniform highp ivec2 coord;
+ uniform float divisor;
+
+ out highp vec4 color;
+
+ void main()
+ {
+ color = imageLoad(img[1], coord) / divisor;
+ }
+ """,
+ r'\(expression +f16vec4 +/'),
+ Test("f32 image load",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ layout(rgba16f) readonly uniform mediump image2D img;
+ // highp shouldn't affect the return value of imageLoad
+ uniform highp ivec2 coord;
+ uniform float divisor;
+
+ out highp vec4 color;
+
+ void main()
+ {
+ color = imageLoad(img, coord) / divisor;
+ }
+ """,
+ r'\(expression +f16vec4 +/'),
+ Test("i32 image load",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ layout(rgba16i) readonly uniform mediump iimage2D img;
+ // highp shouldn't affect the return value of imageLoad
+ uniform highp ivec2 coord;
+ uniform int divisor;
+
+ out highp ivec4 color;
+
+ void main()
+ {
+ color = imageLoad(img, coord) / divisor;
+ }
+ """,
+ r'\(expression +i16vec4 +/'),
+ Test("u32 image load",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ layout(rgba16ui) readonly uniform mediump uimage2D img;
+ // highp shouldn't affect the return value of imageLoad
+ uniform highp ivec2 coord;
+ uniform uint divisor;
+
+ out highp uvec4 color;
+
+ void main()
+ {
+ color = imageLoad(img, coord) / divisor;
+ }
+ """,
+ r'\(expression +u16vec4 +/'),
Test("f32 expression in lvalue",
"""
uniform mediump float a, b;
}
""",
r'\(expression +uint16_t min'),
+ Test("dFdx",
+ """
+ #version 300 es
+ precision mediump float;
+
+ in vec4 var;
+ out vec4 color;
+
+ void main()
+ {
+ color = dFdx(var);
+ }
+ """,
+ r'\(expression +f16vec4 +dFdx +\(expression +f16vec4'),
+ Test("dFdy",
+ """
+ #version 300 es
+ precision mediump float;
+
+ in vec4 var;
+ out vec4 color;
+
+ void main()
+ {
+ color = dFdy(var);
+ }
+ """,
+ r'\(expression +f16vec4 +dFdy +\(expression +f16vec4'),
+ Test("textureSize",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform mediump sampler2D tex;
+ out ivec2 color;
+
+ void main()
+ {
+ color = textureSize(tex, 0) * ivec2(2);
+ }
+ """,
+ r'expression ivec2 \* \(txs ivec2 \(var_ref tex'),
+ Test("floatBitsToInt",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform float val;
+ out int color;
+
+ void main()
+ {
+ color = floatBitsToInt(val + 1.0) + 1;
+ }
+ """,
+ r'expression int bitcast_f2i \(expression float'),
+ Test("floatBitsToUint",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform float val;
+ out uint color;
+
+ void main()
+ {
+ color = floatBitsToUint(val + 1.0) + 1u;
+ }
+ """,
+ r'expression uint bitcast_f2u \(expression float'),
+ Test("intBitsToFloat",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform int val;
+ out float color;
+
+ void main()
+ {
+ color = intBitsToFloat(val + 1) + 1.0;
+ }
+ """,
+ r'expression float bitcast_i2f \(expression int'),
+ Test("uintBitsToFloat",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint val;
+ out float color;
+
+ void main()
+ {
+ color = uintBitsToFloat(val + 1u) + 1.0;
+ }
+ """,
+ r'expression float bitcast_u2f \(expression uint'),
+ Test("bitfieldReverse",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform int val;
+ out int color;
+
+ void main()
+ {
+ color = bitfieldReverse(val + 1) + 1;
+ }
+ """,
+ r'expression int bitfield_reverse \(expression int'),
+ Test("frexp",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform float val;
+ out float color;
+ out int color2;
+
+ void main()
+ {
+ int y;
+ float x = frexp(val + 1.0, y);
+ color = x + 1.0;
+ color2 = y + 1;
+ }
+ """,
+ r'assign \(x\) \(var_ref x\) \(expression float f162f'),
+ Test("ldexp",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform float val;
+ uniform int exp;
+ out float color;
+
+ void main()
+ {
+ color = ldexp(val + 1.0, exp + 1) + 1.0;
+ }
+ """,
+ r'expression float ldexp \(expression float'),
+ Test("uaddCarry",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint x, y;
+ out uint color;
+
+ void main()
+ {
+ lowp uint carry;
+ color = uaddCarry(x * 2u, y * 2u, carry) * 2u;
+ color *= carry;
+ }
+ """,
+ r'expression uint \+ \(var_ref x\) \(var_ref y'),
+ Test("usubBorrow",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint x, y;
+ out uint color;
+
+ void main()
+ {
+ lowp uint borrow;
+ color = usubBorrow(x * 2u, y * 2u, borrow) * 2u;
+ color *= borrow;
+ }
+ """,
+ r'expression uint \+ \(var_ref x\) \(expression uint neg'),
+ Test("imulExtended",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform int x, y;
+ out int color;
+
+ void main()
+ {
+ int msb, lsb;
+ imulExtended(x + 2, y + 2, msb, lsb);
+ color = msb + lsb;
+ }
+ """,
+ r'expression int64_t \* \(expression int'),
+ Test("umulExtended",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint x, y;
+ out uint color;
+
+ void main()
+ {
+ uint msb, lsb;
+ umulExtended(x + 2u, y + 2u, msb, lsb);
+ color = msb + lsb;
+ }
+ """,
+ r'expression uint64_t \* \(expression uint'),
+ Test("unpackUnorm2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint val;
+ out vec2 color;
+
+ void main()
+ {
+ color = unpackUnorm2x16(val + 1u) + vec2(1.0);
+ }
+ """,
+ r'expression vec2 unpackUnorm2x16 \(expression uint'),
+ Test("unpackSnorm2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform uint val;
+ out vec2 color;
+
+ void main()
+ {
+ color = unpackSnorm2x16(val + 1u) + vec2(1.0);
+ }
+ """,
+ r'expression vec2 unpackSnorm2x16 \(expression uint'),
+ Test("packUnorm2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform vec2 val;
+ out uint color;
+
+ void main()
+ {
+ color = packUnorm2x16(val + vec2(1.0)) + 1u;
+ }
+ """,
+ r'expression uint packUnorm2x16 \(expression vec2'),
+ Test("packSnorm2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform vec2 val;
+ out uint color;
+
+ void main()
+ {
+ color = packSnorm2x16(val + vec2(1.0)) + 1u;
+ }
+ """,
+ r'expression uint packSnorm2x16 \(expression vec2'),
+ Test("packHalf2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform vec2 val;
+ out uint color;
+
+ void main()
+ {
+ color = packHalf2x16(val + vec2(1.0)) + 1u;
+ }
+ """,
+ r'expression uint packHalf2x16 \(expression vec2'),
+ Test("packUnorm4x8",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform vec4 val;
+ out uint color;
+
+ void main()
+ {
+ color = packUnorm4x8(val + vec4(1.0)) + 1u;
+ }
+ """,
+ r'expression uint packUnorm4x8 \(expression vec4'),
+ Test("packSnorm4x8",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform vec4 val;
+ out uint color;
+
+ void main()
+ {
+ color = packSnorm4x8(val + vec4(1.0)) + 1u;
+ }
+ """,
+ r'expression uint packSnorm4x8 \(expression vec4'),
+ Test("interpolateAtCentroid",
+ """
+ #version 320 es
+ precision mediump float;
+ precision mediump int;
+
+ in float val;
+ out float color;
+
+ void main()
+ {
+ color = interpolateAtCentroid(val) + 1.0;
+ }
+ """,
+ r'expression float16_t interpolate_at_centroid \(expression float16_t'),
+ Test("interpolateAtOffset",
+ """
+ #version 320 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp vec2 offset;
+ in float val;
+ out float color;
+
+ void main()
+ {
+ color = interpolateAtOffset(val, offset) + 1.0;
+ }
+ """,
+ r'expression float16_t interpolate_at_offset \(expression float16_t'),
+ Test("interpolateAtSample",
+ """
+ #version 320 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int sample_index;
+ in float val;
+ out float color;
+
+ void main()
+ {
+ color = interpolateAtSample(val, sample_index) + 1.0;
+ }
+ """,
+ r'expression float16_t interpolate_at_sample \(expression float16_t'),
+ Test("bitfieldExtract",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int offset, bits;
+ uniform int val;
+ out int color;
+
+ void main()
+ {
+ color = bitfieldExtract(val, offset, bits) + 1;
+ }
+ """,
+ r'expression int16_t bitfield_extract \(expression int16_t'),
+ Test("bitfieldInsert",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int offset, bits;
+ uniform int val, val2;
+ out int color;
+
+ void main()
+ {
+ color = bitfieldInsert(val, val2, offset, bits) + 1;
+ }
+ """,
+ r'expression int16_t bitfield_insert \(expression int16_t'),
+ Test("bitCount",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int val;
+ out int color;
+
+ void main()
+ {
+ color = bitCount(val) + 1;
+ }
+ """,
+ r'expression int16_t \+ \(expression int16_t i2imp \(expression int bit_count \(var_ref val'),
+ Test("findLSB",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int val;
+ out int color;
+
+ void main()
+ {
+ color = findLSB(val) + 1;
+ }
+ """,
+ r'expression int16_t \+ \(expression int16_t i2imp \(expression int find_lsb \(var_ref val'),
+ Test("findMSB",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp int val;
+ out int color;
+
+ void main()
+ {
+ color = findMSB(val) + 1;
+ }
+ """,
+ r'expression int16_t \+ \(expression int16_t i2imp \(expression int find_msb \(var_ref val'),
+ Test("unpackHalf2x16",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp uint val;
+ out vec2 color;
+
+ void main()
+ {
+ color = unpackHalf2x16(val) + vec2(1.0);
+ }
+ """,
+ r'expression f16vec2 \+ \(expression f16vec2 f2fmp \(expression vec2 unpackHalf2x16 \(var_ref val'),
+ Test("unpackUnorm4x8",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp uint val;
+ out vec4 color;
+
+ void main()
+ {
+ color = unpackUnorm4x8(val) + vec4(1.0);
+ }
+ """,
+ r'expression f16vec4 \+ \(expression f16vec4 f2fmp \(expression vec4 unpackUnorm4x8 \(var_ref val'),
+ Test("unpackSnorm4x8",
+ """
+ #version 310 es
+ precision mediump float;
+ precision mediump int;
+
+ uniform highp uint val;
+ out vec4 color;
+
+ void main()
+ {
+ color = unpackSnorm4x8(val) + vec4(1.0);
+ }
+ """,
+ r'expression f16vec4 \+ \(expression f16vec4 f2fmp \(expression vec4 unpackSnorm4x8 \(var_ref val'),
]