You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
12 KiB

#version 460
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, extension not enabled (basic)
gl_SubgroupID; // ERROR, extension not enabled (basic)
subgroupMemoryBarrierShared(); // ERROR, extension not enabled (basic)
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;
}
#define MAX_VIEWS gl_MaxMeshViewCountNV
#define BARRIER() \
memoryBarrierShared(); \
barrier();
#extension GL_NV_mesh_shader : enable
layout(local_size_x = 32) in;
// test use of shared memory in task shaders:
layout(binding=0) writeonly uniform image2D uni_image;
uniform block0 {
uint uni_value;
};
shared vec4 mem[10];
// test use of task memory in task shaders:
taskNV out Task {
vec2 dummy;
vec2 submesh[3];
uint viewID;
} mytask;
void main()
{
uint iid = gl_LocalInvocationID.x;
uint gid = gl_WorkGroupID.x;
uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];
// 1. shared memory load and stores
for (uint i = 0; i < 10; ++i) {
mem[i] = vec4(i + uni_value);
}
imageStore(uni_image, ivec2(iid), mem[gid]);
imageStore(uni_image, ivec2(iid), mem[gid+1]);
BARRIER();
// 2. task memory stores
mytask.dummy = vec2(30.0, 31.0);
mytask.submesh[0] = vec2(32.0, 33.0);
mytask.submesh[1] = vec2(34.0, 35.0);
mytask.submesh[2] = mytask.submesh[gid%2];
mytask.viewID = viewID;
BARRIER();
// 3. set task count
gl_TaskCountNV = 3;
}
#extension GL_KHR_shader_subgroup_basic: enable
void basic_works (void)
{
gl_SubgroupSize;
gl_SubgroupInvocationID;
subgroupBarrier();
subgroupMemoryBarrier();
subgroupMemoryBarrierBuffer();
subgroupMemoryBarrierImage();
subgroupElect();
gl_NumSubgroups; // allowed in task
gl_SubgroupID; // allowed in task
subgroupMemoryBarrierShared(); // allowed in task
}
#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);
}
// tests for NV_shader_sm_builtins
void sm_builtins_err()
{
gl_WarpsPerSMNV; // ERROR, no extension
gl_SMCountNV; // ERROR, no extension
gl_WarpIDNV; // ERROR, no extension
gl_SMIDNV; // ERROR, no extension
}
#ifdef GL_NV_shader_sm_builtins
#extension GL_NV_shader_sm_builtins : enable
#endif
void sm_builtins()
{
gl_WarpsPerSMNV;
gl_SMCountNV;
gl_WarpIDNV;
gl_SMIDNV;
}