Add Vulkan specific atomic result type restriction

Atomic instructions must declare a scalar 32-bit integer type for the “Result Type”.
This commit is contained in:
Andrey Tuganov 2018-03-23 16:15:03 -04:00 committed by Lei Zhang
parent fe9121f721
commit 9cf87ecbc8
2 changed files with 23 additions and 1 deletions

View File

@ -200,6 +200,13 @@ spv_result_t AtomicsPass(ValidationState_t& _,
<< spvOpcodeString(opcode)
<< ": expected Result Type to be int scalar type";
}
if (spvIsVulkanEnv(_.context()->target_env) &&
_.GetBitWidth(result_type) != 32) {
return _.diag(SPV_ERROR_INVALID_DATA)
<< spvOpcodeString(opcode)
<< ": according to the Vulkan spec atomic Result Type needs "
"to be a 32-bit int scalar type";
}
}
uint32_t operand_index =

View File

@ -74,6 +74,9 @@ OpEntryPoint Fragment %main "main"
%u32_ptr = OpTypePointer Workgroup %u32
%u32_var = OpVariable %u32_ptr Workgroup
%u64_ptr = OpTypePointer Workgroup %u64
%u64_var = OpVariable %u64_ptr Workgroup
%f32vec4_ptr = OpTypePointer Workgroup %f32vec4
%f32vec4_var = OpVariable %f32vec4_ptr Workgroup
@ -167,7 +170,7 @@ TEST_F(ValidateAtomics, AtomicLoadShaderSuccess) {
const std::string body = R"(
%val1 = OpAtomicLoad %u32 %u32_var %device %relaxed
%val2 = OpAtomicLoad %u32 %u32_var %workgroup %acquire
%val3 = OpAtomicLoad %u32 %u32_var %subgroup %sequentially_consistent
%val3 = OpAtomicLoad %u64 %u64_var %subgroup %sequentially_consistent
)";
CompileSuccessfully(GenerateShaderCode(body));
@ -260,6 +263,18 @@ TEST_F(ValidateAtomics, AtomicLoadShaderFloat) {
"expected Result Type to be int scalar type"));
}
TEST_F(ValidateAtomics, AtomicLoadVulkanInt64) {
const std::string body = R"(
%val1 = OpAtomicLoad %u64 %u64_var %device %relaxed
)";
CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0);
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
EXPECT_THAT(getDiagnosticString(),
HasSubstr("AtomicLoad: according to the Vulkan spec atomic "
"Result Type needs to be a 32-bit int scalar type"));
}
TEST_F(ValidateAtomics, AtomicLoadWrongResultType) {
const std::string body = R"(
%val1 = OpAtomicLoad %f32vec4 %f32vec4_var %device %relaxed