Commit d0d873eb by Neil Henning

Address most feedback.

parent 892c3b6f
...@@ -246,7 +246,7 @@ namespace spv { ...@@ -246,7 +246,7 @@ namespace spv {
spv::Id spirvbin_t::localId(spv::Id id, spv::Id newId) spv::Id spirvbin_t::localId(spv::Id id, spv::Id newId)
{ {
assert(id != spv::NoResult && newId != spv::NoResult); //assert(id != spv::NoResult && newId != spv::NoResult);
if (id >= idMapL.size()) if (id >= idMapL.size())
idMapL.resize(id+1, unused); idMapL.resize(id+1, unused);
......
...@@ -1572,7 +1572,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -1572,7 +1572,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
} }
// GL_KHR_shader_subgroup // GL_KHR_shader_subgroup
if (profile != EEsProfile && version >= 450) { if (spvVersion.vulkan >= 100) {
commonBuiltins.append( commonBuiltins.append(
"void subgroupBarrier();" "void subgroupBarrier();"
"void subgroupMemoryBarrier();" "void subgroupMemoryBarrier();"
...@@ -1580,676 +1580,676 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -1580,676 +1580,676 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"void subgroupMemoryBarrierImage();" "void subgroupMemoryBarrierImage();"
"bool subgroupElect();" "bool subgroupElect();"
"bool subgroupAll(bool value);" "bool subgroupAll(bool);\n"
"bool subgroupAny(bool value);" "bool subgroupAny(bool);\n"
"bool subgroupAllEqual(float value);" "bool subgroupAllEqual(float);\n"
"bool subgroupAllEqual(vec2 value);" "bool subgroupAllEqual(vec2);\n"
"bool subgroupAllEqual(vec3 value);" "bool subgroupAllEqual(vec3);\n"
"bool subgroupAllEqual(vec4 value);" "bool subgroupAllEqual(vec4);\n"
"bool subgroupAllEqual(int value);" "bool subgroupAllEqual(int);\n"
"bool subgroupAllEqual(ivec2 value);" "bool subgroupAllEqual(ivec2);\n"
"bool subgroupAllEqual(ivec3 value);" "bool subgroupAllEqual(ivec3);\n"
"bool subgroupAllEqual(ivec4 value);" "bool subgroupAllEqual(ivec4);\n"
"bool subgroupAllEqual(uint value);" "bool subgroupAllEqual(uint);\n"
"bool subgroupAllEqual(uvec2 value);" "bool subgroupAllEqual(uvec2);\n"
"bool subgroupAllEqual(uvec3 value);" "bool subgroupAllEqual(uvec3);\n"
"bool subgroupAllEqual(uvec4 value);" "bool subgroupAllEqual(uvec4);\n"
"bool subgroupAllEqual(bool value);" "bool subgroupAllEqual(bool);\n"
"bool subgroupAllEqual(bvec2 value);" "bool subgroupAllEqual(bvec2);\n"
"bool subgroupAllEqual(bvec3 value);" "bool subgroupAllEqual(bvec3);\n"
"bool subgroupAllEqual(bvec4 value);" "bool subgroupAllEqual(bvec4);\n"
"bool subgroupAllEqual(double value);" "bool subgroupAllEqual(double);\n"
"bool subgroupAllEqual(dvec2 value);" "bool subgroupAllEqual(dvec2);\n"
"bool subgroupAllEqual(dvec3 value);" "bool subgroupAllEqual(dvec3);\n"
"bool subgroupAllEqual(dvec4 value);" "bool subgroupAllEqual(dvec4);\n"
"float subgroupBroadcast(float value, uint id);" "float subgroupBroadcast(float, uint);\n"
"vec2 subgroupBroadcast(vec2 value, uint id);" "vec2 subgroupBroadcast(vec2, uint);\n"
"vec3 subgroupBroadcast(vec3 value, uint id);" "vec3 subgroupBroadcast(vec3, uint);\n"
"vec4 subgroupBroadcast(vec4 value, uint id);" "vec4 subgroupBroadcast(vec4, uint);\n"
"int subgroupBroadcast(int value, uint id);" "int subgroupBroadcast(int, uint);\n"
"ivec2 subgroupBroadcast(ivec2 value, uint id);" "ivec2 subgroupBroadcast(ivec2, uint);\n"
"ivec3 subgroupBroadcast(ivec3 value, uint id);" "ivec3 subgroupBroadcast(ivec3, uint);\n"
"ivec4 subgroupBroadcast(ivec4 value, uint id);" "ivec4 subgroupBroadcast(ivec4, uint);\n"
"uint subgroupBroadcast(uint value, uint id);" "uint subgroupBroadcast(uint, uint);\n"
"uvec2 subgroupBroadcast(uvec2 value, uint id);" "uvec2 subgroupBroadcast(uvec2, uint);\n"
"uvec3 subgroupBroadcast(uvec3 value, uint id);" "uvec3 subgroupBroadcast(uvec3, uint);\n"
"uvec4 subgroupBroadcast(uvec4 value, uint id);" "uvec4 subgroupBroadcast(uvec4, uint);\n"
"bool subgroupBroadcast(bool value, uint id);" "bool subgroupBroadcast(bool, uint);\n"
"bvec2 subgroupBroadcast(bvec2 value, uint id);" "bvec2 subgroupBroadcast(bvec2, uint);\n"
"bvec3 subgroupBroadcast(bvec3 value, uint id);" "bvec3 subgroupBroadcast(bvec3, uint);\n"
"bvec4 subgroupBroadcast(bvec4 value, uint id);" "bvec4 subgroupBroadcast(bvec4, uint);\n"
"double subgroupBroadcast(double value, uint id);" "double subgroupBroadcast(double, uint);\n"
"dvec2 subgroupBroadcast(dvec2 value, uint id);" "dvec2 subgroupBroadcast(dvec2, uint);\n"
"dvec3 subgroupBroadcast(dvec3 value, uint id);" "dvec3 subgroupBroadcast(dvec3, uint);\n"
"dvec4 subgroupBroadcast(dvec4 value, uint id);" "dvec4 subgroupBroadcast(dvec4, uint);\n"
"float subgroupBroadcastFirst(float value);" "float subgroupBroadcastFirst(float);\n"
"vec2 subgroupBroadcastFirst(vec2 value);" "vec2 subgroupBroadcastFirst(vec2);\n"
"vec3 subgroupBroadcastFirst(vec3 value);" "vec3 subgroupBroadcastFirst(vec3);\n"
"vec4 subgroupBroadcastFirst(vec4 value);" "vec4 subgroupBroadcastFirst(vec4);\n"
"int subgroupBroadcastFirst(int value);" "int subgroupBroadcastFirst(int);\n"
"ivec2 subgroupBroadcastFirst(ivec2 value);" "ivec2 subgroupBroadcastFirst(ivec2);\n"
"ivec3 subgroupBroadcastFirst(ivec3 value);" "ivec3 subgroupBroadcastFirst(ivec3);\n"
"ivec4 subgroupBroadcastFirst(ivec4 value);" "ivec4 subgroupBroadcastFirst(ivec4);\n"
"uint subgroupBroadcastFirst(uint value);" "uint subgroupBroadcastFirst(uint);\n"
"uvec2 subgroupBroadcastFirst(uvec2 value);" "uvec2 subgroupBroadcastFirst(uvec2);\n"
"uvec3 subgroupBroadcastFirst(uvec3 value);" "uvec3 subgroupBroadcastFirst(uvec3);\n"
"uvec4 subgroupBroadcastFirst(uvec4 value);" "uvec4 subgroupBroadcastFirst(uvec4);\n"
"bool subgroupBroadcastFirst(bool value);" "bool subgroupBroadcastFirst(bool);\n"
"bvec2 subgroupBroadcastFirst(bvec2 value);" "bvec2 subgroupBroadcastFirst(bvec2);\n"
"bvec3 subgroupBroadcastFirst(bvec3 value);" "bvec3 subgroupBroadcastFirst(bvec3);\n"
"bvec4 subgroupBroadcastFirst(bvec4 value);" "bvec4 subgroupBroadcastFirst(bvec4);\n"
"double subgroupBroadcastFirst(double value);" "double subgroupBroadcastFirst(double);\n"
"dvec2 subgroupBroadcastFirst(dvec2 value);" "dvec2 subgroupBroadcastFirst(dvec2);\n"
"dvec3 subgroupBroadcastFirst(dvec3 value);" "dvec3 subgroupBroadcastFirst(dvec3);\n"
"dvec4 subgroupBroadcastFirst(dvec4 value);" "dvec4 subgroupBroadcastFirst(dvec4);\n"
"uvec4 subgroupBallot(bool value);" "uvec4 subgroupBallot(bool);\n"
"bool subgroupInverseBallot(uvec4 value);" "bool subgroupInverseBallot(uvec4);\n"
"bool subgroupBallotBitExtract(uvec4 value, uint index);" "bool subgroupBallotBitExtract(uvec4, uint);\n"
"uint subgroupBallotBitCount(uvec4 value);" "uint subgroupBallotBitCount(uvec4);\n"
"uint subgroupBallotInclusiveBitCount(uvec4 value);" "uint subgroupBallotInclusiveBitCount(uvec4);\n"
"uint subgroupBallotExclusiveBitCount(uvec4 value);" "uint subgroupBallotExclusiveBitCount(uvec4);\n"
"uint subgroupBallotFindLSB(uvec4 value);" "uint subgroupBallotFindLSB(uvec4);\n"
"uint subgroupBallotFindMSB(uvec4 value);" "uint subgroupBallotFindMSB(uvec4);\n"
"float subgroupShuffle(float value, uint id);" "float subgroupShuffle(float, uint);\n"
"vec2 subgroupShuffle(vec2 value, uint id);" "vec2 subgroupShuffle(vec2, uint);\n"
"vec3 subgroupShuffle(vec3 value, uint id);" "vec3 subgroupShuffle(vec3, uint);\n"
"vec4 subgroupShuffle(vec4 value, uint id);" "vec4 subgroupShuffle(vec4, uint);\n"
"int subgroupShuffle(int value, uint id);" "int subgroupShuffle(int, uint);\n"
"ivec2 subgroupShuffle(ivec2 value, uint id);" "ivec2 subgroupShuffle(ivec2, uint);\n"
"ivec3 subgroupShuffle(ivec3 value, uint id);" "ivec3 subgroupShuffle(ivec3, uint);\n"
"ivec4 subgroupShuffle(ivec4 value, uint id);" "ivec4 subgroupShuffle(ivec4, uint);\n"
"uint subgroupShuffle(uint value, uint id);" "uint subgroupShuffle(uint, uint);\n"
"uvec2 subgroupShuffle(uvec2 value, uint id);" "uvec2 subgroupShuffle(uvec2, uint);\n"
"uvec3 subgroupShuffle(uvec3 value, uint id);" "uvec3 subgroupShuffle(uvec3, uint);\n"
"uvec4 subgroupShuffle(uvec4 value, uint id);" "uvec4 subgroupShuffle(uvec4, uint);\n"
"bool subgroupShuffle(bool value, uint id);" "bool subgroupShuffle(bool, uint);\n"
"bvec2 subgroupShuffle(bvec2 value, uint id);" "bvec2 subgroupShuffle(bvec2, uint);\n"
"bvec3 subgroupShuffle(bvec3 value, uint id);" "bvec3 subgroupShuffle(bvec3, uint);\n"
"bvec4 subgroupShuffle(bvec4 value, uint id);" "bvec4 subgroupShuffle(bvec4, uint);\n"
"double subgroupShuffle(double value, uint id);" "double subgroupShuffle(double, uint);\n"
"dvec2 subgroupShuffle(dvec2 value, uint id);" "dvec2 subgroupShuffle(dvec2, uint);\n"
"dvec3 subgroupShuffle(dvec3 value, uint id);" "dvec3 subgroupShuffle(dvec3, uint);\n"
"dvec4 subgroupShuffle(dvec4 value, uint id);" "dvec4 subgroupShuffle(dvec4, uint);\n"
"float subgroupShuffleXor(float value, uint mask);" "float subgroupShuffleXor(float, uint);\n"
"vec2 subgroupShuffleXor(vec2 value, uint mask);" "vec2 subgroupShuffleXor(vec2, uint);\n"
"vec3 subgroupShuffleXor(vec3 value, uint mask);" "vec3 subgroupShuffleXor(vec3, uint);\n"
"vec4 subgroupShuffleXor(vec4 value, uint mask);" "vec4 subgroupShuffleXor(vec4, uint);\n"
"int subgroupShuffleXor(int value, uint mask);" "int subgroupShuffleXor(int, uint);\n"
"ivec2 subgroupShuffleXor(ivec2 value, uint mask);" "ivec2 subgroupShuffleXor(ivec2, uint);\n"
"ivec3 subgroupShuffleXor(ivec3 value, uint mask);" "ivec3 subgroupShuffleXor(ivec3, uint);\n"
"ivec4 subgroupShuffleXor(ivec4 value, uint mask);" "ivec4 subgroupShuffleXor(ivec4, uint);\n"
"uint subgroupShuffleXor(uint value, uint mask);" "uint subgroupShuffleXor(uint, uint);\n"
"uvec2 subgroupShuffleXor(uvec2 value, uint mask);" "uvec2 subgroupShuffleXor(uvec2, uint);\n"
"uvec3 subgroupShuffleXor(uvec3 value, uint mask);" "uvec3 subgroupShuffleXor(uvec3, uint);\n"
"uvec4 subgroupShuffleXor(uvec4 value, uint mask);" "uvec4 subgroupShuffleXor(uvec4, uint);\n"
"bool subgroupShuffleXor(bool value, uint mask);" "bool subgroupShuffleXor(bool, uint);\n"
"bvec2 subgroupShuffleXor(bvec2 value, uint mask);" "bvec2 subgroupShuffleXor(bvec2, uint);\n"
"bvec3 subgroupShuffleXor(bvec3 value, uint mask);" "bvec3 subgroupShuffleXor(bvec3, uint);\n"
"bvec4 subgroupShuffleXor(bvec4 value, uint mask);" "bvec4 subgroupShuffleXor(bvec4, uint);\n"
"double subgroupShuffleXor(double value, uint mask);" "double subgroupShuffleXor(double, uint);\n"
"dvec2 subgroupShuffleXor(dvec2 value, uint mask);" "dvec2 subgroupShuffleXor(dvec2, uint);\n"
"dvec3 subgroupShuffleXor(dvec3 value, uint mask);" "dvec3 subgroupShuffleXor(dvec3, uint);\n"
"dvec4 subgroupShuffleXor(dvec4 value, uint mask);" "dvec4 subgroupShuffleXor(dvec4, uint);\n"
"float subgroupShuffleUp(float value, uint delta);" "float subgroupShuffleUp(float, uint delta);\n"
"vec2 subgroupShuffleUp(vec2 value, uint delta);" "vec2 subgroupShuffleUp(vec2, uint delta);\n"
"vec3 subgroupShuffleUp(vec3 value, uint delta);" "vec3 subgroupShuffleUp(vec3, uint delta);\n"
"vec4 subgroupShuffleUp(vec4 value, uint delta);" "vec4 subgroupShuffleUp(vec4, uint delta);\n"
"int subgroupShuffleUp(int value, uint delta);" "int subgroupShuffleUp(int, uint delta);\n"
"ivec2 subgroupShuffleUp(ivec2 value, uint delta);" "ivec2 subgroupShuffleUp(ivec2, uint delta);\n"
"ivec3 subgroupShuffleUp(ivec3 value, uint delta);" "ivec3 subgroupShuffleUp(ivec3, uint delta);\n"
"ivec4 subgroupShuffleUp(ivec4 value, uint delta);" "ivec4 subgroupShuffleUp(ivec4, uint delta);\n"
"uint subgroupShuffleUp(uint value, uint delta);" "uint subgroupShuffleUp(uint, uint delta);\n"
"uvec2 subgroupShuffleUp(uvec2 value, uint delta);" "uvec2 subgroupShuffleUp(uvec2, uint delta);\n"
"uvec3 subgroupShuffleUp(uvec3 value, uint delta);" "uvec3 subgroupShuffleUp(uvec3, uint delta);\n"
"uvec4 subgroupShuffleUp(uvec4 value, uint delta);" "uvec4 subgroupShuffleUp(uvec4, uint delta);\n"
"bool subgroupShuffleUp(bool value, uint delta);" "bool subgroupShuffleUp(bool, uint delta);\n"
"bvec2 subgroupShuffleUp(bvec2 value, uint delta);" "bvec2 subgroupShuffleUp(bvec2, uint delta);\n"
"bvec3 subgroupShuffleUp(bvec3 value, uint delta);" "bvec3 subgroupShuffleUp(bvec3, uint delta);\n"
"bvec4 subgroupShuffleUp(bvec4 value, uint delta);" "bvec4 subgroupShuffleUp(bvec4, uint delta);\n"
"double subgroupShuffleUp(double value, uint delta);" "double subgroupShuffleUp(double, uint delta);\n"
"dvec2 subgroupShuffleUp(dvec2 value, uint delta);" "dvec2 subgroupShuffleUp(dvec2, uint delta);\n"
"dvec3 subgroupShuffleUp(dvec3 value, uint delta);" "dvec3 subgroupShuffleUp(dvec3, uint delta);\n"
"dvec4 subgroupShuffleUp(dvec4 value, uint delta);" "dvec4 subgroupShuffleUp(dvec4, uint delta);\n"
"float subgroupShuffleDown(float value, uint delta);" "float subgroupShuffleDown(float, uint delta);\n"
"vec2 subgroupShuffleDown(vec2 value, uint delta);" "vec2 subgroupShuffleDown(vec2, uint delta);\n"
"vec3 subgroupShuffleDown(vec3 value, uint delta);" "vec3 subgroupShuffleDown(vec3, uint delta);\n"
"vec4 subgroupShuffleDown(vec4 value, uint delta);" "vec4 subgroupShuffleDown(vec4, uint delta);\n"
"int subgroupShuffleDown(int value, uint delta);" "int subgroupShuffleDown(int, uint delta);\n"
"ivec2 subgroupShuffleDown(ivec2 value, uint delta);" "ivec2 subgroupShuffleDown(ivec2, uint delta);\n"
"ivec3 subgroupShuffleDown(ivec3 value, uint delta);" "ivec3 subgroupShuffleDown(ivec3, uint delta);\n"
"ivec4 subgroupShuffleDown(ivec4 value, uint delta);" "ivec4 subgroupShuffleDown(ivec4, uint delta);\n"
"uint subgroupShuffleDown(uint value, uint delta);" "uint subgroupShuffleDown(uint, uint delta);\n"
"uvec2 subgroupShuffleDown(uvec2 value, uint delta);" "uvec2 subgroupShuffleDown(uvec2, uint delta);\n"
"uvec3 subgroupShuffleDown(uvec3 value, uint delta);" "uvec3 subgroupShuffleDown(uvec3, uint delta);\n"
"uvec4 subgroupShuffleDown(uvec4 value, uint delta);" "uvec4 subgroupShuffleDown(uvec4, uint delta);\n"
"bool subgroupShuffleDown(bool value, uint delta);" "bool subgroupShuffleDown(bool, uint delta);\n"
"bvec2 subgroupShuffleDown(bvec2 value, uint delta);" "bvec2 subgroupShuffleDown(bvec2, uint delta);\n"
"bvec3 subgroupShuffleDown(bvec3 value, uint delta);" "bvec3 subgroupShuffleDown(bvec3, uint delta);\n"
"bvec4 subgroupShuffleDown(bvec4 value, uint delta);" "bvec4 subgroupShuffleDown(bvec4, uint delta);\n"
"double subgroupShuffleDown(double value, uint delta);" "double subgroupShuffleDown(double, uint delta);\n"
"dvec2 subgroupShuffleDown(dvec2 value, uint delta);" "dvec2 subgroupShuffleDown(dvec2, uint delta);\n"
"dvec3 subgroupShuffleDown(dvec3 value, uint delta);" "dvec3 subgroupShuffleDown(dvec3, uint delta);\n"
"dvec4 subgroupShuffleDown(dvec4 value, uint delta);" "dvec4 subgroupShuffleDown(dvec4, uint delta);\n"
"float subgroupAdd(float value);" "float subgroupAdd(float);\n"
"vec2 subgroupAdd(vec2 value);" "vec2 subgroupAdd(vec2);\n"
"vec3 subgroupAdd(vec3 value);" "vec3 subgroupAdd(vec3);\n"
"vec4 subgroupAdd(vec4 value);" "vec4 subgroupAdd(vec4);\n"
"int subgroupAdd(int value);" "int subgroupAdd(int);\n"
"ivec2 subgroupAdd(ivec2 value);" "ivec2 subgroupAdd(ivec2);\n"
"ivec3 subgroupAdd(ivec3 value);" "ivec3 subgroupAdd(ivec3);\n"
"ivec4 subgroupAdd(ivec4 value);" "ivec4 subgroupAdd(ivec4);\n"
"uint subgroupAdd(uint value);" "uint subgroupAdd(uint);\n"
"uvec2 subgroupAdd(uvec2 value);" "uvec2 subgroupAdd(uvec2);\n"
"uvec3 subgroupAdd(uvec3 value);" "uvec3 subgroupAdd(uvec3);\n"
"uvec4 subgroupAdd(uvec4 value);" "uvec4 subgroupAdd(uvec4);\n"
"double subgroupAdd(double value);" "double subgroupAdd(double);\n"
"dvec2 subgroupAdd(dvec2 value);" "dvec2 subgroupAdd(dvec2);\n"
"dvec3 subgroupAdd(dvec3 value);" "dvec3 subgroupAdd(dvec3);\n"
"dvec4 subgroupAdd(dvec4 value);" "dvec4 subgroupAdd(dvec4);\n"
"float subgroupMul(float value);" "float subgroupMul(float);\n"
"vec2 subgroupMul(vec2 value);" "vec2 subgroupMul(vec2);\n"
"vec3 subgroupMul(vec3 value);" "vec3 subgroupMul(vec3);\n"
"vec4 subgroupMul(vec4 value);" "vec4 subgroupMul(vec4);\n"
"int subgroupMul(int value);" "int subgroupMul(int);\n"
"ivec2 subgroupMul(ivec2 value);" "ivec2 subgroupMul(ivec2);\n"
"ivec3 subgroupMul(ivec3 value);" "ivec3 subgroupMul(ivec3);\n"
"ivec4 subgroupMul(ivec4 value);" "ivec4 subgroupMul(ivec4);\n"
"uint subgroupMul(uint value);" "uint subgroupMul(uint);\n"
"uvec2 subgroupMul(uvec2 value);" "uvec2 subgroupMul(uvec2);\n"
"uvec3 subgroupMul(uvec3 value);" "uvec3 subgroupMul(uvec3);\n"
"uvec4 subgroupMul(uvec4 value);" "uvec4 subgroupMul(uvec4);\n"
"double subgroupMul(double value);" "double subgroupMul(double);\n"
"dvec2 subgroupMul(dvec2 value);" "dvec2 subgroupMul(dvec2);\n"
"dvec3 subgroupMul(dvec3 value);" "dvec3 subgroupMul(dvec3);\n"
"dvec4 subgroupMul(dvec4 value);" "dvec4 subgroupMul(dvec4);\n"
"float subgroupMin(float value);" "float subgroupMin(float);\n"
"vec2 subgroupMin(vec2 value);" "vec2 subgroupMin(vec2);\n"
"vec3 subgroupMin(vec3 value);" "vec3 subgroupMin(vec3);\n"
"vec4 subgroupMin(vec4 value);" "vec4 subgroupMin(vec4);\n"
"int subgroupMin(int value);" "int subgroupMin(int);\n"
"ivec2 subgroupMin(ivec2 value);" "ivec2 subgroupMin(ivec2);\n"
"ivec3 subgroupMin(ivec3 value);" "ivec3 subgroupMin(ivec3);\n"
"ivec4 subgroupMin(ivec4 value);" "ivec4 subgroupMin(ivec4);\n"
"uint subgroupMin(uint value);" "uint subgroupMin(uint);\n"
"uvec2 subgroupMin(uvec2 value);" "uvec2 subgroupMin(uvec2);\n"
"uvec3 subgroupMin(uvec3 value);" "uvec3 subgroupMin(uvec3);\n"
"uvec4 subgroupMin(uvec4 value);" "uvec4 subgroupMin(uvec4);\n"
"double subgroupMin(double value);" "double subgroupMin(double);\n"
"dvec2 subgroupMin(dvec2 value);" "dvec2 subgroupMin(dvec2);\n"
"dvec3 subgroupMin(dvec3 value);" "dvec3 subgroupMin(dvec3);\n"
"dvec4 subgroupMin(dvec4 value);" "dvec4 subgroupMin(dvec4);\n"
"float subgroupMax(float value);" "float subgroupMax(float);\n"
"vec2 subgroupMax(vec2 value);" "vec2 subgroupMax(vec2);\n"
"vec3 subgroupMax(vec3 value);" "vec3 subgroupMax(vec3);\n"
"vec4 subgroupMax(vec4 value);" "vec4 subgroupMax(vec4);\n"
"int subgroupMax(int value);" "int subgroupMax(int);\n"
"ivec2 subgroupMax(ivec2 value);" "ivec2 subgroupMax(ivec2);\n"
"ivec3 subgroupMax(ivec3 value);" "ivec3 subgroupMax(ivec3);\n"
"ivec4 subgroupMax(ivec4 value);" "ivec4 subgroupMax(ivec4);\n"
"uint subgroupMax(uint value);" "uint subgroupMax(uint);\n"
"uvec2 subgroupMax(uvec2 value);" "uvec2 subgroupMax(uvec2);\n"
"uvec3 subgroupMax(uvec3 value);" "uvec3 subgroupMax(uvec3);\n"
"uvec4 subgroupMax(uvec4 value);" "uvec4 subgroupMax(uvec4);\n"
"double subgroupMax(double value);" "double subgroupMax(double);\n"
"dvec2 subgroupMax(dvec2 value);" "dvec2 subgroupMax(dvec2);\n"
"dvec3 subgroupMax(dvec3 value);" "dvec3 subgroupMax(dvec3);\n"
"dvec4 subgroupMax(dvec4 value);" "dvec4 subgroupMax(dvec4);\n"
"int subgroupAnd(int value);" "int subgroupAnd(int);\n"
"ivec2 subgroupAnd(ivec2 value);" "ivec2 subgroupAnd(ivec2);\n"
"ivec3 subgroupAnd(ivec3 value);" "ivec3 subgroupAnd(ivec3);\n"
"ivec4 subgroupAnd(ivec4 value);" "ivec4 subgroupAnd(ivec4);\n"
"uint subgroupAnd(uint value);" "uint subgroupAnd(uint);\n"
"uvec2 subgroupAnd(uvec2 value);" "uvec2 subgroupAnd(uvec2);\n"
"uvec3 subgroupAnd(uvec3 value);" "uvec3 subgroupAnd(uvec3);\n"
"uvec4 subgroupAnd(uvec4 value);" "uvec4 subgroupAnd(uvec4);\n"
"bool subgroupAnd(bool value);" "bool subgroupAnd(bool);\n"
"bvec2 subgroupAnd(bvec2 value);" "bvec2 subgroupAnd(bvec2);\n"
"bvec3 subgroupAnd(bvec3 value);" "bvec3 subgroupAnd(bvec3);\n"
"bvec4 subgroupAnd(bvec4 value);" "bvec4 subgroupAnd(bvec4);\n"
"int subgroupOr(int value);" "int subgroupOr(int);\n"
"ivec2 subgroupOr(ivec2 value);" "ivec2 subgroupOr(ivec2);\n"
"ivec3 subgroupOr(ivec3 value);" "ivec3 subgroupOr(ivec3);\n"
"ivec4 subgroupOr(ivec4 value);" "ivec4 subgroupOr(ivec4);\n"
"uint subgroupOr(uint value);" "uint subgroupOr(uint);\n"
"uvec2 subgroupOr(uvec2 value);" "uvec2 subgroupOr(uvec2);\n"
"uvec3 subgroupOr(uvec3 value);" "uvec3 subgroupOr(uvec3);\n"
"uvec4 subgroupOr(uvec4 value);" "uvec4 subgroupOr(uvec4);\n"
"bool subgroupOr(bool value);" "bool subgroupOr(bool);\n"
"bvec2 subgroupOr(bvec2 value);" "bvec2 subgroupOr(bvec2);\n"
"bvec3 subgroupOr(bvec3 value);" "bvec3 subgroupOr(bvec3);\n"
"bvec4 subgroupOr(bvec4 value);" "bvec4 subgroupOr(bvec4);\n"
"int subgroupXor(int value);" "int subgroupXor(int);\n"
"ivec2 subgroupXor(ivec2 value);" "ivec2 subgroupXor(ivec2);\n"
"ivec3 subgroupXor(ivec3 value);" "ivec3 subgroupXor(ivec3);\n"
"ivec4 subgroupXor(ivec4 value);" "ivec4 subgroupXor(ivec4);\n"
"uint subgroupXor(uint value);" "uint subgroupXor(uint);\n"
"uvec2 subgroupXor(uvec2 value);" "uvec2 subgroupXor(uvec2);\n"
"uvec3 subgroupXor(uvec3 value);" "uvec3 subgroupXor(uvec3);\n"
"uvec4 subgroupXor(uvec4 value);" "uvec4 subgroupXor(uvec4);\n"
"bool subgroupXor(bool value);" "bool subgroupXor(bool);\n"
"bvec2 subgroupXor(bvec2 value);" "bvec2 subgroupXor(bvec2);\n"
"bvec3 subgroupXor(bvec3 value);" "bvec3 subgroupXor(bvec3);\n"
"bvec4 subgroupXor(bvec4 value);" "bvec4 subgroupXor(bvec4);\n"
"float subgroupInclusiveAdd(float value);" "float subgroupInclusiveAdd(float);\n"
"vec2 subgroupInclusiveAdd(vec2 value);" "vec2 subgroupInclusiveAdd(vec2);\n"
"vec3 subgroupInclusiveAdd(vec3 value);" "vec3 subgroupInclusiveAdd(vec3);\n"
"vec4 subgroupInclusiveAdd(vec4 value);" "vec4 subgroupInclusiveAdd(vec4);\n"
"int subgroupInclusiveAdd(int value);" "int subgroupInclusiveAdd(int);\n"
"ivec2 subgroupInclusiveAdd(ivec2 value);" "ivec2 subgroupInclusiveAdd(ivec2);\n"
"ivec3 subgroupInclusiveAdd(ivec3 value);" "ivec3 subgroupInclusiveAdd(ivec3);\n"
"ivec4 subgroupInclusiveAdd(ivec4 value);" "ivec4 subgroupInclusiveAdd(ivec4);\n"
"uint subgroupInclusiveAdd(uint value);" "uint subgroupInclusiveAdd(uint);\n"
"uvec2 subgroupInclusiveAdd(uvec2 value);" "uvec2 subgroupInclusiveAdd(uvec2);\n"
"uvec3 subgroupInclusiveAdd(uvec3 value);" "uvec3 subgroupInclusiveAdd(uvec3);\n"
"uvec4 subgroupInclusiveAdd(uvec4 value);" "uvec4 subgroupInclusiveAdd(uvec4);\n"
"double subgroupInclusiveAdd(double value);" "double subgroupInclusiveAdd(double);\n"
"dvec2 subgroupInclusiveAdd(dvec2 value);" "dvec2 subgroupInclusiveAdd(dvec2);\n"
"dvec3 subgroupInclusiveAdd(dvec3 value);" "dvec3 subgroupInclusiveAdd(dvec3);\n"
"dvec4 subgroupInclusiveAdd(dvec4 value);" "dvec4 subgroupInclusiveAdd(dvec4);\n"
"float subgroupInclusiveMul(float value);" "float subgroupInclusiveMul(float);\n"
"vec2 subgroupInclusiveMul(vec2 value);" "vec2 subgroupInclusiveMul(vec2);\n"
"vec3 subgroupInclusiveMul(vec3 value);" "vec3 subgroupInclusiveMul(vec3);\n"
"vec4 subgroupInclusiveMul(vec4 value);" "vec4 subgroupInclusiveMul(vec4);\n"
"int subgroupInclusiveMul(int value);" "int subgroupInclusiveMul(int);\n"
"ivec2 subgroupInclusiveMul(ivec2 value);" "ivec2 subgroupInclusiveMul(ivec2);\n"
"ivec3 subgroupInclusiveMul(ivec3 value);" "ivec3 subgroupInclusiveMul(ivec3);\n"
"ivec4 subgroupInclusiveMul(ivec4 value);" "ivec4 subgroupInclusiveMul(ivec4);\n"
"uint subgroupInclusiveMul(uint value);" "uint subgroupInclusiveMul(uint);\n"
"uvec2 subgroupInclusiveMul(uvec2 value);" "uvec2 subgroupInclusiveMul(uvec2);\n"
"uvec3 subgroupInclusiveMul(uvec3 value);" "uvec3 subgroupInclusiveMul(uvec3);\n"
"uvec4 subgroupInclusiveMul(uvec4 value);" "uvec4 subgroupInclusiveMul(uvec4);\n"
"double subgroupInclusiveMul(double value);" "double subgroupInclusiveMul(double);\n"
"dvec2 subgroupInclusiveMul(dvec2 value);" "dvec2 subgroupInclusiveMul(dvec2);\n"
"dvec3 subgroupInclusiveMul(dvec3 value);" "dvec3 subgroupInclusiveMul(dvec3);\n"
"dvec4 subgroupInclusiveMul(dvec4 value);" "dvec4 subgroupInclusiveMul(dvec4);\n"
"float subgroupInclusiveMin(float value);" "float subgroupInclusiveMin(float);\n"
"vec2 subgroupInclusiveMin(vec2 value);" "vec2 subgroupInclusiveMin(vec2);\n"
"vec3 subgroupInclusiveMin(vec3 value);" "vec3 subgroupInclusiveMin(vec3);\n"
"vec4 subgroupInclusiveMin(vec4 value);" "vec4 subgroupInclusiveMin(vec4);\n"
"int subgroupInclusiveMin(int value);" "int subgroupInclusiveMin(int);\n"
"ivec2 subgroupInclusiveMin(ivec2 value);" "ivec2 subgroupInclusiveMin(ivec2);\n"
"ivec3 subgroupInclusiveMin(ivec3 value);" "ivec3 subgroupInclusiveMin(ivec3);\n"
"ivec4 subgroupInclusiveMin(ivec4 value);" "ivec4 subgroupInclusiveMin(ivec4);\n"
"uint subgroupInclusiveMin(uint value);" "uint subgroupInclusiveMin(uint);\n"
"uvec2 subgroupInclusiveMin(uvec2 value);" "uvec2 subgroupInclusiveMin(uvec2);\n"
"uvec3 subgroupInclusiveMin(uvec3 value);" "uvec3 subgroupInclusiveMin(uvec3);\n"
"uvec4 subgroupInclusiveMin(uvec4 value);" "uvec4 subgroupInclusiveMin(uvec4);\n"
"double subgroupInclusiveMin(double value);" "double subgroupInclusiveMin(double);\n"
"dvec2 subgroupInclusiveMin(dvec2 value);" "dvec2 subgroupInclusiveMin(dvec2);\n"
"dvec3 subgroupInclusiveMin(dvec3 value);" "dvec3 subgroupInclusiveMin(dvec3);\n"
"dvec4 subgroupInclusiveMin(dvec4 value);" "dvec4 subgroupInclusiveMin(dvec4);\n"
"float subgroupInclusiveMax(float value);" "float subgroupInclusiveMax(float);\n"
"vec2 subgroupInclusiveMax(vec2 value);" "vec2 subgroupInclusiveMax(vec2);\n"
"vec3 subgroupInclusiveMax(vec3 value);" "vec3 subgroupInclusiveMax(vec3);\n"
"vec4 subgroupInclusiveMax(vec4 value);" "vec4 subgroupInclusiveMax(vec4);\n"
"int subgroupInclusiveMax(int value);" "int subgroupInclusiveMax(int);\n"
"ivec2 subgroupInclusiveMax(ivec2 value);" "ivec2 subgroupInclusiveMax(ivec2);\n"
"ivec3 subgroupInclusiveMax(ivec3 value);" "ivec3 subgroupInclusiveMax(ivec3);\n"
"ivec4 subgroupInclusiveMax(ivec4 value);" "ivec4 subgroupInclusiveMax(ivec4);\n"
"uint subgroupInclusiveMax(uint value);" "uint subgroupInclusiveMax(uint);\n"
"uvec2 subgroupInclusiveMax(uvec2 value);" "uvec2 subgroupInclusiveMax(uvec2);\n"
"uvec3 subgroupInclusiveMax(uvec3 value);" "uvec3 subgroupInclusiveMax(uvec3);\n"
"uvec4 subgroupInclusiveMax(uvec4 value);" "uvec4 subgroupInclusiveMax(uvec4);\n"
"double subgroupInclusiveMax(double value);" "double subgroupInclusiveMax(double);\n"
"dvec2 subgroupInclusiveMax(dvec2 value);" "dvec2 subgroupInclusiveMax(dvec2);\n"
"dvec3 subgroupInclusiveMax(dvec3 value);" "dvec3 subgroupInclusiveMax(dvec3);\n"
"dvec4 subgroupInclusiveMax(dvec4 value);" "dvec4 subgroupInclusiveMax(dvec4);\n"
"int subgroupInclusiveAnd(int value);" "int subgroupInclusiveAnd(int);\n"
"ivec2 subgroupInclusiveAnd(ivec2 value);" "ivec2 subgroupInclusiveAnd(ivec2);\n"
"ivec3 subgroupInclusiveAnd(ivec3 value);" "ivec3 subgroupInclusiveAnd(ivec3);\n"
"ivec4 subgroupInclusiveAnd(ivec4 value);" "ivec4 subgroupInclusiveAnd(ivec4);\n"
"uint subgroupInclusiveAnd(uint value);" "uint subgroupInclusiveAnd(uint);\n"
"uvec2 subgroupInclusiveAnd(uvec2 value);" "uvec2 subgroupInclusiveAnd(uvec2);\n"
"uvec3 subgroupInclusiveAnd(uvec3 value);" "uvec3 subgroupInclusiveAnd(uvec3);\n"
"uvec4 subgroupInclusiveAnd(uvec4 value);" "uvec4 subgroupInclusiveAnd(uvec4);\n"
"bool subgroupInclusiveAnd(bool value);" "bool subgroupInclusiveAnd(bool);\n"
"bvec2 subgroupInclusiveAnd(bvec2 value);" "bvec2 subgroupInclusiveAnd(bvec2);\n"
"bvec3 subgroupInclusiveAnd(bvec3 value);" "bvec3 subgroupInclusiveAnd(bvec3);\n"
"bvec4 subgroupInclusiveAnd(bvec4 value);" "bvec4 subgroupInclusiveAnd(bvec4);\n"
"int subgroupInclusiveOr(int value);" "int subgroupInclusiveOr(int);\n"
"ivec2 subgroupInclusiveOr(ivec2 value);" "ivec2 subgroupInclusiveOr(ivec2);\n"
"ivec3 subgroupInclusiveOr(ivec3 value);" "ivec3 subgroupInclusiveOr(ivec3);\n"
"ivec4 subgroupInclusiveOr(ivec4 value);" "ivec4 subgroupInclusiveOr(ivec4);\n"
"uint subgroupInclusiveOr(uint value);" "uint subgroupInclusiveOr(uint);\n"
"uvec2 subgroupInclusiveOr(uvec2 value);" "uvec2 subgroupInclusiveOr(uvec2);\n"
"uvec3 subgroupInclusiveOr(uvec3 value);" "uvec3 subgroupInclusiveOr(uvec3);\n"
"uvec4 subgroupInclusiveOr(uvec4 value);" "uvec4 subgroupInclusiveOr(uvec4);\n"
"bool subgroupInclusiveOr(bool value);" "bool subgroupInclusiveOr(bool);\n"
"bvec2 subgroupInclusiveOr(bvec2 value);" "bvec2 subgroupInclusiveOr(bvec2);\n"
"bvec3 subgroupInclusiveOr(bvec3 value);" "bvec3 subgroupInclusiveOr(bvec3);\n"
"bvec4 subgroupInclusiveOr(bvec4 value);" "bvec4 subgroupInclusiveOr(bvec4);\n"
"int subgroupInclusiveXor(int value);" "int subgroupInclusiveXor(int);\n"
"ivec2 subgroupInclusiveXor(ivec2 value);" "ivec2 subgroupInclusiveXor(ivec2);\n"
"ivec3 subgroupInclusiveXor(ivec3 value);" "ivec3 subgroupInclusiveXor(ivec3);\n"
"ivec4 subgroupInclusiveXor(ivec4 value);" "ivec4 subgroupInclusiveXor(ivec4);\n"
"uint subgroupInclusiveXor(uint value);" "uint subgroupInclusiveXor(uint);\n"
"uvec2 subgroupInclusiveXor(uvec2 value);" "uvec2 subgroupInclusiveXor(uvec2);\n"
"uvec3 subgroupInclusiveXor(uvec3 value);" "uvec3 subgroupInclusiveXor(uvec3);\n"
"uvec4 subgroupInclusiveXor(uvec4 value);" "uvec4 subgroupInclusiveXor(uvec4);\n"
"bool subgroupInclusiveXor(bool value);" "bool subgroupInclusiveXor(bool);\n"
"bvec2 subgroupInclusiveXor(bvec2 value);" "bvec2 subgroupInclusiveXor(bvec2);\n"
"bvec3 subgroupInclusiveXor(bvec3 value);" "bvec3 subgroupInclusiveXor(bvec3);\n"
"bvec4 subgroupInclusiveXor(bvec4 value);" "bvec4 subgroupInclusiveXor(bvec4);\n"
"float subgroupExclusiveAdd(float value);" "float subgroupExclusiveAdd(float);\n"
"vec2 subgroupExclusiveAdd(vec2 value);" "vec2 subgroupExclusiveAdd(vec2);\n"
"vec3 subgroupExclusiveAdd(vec3 value);" "vec3 subgroupExclusiveAdd(vec3);\n"
"vec4 subgroupExclusiveAdd(vec4 value);" "vec4 subgroupExclusiveAdd(vec4);\n"
"int subgroupExclusiveAdd(int value);" "int subgroupExclusiveAdd(int);\n"
"ivec2 subgroupExclusiveAdd(ivec2 value);" "ivec2 subgroupExclusiveAdd(ivec2);\n"
"ivec3 subgroupExclusiveAdd(ivec3 value);" "ivec3 subgroupExclusiveAdd(ivec3);\n"
"ivec4 subgroupExclusiveAdd(ivec4 value);" "ivec4 subgroupExclusiveAdd(ivec4);\n"
"uint subgroupExclusiveAdd(uint value);" "uint subgroupExclusiveAdd(uint);\n"
"uvec2 subgroupExclusiveAdd(uvec2 value);" "uvec2 subgroupExclusiveAdd(uvec2);\n"
"uvec3 subgroupExclusiveAdd(uvec3 value);" "uvec3 subgroupExclusiveAdd(uvec3);\n"
"uvec4 subgroupExclusiveAdd(uvec4 value);" "uvec4 subgroupExclusiveAdd(uvec4);\n"
"double subgroupExclusiveAdd(double value);" "double subgroupExclusiveAdd(double);\n"
"dvec2 subgroupExclusiveAdd(dvec2 value);" "dvec2 subgroupExclusiveAdd(dvec2);\n"
"dvec3 subgroupExclusiveAdd(dvec3 value);" "dvec3 subgroupExclusiveAdd(dvec3);\n"
"dvec4 subgroupExclusiveAdd(dvec4 value);" "dvec4 subgroupExclusiveAdd(dvec4);\n"
"float subgroupExclusiveMul(float value);" "float subgroupExclusiveMul(float);\n"
"vec2 subgroupExclusiveMul(vec2 value);" "vec2 subgroupExclusiveMul(vec2);\n"
"vec3 subgroupExclusiveMul(vec3 value);" "vec3 subgroupExclusiveMul(vec3);\n"
"vec4 subgroupExclusiveMul(vec4 value);" "vec4 subgroupExclusiveMul(vec4);\n"
"int subgroupExclusiveMul(int value);" "int subgroupExclusiveMul(int);\n"
"ivec2 subgroupExclusiveMul(ivec2 value);" "ivec2 subgroupExclusiveMul(ivec2);\n"
"ivec3 subgroupExclusiveMul(ivec3 value);" "ivec3 subgroupExclusiveMul(ivec3);\n"
"ivec4 subgroupExclusiveMul(ivec4 value);" "ivec4 subgroupExclusiveMul(ivec4);\n"
"uint subgroupExclusiveMul(uint value);" "uint subgroupExclusiveMul(uint);\n"
"uvec2 subgroupExclusiveMul(uvec2 value);" "uvec2 subgroupExclusiveMul(uvec2);\n"
"uvec3 subgroupExclusiveMul(uvec3 value);" "uvec3 subgroupExclusiveMul(uvec3);\n"
"uvec4 subgroupExclusiveMul(uvec4 value);" "uvec4 subgroupExclusiveMul(uvec4);\n"
"double subgroupExclusiveMul(double value);" "double subgroupExclusiveMul(double);\n"
"dvec2 subgroupExclusiveMul(dvec2 value);" "dvec2 subgroupExclusiveMul(dvec2);\n"
"dvec3 subgroupExclusiveMul(dvec3 value);" "dvec3 subgroupExclusiveMul(dvec3);\n"
"dvec4 subgroupExclusiveMul(dvec4 value);" "dvec4 subgroupExclusiveMul(dvec4);\n"
"float subgroupExclusiveMin(float value);" "float subgroupExclusiveMin(float);\n"
"vec2 subgroupExclusiveMin(vec2 value);" "vec2 subgroupExclusiveMin(vec2);\n"
"vec3 subgroupExclusiveMin(vec3 value);" "vec3 subgroupExclusiveMin(vec3);\n"
"vec4 subgroupExclusiveMin(vec4 value);" "vec4 subgroupExclusiveMin(vec4);\n"
"int subgroupExclusiveMin(int value);" "int subgroupExclusiveMin(int);\n"
"ivec2 subgroupExclusiveMin(ivec2 value);" "ivec2 subgroupExclusiveMin(ivec2);\n"
"ivec3 subgroupExclusiveMin(ivec3 value);" "ivec3 subgroupExclusiveMin(ivec3);\n"
"ivec4 subgroupExclusiveMin(ivec4 value);" "ivec4 subgroupExclusiveMin(ivec4);\n"
"uint subgroupExclusiveMin(uint value);" "uint subgroupExclusiveMin(uint);\n"
"uvec2 subgroupExclusiveMin(uvec2 value);" "uvec2 subgroupExclusiveMin(uvec2);\n"
"uvec3 subgroupExclusiveMin(uvec3 value);" "uvec3 subgroupExclusiveMin(uvec3);\n"
"uvec4 subgroupExclusiveMin(uvec4 value);" "uvec4 subgroupExclusiveMin(uvec4);\n"
"double subgroupExclusiveMin(double value);" "double subgroupExclusiveMin(double);\n"
"dvec2 subgroupExclusiveMin(dvec2 value);" "dvec2 subgroupExclusiveMin(dvec2);\n"
"dvec3 subgroupExclusiveMin(dvec3 value);" "dvec3 subgroupExclusiveMin(dvec3);\n"
"dvec4 subgroupExclusiveMin(dvec4 value);" "dvec4 subgroupExclusiveMin(dvec4);\n"
"float subgroupExclusiveMax(float value);" "float subgroupExclusiveMax(float);\n"
"vec2 subgroupExclusiveMax(vec2 value);" "vec2 subgroupExclusiveMax(vec2);\n"
"vec3 subgroupExclusiveMax(vec3 value);" "vec3 subgroupExclusiveMax(vec3);\n"
"vec4 subgroupExclusiveMax(vec4 value);" "vec4 subgroupExclusiveMax(vec4);\n"
"int subgroupExclusiveMax(int value);" "int subgroupExclusiveMax(int);\n"
"ivec2 subgroupExclusiveMax(ivec2 value);" "ivec2 subgroupExclusiveMax(ivec2);\n"
"ivec3 subgroupExclusiveMax(ivec3 value);" "ivec3 subgroupExclusiveMax(ivec3);\n"
"ivec4 subgroupExclusiveMax(ivec4 value);" "ivec4 subgroupExclusiveMax(ivec4);\n"
"uint subgroupExclusiveMax(uint value);" "uint subgroupExclusiveMax(uint);\n"
"uvec2 subgroupExclusiveMax(uvec2 value);" "uvec2 subgroupExclusiveMax(uvec2);\n"
"uvec3 subgroupExclusiveMax(uvec3 value);" "uvec3 subgroupExclusiveMax(uvec3);\n"
"uvec4 subgroupExclusiveMax(uvec4 value);" "uvec4 subgroupExclusiveMax(uvec4);\n"
"double subgroupExclusiveMax(double value);" "double subgroupExclusiveMax(double);\n"
"dvec2 subgroupExclusiveMax(dvec2 value);" "dvec2 subgroupExclusiveMax(dvec2);\n"
"dvec3 subgroupExclusiveMax(dvec3 value);" "dvec3 subgroupExclusiveMax(dvec3);\n"
"dvec4 subgroupExclusiveMax(dvec4 value);" "dvec4 subgroupExclusiveMax(dvec4);\n"
"int subgroupExclusiveAnd(int value);" "int subgroupExclusiveAnd(int);\n"
"ivec2 subgroupExclusiveAnd(ivec2 value);" "ivec2 subgroupExclusiveAnd(ivec2);\n"
"ivec3 subgroupExclusiveAnd(ivec3 value);" "ivec3 subgroupExclusiveAnd(ivec3);\n"
"ivec4 subgroupExclusiveAnd(ivec4 value);" "ivec4 subgroupExclusiveAnd(ivec4);\n"
"uint subgroupExclusiveAnd(uint value);" "uint subgroupExclusiveAnd(uint);\n"
"uvec2 subgroupExclusiveAnd(uvec2 value);" "uvec2 subgroupExclusiveAnd(uvec2);\n"
"uvec3 subgroupExclusiveAnd(uvec3 value);" "uvec3 subgroupExclusiveAnd(uvec3);\n"
"uvec4 subgroupExclusiveAnd(uvec4 value);" "uvec4 subgroupExclusiveAnd(uvec4);\n"
"bool subgroupExclusiveAnd(bool value);" "bool subgroupExclusiveAnd(bool);\n"
"bvec2 subgroupExclusiveAnd(bvec2 value);" "bvec2 subgroupExclusiveAnd(bvec2);\n"
"bvec3 subgroupExclusiveAnd(bvec3 value);" "bvec3 subgroupExclusiveAnd(bvec3);\n"
"bvec4 subgroupExclusiveAnd(bvec4 value);" "bvec4 subgroupExclusiveAnd(bvec4);\n"
"int subgroupExclusiveOr(int value);" "int subgroupExclusiveOr(int);\n"
"ivec2 subgroupExclusiveOr(ivec2 value);" "ivec2 subgroupExclusiveOr(ivec2);\n"
"ivec3 subgroupExclusiveOr(ivec3 value);" "ivec3 subgroupExclusiveOr(ivec3);\n"
"ivec4 subgroupExclusiveOr(ivec4 value);" "ivec4 subgroupExclusiveOr(ivec4);\n"
"uint subgroupExclusiveOr(uint value);" "uint subgroupExclusiveOr(uint);\n"
"uvec2 subgroupExclusiveOr(uvec2 value);" "uvec2 subgroupExclusiveOr(uvec2);\n"
"uvec3 subgroupExclusiveOr(uvec3 value);" "uvec3 subgroupExclusiveOr(uvec3);\n"
"uvec4 subgroupExclusiveOr(uvec4 value);" "uvec4 subgroupExclusiveOr(uvec4);\n"
"bool subgroupExclusiveOr(bool value);" "bool subgroupExclusiveOr(bool);\n"
"bvec2 subgroupExclusiveOr(bvec2 value);" "bvec2 subgroupExclusiveOr(bvec2);\n"
"bvec3 subgroupExclusiveOr(bvec3 value);" "bvec3 subgroupExclusiveOr(bvec3);\n"
"bvec4 subgroupExclusiveOr(bvec4 value);" "bvec4 subgroupExclusiveOr(bvec4);\n"
"int subgroupExclusiveXor(int value);" "int subgroupExclusiveXor(int);\n"
"ivec2 subgroupExclusiveXor(ivec2 value);" "ivec2 subgroupExclusiveXor(ivec2);\n"
"ivec3 subgroupExclusiveXor(ivec3 value);" "ivec3 subgroupExclusiveXor(ivec3);\n"
"ivec4 subgroupExclusiveXor(ivec4 value);" "ivec4 subgroupExclusiveXor(ivec4);\n"
"uint subgroupExclusiveXor(uint value);" "uint subgroupExclusiveXor(uint);\n"
"uvec2 subgroupExclusiveXor(uvec2 value);" "uvec2 subgroupExclusiveXor(uvec2);\n"
"uvec3 subgroupExclusiveXor(uvec3 value);" "uvec3 subgroupExclusiveXor(uvec3);\n"
"uvec4 subgroupExclusiveXor(uvec4 value);" "uvec4 subgroupExclusiveXor(uvec4);\n"
"bool subgroupExclusiveXor(bool value);" "bool subgroupExclusiveXor(bool);\n"
"bvec2 subgroupExclusiveXor(bvec2 value);" "bvec2 subgroupExclusiveXor(bvec2);\n"
"bvec3 subgroupExclusiveXor(bvec3 value);" "bvec3 subgroupExclusiveXor(bvec3);\n"
"bvec4 subgroupExclusiveXor(bvec4 value);" "bvec4 subgroupExclusiveXor(bvec4);\n"
"float subgroupClusteredAdd(float value, uint clusterSize);" "float subgroupClusteredAdd(float, uint);\n"
"vec2 subgroupClusteredAdd(vec2 value, uint clusterSize);" "vec2 subgroupClusteredAdd(vec2, uint);\n"
"vec3 subgroupClusteredAdd(vec3 value, uint clusterSize);" "vec3 subgroupClusteredAdd(vec3, uint);\n"
"vec4 subgroupClusteredAdd(vec4 value, uint clusterSize);" "vec4 subgroupClusteredAdd(vec4, uint);\n"
"int subgroupClusteredAdd(int value, uint clusterSize);" "int subgroupClusteredAdd(int, uint);\n"
"ivec2 subgroupClusteredAdd(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredAdd(ivec2, uint);\n"
"ivec3 subgroupClusteredAdd(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredAdd(ivec3, uint);\n"
"ivec4 subgroupClusteredAdd(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredAdd(ivec4, uint);\n"
"uint subgroupClusteredAdd(uint value, uint clusterSize);" "uint subgroupClusteredAdd(uint, uint);\n"
"uvec2 subgroupClusteredAdd(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredAdd(uvec2, uint);\n"
"uvec3 subgroupClusteredAdd(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredAdd(uvec3, uint);\n"
"uvec4 subgroupClusteredAdd(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredAdd(uvec4, uint);\n"
"double subgroupClusteredAdd(double value, uint clusterSize);" "double subgroupClusteredAdd(double, uint);\n"
"dvec2 subgroupClusteredAdd(dvec2 value, uint clusterSize);" "dvec2 subgroupClusteredAdd(dvec2, uint);\n"
"dvec3 subgroupClusteredAdd(dvec3 value, uint clusterSize);" "dvec3 subgroupClusteredAdd(dvec3, uint);\n"
"dvec4 subgroupClusteredAdd(dvec4 value, uint clusterSize);" "dvec4 subgroupClusteredAdd(dvec4, uint);\n"
"float subgroupClusteredMul(float value, uint clusterSize);" "float subgroupClusteredMul(float, uint);\n"
"vec2 subgroupClusteredMul(vec2 value, uint clusterSize);" "vec2 subgroupClusteredMul(vec2, uint);\n"
"vec3 subgroupClusteredMul(vec3 value, uint clusterSize);" "vec3 subgroupClusteredMul(vec3, uint);\n"
"vec4 subgroupClusteredMul(vec4 value, uint clusterSize);" "vec4 subgroupClusteredMul(vec4, uint);\n"
"int subgroupClusteredMul(int value, uint clusterSize);" "int subgroupClusteredMul(int, uint);\n"
"ivec2 subgroupClusteredMul(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredMul(ivec2, uint);\n"
"ivec3 subgroupClusteredMul(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredMul(ivec3, uint);\n"
"ivec4 subgroupClusteredMul(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredMul(ivec4, uint);\n"
"uint subgroupClusteredMul(uint value, uint clusterSize);" "uint subgroupClusteredMul(uint, uint);\n"
"uvec2 subgroupClusteredMul(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredMul(uvec2, uint);\n"
"uvec3 subgroupClusteredMul(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredMul(uvec3, uint);\n"
"uvec4 subgroupClusteredMul(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredMul(uvec4, uint);\n"
"double subgroupClusteredMul(double value, uint clusterSize);" "double subgroupClusteredMul(double, uint);\n"
"dvec2 subgroupClusteredMul(dvec2 value, uint clusterSize);" "dvec2 subgroupClusteredMul(dvec2, uint);\n"
"dvec3 subgroupClusteredMul(dvec3 value, uint clusterSize);" "dvec3 subgroupClusteredMul(dvec3, uint);\n"
"dvec4 subgroupClusteredMul(dvec4 value, uint clusterSize);" "dvec4 subgroupClusteredMul(dvec4, uint);\n"
"float subgroupClusteredMin(float value, uint clusterSize);" "float subgroupClusteredMin(float, uint);\n"
"vec2 subgroupClusteredMin(vec2 value, uint clusterSize);" "vec2 subgroupClusteredMin(vec2, uint);\n"
"vec3 subgroupClusteredMin(vec3 value, uint clusterSize);" "vec3 subgroupClusteredMin(vec3, uint);\n"
"vec4 subgroupClusteredMin(vec4 value, uint clusterSize);" "vec4 subgroupClusteredMin(vec4, uint);\n"
"int subgroupClusteredMin(int value, uint clusterSize);" "int subgroupClusteredMin(int, uint);\n"
"ivec2 subgroupClusteredMin(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredMin(ivec2, uint);\n"
"ivec3 subgroupClusteredMin(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredMin(ivec3, uint);\n"
"ivec4 subgroupClusteredMin(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredMin(ivec4, uint);\n"
"uint subgroupClusteredMin(uint value, uint clusterSize);" "uint subgroupClusteredMin(uint, uint);\n"
"uvec2 subgroupClusteredMin(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredMin(uvec2, uint);\n"
"uvec3 subgroupClusteredMin(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredMin(uvec3, uint);\n"
"uvec4 subgroupClusteredMin(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredMin(uvec4, uint);\n"
"double subgroupClusteredMin(double value, uint clusterSize);" "double subgroupClusteredMin(double, uint);\n"
"dvec2 subgroupClusteredMin(dvec2 value, uint clusterSize);" "dvec2 subgroupClusteredMin(dvec2, uint);\n"
"dvec3 subgroupClusteredMin(dvec3 value, uint clusterSize);" "dvec3 subgroupClusteredMin(dvec3, uint);\n"
"dvec4 subgroupClusteredMin(dvec4 value, uint clusterSize);" "dvec4 subgroupClusteredMin(dvec4, uint);\n"
"float subgroupClusteredMax(float value, uint clusterSize);" "float subgroupClusteredMax(float, uint);\n"
"vec2 subgroupClusteredMax(vec2 value, uint clusterSize);" "vec2 subgroupClusteredMax(vec2, uint);\n"
"vec3 subgroupClusteredMax(vec3 value, uint clusterSize);" "vec3 subgroupClusteredMax(vec3, uint);\n"
"vec4 subgroupClusteredMax(vec4 value, uint clusterSize);" "vec4 subgroupClusteredMax(vec4, uint);\n"
"int subgroupClusteredMax(int value, uint clusterSize);" "int subgroupClusteredMax(int, uint);\n"
"ivec2 subgroupClusteredMax(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredMax(ivec2, uint);\n"
"ivec3 subgroupClusteredMax(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredMax(ivec3, uint);\n"
"ivec4 subgroupClusteredMax(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredMax(ivec4, uint);\n"
"uint subgroupClusteredMax(uint value, uint clusterSize);" "uint subgroupClusteredMax(uint, uint);\n"
"uvec2 subgroupClusteredMax(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredMax(uvec2, uint);\n"
"uvec3 subgroupClusteredMax(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredMax(uvec3, uint);\n"
"uvec4 subgroupClusteredMax(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredMax(uvec4, uint);\n"
"double subgroupClusteredMax(double value, uint clusterSize);" "double subgroupClusteredMax(double, uint);\n"
"dvec2 subgroupClusteredMax(dvec2 value, uint clusterSize);" "dvec2 subgroupClusteredMax(dvec2, uint);\n"
"dvec3 subgroupClusteredMax(dvec3 value, uint clusterSize);" "dvec3 subgroupClusteredMax(dvec3, uint);\n"
"dvec4 subgroupClusteredMax(dvec4 value, uint clusterSize);" "dvec4 subgroupClusteredMax(dvec4, uint);\n"
"int subgroupClusteredAnd(int value, uint clusterSize);" "int subgroupClusteredAnd(int, uint);\n"
"ivec2 subgroupClusteredAnd(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredAnd(ivec2, uint);\n"
"ivec3 subgroupClusteredAnd(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredAnd(ivec3, uint);\n"
"ivec4 subgroupClusteredAnd(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredAnd(ivec4, uint);\n"
"uint subgroupClusteredAnd(uint value, uint clusterSize);" "uint subgroupClusteredAnd(uint, uint);\n"
"uvec2 subgroupClusteredAnd(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredAnd(uvec2, uint);\n"
"uvec3 subgroupClusteredAnd(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredAnd(uvec3, uint);\n"
"uvec4 subgroupClusteredAnd(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredAnd(uvec4, uint);\n"
"bool subgroupClusteredAnd(bool value, uint clusterSize);" "bool subgroupClusteredAnd(bool, uint);\n"
"bvec2 subgroupClusteredAnd(bvec2 value, uint clusterSize);" "bvec2 subgroupClusteredAnd(bvec2, uint);\n"
"bvec3 subgroupClusteredAnd(bvec3 value, uint clusterSize);" "bvec3 subgroupClusteredAnd(bvec3, uint);\n"
"bvec4 subgroupClusteredAnd(bvec4 value, uint clusterSize);" "bvec4 subgroupClusteredAnd(bvec4, uint);\n"
"int subgroupClusteredOr(int value, uint clusterSize);" "int subgroupClusteredOr(int, uint);\n"
"ivec2 subgroupClusteredOr(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredOr(ivec2, uint);\n"
"ivec3 subgroupClusteredOr(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredOr(ivec3, uint);\n"
"ivec4 subgroupClusteredOr(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredOr(ivec4, uint);\n"
"uint subgroupClusteredOr(uint value, uint clusterSize);" "uint subgroupClusteredOr(uint, uint);\n"
"uvec2 subgroupClusteredOr(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredOr(uvec2, uint);\n"
"uvec3 subgroupClusteredOr(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredOr(uvec3, uint);\n"
"uvec4 subgroupClusteredOr(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredOr(uvec4, uint);\n"
"bool subgroupClusteredOr(bool value, uint clusterSize);" "bool subgroupClusteredOr(bool, uint);\n"
"bvec2 subgroupClusteredOr(bvec2 value, uint clusterSize);" "bvec2 subgroupClusteredOr(bvec2, uint);\n"
"bvec3 subgroupClusteredOr(bvec3 value, uint clusterSize);" "bvec3 subgroupClusteredOr(bvec3, uint);\n"
"bvec4 subgroupClusteredOr(bvec4 value, uint clusterSize);" "bvec4 subgroupClusteredOr(bvec4, uint);\n"
"int subgroupClusteredXor(int value, uint clusterSize);" "int subgroupClusteredXor(int, uint);\n"
"ivec2 subgroupClusteredXor(ivec2 value, uint clusterSize);" "ivec2 subgroupClusteredXor(ivec2, uint);\n"
"ivec3 subgroupClusteredXor(ivec3 value, uint clusterSize);" "ivec3 subgroupClusteredXor(ivec3, uint);\n"
"ivec4 subgroupClusteredXor(ivec4 value, uint clusterSize);" "ivec4 subgroupClusteredXor(ivec4, uint);\n"
"uint subgroupClusteredXor(uint value, uint clusterSize);" "uint subgroupClusteredXor(uint, uint);\n"
"uvec2 subgroupClusteredXor(uvec2 value, uint clusterSize);" "uvec2 subgroupClusteredXor(uvec2, uint);\n"
"uvec3 subgroupClusteredXor(uvec3 value, uint clusterSize);" "uvec3 subgroupClusteredXor(uvec3, uint);\n"
"uvec4 subgroupClusteredXor(uvec4 value, uint clusterSize);" "uvec4 subgroupClusteredXor(uvec4, uint);\n"
"bool subgroupClusteredXor(bool value, uint clusterSize);" "bool subgroupClusteredXor(bool, uint);\n"
"bvec2 subgroupClusteredXor(bvec2 value, uint clusterSize);" "bvec2 subgroupClusteredXor(bvec2, uint);\n"
"bvec3 subgroupClusteredXor(bvec3 value, uint clusterSize);" "bvec3 subgroupClusteredXor(bvec3, uint);\n"
"bvec4 subgroupClusteredXor(bvec4 value, uint clusterSize);" "bvec4 subgroupClusteredXor(bvec4, uint);\n"
"float subgroupQuadBroadcast(float value, uint id);" "float subgroupQuadBroadcast(float, uint);\n"
"vec2 subgroupQuadBroadcast(vec2 value, uint id);" "vec2 subgroupQuadBroadcast(vec2, uint);\n"
"vec3 subgroupQuadBroadcast(vec3 value, uint id);" "vec3 subgroupQuadBroadcast(vec3, uint);\n"
"vec4 subgroupQuadBroadcast(vec4 value, uint id);" "vec4 subgroupQuadBroadcast(vec4, uint);\n"
"int subgroupQuadBroadcast(int value, uint id);" "int subgroupQuadBroadcast(int, uint);\n"
"ivec2 subgroupQuadBroadcast(ivec2 value, uint id);" "ivec2 subgroupQuadBroadcast(ivec2, uint);\n"
"ivec3 subgroupQuadBroadcast(ivec3 value, uint id);" "ivec3 subgroupQuadBroadcast(ivec3, uint);\n"
"ivec4 subgroupQuadBroadcast(ivec4 value, uint id);" "ivec4 subgroupQuadBroadcast(ivec4, uint);\n"
"uint subgroupQuadBroadcast(uint value, uint id);" "uint subgroupQuadBroadcast(uint, uint);\n"
"uvec2 subgroupQuadBroadcast(uvec2 value, uint id);" "uvec2 subgroupQuadBroadcast(uvec2, uint);\n"
"uvec3 subgroupQuadBroadcast(uvec3 value, uint id);" "uvec3 subgroupQuadBroadcast(uvec3, uint);\n"
"uvec4 subgroupQuadBroadcast(uvec4 value, uint id);" "uvec4 subgroupQuadBroadcast(uvec4, uint);\n"
"bool subgroupQuadBroadcast(bool value, uint id);" "bool subgroupQuadBroadcast(bool, uint);\n"
"bvec2 subgroupQuadBroadcast(bvec2 value, uint id);" "bvec2 subgroupQuadBroadcast(bvec2, uint);\n"
"bvec3 subgroupQuadBroadcast(bvec3 value, uint id);" "bvec3 subgroupQuadBroadcast(bvec3, uint);\n"
"bvec4 subgroupQuadBroadcast(bvec4 value, uint id);" "bvec4 subgroupQuadBroadcast(bvec4, uint);\n"
"double subgroupQuadBroadcast(double value, uint id);" "double subgroupQuadBroadcast(double, uint);\n"
"dvec2 subgroupQuadBroadcast(dvec2 value, uint id);" "dvec2 subgroupQuadBroadcast(dvec2, uint);\n"
"dvec3 subgroupQuadBroadcast(dvec3 value, uint id);" "dvec3 subgroupQuadBroadcast(dvec3, uint);\n"
"dvec4 subgroupQuadBroadcast(dvec4 value, uint id);" "dvec4 subgroupQuadBroadcast(dvec4, uint);\n"
"float subgroupQuadSwapHorizontal(float value);" "float subgroupQuadSwapHorizontal(float);\n"
"vec2 subgroupQuadSwapHorizontal(vec2 value);" "vec2 subgroupQuadSwapHorizontal(vec2);\n"
"vec3 subgroupQuadSwapHorizontal(vec3 value);" "vec3 subgroupQuadSwapHorizontal(vec3);\n"
"vec4 subgroupQuadSwapHorizontal(vec4 value);" "vec4 subgroupQuadSwapHorizontal(vec4);\n"
"int subgroupQuadSwapHorizontal(int value);" "int subgroupQuadSwapHorizontal(int);\n"
"ivec2 subgroupQuadSwapHorizontal(ivec2 value);" "ivec2 subgroupQuadSwapHorizontal(ivec2);\n"
"ivec3 subgroupQuadSwapHorizontal(ivec3 value);" "ivec3 subgroupQuadSwapHorizontal(ivec3);\n"
"ivec4 subgroupQuadSwapHorizontal(ivec4 value);" "ivec4 subgroupQuadSwapHorizontal(ivec4);\n"
"uint subgroupQuadSwapHorizontal(uint value);" "uint subgroupQuadSwapHorizontal(uint);\n"
"uvec2 subgroupQuadSwapHorizontal(uvec2 value);" "uvec2 subgroupQuadSwapHorizontal(uvec2);\n"
"uvec3 subgroupQuadSwapHorizontal(uvec3 value);" "uvec3 subgroupQuadSwapHorizontal(uvec3);\n"
"uvec4 subgroupQuadSwapHorizontal(uvec4 value);" "uvec4 subgroupQuadSwapHorizontal(uvec4);\n"
"bool subgroupQuadSwapHorizontal(bool value);" "bool subgroupQuadSwapHorizontal(bool);\n"
"bvec2 subgroupQuadSwapHorizontal(bvec2 value);" "bvec2 subgroupQuadSwapHorizontal(bvec2);\n"
"bvec3 subgroupQuadSwapHorizontal(bvec3 value);" "bvec3 subgroupQuadSwapHorizontal(bvec3);\n"
"bvec4 subgroupQuadSwapHorizontal(bvec4 value);" "bvec4 subgroupQuadSwapHorizontal(bvec4);\n"
"double subgroupQuadSwapHorizontal(double value);" "double subgroupQuadSwapHorizontal(double);\n"
"dvec2 subgroupQuadSwapHorizontal(dvec2 value);" "dvec2 subgroupQuadSwapHorizontal(dvec2);\n"
"dvec3 subgroupQuadSwapHorizontal(dvec3 value);" "dvec3 subgroupQuadSwapHorizontal(dvec3);\n"
"dvec4 subgroupQuadSwapHorizontal(dvec4 value);" "dvec4 subgroupQuadSwapHorizontal(dvec4);\n"
"float subgroupQuadSwapVertical(float value);" "float subgroupQuadSwapVertical(float);\n"
"vec2 subgroupQuadSwapVertical(vec2 value);" "vec2 subgroupQuadSwapVertical(vec2);\n"
"vec3 subgroupQuadSwapVertical(vec3 value);" "vec3 subgroupQuadSwapVertical(vec3);\n"
"vec4 subgroupQuadSwapVertical(vec4 value);" "vec4 subgroupQuadSwapVertical(vec4);\n"
"int subgroupQuadSwapVertical(int value);" "int subgroupQuadSwapVertical(int);\n"
"ivec2 subgroupQuadSwapVertical(ivec2 value);" "ivec2 subgroupQuadSwapVertical(ivec2);\n"
"ivec3 subgroupQuadSwapVertical(ivec3 value);" "ivec3 subgroupQuadSwapVertical(ivec3);\n"
"ivec4 subgroupQuadSwapVertical(ivec4 value);" "ivec4 subgroupQuadSwapVertical(ivec4);\n"
"uint subgroupQuadSwapVertical(uint value);" "uint subgroupQuadSwapVertical(uint);\n"
"uvec2 subgroupQuadSwapVertical(uvec2 value);" "uvec2 subgroupQuadSwapVertical(uvec2);\n"
"uvec3 subgroupQuadSwapVertical(uvec3 value);" "uvec3 subgroupQuadSwapVertical(uvec3);\n"
"uvec4 subgroupQuadSwapVertical(uvec4 value);" "uvec4 subgroupQuadSwapVertical(uvec4);\n"
"bool subgroupQuadSwapVertical(bool value);" "bool subgroupQuadSwapVertical(bool);\n"
"bvec2 subgroupQuadSwapVertical(bvec2 value);" "bvec2 subgroupQuadSwapVertical(bvec2);\n"
"bvec3 subgroupQuadSwapVertical(bvec3 value);" "bvec3 subgroupQuadSwapVertical(bvec3);\n"
"bvec4 subgroupQuadSwapVertical(bvec4 value);" "bvec4 subgroupQuadSwapVertical(bvec4);\n"
"double subgroupQuadSwapVertical(double value);" "double subgroupQuadSwapVertical(double);\n"
"dvec2 subgroupQuadSwapVertical(dvec2 value);" "dvec2 subgroupQuadSwapVertical(dvec2);\n"
"dvec3 subgroupQuadSwapVertical(dvec3 value);" "dvec3 subgroupQuadSwapVertical(dvec3);\n"
"dvec4 subgroupQuadSwapVertical(dvec4 value);" "dvec4 subgroupQuadSwapVertical(dvec4);\n"
"float subgroupQuadSwapDiagonal(float value);" "float subgroupQuadSwapDiagonal(float);\n"
"vec2 subgroupQuadSwapDiagonal(vec2 value);" "vec2 subgroupQuadSwapDiagonal(vec2);\n"
"vec3 subgroupQuadSwapDiagonal(vec3 value);" "vec3 subgroupQuadSwapDiagonal(vec3);\n"
"vec4 subgroupQuadSwapDiagonal(vec4 value);" "vec4 subgroupQuadSwapDiagonal(vec4);\n"
"int subgroupQuadSwapDiagonal(int value);" "int subgroupQuadSwapDiagonal(int);\n"
"ivec2 subgroupQuadSwapDiagonal(ivec2 value);" "ivec2 subgroupQuadSwapDiagonal(ivec2);\n"
"ivec3 subgroupQuadSwapDiagonal(ivec3 value);" "ivec3 subgroupQuadSwapDiagonal(ivec3);\n"
"ivec4 subgroupQuadSwapDiagonal(ivec4 value);" "ivec4 subgroupQuadSwapDiagonal(ivec4);\n"
"uint subgroupQuadSwapDiagonal(uint value);" "uint subgroupQuadSwapDiagonal(uint);\n"
"uvec2 subgroupQuadSwapDiagonal(uvec2 value);" "uvec2 subgroupQuadSwapDiagonal(uvec2);\n"
"uvec3 subgroupQuadSwapDiagonal(uvec3 value);" "uvec3 subgroupQuadSwapDiagonal(uvec3);\n"
"uvec4 subgroupQuadSwapDiagonal(uvec4 value);" "uvec4 subgroupQuadSwapDiagonal(uvec4);\n"
"bool subgroupQuadSwapDiagonal(bool value);" "bool subgroupQuadSwapDiagonal(bool);\n"
"bvec2 subgroupQuadSwapDiagonal(bvec2 value);" "bvec2 subgroupQuadSwapDiagonal(bvec2);\n"
"bvec3 subgroupQuadSwapDiagonal(bvec3 value);" "bvec3 subgroupQuadSwapDiagonal(bvec3);\n"
"bvec4 subgroupQuadSwapDiagonal(bvec4 value);" "bvec4 subgroupQuadSwapDiagonal(bvec4);\n"
"double subgroupQuadSwapDiagonal(double value);" "double subgroupQuadSwapDiagonal(double);\n"
"dvec2 subgroupQuadSwapDiagonal(dvec2 value);" "dvec2 subgroupQuadSwapDiagonal(dvec2);\n"
"dvec3 subgroupQuadSwapDiagonal(dvec3 value);" "dvec3 subgroupQuadSwapDiagonal(dvec3);\n"
"dvec4 subgroupQuadSwapDiagonal(dvec4 value);" "dvec4 subgroupQuadSwapDiagonal(dvec4);\n"
"\n"); "\n");
...@@ -4439,7 +4439,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -4439,7 +4439,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
} }
// GL_KHR_shader_subgroup // GL_KHR_shader_subgroup
if (profile != EEsProfile && version >= 450) { if (spvVersion.vulkan >= 100) {
commonBuiltins.append( commonBuiltins.append(
"mediump in uint gl_SubgroupSize;" "mediump in uint gl_SubgroupSize;"
"mediump in uint gl_SubgroupInvocationID;" "mediump in uint gl_SubgroupInvocationID;"
...@@ -5671,78 +5671,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -5671,78 +5671,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote);
symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote);
symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
// GL_KHR_shader_subgroup
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
symbolTable.setFunctionExtensions("subgroupBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrierBuffer", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrierImage", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupElect", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupAll", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupAny", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupAllEqual", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupBroadcast", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBroadcastFirst", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupInverseBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotBitExtract", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotInclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotExclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotFindLSB", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotFindMSB", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupShuffle", 1, &E_GL_KHR_shader_subgroup_shuffle);
symbolTable.setFunctionExtensions("subgroupShuffleXor", 1, &E_GL_KHR_shader_subgroup_shuffle);
symbolTable.setFunctionExtensions("subgroupShuffleUp", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
symbolTable.setFunctionExtensions("subgroupShuffleDown", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
symbolTable.setFunctionExtensions("subgroupAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupClusteredAdd", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMul", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMin", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMax", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredAnd", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredOr", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredXor", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupQuadBroadcast", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapHorizontal", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapVertical", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapDiagonal", 1, &E_GL_KHR_shader_subgroup_quad);
} }
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
...@@ -6153,6 +6081,80 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -6153,6 +6081,80 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview); symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
// GL_KHR_shader_subgroup
if (spvVersion.vulkan >= 100) {
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
symbolTable.setFunctionExtensions("subgroupBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrierBuffer", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupMemoryBarrierImage", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupElect", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setFunctionExtensions("subgroupAll", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupAny", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupAllEqual", 1, &E_GL_KHR_shader_subgroup_vote);
symbolTable.setFunctionExtensions("subgroupBroadcast", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBroadcastFirst", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupInverseBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotBitExtract", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotInclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotExclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotFindLSB", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupBallotFindMSB", 1, &E_GL_KHR_shader_subgroup_ballot);
symbolTable.setFunctionExtensions("subgroupShuffle", 1, &E_GL_KHR_shader_subgroup_shuffle);
symbolTable.setFunctionExtensions("subgroupShuffleXor", 1, &E_GL_KHR_shader_subgroup_shuffle);
symbolTable.setFunctionExtensions("subgroupShuffleUp", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
symbolTable.setFunctionExtensions("subgroupShuffleDown", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
symbolTable.setFunctionExtensions("subgroupAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupInclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupExclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
symbolTable.setFunctionExtensions("subgroupClusteredAdd", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMul", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMin", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredMax", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredAnd", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredOr", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupClusteredXor", 1, &E_GL_KHR_shader_subgroup_clustered);
symbolTable.setFunctionExtensions("subgroupQuadBroadcast", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapHorizontal", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapVertical", 1, &E_GL_KHR_shader_subgroup_quad);
symbolTable.setFunctionExtensions("subgroupQuadSwapDiagonal", 1, &E_GL_KHR_shader_subgroup_quad);
}
break; break;
case EShLangCompute: case EShLangCompute:
...@@ -6195,8 +6197,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -6195,8 +6197,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
} }
if (profile != EEsProfile) {
// GL_KHR_shader_subgroup // GL_KHR_shader_subgroup
if (spvVersion.vulkan >= 100) {
symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic); symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic); symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
......
...@@ -663,8 +663,7 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co ...@@ -663,8 +663,7 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co
updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString); updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString);
else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0)
updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString);
else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) // subgroup_* to subgroup_basic
updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString);
else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0) else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0)
updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
else if (strcmp(extension, "GL_KHR_shader_subgroup_arithmetic") == 0) else if (strcmp(extension, "GL_KHR_shader_subgroup_arithmetic") == 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment