spirv-val: Label new Vulkan OpPtrAccessChain VUs (#4975)
diff --git a/source/val/validate_memory.cpp b/source/val/validate_memory.cpp
index 8a66bee..09fd2b6 100644
--- a/source/val/validate_memory.cpp
+++ b/source/val/validate_memory.cpp
@@ -1436,12 +1436,14 @@
if (base_type_storage_class == SpvStorageClassWorkgroup) {
if (!_.HasCapability(SpvCapabilityVariablePointers)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
+ << _.VkErrorID(7651)
<< "OpPtrAccessChain Base operand pointing to Workgroup "
"storage class must use VariablePointers capability";
}
} else if (base_type_storage_class == SpvStorageClassStorageBuffer) {
if (!_.features().variable_pointers) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
+ << _.VkErrorID(7652)
<< "OpPtrAccessChain Base operand pointing to StorageBuffer "
"storage class must use VariablePointers or "
"VariablePointersStorageBuffer capability";
@@ -1449,6 +1451,7 @@
} else if (base_type_storage_class !=
SpvStorageClassPhysicalStorageBuffer) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
+ << _.VkErrorID(7650)
<< "OpPtrAccessChain Base operand must point to Workgroup, "
"StorageBuffer, or PhysicalStorageBuffer storage class";
}
diff --git a/source/val/validation_state.cpp b/source/val/validation_state.cpp
index a5f1de0..64a0a1a 100644
--- a/source/val/validation_state.cpp
+++ b/source/val/validation_state.cpp
@@ -2144,6 +2144,12 @@
return VUID_WRAP(VUID-StandaloneSpirv-ExecutionModel-07320);
case 7290:
return VUID_WRAP(VUID-StandaloneSpirv-Input-07290);
+ case 7650:
+ return VUID_WRAP(VUID-StandaloneSpirv-Base-07650);
+ case 7651:
+ return VUID_WRAP(VUID-StandaloneSpirv-Base-07651);
+ case 7652:
+ return VUID_WRAP(VUID-StandaloneSpirv-Base-07652);
default:
return ""; // unknown id
}
diff --git a/test/val/val_memory_test.cpp b/test/val/val_memory_test.cpp
index 780aeed..d0735dc 100644
--- a/test/val/val_memory_test.cpp
+++ b/test/val/val_memory_test.cpp
@@ -4857,6 +4857,8 @@
CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_2);
EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
EXPECT_THAT(getDiagnosticString(),
+ AnyVUID("VUID-StandaloneSpirv-Base-07652"));
+ EXPECT_THAT(getDiagnosticString(),
HasSubstr("OpPtrAccessChain Base operand pointing to "
"StorageBuffer storage class must use VariablePointers "
"or VariablePointersStorageBuffer capability"));
@@ -4892,6 +4894,8 @@
CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_2);
EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
EXPECT_THAT(getDiagnosticString(),
+ AnyVUID("VUID-StandaloneSpirv-Base-07651"));
+ EXPECT_THAT(getDiagnosticString(),
HasSubstr("OpPtrAccessChain Base operand pointing to Workgroup "
"storage class must use VariablePointers capability"));
}