Extend test coverage in Vk_Subgroup_Zoo

- gl_NumSubgroups
- gl_SubgroupID
- gl_SubgroupEqMask
- gl_SubgroupGeMask
- gl_SubgroupGtMask
- gl_SubgroupLeMask
- gl_SubgroupLtMask
- subgroupBallotInclusiveBitCount
- subgroupInverseBallot
- subgroupShuffleXor
- subgroupShuffleUp
- subgroupShuffleDown
- subgroupInclusiveAdd
- subgroupInclusiveMul
- subgroupInclusiveMin
- subgroupInclusiveMax
- subgroupInclusiveAnd
- subgroupInclusiveOr
- subgroupInclusiveXor
- subgroupExclusiveAdd
- subgroupExclusiveMul
- subgroupExclusiveMin
- subgroupExclusiveMax
- subgroupExclusiveAnd
- subgroupExclusiveOr
- subgroupExclusiveXor
- subgroupClusteredAdd
- subgroupClusteredMul
- subgroupClusteredMin
- subgroupClusteredMax
- subgroupClusteredAnd
- subgroupClusteredOr
- subgroupClusteredXor
This commit is contained in:
Jake Turner
2026-09-21 16:22:24 +01:00
parent cfa80924ef
commit b29e2cc987
+123 -9
View File
@@ -121,19 +121,23 @@ void main()
}
else if(IsTest(5))
{
#if FEAT_QUAD
// subgroupQuadBroadcast : unit tests
fragdata.x = float(subgroupQuadBroadcast(subgroupId, 0));
fragdata.y = float(subgroupQuadBroadcast(subgroupId, 1));
fragdata.z = float(subgroupQuadBroadcast(subgroupId, 2));
fragdata.w = float(subgroupQuadBroadcast(subgroupId, 3));
#endif
}
else if(IsTest(6))
{
#if FEAT_QUAD
// subgroupQuadSwapDiagonal, subgroupQuadSwapHorizontal, subgroupQuadSwapVertical : unit tests
fragdata.x = float(subgroupQuadSwapDiagonal(subgroupId));
fragdata.y = float(subgroupQuadSwapHorizontal(subgroupId));
fragdata.z = float(subgroupQuadSwapVertical(subgroupId));
fragdata.w = subgroupQuadBroadcast(fragdata.x, 2);
#endif
}
Color = vertdata + fragdata;
@@ -172,6 +176,7 @@ void main()
testResult.x = float(gl_SubgroupSize);
testResult.y = float(gl_SubgroupInvocationID);
testResult.z = float(subgroupElect());
testResult.w = float(gl_NumSubgroups);
}
else if(IsTest(1))
{
@@ -193,13 +198,14 @@ void main()
}
else if(IsTest(2))
{
uvec4 bits20 = subgroupBallot(id > 20);
// Broadcast functions : unit tests
if (id >= 2 && id <= 20)
{
testResult.x = subgroupBroadcastFirst(id);
testResult.y = subgroupBroadcast(id, 5);
testResult.z = subgroupShuffle(id, id);
testResult.w = subgroupShuffle(testResult.x, 2+id%3);
testResult.z = float(subgroupInverseBallot(bits20));
testResult.w = float(subgroupBallotBitCount(bits20));
}
}
else if(IsTest(3))
@@ -211,14 +217,14 @@ void main()
// Scan and Prefix functions : unit tests
if (id >= 2 && id <= 20)
{
testResult.x = subgroupBallotExclusiveBitCount(bits4);
testResult.x = subgroupBallotInclusiveBitCount(bits4);
testResult.y = subgroupBallotExclusiveBitCount(bits10);
testResult.z = subgroupExclusiveAdd(testResult.x);
testResult.w = subgroupExclusiveMul(1 + testResult.y);
}
else
{
testResult.x = subgroupBallotExclusiveBitCount(bits23);
testResult.x = subgroupBallotInclusiveBitCount(bits23);
testResult.y = subgroupBallotExclusiveBitCount(bits1);
testResult.z = subgroupExclusiveAdd(testResult.x);
testResult.w = subgroupExclusiveAdd(testResult.y);
@@ -237,14 +243,13 @@ void main()
}
else if(IsTest(5))
{
uvec4 bits20 = subgroupBallot(id > 20);
// Reduction functions : unit tests
if (id >= 2 && id <= 20)
{
testResult.x = float(subgroupBallotBitCount(bits20));
testResult.y = float(subgroupAnd(id));
testResult.z = float(subgroupOr(id));
testResult.w = float(subgroupXor(id));
testResult.x = float(subgroupAnd(id));
testResult.y = float(subgroupOr(id));
testResult.z = float(subgroupXor(id));
testResult.w = float(subgroupInclusiveAdd(id));
}
}
else if(IsTest(6))
@@ -260,26 +265,32 @@ void main()
}
else if(IsTest(7))
{
#if FEAT_QUAD
// subgroupQuadBroadcast : unit tests
testResult.x = float(subgroupQuadBroadcast(id, 0));
testResult.y = float(subgroupQuadBroadcast(id, 1));
testResult.z = float(subgroupQuadBroadcast(id, 2));
testResult.w = float(subgroupQuadBroadcast(id, 3));
#endif
}
else if(IsTest(8))
{
#if FEAT_QUAD
// subgroupQuadSwapDiagonal, subgroupQuadSwapHorizontal, subgroupQuadSwapVertical : unit tests
testResult.x = float(subgroupQuadSwapDiagonal(id));
testResult.y = float(subgroupQuadSwapHorizontal(id));
testResult.z = float(subgroupQuadSwapVertical(id));
testResult.w = subgroupQuadBroadcast(testResult.x, 2);
#endif
}
else if(IsTest(9))
{
#if FEAT_QUAD
testResult.x = float(subgroupQuadAny(id*2 > id+10));
testResult.y = float(subgroupQuadAll(id < gl_SubgroupSize));
testResult.z = subgroupQuadBroadcast(testResult.x, 2);
testResult.w = subgroupQuadBroadcast(testResult.y, 2);
#endif
}
else if(IsTest(10))
{
@@ -293,6 +304,102 @@ void main()
testResult.w = float(subgroupBallotFindMSB(bits10));
}
}
else if(IsTest(11))
{
// Query functions : unit tests
testResult.x = float(gl_SubgroupID);
// Query functions : subgroup masks
testResult.y = float(gl_SubgroupEqMask);
testResult.z = float(gl_SubgroupGeMask);
testResult.w = float(gl_SubgroupGtMask);
}
else if(IsTest(12))
{
// Query functions : subgroup masks
testResult.x = float(gl_SubgroupLeMask);
testResult.y = float(gl_SubgroupLtMask);
testResult.z = float(subgroupInclusiveMul(id));
#if FEAT_SHUFFLE
if (id >= 2 && id <= 20)
testResult.w = subgroupShuffle(testResult.x, 2+id%3);
#endif
}
else if(IsTest(13))
{
#if FEAT_SHUFFLE
testResult.x = subgroupShuffle(id, id);
testResult.y = subgroupShuffleXor(id, id);
#endif
if (id >= 2 && id <= 20)
{
uint deltaUp = (id > 4) ? 2 : 0;
uint deltaDown = (id < 15) ? 4 : 0;
#if FEAT_SHUFFLE_RELATIVE
testResult.z = float(subgroupShuffleUp(id, deltaUp));
testResult.w = float(subgroupShuffleDown(id, deltaDown));
#endif
}
}
else if(IsTest(14))
{
if (id >= 2 && id <= 20)
{
testResult.x = float(subgroupInclusiveMin(id));
testResult.y = float(subgroupInclusiveMax(id));
testResult.z = float(subgroupInclusiveAnd(id));
testResult.w = float(subgroupInclusiveOr(id));
}
}
else if(IsTest(15))
{
if (id >= 2 && id <= 20)
{
testResult.x = float(subgroupInclusiveXor(id));
testResult.y = float(subgroupExclusiveAdd(id));
testResult.z = float(subgroupExclusiveMul(id));
testResult.w = float(subgroupExclusiveMin(id));
}
}
else if(IsTest(16))
{
if (id >= 2 && id <= 20)
{
testResult.x = float(subgroupExclusiveMax(id));
testResult.y = float(subgroupExclusiveAnd(id));
testResult.z = float(subgroupExclusiveOr(id));
testResult.w = float(subgroupExclusiveXor(id));
}
}
else if(IsTest(17))
{
#if FEAT_CLUSTERED
testResult.x = float(subgroupClusteredAdd(id, 2));
testResult.y = float(subgroupClusteredMul(id, 4));
testResult.z = float(subgroupClusteredMin(id, 8));
testResult.w = float(subgroupClusteredMax(id, 1));
#endif
}
else if(IsTest(18))
{
#if FEAT_CLUSTERED
testResult.x = float(subgroupClusteredAnd(id, 2));
testResult.y = float(subgroupClusteredOr(id, 4));
testResult.z = float(subgroupClusteredXor(id, 8));
testResult.w = float(subgroupClusteredAdd(id, 16));
#endif
}
else if(IsTest(19))
{
#if FEAT_ROTATE
uint delta = gl_SubgroupSize;
testResult.x = float(subgroupRotate(id, delta));
#endif
#if FEAT_ROTATE_CLUSTERED
testResult.y = float(subgroupClusteredRotate(id, delta, 1));
testResult.z = float(subgroupClusteredRotate(id, delta, 2));
testResult.w = float(subgroupClusteredRotate(id, delta, 4));
#endif
}
SetOutput(testResult);
}
@@ -342,6 +449,12 @@ void main()
if((subProps.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT) == 0)
Avail = "Missing compute subgroup support";
static VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR subgroupRotateFeats = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR,
};
getPhysFeatures2(&subgroupRotateFeats);
devInfoNext = &subgroupRotateFeats;
static VkPhysicalDeviceShaderQuadControlFeaturesKHR quadControlFeats = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR,
};
@@ -350,6 +463,7 @@ void main()
if(quadControlFeats.shaderQuadControl == VK_FALSE)
Avail = "Missing compute quad support";
quadControlFeats.pNext = (void *)devInfoNext;
devInfoNext = &quadControlFeats;
}