mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-10-20 16:01:14 +00:00
Updated spirv-tools.
This commit is contained in:
@@ -30,6 +30,7 @@ using spvtest::EnumCase;
|
||||
using spvtest::MakeInstruction;
|
||||
using spvtest::TextToBinaryTest;
|
||||
using ::testing::Eq;
|
||||
using ::testing::HasSubstr;
|
||||
|
||||
// Test assembly of Memory Access masks
|
||||
|
||||
@@ -95,12 +96,326 @@ INSTANTIATE_TEST_SUITE_P(
|
||||
#undef CASE
|
||||
// clang-format on
|
||||
|
||||
using MemoryRoundTripTest = RoundTripTest;
|
||||
|
||||
// OpPtrEqual appeared in SPIR-V 1.4
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrEqualGood) {
|
||||
std::string spirv = "%2 = OpPtrEqual %1 %3 %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_4),
|
||||
Eq(MakeInstruction(SpvOpPtrEqual, {1, 2, 3, 4})));
|
||||
std::string disassembly = EncodeAndDecodeSuccessfully(
|
||||
spirv, SPV_BINARY_TO_TEXT_OPTION_NONE, SPV_ENV_UNIVERSAL_1_4);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrEqualV13Bad) {
|
||||
std::string spirv = "%2 = OpPtrEqual %1 %3 %4\n";
|
||||
std::string err = CompileFailure(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_THAT(err, HasSubstr("Invalid Opcode name 'OpPtrEqual'"));
|
||||
}
|
||||
|
||||
// OpPtrNotEqual appeared in SPIR-V 1.4
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrNotEqualGood) {
|
||||
std::string spirv = "%2 = OpPtrNotEqual %1 %3 %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_4),
|
||||
Eq(MakeInstruction(SpvOpPtrNotEqual, {1, 2, 3, 4})));
|
||||
std::string disassembly = EncodeAndDecodeSuccessfully(
|
||||
spirv, SPV_BINARY_TO_TEXT_OPTION_NONE, SPV_ENV_UNIVERSAL_1_4);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrNotEqualV13Bad) {
|
||||
std::string spirv = "%2 = OpPtrNotEqual %1 %3 %4\n";
|
||||
std::string err = CompileFailure(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_THAT(err, HasSubstr("Invalid Opcode name 'OpPtrNotEqual'"));
|
||||
}
|
||||
|
||||
// OpPtrDiff appeared in SPIR-V 1.4
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrDiffGood) {
|
||||
std::string spirv = "%2 = OpPtrDiff %1 %3 %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_4),
|
||||
Eq(MakeInstruction(SpvOpPtrDiff, {1, 2, 3, 4})));
|
||||
std::string disassembly = EncodeAndDecodeSuccessfully(
|
||||
spirv, SPV_BINARY_TO_TEXT_OPTION_NONE, SPV_ENV_UNIVERSAL_1_4);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpPtrDiffV13Good) {
|
||||
// OpPtrDiff is enabled by a capability as well, so we can assemble
|
||||
// it even in older SPIR-V environments. We do that so we can
|
||||
// write tests.
|
||||
std::string spirv = "%2 = OpPtrDiff %1 %3 %4\n";
|
||||
std::string disassembly = EncodeAndDecodeSuccessfully(
|
||||
spirv, SPV_BINARY_TO_TEXT_OPTION_NONE, SPV_ENV_UNIVERSAL_1_4);
|
||||
}
|
||||
|
||||
// OpCopyMemory
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryNoMemAccessGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryTooFewArgsBad) {
|
||||
std::string spirv = "OpCopyMemory %1\n";
|
||||
std::string err = CompileFailure(spirv);
|
||||
EXPECT_THAT(err, HasSubstr("Expected operand, found end of stream"));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryTooManyArgsBad) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 %3\n";
|
||||
std::string err = CompileFailure(spirv);
|
||||
EXPECT_THAT(err, HasSubstr("Invalid memory access operand '%3'"));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNoneGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 None\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 0})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessVolatileGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 Volatile\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessAligned8Good) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 Aligned 8\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 2, 8})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNontemporalGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 Nontemporal\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessAvGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 MakePointerAvailableKHR %3\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 8, 3})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessVisGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 MakePointerVisibleKHR %3\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 16, 3})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessNonPrivateGood) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 NonPrivatePointerKHR\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 32})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryAccessMixedGood) {
|
||||
std::string spirv =
|
||||
"OpCopyMemory %1 %2 "
|
||||
"Volatile|Aligned|Nontemporal|MakePointerAvailableKHR|"
|
||||
"MakePointerVisibleKHR|NonPrivatePointerKHR 16 %3 %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 63, 16, 3, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessV13Good) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 Volatile Volatile\n";
|
||||
// Note: This will assemble but should not validate for SPIR-V 1.3
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_3),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 1, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessV14Good) {
|
||||
std::string spirv = "OpCopyMemory %1 %2 Volatile Volatile\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_4),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 1, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemoryTwoAccessMixedV14Good) {
|
||||
std::string spirv =
|
||||
"OpCopyMemory %1 %2 Volatile|Nontemporal|"
|
||||
"MakePointerVisibleKHR %3 "
|
||||
"Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 16 %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemory, {1, 2, 21, 3, 42, 16, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
// OpCopyMemorySized
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedNoMemAccessGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTooFewArgsBad) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2\n";
|
||||
std::string err = CompileFailure(spirv);
|
||||
EXPECT_THAT(err, HasSubstr("Expected operand, found end of stream"));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTooManyArgsBad) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 %4\n";
|
||||
std::string err = CompileFailure(spirv);
|
||||
EXPECT_THAT(err, HasSubstr("Invalid memory access operand '%4'"));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNoneGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 None\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 0})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessVolatileGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 Volatile\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessAligned8Good) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 Aligned 8\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 2, 8})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNontemporalGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 Nontemporal\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessAvGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerAvailableKHR %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 8, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessVisGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 MakePointerVisibleKHR %4\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 16, 4})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessNonPrivateGood) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 NonPrivatePointerKHR\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 32})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedAccessMixedGood) {
|
||||
std::string spirv =
|
||||
"OpCopyMemorySized %1 %2 %3 "
|
||||
"Volatile|Aligned|Nontemporal|MakePointerAvailableKHR|"
|
||||
"MakePointerVisibleKHR|NonPrivatePointerKHR 16 %4 %5\n";
|
||||
EXPECT_THAT(
|
||||
CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 63, 16, 4, 5})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessV13Good) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 Volatile Volatile\n";
|
||||
// Note: This will assemble but should not validate for SPIR-V 1.3
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_3),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 1, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessV14Good) {
|
||||
std::string spirv = "OpCopyMemorySized %1 %2 %3 Volatile Volatile\n";
|
||||
EXPECT_THAT(CompiledInstructions(spirv, SPV_ENV_UNIVERSAL_1_4),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 1, 1})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
TEST_F(MemoryRoundTripTest, OpCopyMemorySizedTwoAccessMixedV14Good) {
|
||||
std::string spirv =
|
||||
"OpCopyMemorySized %1 %2 %3 Volatile|Nontemporal|"
|
||||
"MakePointerVisibleKHR %4 "
|
||||
"Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 16 %5\n";
|
||||
EXPECT_THAT(
|
||||
CompiledInstructions(spirv),
|
||||
Eq(MakeInstruction(SpvOpCopyMemorySized, {1, 2, 3, 21, 4, 42, 16, 5})));
|
||||
std::string disassembly =
|
||||
EncodeAndDecodeSuccessfully(spirv, SPV_BINARY_TO_TEXT_OPTION_NONE);
|
||||
EXPECT_THAT(disassembly, Eq(spirv));
|
||||
}
|
||||
|
||||
// TODO(dneto): OpVariable with initializers
|
||||
// TODO(dneto): OpImageTexelPointer
|
||||
// TODO(dneto): OpLoad
|
||||
// TODO(dneto): OpStore
|
||||
// TODO(dneto): OpCopyMemory
|
||||
// TODO(dneto): OpCopyMemorySized
|
||||
// TODO(dneto): OpAccessChain
|
||||
// TODO(dneto): OpInBoundsAccessChain
|
||||
// TODO(dneto): OpPtrAccessChain
|
||||
|
||||
Reference in New Issue
Block a user