mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-26 13:20:05 +00:00
Check device scope for Vulkan memory model (#2149)
Fixes #2147 * Checks that device scope is not used for availability and visibility operations unless VulkanMemoryModelDeviceScopeKHR capability is present * implemented for atomics, barriers and memory instructions currently
This commit is contained in:
parent
d835d664bd
commit
b1ff8ba5b9
@ -23,6 +23,7 @@
|
||||
#include "source/spirv_target_env.h"
|
||||
#include "source/util/bitutils.h"
|
||||
#include "source/val/instruction.h"
|
||||
#include "source/val/validate_scopes.h"
|
||||
#include "source/val/validation_state.h"
|
||||
|
||||
namespace spvtools {
|
||||
@ -513,6 +514,10 @@ spv_result_t ValidateImageOperands(ValidationState_t& _,
|
||||
"NonPrivateTexelKHR is also specified: Op"
|
||||
<< spvOpcodeString(opcode);
|
||||
}
|
||||
|
||||
const auto available_scope = inst->word(word_index++);
|
||||
if (auto error = ValidateMemoryScope(_, inst, available_scope))
|
||||
return error;
|
||||
}
|
||||
|
||||
if (mask & SpvImageOperandsMakeTexelVisibleKHRMask) {
|
||||
@ -531,6 +536,9 @@ spv_result_t ValidateImageOperands(ValidationState_t& _,
|
||||
"is also specified: Op"
|
||||
<< spvOpcodeString(opcode);
|
||||
}
|
||||
|
||||
const auto visible_scope = inst->word(word_index++);
|
||||
if (auto error = ValidateMemoryScope(_, inst, visible_scope)) return error;
|
||||
}
|
||||
|
||||
return SPV_SUCCESS;
|
||||
@ -1512,7 +1520,7 @@ spv_result_t ValidateImageQuerySize(ValidationState_t& _,
|
||||
ImageTypeInfo info;
|
||||
if (!GetImageTypeInfo(_, image_type, &info)) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "Corrupt image type definition";
|
||||
<< "Corrupt image type definition";
|
||||
}
|
||||
|
||||
uint32_t expected_num_components = info.arrayed;
|
||||
@ -1545,8 +1553,8 @@ spv_result_t ValidateImageQuerySize(ValidationState_t& _,
|
||||
uint32_t result_num_components = _.GetDimension(result_type);
|
||||
if (result_num_components != expected_num_components) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "Result Type has " << result_num_components << " components, "
|
||||
<< "but " << expected_num_components << " expected";
|
||||
<< "Result Type has " << result_num_components << " components, "
|
||||
<< "but " << expected_num_components << " expected";
|
||||
}
|
||||
|
||||
return SPV_SUCCESS;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "source/opcode.h"
|
||||
#include "source/spirv_target_env.h"
|
||||
#include "source/val/instruction.h"
|
||||
#include "source/val/validate_scopes.h"
|
||||
#include "source/val/validation_state.h"
|
||||
|
||||
namespace spvtools {
|
||||
@ -230,6 +231,51 @@ std::pair<SpvStorageClass, SpvStorageClass> GetStorageClass(
|
||||
return std::make_pair(dst_sc, src_sc);
|
||||
}
|
||||
|
||||
// This function is only called for OpLoad, OpStore, OpCopyMemory and
|
||||
// OpCopyMemorySized.
|
||||
uint32_t GetMakeAvailableScope(const Instruction* inst, uint32_t mask) {
|
||||
uint32_t offset = 1;
|
||||
if (mask & SpvMemoryAccessAlignedMask) ++offset;
|
||||
|
||||
uint32_t scope_id = 0;
|
||||
switch (inst->opcode()) {
|
||||
case SpvOpLoad:
|
||||
case SpvOpCopyMemorySized:
|
||||
return inst->GetOperandAs<uint32_t>(3 + offset);
|
||||
case SpvOpStore:
|
||||
case SpvOpCopyMemory:
|
||||
return inst->GetOperandAs<uint32_t>(2 + offset);
|
||||
default:
|
||||
assert(false && "unexpected opcode");
|
||||
break;
|
||||
}
|
||||
|
||||
return scope_id;
|
||||
}
|
||||
|
||||
// This function is only called for OpLoad, OpStore, OpCopyMemory and
|
||||
// OpCopyMemorySized.
|
||||
uint32_t GetMakeVisibleScope(const Instruction* inst, uint32_t mask) {
|
||||
uint32_t offset = 1;
|
||||
if (mask & SpvMemoryAccessAlignedMask) ++offset;
|
||||
if (mask & SpvMemoryAccessMakePointerAvailableKHRMask) ++offset;
|
||||
|
||||
uint32_t scope_id = 0;
|
||||
switch (inst->opcode()) {
|
||||
case SpvOpLoad:
|
||||
case SpvOpCopyMemorySized:
|
||||
return inst->GetOperandAs<uint32_t>(3 + offset);
|
||||
case SpvOpStore:
|
||||
case SpvOpCopyMemory:
|
||||
return inst->GetOperandAs<uint32_t>(2 + offset);
|
||||
default:
|
||||
assert(false && "unexpected opcode");
|
||||
break;
|
||||
}
|
||||
|
||||
return scope_id;
|
||||
}
|
||||
|
||||
spv_result_t CheckMemoryAccess(ValidationState_t& _, const Instruction* inst,
|
||||
uint32_t mask) {
|
||||
if (mask & SpvMemoryAccessMakePointerAvailableKHRMask) {
|
||||
@ -243,6 +289,11 @@ spv_result_t CheckMemoryAccess(ValidationState_t& _, const Instruction* inst,
|
||||
<< "NonPrivatePointerKHR must be specified if "
|
||||
"MakePointerAvailableKHR is specified.";
|
||||
}
|
||||
|
||||
// Check the associated scope for MakeAvailableKHR.
|
||||
const auto available_scope = GetMakeAvailableScope(inst, mask);
|
||||
if (auto error = ValidateMemoryScope(_, inst, available_scope))
|
||||
return error;
|
||||
}
|
||||
|
||||
if (mask & SpvMemoryAccessMakePointerVisibleKHRMask) {
|
||||
@ -256,6 +307,10 @@ spv_result_t CheckMemoryAccess(ValidationState_t& _, const Instruction* inst,
|
||||
<< "NonPrivatePointerKHR must be specified if "
|
||||
"MakePointerVisibleKHR is specified.";
|
||||
}
|
||||
|
||||
// Check the associated scope for MakeVisibleKHR.
|
||||
const auto visible_scope = GetMakeVisibleScope(inst, mask);
|
||||
if (auto error = ValidateMemoryScope(_, inst, visible_scope)) return error;
|
||||
}
|
||||
|
||||
if (mask & SpvMemoryAccessNonPrivatePointerKHRMask) {
|
||||
|
@ -149,6 +149,14 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
|
||||
}
|
||||
}
|
||||
|
||||
if (value == SpvScopeDevice &&
|
||||
_.HasCapability(SpvCapabilityVulkanMemoryModelKHR) &&
|
||||
!_.HasCapability(SpvCapabilityVulkanMemoryModelDeviceScopeKHR)) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability";
|
||||
}
|
||||
|
||||
// Vulkan Specific rules
|
||||
if (spvIsVulkanEnv(_.context()->target_env)) {
|
||||
if (value == SpvScopeCrossDevice) {
|
||||
|
@ -1747,6 +1747,40 @@ OpFunctionEnd
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
|
||||
}
|
||||
|
||||
TEST_F(ValidateAtomics, VulkanMemoryModelDeviceScopeBad) {
|
||||
const std::string body = R"(
|
||||
%val = OpAtomicAnd %u32 %u32_var %device %relaxed %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(OpCapability VulkanMemoryModelKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"),
|
||||
SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateAtomics, VulkanMemoryModelDeviceScopeGood) {
|
||||
const std::string body = R"(
|
||||
%val = OpAtomicAnd %u32 %u32_var %device %relaxed %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"),
|
||||
SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
@ -892,7 +892,7 @@ OpExecutionMode %1 OriginUpperLeft
|
||||
%3 = OpTypeInt 32 0
|
||||
%4 = OpConstant %3 16
|
||||
%5 = OpTypeFunction %2
|
||||
%6 = OpConstant %3 1
|
||||
%6 = OpConstant %3 5
|
||||
%1 = OpFunction %2 None %5
|
||||
%7 = OpLabel
|
||||
OpControlBarrier %6 %6 %4
|
||||
@ -921,7 +921,7 @@ OpExecutionMode %1 OriginUpperLeft
|
||||
%3 = OpTypeInt 32 0
|
||||
%4 = OpConstant %3 16
|
||||
%5 = OpTypeFunction %2
|
||||
%6 = OpConstant %3 1
|
||||
%6 = OpConstant %3 5
|
||||
%1 = OpFunction %2 None %5
|
||||
%7 = OpLabel
|
||||
OpMemoryBarrier %6 %4
|
||||
@ -1226,6 +1226,60 @@ OpFunctionEnd
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
|
||||
}
|
||||
|
||||
TEST_F(ValidateBarriers, VulkanMemoryModelDeviceScopeBad) {
|
||||
const std::string text = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
OpEntryPoint Fragment %func "func"
|
||||
OpExecutionMode %func OriginUpperLeft
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%semantics = OpConstant %int 0
|
||||
%functy = OpTypeFunction %void
|
||||
%func = OpFunction %void None %functy
|
||||
%1 = OpLabel
|
||||
OpMemoryBarrier %device %semantics
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateBarriers, VulkanMemoryModelDeviceScopeGood) {
|
||||
const std::string text = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
OpEntryPoint Fragment %func "func"
|
||||
OpExecutionMode %func OriginUpperLeft
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%semantics = OpConstant %int 0
|
||||
%functy = OpTypeFunction %void
|
||||
%func = OpFunction %void None %functy
|
||||
%1 = OpLabel
|
||||
OpMemoryBarrier %device %semantics
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
@ -4204,7 +4204,7 @@ TEST_F(ValidateImage, SparseTexelsResidentResultTypeNotBool) {
|
||||
TEST_F(ValidateImage, MakeTexelVisibleKHRSuccessImageRead) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1
|
||||
%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_2
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
@ -4221,7 +4221,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
TEST_F(ValidateImage, MakeTexelVisibleKHRSuccessImageSparseRead) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_f32_2d_0002 %uniform_image_f32_2d_0002
|
||||
%res1 = OpImageSparseRead %struct_u32_f32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1
|
||||
%res1 = OpImageSparseRead %struct_u32_f32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_2
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
@ -4283,7 +4283,7 @@ OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
TEST_F(ValidateImage, MakeTexelAvailableKHRSuccessImageWrite) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
|
||||
%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_2
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
@ -4341,6 +4341,86 @@ OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
"NonPrivateTexelKHR is also specified: OpImageWrite"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteBad) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
OpCapability StorageImageWriteWithoutFormat
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment",
|
||||
SPV_ENV_UNIVERSAL_1_3, "VulkanKHR")
|
||||
.c_str());
|
||||
ASSERT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteGood) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
OpCapability StorageImageWriteWithoutFormat
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment",
|
||||
SPV_ENV_UNIVERSAL_1_3, "VulkanKHR")
|
||||
.c_str());
|
||||
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageReadBad) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
OpCapability StorageImageReadWithoutFormat
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment",
|
||||
SPV_ENV_UNIVERSAL_1_3, "VulkanKHR")
|
||||
.c_str());
|
||||
ASSERT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageReadGood) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000
|
||||
%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1
|
||||
)";
|
||||
|
||||
const std::string extra = R"(
|
||||
OpCapability StorageImageReadWithoutFormat
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
)";
|
||||
CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment",
|
||||
SPV_ENV_UNIVERSAL_1_3, "VulkanKHR")
|
||||
.c_str());
|
||||
ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
@ -941,6 +941,572 @@ TEST_F(ValidateMemory, VulkanPushConstant) {
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadBad1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
%load = OpLoad %int %var MakePointerVisibleKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadBad2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
%load = OpLoad %int %var Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadGood1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
%load = OpLoad %int %var MakePointerVisibleKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadGood2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
%load = OpLoad %int %var Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreBad1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpStore %var %device MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreBad2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpStore %var %device Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreGood1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpStore %var %device MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreGood2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpStore %var %device Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad3) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 2
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood3) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 2
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad3) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_DATA,
|
||||
ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Use of device scope with VulkanKHR memory model requires the "
|
||||
"VulkanMemoryModelDeviceScopeKHR capability"));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood1) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device MakePointerAvailableKHR|NonPrivatePointerKHR %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood2) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 2
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood3) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability VulkanMemoryModelKHR
|
||||
OpCapability VulkanMemoryModelDeviceScopeKHR
|
||||
OpCapability Linkage
|
||||
OpCapability Addresses
|
||||
OpExtension "SPV_KHR_vulkan_memory_model"
|
||||
OpMemoryModel Logical VulkanKHR
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%device = OpConstant %int 1
|
||||
%workgroup = OpConstant %int 2
|
||||
%int_ptr_ssbo = OpTypePointer StorageBuffer %int
|
||||
%var1 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%var2 = OpVariable %int_ptr_ssbo StorageBuffer
|
||||
%voidfn = OpTypeFunction %void
|
||||
%func = OpFunction %void None %voidfn
|
||||
%entry = OpLabel
|
||||
OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
Loading…
Reference in New Issue
Block a user