spirv-val: Add Vulkan check for Rect Dim in OpTypeImage (#5644)
diff --git a/source/val/validate_image.cpp b/source/val/validate_image.cpp index f62c3a2..bfcb310 100644 --- a/source/val/validate_image.cpp +++ b/source/val/validate_image.cpp
@@ -914,7 +914,15 @@ if (info.dim == spv::Dim::SubpassData && info.arrayed != 0) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << _.VkErrorID(6214) << "Dim SubpassData requires Arrayed to be 0"; + << _.VkErrorID(6214) + << "Dim SubpassData requires Arrayed to be 0 in the Vulkan " + "environment"; + } + + if (info.dim == spv::Dim::Rect) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << _.VkErrorID(9638) + << "Dim must not be Rect in the Vulkan environment"; } }
diff --git a/source/val/validation_state.cpp b/source/val/validation_state.cpp index 8968499..87322d2 100644 --- a/source/val/validation_state.cpp +++ b/source/val/validation_state.cpp
@@ -2351,6 +2351,8 @@ return VUID_WRAP(VUID-StandaloneSpirv-OpEntryPoint-08722); case 8973: return VUID_WRAP(VUID-StandaloneSpirv-Pointer-08973); + case 9638: + return VUID_WRAP(VUID-StandaloneSpirv-OpTypeImage-09638); default: return ""; // unknown id }
diff --git a/test/val/val_image_test.cpp b/test/val/val_image_test.cpp index 35b76fc..44ccf2d 100644 --- a/test/val/val_image_test.cpp +++ b/test/val/val_image_test.cpp
@@ -786,6 +786,21 @@ HasSubstr("Dim SubpassData requires Arrayed to be 0")); } +TEST_F(ValidateImage, TypeImageDimRectVulkan) { + const std::string code = GetShaderHeader("OpCapability InputAttachment\n") + + R"( +%img_type = OpTypeImage %f32 Rect 0 1 0 2 Unknown +)" + TrivialMain(); + + CompileSuccessfully(code.c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, + ValidateInstructions(SPV_ENV_VULKAN_1_0)); + // Can't actually hit VUID-StandaloneSpirv-OpTypeImage-09638 + EXPECT_THAT( + getDiagnosticString(), + AnyVUID("TypeImage requires one of these capabilities: SampledRect")); +} + TEST_F(ValidateImage, TypeImageWrongSampledTypeForTileImageDataEXT) { const std::string code = GetShaderHeader( "OpCapability TileImageColorReadAccessEXT\n"