@@ -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+
146148struct 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