@@ -318,7 +318,8 @@ TEST_F(ValidateAtomics, AtomicAddFloatVulkan) {
318
318
EXPECT_THAT (
319
319
getDiagnosticString (),
320
320
HasSubstr (" Opcode AtomicFAddEXT requires one of these capabilities: "
321
- " AtomicFloat32AddEXT AtomicFloat64AddEXT AtomicFloat16AddEXT" ));
321
+ " AtomicFloat16VectorNV AtomicFloat32AddEXT AtomicFloat64AddEXT "
322
+ " AtomicFloat16AddEXT" ));
322
323
}
323
324
324
325
TEST_F (ValidateAtomics, AtomicMinFloatVulkan) {
@@ -331,7 +332,8 @@ TEST_F(ValidateAtomics, AtomicMinFloatVulkan) {
331
332
EXPECT_THAT (
332
333
getDiagnosticString (),
333
334
HasSubstr (" Opcode AtomicFMinEXT requires one of these capabilities: "
334
- " AtomicFloat32MinMaxEXT AtomicFloat64MinMaxEXT AtomicFloat16MinMaxEXT" ));
335
+ " AtomicFloat16VectorNV AtomicFloat32MinMaxEXT "
336
+ " AtomicFloat64MinMaxEXT AtomicFloat16MinMaxEXT" ));
335
337
}
336
338
337
339
TEST_F (ValidateAtomics, AtomicMaxFloatVulkan) {
@@ -343,8 +345,10 @@ TEST_F(ValidateAtomics, AtomicMaxFloatVulkan) {
343
345
ASSERT_EQ (SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions ());
344
346
EXPECT_THAT (
345
347
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" ));
348
352
}
349
353
350
354
TEST_F (ValidateAtomics, AtomicAddFloatVulkanWrongType1) {
@@ -2713,6 +2717,136 @@ TEST_F(ValidateAtomics, IIncrementBadPointerDataType) {
2713
2717
" value of type Result Type" ));
2714
2718
}
2715
2719
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
+
2716
2850
} // namespace
2717
2851
} // namespace val
2718
2852
} // namespace spvtools
0 commit comments