mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 20:10:06 +00:00
51760c88ca
Touch test all subgroup builtins in vert, tesc, tese, geom, frag, compute shaders before and after enabling extensions to make sure the correct errors are generated and then not generated (after enablement).
235 lines
11 KiB
GLSL
235 lines
11 KiB
GLSL
#version 450
|
|
|
|
vec4 undeclared_errors(vec4 f4)
|
|
{
|
|
vec4 result;
|
|
gl_SubgroupSize; // ERROR, extension not enabled (basic)
|
|
gl_SubgroupInvocationID; // ERROR, extension not enabled (basic)
|
|
subgroupBarrier(); // ERROR, extension not enabled (basic)
|
|
subgroupMemoryBarrier(); // ERROR, extension not enabled (basic)
|
|
subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic)
|
|
subgroupMemoryBarrierImage(); // ERROR, extension not enabled (basic)
|
|
subgroupElect(); // ERROR, extension not enabled (basic)
|
|
gl_NumSubgroups; // ERROR, only defined in compute
|
|
gl_SubgroupID; // ERROR, only defined in compute
|
|
subgroupMemoryBarrierShared(); // ERROR, only defined in compute
|
|
|
|
subgroupAll(true); // ERROR extension not enabled (vote)
|
|
subgroupAny(false); // ERROR extension not enabled (vote)
|
|
subgroupAllEqual(f4); // ERROR extension not enabled (vote)
|
|
|
|
gl_SubgroupEqMask; // ERROR extension not enabled (ballot)
|
|
gl_SubgroupGeMask; // ERROR extension not enabled (ballot)
|
|
gl_SubgroupGtMask; // ERROR extension not enabled (ballot)
|
|
gl_SubgroupLeMask; // ERROR extension not enabled (ballot)
|
|
gl_SubgroupLtMask; // ERROR extension not enabled (ballot)
|
|
subgroupBroadcast(f4, 0); // ERROR extension not enabled (ballot)
|
|
subgroupBroadcastFirst(f4); // ERROR extension not enabled (ballot)
|
|
uvec4 ballot = subgroupBallot(false); // ERROR extension not enabled (ballot)
|
|
subgroupInverseBallot(uvec4(0x1)); // ERROR extension not enabled (ballot)
|
|
subgroupBallotBitExtract(ballot, 0); // ERROR extension not enabled (ballot)
|
|
subgroupBallotBitCount(ballot); // ERROR extension not enabled (ballot)
|
|
subgroupBallotInclusiveBitCount(ballot); // ERROR extension not enabled (ballot)
|
|
subgroupBallotExclusiveBitCount(ballot); // ERROR extension not enabled (ballot)
|
|
subgroupBallotFindLSB(ballot); // ERROR extension not enabled (ballot)
|
|
subgroupBallotFindMSB(ballot); // ERROR extension not enabled (ballot)
|
|
|
|
subgroupShuffle(f4, 0); // ERROR extension not enabled (shuffle)
|
|
subgroupShuffleXor(f4, 0x1); // ERROR extension not enabled (shuffle)
|
|
subgroupShuffleUp(f4, 1); // ERROR extension not enabled (shuffle_relative)
|
|
subgroupShuffleDown(f4, 1); // ERROR extension not enabled (shuffle_relative)
|
|
|
|
result = subgroupAdd(f4); // ERROR, extension not enabled (arith)
|
|
subgroupMul(f4); // ERROR, extension not enabled (arith)
|
|
subgroupMin(f4); // ERROR, extension not enabled (arith)
|
|
subgroupMax(f4); // ERROR, extension not enabled (arith)
|
|
subgroupAnd(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupOr(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupXor(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveAdd(f4); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveMul(f4); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveMin(f4); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveMax(f4); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveAnd(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveOr(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupInclusiveXor(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveAdd(f4); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveMul(f4); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveMin(f4); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveMax(f4); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveAnd(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveOr(ballot); // ERROR, extension not enabled (arith)
|
|
subgroupExclusiveXor(ballot); // ERROR, extension not enabled (arith)
|
|
|
|
subgroupClusteredAdd(f4, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredMul(f4, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredMin(f4, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredMax(f4, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredAnd(ballot, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredOr(ballot, 2); // ERROR, extension not enabled (clustered)
|
|
subgroupClusteredXor(ballot, 2); // ERROR, extension not enabled (clustered)
|
|
|
|
subgroupQuadBroadcast(f4, 0); // ERROR, extension not enabled (quad)
|
|
subgroupQuadSwapHorizontal(f4); // ERROR, extension not enabled (quad)
|
|
subgroupQuadSwapVertical(f4); // ERROR, extension not enabled (quad)
|
|
subgroupQuadSwapDiagonal(f4); // ERROR, extension not enabled (quad)
|
|
|
|
uvec4 parti = subgroupPartitionNV(f4); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedAddNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedMulNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedMinNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedMaxNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedAndNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedOrNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedXorNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedInclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
subgroupPartitionedExclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned)
|
|
|
|
return result;
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_basic: enable
|
|
layout(points) in;
|
|
layout(points, max_vertices = 1) out;
|
|
layout(set = 0, binding = 0, std430) buffer Output
|
|
{
|
|
uvec4 result[];
|
|
};
|
|
|
|
void main (void)
|
|
{
|
|
result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
|
|
subgroupBarrier();
|
|
subgroupMemoryBarrier();
|
|
subgroupMemoryBarrierBuffer();
|
|
subgroupMemoryBarrierImage();
|
|
subgroupElect();
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_ballot: enable
|
|
void ballot_works(vec4 f4) {
|
|
gl_SubgroupEqMask;
|
|
gl_SubgroupGeMask;
|
|
gl_SubgroupGtMask;
|
|
gl_SubgroupLeMask;
|
|
gl_SubgroupLtMask;
|
|
subgroupBroadcast(f4, 0);
|
|
subgroupBroadcastFirst(f4);
|
|
uvec4 ballot = subgroupBallot(false);
|
|
subgroupInverseBallot(uvec4(0x1));
|
|
subgroupBallotBitExtract(ballot, 0);
|
|
subgroupBallotBitCount(ballot);
|
|
subgroupBallotInclusiveBitCount(ballot);
|
|
subgroupBallotExclusiveBitCount(ballot);
|
|
subgroupBallotFindLSB(ballot);
|
|
subgroupBallotFindMSB(ballot);
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_vote: enable
|
|
void vote_works(vec4 f4)
|
|
{
|
|
subgroupAll(true);
|
|
subgroupAny(false);
|
|
subgroupAllEqual(f4);
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_shuffle: enable
|
|
#extension GL_KHR_shader_subgroup_shuffle_relative: enable
|
|
void shuffle_works(vec4 f4)
|
|
{
|
|
subgroupShuffle(f4, 0);
|
|
subgroupShuffleXor(f4, 0x1);
|
|
subgroupShuffleUp(f4, 1);
|
|
subgroupShuffleDown(f4, 1);
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_arithmetic: enable
|
|
void arith_works(vec4 f4)
|
|
{
|
|
uvec4 ballot;
|
|
subgroupAdd(f4);
|
|
subgroupMul(f4);
|
|
subgroupMin(f4);
|
|
subgroupMax(f4);
|
|
subgroupAnd(ballot);
|
|
subgroupOr(ballot);
|
|
subgroupXor(ballot);
|
|
subgroupInclusiveAdd(f4);
|
|
subgroupInclusiveMul(f4);
|
|
subgroupInclusiveMin(f4);
|
|
subgroupInclusiveMax(f4);
|
|
subgroupInclusiveAnd(ballot);
|
|
subgroupInclusiveOr(ballot);
|
|
subgroupInclusiveXor(ballot);
|
|
subgroupExclusiveAdd(f4);
|
|
subgroupExclusiveMul(f4);
|
|
subgroupExclusiveMin(f4);
|
|
subgroupExclusiveMax(f4);
|
|
subgroupExclusiveAnd(ballot);
|
|
subgroupExclusiveOr(ballot);
|
|
subgroupExclusiveXor(ballot);
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_clustered: enable
|
|
void clustered_works(vec4 f4)
|
|
{
|
|
uvec4 ballot = uvec4(0x55,0,0,0);
|
|
subgroupClusteredAdd(f4, 2);
|
|
subgroupClusteredMul(f4, 2);
|
|
subgroupClusteredMin(f4, 2);
|
|
subgroupClusteredMax(f4, 2);
|
|
subgroupClusteredAnd(ballot, 2);
|
|
subgroupClusteredOr(ballot, 2);
|
|
subgroupClusteredXor(ballot, 2);
|
|
}
|
|
|
|
#extension GL_KHR_shader_subgroup_quad: enable
|
|
void quad_works(vec4 f4)
|
|
{
|
|
subgroupQuadBroadcast(f4, 0);
|
|
subgroupQuadSwapHorizontal(f4);
|
|
subgroupQuadSwapVertical(f4);
|
|
subgroupQuadSwapDiagonal(f4);
|
|
}
|
|
|
|
#extension GL_NV_shader_subgroup_partitioned: enable
|
|
void partitioned_works(vec4 f4)
|
|
{
|
|
uvec4 parti = subgroupPartitionNV(f4);
|
|
uvec4 ballot = uvec4(0x55,0,0,0);
|
|
subgroupPartitionedAddNV(f4, parti);
|
|
subgroupPartitionedMulNV(f4, parti);
|
|
subgroupPartitionedMinNV(f4, parti);
|
|
subgroupPartitionedMaxNV(f4, parti);
|
|
subgroupPartitionedAndNV(ballot, parti);
|
|
subgroupPartitionedOrNV(ballot, parti);
|
|
subgroupPartitionedXorNV(ballot, parti);
|
|
subgroupPartitionedInclusiveAddNV(f4, parti);
|
|
subgroupPartitionedInclusiveMulNV(f4, parti);
|
|
subgroupPartitionedInclusiveMinNV(f4, parti);
|
|
subgroupPartitionedInclusiveMaxNV(f4, parti);
|
|
subgroupPartitionedInclusiveAndNV(ballot, parti);
|
|
subgroupPartitionedInclusiveOrNV(ballot, parti);
|
|
subgroupPartitionedInclusiveXorNV(ballot, parti);
|
|
subgroupPartitionedExclusiveAddNV(f4, parti);
|
|
subgroupPartitionedExclusiveMulNV(f4, parti);
|
|
subgroupPartitionedExclusiveMinNV(f4, parti);
|
|
subgroupPartitionedExclusiveMaxNV(f4, parti);
|
|
subgroupPartitionedExclusiveAndNV(ballot, parti);
|
|
subgroupPartitionedExclusiveOrNV(ballot, parti);
|
|
subgroupPartitionedExclusiveXorNV(ballot, parti);
|
|
}
|
|
|