GLSL: Add support for Logical subgroup ops.

Completely missed these ...
This commit is contained in:
Hans-Kristian Arntzen 2021-03-08 12:06:46 +01:00
parent d57ab68a21
commit 5570043af3
3 changed files with 22 additions and 0 deletions

View File

@ -62,6 +62,9 @@ void main()
uvec4 anded = subgroupAnd(ballot_value);
uvec4 ored = subgroupOr(ballot_value);
uvec4 xored = subgroupXor(ballot_value);
bvec4 anded_b = subgroupAnd(equal(ballot_value, uvec4(42u)));
bvec4 ored_b = subgroupOr(equal(ballot_value, uvec4(42u)));
bvec4 xored_b = subgroupXor(equal(ballot_value, uvec4(42u)));
added = subgroupInclusiveAdd(added);
iadded = subgroupInclusiveAdd(iadded);
multiplied = subgroupInclusiveMul(multiplied);
@ -102,6 +105,9 @@ void main()
anded = subgroupClusteredAnd(anded, 4u);
ored = subgroupClusteredOr(ored, 4u);
xored = subgroupClusteredXor(xored, 4u);
anded_b = subgroupClusteredAnd(equal(anded, uvec4(2u)), 4u);
ored_b = subgroupClusteredOr(equal(ored, uvec4(3u)), 4u);
xored_b = subgroupClusteredXor(equal(xored, uvec4(4u)), 4u);
vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0));
vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0));
vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0));

View File

@ -72,6 +72,9 @@ void main()
uvec4 anded = subgroupAnd(ballot_value);
uvec4 ored = subgroupOr(ballot_value);
uvec4 xored = subgroupXor(ballot_value);
bvec4 anded_b = subgroupAnd(equal(ballot_value, uvec4(42)));
bvec4 ored_b = subgroupOr(equal(ballot_value, uvec4(42)));
bvec4 xored_b = subgroupXor(equal(ballot_value, uvec4(42)));
added = subgroupInclusiveAdd(added);
iadded = subgroupInclusiveAdd(iadded);
@ -117,6 +120,10 @@ void main()
ored = subgroupClusteredOr(ored, 4u);
xored = subgroupClusteredXor(xored, 4u);
anded_b = subgroupClusteredAnd(equal(anded, uvec4(2u)), 4u);
ored_b = subgroupClusteredOr(equal(ored, uvec4(3u)), 4u);
xored_b = subgroupClusteredXor(equal(xored, uvec4(4u)), 4u);
// quad
vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0));
vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0));

View File

@ -7646,6 +7646,9 @@ void CompilerGLSL::emit_subgroup_op(const Instruction &i)
case OpGroupNonUniformBitwiseAnd:
case OpGroupNonUniformBitwiseOr:
case OpGroupNonUniformBitwiseXor:
case OpGroupNonUniformLogicalAnd:
case OpGroupNonUniformLogicalOr:
case OpGroupNonUniformLogicalXor:
{
auto operation = static_cast<GroupOperation>(ops[3]);
if (operation == GroupOperationClusteredReduce)
@ -7802,6 +7805,9 @@ case OpGroupNonUniform##op: \
GLSL_GROUP_OP(BitwiseAnd, And)
GLSL_GROUP_OP(BitwiseOr, Or)
GLSL_GROUP_OP(BitwiseXor, Xor)
GLSL_GROUP_OP(LogicalAnd, And)
GLSL_GROUP_OP(LogicalOr, Or)
GLSL_GROUP_OP(LogicalXor, Xor)
#undef GLSL_GROUP_OP
#undef GLSL_GROUP_OP_CAST
// clang-format on
@ -12148,6 +12154,9 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
case OpGroupNonUniformBitwiseAnd:
case OpGroupNonUniformBitwiseOr:
case OpGroupNonUniformBitwiseXor:
case OpGroupNonUniformLogicalAnd:
case OpGroupNonUniformLogicalOr:
case OpGroupNonUniformLogicalXor:
case OpGroupNonUniformQuadSwap:
case OpGroupNonUniformQuadBroadcast:
emit_subgroup_op(instruction);