79 lines
2.3 KiB
GLSL
79 lines
2.3 KiB
GLSL
#version 310 es
|
|
precision mediump float;
|
|
|
|
layout(location = 0) out vec4 FragColor;
|
|
layout(constant_id = 1) const float a = 1.5;
|
|
layout(constant_id = 2) const float b = 2.5;
|
|
layout(constant_id = 3) const int c = 3;
|
|
layout(constant_id = 4) const int d = 4;
|
|
layout(constant_id = 5) const uint e = 5u;
|
|
layout(constant_id = 6) const uint f = 6u;
|
|
layout(constant_id = 7) const bool g = false;
|
|
layout(constant_id = 8) const bool h = true;
|
|
|
|
// glslang doesn't seem to support partial spec constants or composites yet, so only test the basics.
|
|
|
|
struct Foo
|
|
{
|
|
float elems[d + 2];
|
|
};
|
|
|
|
void main()
|
|
{
|
|
float t0 = a;
|
|
float t1 = b;
|
|
|
|
uint c0 = uint(c); // OpIAdd with different types.
|
|
// FConvert, float-to-double.
|
|
int c1 = -c; // SNegate
|
|
int c2 = ~c; // OpNot
|
|
int c3 = c + d; // OpIAdd
|
|
int c4 = c - d; // OpISub
|
|
int c5 = c * d; // OpIMul
|
|
int c6 = c / d; // OpSDiv
|
|
uint c7 = e / f; // OpUDiv
|
|
int c8 = c % d; // OpSMod
|
|
uint c9 = e % f; // OpUMod
|
|
// TODO: OpSRem, any way to access this in GLSL?
|
|
int c10 = c >> d; // OpShiftRightArithmetic
|
|
uint c11 = e >> f; // OpShiftRightLogical
|
|
int c12 = c << d; // OpShiftLeftLogical
|
|
int c13 = c | d; // OpBitwiseOr
|
|
int c14 = c ^ d; // OpBitwiseXor
|
|
int c15 = c & d; // OpBitwiseAnd
|
|
// VectorShuffle, CompositeExtract, CompositeInsert, not testable atm.
|
|
bool c16 = g || h; // OpLogicalOr
|
|
bool c17 = g && h; // OpLogicalAnd
|
|
bool c18 = !g; // OpLogicalNot
|
|
bool c19 = g == h; // OpLogicalEqual
|
|
bool c20 = g != h; // OpLogicalNotEqual
|
|
// OpSelect not testable atm.
|
|
bool c21 = c == d; // OpIEqual
|
|
bool c22 = c != d; // OpINotEqual
|
|
bool c23 = c < d; // OpSLessThan
|
|
bool c24 = e < f; // OpULessThan
|
|
bool c25 = c > d; // OpSGreaterThan
|
|
bool c26 = e > f; // OpUGreaterThan
|
|
bool c27 = c <= d; // OpSLessThanEqual
|
|
bool c28 = e <= f; // OpULessThanEqual
|
|
bool c29 = c >= d; // OpSGreaterThanEqual
|
|
bool c30 = e >= f; // OpUGreaterThanEqual
|
|
// OpQuantizeToF16 not testable atm.
|
|
|
|
int c31 = c8 + c3;
|
|
|
|
int c32 = int(e); // OpIAdd with different types.
|
|
bool c33 = bool(c); // int -> bool
|
|
bool c34 = bool(e); // uint -> bool
|
|
int c35 = int(g); // bool -> int
|
|
uint c36 = uint(g); // bool -> uint
|
|
float c37 = float(g); // bool -> float
|
|
|
|
// Flexible sized arrays with spec constants and spec constant ops.
|
|
float vec0[c + 3][8];
|
|
float vec1[c + 2];
|
|
|
|
Foo foo;
|
|
FragColor = vec4(t0 + t1) + vec0[0][0] + vec1[0] + foo.elems[c];
|
|
}
|