Skip to content

Commit a32a82b

Browse files
spirv-val: Better atomic storage class message (#6425)
> AtomicIAdd: storage class forbidden by universal validation rules. Is a terrible error message and requires me to read the source code to know what is wrong/going on Now it will say > AtomicIAdd: Can not be used with storage class Output by universal validation rules
1 parent 1c26ea1 commit a32a82b

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

source/val/validate_atomics.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) {
235235
if (!IsStorageClassAllowedByUniversalRules(storage_class)) {
236236
return _.diag(SPV_ERROR_INVALID_DATA, inst)
237237
<< spvOpcodeString(opcode)
238-
<< ": storage class forbidden by universal validation rules.";
238+
<< ": Can not be used with storage class "
239+
<< spvtools::StorageClassToString(storage_class)
240+
<< " by universal validation rules";
239241
}
240242

241243
// Then Shader rules
@@ -249,8 +251,10 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) {
249251
(storage_class != spv::StorageClass::PhysicalStorageBuffer) &&
250252
(storage_class != spv::StorageClass::TaskPayloadWorkgroupEXT)) {
251253
return _.diag(SPV_ERROR_INVALID_DATA, inst)
252-
<< _.VkErrorID(4686) << spvOpcodeString(opcode)
253-
<< ": Vulkan spec only allows storage classes for atomic to "
254+
<< _.VkErrorID(4686) << spvOpcodeString(opcode) << ": "
255+
<< spvtools::StorageClassToString(storage_class)
256+
<< " is not allowed, the Vulkan spec only allows storage "
257+
"classes for atomic to "
254258
"be: Uniform, Workgroup, Image, StorageBuffer, "
255259
"PhysicalStorageBuffer or TaskPayloadWorkgroupEXT.";
256260
}
@@ -335,8 +339,9 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) {
335339
(storage_class != spv::StorageClass::CrossWorkgroup) &&
336340
(storage_class != spv::StorageClass::Generic)) {
337341
return _.diag(SPV_ERROR_INVALID_DATA, inst)
338-
<< spvOpcodeString(opcode)
339-
<< ": storage class must be Function, Workgroup, "
342+
<< spvOpcodeString(opcode) << ": storage class is "
343+
<< spvtools::StorageClassToString(storage_class)
344+
<< ", but must be Function, Workgroup, "
340345
"CrossWorkGroup or Generic in the OpenCL environment.";
341346
}
342347

test/val/val_atomics_test.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,8 @@ OpAtomicStore %f32_var_function %device %relaxed %f32_1
783783
AnyVUID("VUID-StandaloneSpirv-None-04686"));
784784
EXPECT_THAT(
785785
getDiagnosticString(),
786-
HasSubstr("AtomicStore: Vulkan spec only allows storage classes for "
786+
HasSubstr("AtomicStore: Function is not allowed, the Vulkan spec only "
787+
"allows storage classes for "
787788
"atomic to be: Uniform, Workgroup, Image, StorageBuffer, "
788789
"PhysicalStorageBuffer or TaskPayloadWorkgroupEXT."));
789790
}
@@ -1081,7 +1082,8 @@ OpAtomicStore %f32_im_var %device %relaxed %f32_1
10811082
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_OPENCL_1_2));
10821083
EXPECT_THAT(
10831084
getDiagnosticString(),
1084-
HasSubstr("AtomicStore: storage class must be Function, Workgroup, "
1085+
HasSubstr("AtomicStore: storage class is Image, but must be Function, "
1086+
"Workgroup, "
10851087
"CrossWorkGroup or Generic in the OpenCL environment."));
10861088
}
10871089

@@ -1093,8 +1095,8 @@ OpAtomicStore %f32_uc_var %device %relaxed %f32_1
10931095
CompileSuccessfully(GenerateKernelCode(body));
10941096
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
10951097
EXPECT_THAT(getDiagnosticString(),
1096-
HasSubstr("AtomicStore: storage class forbidden by universal "
1097-
"validation rules."));
1098+
HasSubstr("AtomicStore: Can not be used with storage class "
1099+
"UniformConstant by universal validation rules"));
10981100
}
10991101

11001102
TEST_F(ValidateAtomics, AtomicStoreWrongScopeType) {

0 commit comments

Comments
 (0)