@@ -318,7 +318,8 @@ TEST_F(ValidateAtomics, AtomicAddFloatVulkan) {
318318 EXPECT_THAT (
319319 getDiagnosticString (),
320320 HasSubstr (" Opcode AtomicFAddEXT requires one of these capabilities: "
321- " AtomicFloat32AddEXT AtomicFloat64AddEXT AtomicFloat16AddEXT" ));
321+ " AtomicFloat16VectorNV AtomicFloat32AddEXT AtomicFloat64AddEXT "
322+ " AtomicFloat16AddEXT" ));
322323}
323324
324325TEST_F (ValidateAtomics, AtomicMinFloatVulkan) {
@@ -331,7 +332,8 @@ TEST_F(ValidateAtomics, AtomicMinFloatVulkan) {
331332 EXPECT_THAT (
332333 getDiagnosticString (),
333334 HasSubstr (" Opcode AtomicFMinEXT requires one of these capabilities: "
334- " AtomicFloat32MinMaxEXT AtomicFloat64MinMaxEXT AtomicFloat16MinMaxEXT" ));
335+ " AtomicFloat16VectorNV AtomicFloat32MinMaxEXT "
336+ " AtomicFloat64MinMaxEXT AtomicFloat16MinMaxEXT" ));
335337}
336338
337339TEST_F (ValidateAtomics, AtomicMaxFloatVulkan) {
@@ -343,8 +345,10 @@ TEST_F(ValidateAtomics, AtomicMaxFloatVulkan) {
343345 ASSERT_EQ (SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions ());
344346 EXPECT_THAT (
345347 getDiagnosticString (),
346- HasSubstr (" Opcode AtomicFMaxEXT requires one of these capabilities: "
347- " AtomicFloat32MinMaxEXT AtomicFloat64MinMaxEXT AtomicFloat16MinMaxEXT" ));
348+ HasSubstr (
349+ " Opcode AtomicFMaxEXT requires one of these capabilities: "
350+ " AtomicFloat16VectorNV AtomicFloat32MinMaxEXT AtomicFloat64MinMaxEXT "
351+ " AtomicFloat16MinMaxEXT" ));
348352}
349353
350354TEST_F (ValidateAtomics, AtomicAddFloatVulkanWrongType1) {
@@ -2713,6 +2717,136 @@ TEST_F(ValidateAtomics, IIncrementBadPointerDataType) {
27132717 " value of type Result Type" ));
27142718}
27152719
2720+ TEST_F (ValidateAtomics, AtomicFloat16VectorSuccess) {
2721+ const std::string definitions = R"(
2722+ %f16 = OpTypeFloat 16
2723+ %f16vec2 = OpTypeVector %f16 2
2724+ %f16vec4 = OpTypeVector %f16 4
2725+
2726+ %f16_1 = OpConstant %f16 1
2727+ %f16vec2_1 = OpConstantComposite %f16vec2 %f16_1 %f16_1
2728+ %f16vec4_1 = OpConstantComposite %f16vec4 %f16_1 %f16_1 %f16_1 %f16_1
2729+
2730+ %f16vec2_ptr = OpTypePointer Workgroup %f16vec2
2731+ %f16vec4_ptr = OpTypePointer Workgroup %f16vec4
2732+ %f16vec2_var = OpVariable %f16vec2_ptr Workgroup
2733+ %f16vec4_var = OpVariable %f16vec4_ptr Workgroup
2734+ )" ;
2735+
2736+ const std::string body = R"(
2737+ %val3 = OpAtomicFMinEXT %f16vec2 %f16vec2_var %device %relaxed %f16vec2_1
2738+ %val4 = OpAtomicFMaxEXT %f16vec2 %f16vec2_var %device %relaxed %f16vec2_1
2739+ %val8 = OpAtomicFAddEXT %f16vec2 %f16vec2_var %device %relaxed %f16vec2_1
2740+ %val9 = OpAtomicExchange %f16vec2 %f16vec2_var %device %relaxed %f16vec2_1
2741+
2742+ %val11 = OpAtomicFMinEXT %f16vec4 %f16vec4_var %device %relaxed %f16vec4_1
2743+ %val12 = OpAtomicFMaxEXT %f16vec4 %f16vec4_var %device %relaxed %f16vec4_1
2744+ %val18 = OpAtomicFAddEXT %f16vec4 %f16vec4_var %device %relaxed %f16vec4_1
2745+ %val19 = OpAtomicExchange %f16vec4 %f16vec4_var %device %relaxed %f16vec4_1
2746+
2747+ )" ;
2748+
2749+ CompileSuccessfully (GenerateShaderComputeCode (
2750+ body,
2751+ " OpCapability Float16\n "
2752+ " OpCapability AtomicFloat16VectorNV\n "
2753+ " OpExtension \" SPV_NV_shader_atomic_fp16_vector\"\n " ,
2754+ definitions),
2755+ SPV_ENV_VULKAN_1_0);
2756+ ASSERT_EQ (SPV_SUCCESS, ValidateInstructions (SPV_ENV_VULKAN_1_0));
2757+ }
2758+
2759+ static constexpr char Float16Vector3Defs[] = R"(
2760+ %f16 = OpTypeFloat 16
2761+ %f16vec3 = OpTypeVector %f16 3
2762+
2763+ %f16_1 = OpConstant %f16 1
2764+ %f16vec3_1 = OpConstantComposite %f16vec3 %f16_1 %f16_1 %f16_1
2765+
2766+ %f16vec3_ptr = OpTypePointer Workgroup %f16vec3
2767+ %f16vec3_var = OpVariable %f16vec3_ptr Workgroup
2768+ )" ;
2769+
2770+ TEST_F (ValidateAtomics, AtomicFloat16Vector3MinFail) {
2771+ const std::string definitions = Float16Vector3Defs;
2772+
2773+ const std::string body = R"(
2774+ %val11 = OpAtomicFMinEXT %f16vec3 %f16vec3_var %device %relaxed %f16vec3_1
2775+ )" ;
2776+
2777+ CompileSuccessfully (GenerateShaderComputeCode (
2778+ body,
2779+ " OpCapability Float16\n "
2780+ " OpCapability AtomicFloat16VectorNV\n "
2781+ " OpExtension \" SPV_NV_shader_atomic_fp16_vector\"\n " ,
2782+ definitions),
2783+ SPV_ENV_VULKAN_1_0);
2784+ EXPECT_EQ (SPV_ERROR_INVALID_DATA, ValidateInstructions ());
2785+ EXPECT_THAT (
2786+ getDiagnosticString (),
2787+ HasSubstr (" AtomicFMinEXT: expected Result Type to be float scalar type" ));
2788+ }
2789+
2790+ TEST_F (ValidateAtomics, AtomicFloat16Vector3MaxFail) {
2791+ const std::string definitions = Float16Vector3Defs;
2792+
2793+ const std::string body = R"(
2794+ %val12 = OpAtomicFMaxEXT %f16vec3 %f16vec3_var %device %relaxed %f16vec3_1
2795+ )" ;
2796+
2797+ CompileSuccessfully (GenerateShaderComputeCode (
2798+ body,
2799+ " OpCapability Float16\n "
2800+ " OpCapability AtomicFloat16VectorNV\n "
2801+ " OpExtension \" SPV_NV_shader_atomic_fp16_vector\"\n " ,
2802+ definitions),
2803+ SPV_ENV_VULKAN_1_0);
2804+ EXPECT_EQ (SPV_ERROR_INVALID_DATA, ValidateInstructions ());
2805+ EXPECT_THAT (
2806+ getDiagnosticString (),
2807+ HasSubstr (" AtomicFMaxEXT: expected Result Type to be float scalar type" ));
2808+ }
2809+
2810+ TEST_F (ValidateAtomics, AtomicFloat16Vector3AddFail) {
2811+ const std::string definitions = Float16Vector3Defs;
2812+
2813+ const std::string body = R"(
2814+ %val18 = OpAtomicFAddEXT %f16vec3 %f16vec3_var %device %relaxed %f16vec3_1
2815+ )" ;
2816+
2817+ CompileSuccessfully (GenerateShaderComputeCode (
2818+ body,
2819+ " OpCapability Float16\n "
2820+ " OpCapability AtomicFloat16VectorNV\n "
2821+ " OpExtension \" SPV_NV_shader_atomic_fp16_vector\"\n " ,
2822+ definitions),
2823+ SPV_ENV_VULKAN_1_0);
2824+ EXPECT_EQ (SPV_ERROR_INVALID_DATA, ValidateInstructions ());
2825+ EXPECT_THAT (
2826+ getDiagnosticString (),
2827+ HasSubstr (" AtomicFAddEXT: expected Result Type to be float scalar type" ));
2828+ }
2829+
2830+ TEST_F (ValidateAtomics, AtomicFloat16Vector3ExchangeFail) {
2831+ const std::string definitions = Float16Vector3Defs;
2832+
2833+ const std::string body = R"(
2834+ %val19 = OpAtomicExchange %f16vec3 %f16vec3_var %device %relaxed %f16vec3_1
2835+ )" ;
2836+
2837+ CompileSuccessfully (GenerateShaderComputeCode (
2838+ body,
2839+ " OpCapability Float16\n "
2840+ " OpCapability AtomicFloat16VectorNV\n "
2841+ " OpExtension \" SPV_NV_shader_atomic_fp16_vector\"\n " ,
2842+ definitions),
2843+ SPV_ENV_VULKAN_1_0);
2844+ EXPECT_EQ (SPV_ERROR_INVALID_DATA, ValidateInstructions ());
2845+ EXPECT_THAT (getDiagnosticString (),
2846+ HasSubstr (" AtomicExchange: expected Result Type to be integer or "
2847+ " float scalar type" ));
2848+ }
2849+
27162850} // namespace
27172851} // namespace val
27182852} // namespace spvtools
0 commit comments