Skip to content

Commit 34ce403

Browse files
committed
VK_Subgroup_Zoo tests for Quad Ops in Compute Shader
subgroupQuadBroadcast subgroupQuadSwapDiagonal subgroupQuadSwapHorizontal subgroupQuadSwapVertical subgroupQuadAny subgroupQuadAll
1 parent 61bf255 commit 34ce403

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

util/test/demos/vk/vk_subgroup_zoo.cpp

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ void main()
143143

144144
const std::string comp = common + R"EOSHADER(
145145
146+
#extension GL_EXT_shader_quad_control : require
147+
146148
struct Output
147149
{
148150
vec4 vals[1024];
@@ -256,6 +258,29 @@ void main()
256258
testResult.w = float(subgroupAllEqual(id >= 28));
257259
}
258260
}
261+
else if(IsTest(7))
262+
{
263+
// subgroupQuadBroadcast : unit tests
264+
testResult.x = float(subgroupQuadBroadcast(id, 0));
265+
testResult.y = float(subgroupQuadBroadcast(id, 1));
266+
testResult.z = float(subgroupQuadBroadcast(id, 2));
267+
testResult.w = float(subgroupQuadBroadcast(id, 3));
268+
}
269+
else if(IsTest(8))
270+
{
271+
// subgroupQuadSwapDiagonal, subgroupQuadSwapHorizontal, subgroupQuadSwapVertical : unit tests
272+
testResult.x = float(subgroupQuadSwapDiagonal(id));
273+
testResult.y = float(subgroupQuadSwapHorizontal(id));
274+
testResult.z = float(subgroupQuadSwapVertical(id));
275+
testResult.w = subgroupQuadBroadcast(testResult.x, 2);
276+
}
277+
else if(IsTest(9))
278+
{
279+
testResult.x = float(subgroupQuadAny(id*2 > id+10));
280+
testResult.y = float(subgroupQuadAll(id < gl_SubgroupSize));
281+
testResult.z = subgroupQuadBroadcast(testResult.x, 2);
282+
testResult.w = subgroupQuadBroadcast(testResult.y, 2);
283+
}
259284
SetOutput(testResult);
260285
}
261286
@@ -265,6 +290,9 @@ void main()
265290

266291
void Prepare(int argc, char **argv)
267292
{
293+
devExts.push_back(VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME);
294+
devExts.push_back(VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME);
295+
268296
VulkanGraphicsTest::Prepare(argc, argv);
269297

270298
if(!Avail.empty())
@@ -301,6 +329,16 @@ void main()
301329

302330
if((subProps.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT) == 0)
303331
Avail = "Missing compute subgroup support";
332+
333+
static VkPhysicalDeviceShaderQuadControlFeaturesKHR quadControlFeats = {
334+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR,
335+
};
336+
337+
getPhysFeatures2(&quadControlFeats);
338+
if(quadControlFeats.shaderQuadControl == VK_FALSE)
339+
Avail = "Missing compute quad support";
340+
341+
devInfoNext = &quadControlFeats;
304342
}
305343

306344
int main()
@@ -426,28 +464,28 @@ void main()
426464

427465
macros["GROUP_SIZE_X"] = "256";
428466
macros["GROUP_SIZE_Y"] = "1";
429-
comppipe_name[0] = "256x1";
467+
comppipe_name[0] = fmt::format("{}x{}", macros["GROUP_SIZE_X"], macros["GROUP_SIZE_Y"]);
430468
comppipe[0] = createComputePipeline(vkh::ComputePipelineCreateInfo(
431469
layout, CompileShaderModule(comp, ShaderLang::glsl, ShaderStage::comp, "main", macros,
432470
SPIRVTarget::vulkan11)));
433471

434472
macros["GROUP_SIZE_X"] = "128";
435473
macros["GROUP_SIZE_Y"] = "2";
436-
comppipe_name[1] = "128x2";
474+
comppipe_name[1] = fmt::format("{}x{}", macros["GROUP_SIZE_X"], macros["GROUP_SIZE_Y"]);
437475
comppipe[1] = createComputePipeline(vkh::ComputePipelineCreateInfo(
438476
layout, CompileShaderModule(comp, ShaderLang::glsl, ShaderStage::comp, "main", macros,
439477
SPIRVTarget::vulkan11)));
440478

441479
macros["GROUP_SIZE_X"] = "8";
442480
macros["GROUP_SIZE_Y"] = "128";
443-
comppipe_name[2] = "8x128";
481+
comppipe_name[2] = fmt::format("{}x{}", macros["GROUP_SIZE_X"], macros["GROUP_SIZE_Y"]);
444482
comppipe[2] = createComputePipeline(vkh::ComputePipelineCreateInfo(
445483
layout, CompileShaderModule(comp, ShaderLang::glsl, ShaderStage::comp, "main", macros,
446484
SPIRVTarget::vulkan11)));
447485

448-
macros["GROUP_SIZE_X"] = "150";
486+
macros["GROUP_SIZE_X"] = "152";
449487
macros["GROUP_SIZE_Y"] = "1";
450-
comppipe_name[3] = "150x1";
488+
comppipe_name[3] = fmt::format("{}x{}", macros["GROUP_SIZE_X"], macros["GROUP_SIZE_Y"]);
451489
comppipe[3] = createComputePipeline(vkh::ComputePipelineCreateInfo(
452490
layout, CompileShaderModule(comp, ShaderLang::glsl, ShaderStage::comp, "main", macros,
453491
SPIRVTarget::vulkan11)));

0 commit comments

Comments
 (0)