1 // Copyright (c) 2015-2016 The Khronos Group Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Assembler tests for instructions in the "Barrier Instructions" section 16 // of the SPIR-V spec. 17 18 #include <string> 19 20 #include "gmock/gmock.h" 21 #include "test/test_fixture.h" 22 #include "test/unit_spirv.h" 23 24 namespace spvtools { 25 namespace { 26 27 using spvtest::MakeInstruction; 28 using spvtest::TextToBinaryTest; 29 using ::testing::_; 30 using ::testing::ElementsAre; 31 using ::testing::Eq; 32 33 // Test OpMemoryBarrier 34 35 using OpMemoryBarrier = spvtest::TextToBinaryTest; 36 37 TEST_F(OpMemoryBarrier, Good) { 38 const std::string input = "OpMemoryBarrier %1 %2\n"; 39 EXPECT_THAT(CompiledInstructions(input), 40 Eq(MakeInstruction(SpvOpMemoryBarrier, {1, 2}))); 41 EXPECT_THAT(EncodeAndDecodeSuccessfully(input), Eq(input)); 42 } 43 44 TEST_F(OpMemoryBarrier, BadMissingScopeId) { 45 const std::string input = "OpMemoryBarrier\n"; 46 EXPECT_THAT(CompileFailure(input), 47 Eq("Expected operand, found end of stream.")); 48 } 49 50 TEST_F(OpMemoryBarrier, BadInvalidScopeId) { 51 const std::string input = "OpMemoryBarrier 99\n"; 52 EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %.")); 53 } 54 55 TEST_F(OpMemoryBarrier, BadMissingMemorySemanticsId) { 56 const std::string input = "OpMemoryBarrier %scope\n"; 57 EXPECT_THAT(CompileFailure(input), 58 Eq("Expected operand, found end of stream.")); 59 } 60 61 TEST_F(OpMemoryBarrier, BadInvalidMemorySemanticsId) { 62 const std::string input = "OpMemoryBarrier %scope 14\n"; 63 EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %.")); 64 } 65 66 // TODO(dneto): OpControlBarrier 67 // TODO(dneto): OpGroupAsyncCopy 68 // TODO(dneto): OpGroupWaitEvents 69 // TODO(dneto): OpGroupAll 70 // TODO(dneto): OpGroupAny 71 // TODO(dneto): OpGroupBroadcast 72 // TODO(dneto): OpGroupIAdd 73 // TODO(dneto): OpGroupFAdd 74 // TODO(dneto): OpGroupFMin 75 // TODO(dneto): OpGroupUMin 76 // TODO(dneto): OpGroupSMin 77 // TODO(dneto): OpGroupFMax 78 // TODO(dneto): OpGroupUMax 79 // TODO(dneto): OpGroupSMax 80 81 using NamedMemoryBarrierTest = spvtest::TextToBinaryTest; 82 83 // OpMemoryNamedBarrier is not in 1.0, but it is enabled by a capability. 84 // We should be able to assemble it. Validation checks are in another test 85 // file. 86 TEST_F(NamedMemoryBarrierTest, OpcodeAssemblesInV10) { 87 EXPECT_THAT( 88 CompiledInstructions("OpMemoryNamedBarrier %bar %scope %semantics", 89 SPV_ENV_UNIVERSAL_1_0), 90 ElementsAre(spvOpcodeMake(4, SpvOpMemoryNamedBarrier), _, _, _)); 91 } 92 93 TEST_F(NamedMemoryBarrierTest, ArgumentCount) { 94 EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier", SPV_ENV_UNIVERSAL_1_1), 95 Eq("Expected operand, found end of stream.")); 96 EXPECT_THAT( 97 CompileFailure("OpMemoryNamedBarrier %bar", SPV_ENV_UNIVERSAL_1_1), 98 Eq("Expected operand, found end of stream.")); 99 EXPECT_THAT( 100 CompileFailure("OpMemoryNamedBarrier %bar %scope", SPV_ENV_UNIVERSAL_1_1), 101 Eq("Expected operand, found end of stream.")); 102 EXPECT_THAT( 103 CompiledInstructions("OpMemoryNamedBarrier %bar %scope %semantics", 104 SPV_ENV_UNIVERSAL_1_1), 105 ElementsAre(spvOpcodeMake(4, SpvOpMemoryNamedBarrier), _, _, _)); 106 EXPECT_THAT( 107 CompileFailure("OpMemoryNamedBarrier %bar %scope %semantics %extra", 108 SPV_ENV_UNIVERSAL_1_1), 109 Eq("Expected '=', found end of stream.")); 110 } 111 112 TEST_F(NamedMemoryBarrierTest, ArgumentTypes) { 113 EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier 123 %scope %semantics", 114 SPV_ENV_UNIVERSAL_1_1), 115 Eq("Expected id to start with %.")); 116 EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier %bar %scope \"semantics\"", 117 SPV_ENV_UNIVERSAL_1_1), 118 Eq("Expected id to start with %.")); 119 } 120 121 using TypeNamedBarrierTest = spvtest::TextToBinaryTest; 122 123 TEST_F(TypeNamedBarrierTest, OpcodeAssemblesInV10) { 124 EXPECT_THAT( 125 CompiledInstructions("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_0), 126 ElementsAre(spvOpcodeMake(2, SpvOpTypeNamedBarrier), _)); 127 } 128 129 TEST_F(TypeNamedBarrierTest, ArgumentCount) { 130 EXPECT_THAT(CompileFailure("OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1), 131 Eq("Expected <result-id> at the beginning of an instruction, " 132 "found 'OpTypeNamedBarrier'.")); 133 EXPECT_THAT( 134 CompiledInstructions("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1), 135 ElementsAre(spvOpcodeMake(2, SpvOpTypeNamedBarrier), _)); 136 EXPECT_THAT( 137 CompileFailure("%t = OpTypeNamedBarrier 1 2 3", SPV_ENV_UNIVERSAL_1_1), 138 Eq("Expected <opcode> or <result-id> at the beginning of an instruction, " 139 "found '1'.")); 140 } 141 142 using NamedBarrierInitializeTest = spvtest::TextToBinaryTest; 143 144 TEST_F(NamedBarrierInitializeTest, OpcodeAssemblesInV10) { 145 EXPECT_THAT( 146 CompiledInstructions("%bar = OpNamedBarrierInitialize %type %count", 147 SPV_ENV_UNIVERSAL_1_0), 148 ElementsAre(spvOpcodeMake(4, SpvOpNamedBarrierInitialize), _, _, _)); 149 } 150 151 TEST_F(NamedBarrierInitializeTest, ArgumentCount) { 152 EXPECT_THAT( 153 CompileFailure("%bar = OpNamedBarrierInitialize", SPV_ENV_UNIVERSAL_1_1), 154 Eq("Expected operand, found end of stream.")); 155 EXPECT_THAT(CompileFailure("%bar = OpNamedBarrierInitialize %ype", 156 SPV_ENV_UNIVERSAL_1_1), 157 Eq("Expected operand, found end of stream.")); 158 EXPECT_THAT( 159 CompiledInstructions("%bar = OpNamedBarrierInitialize %type %count", 160 SPV_ENV_UNIVERSAL_1_1), 161 ElementsAre(spvOpcodeMake(4, SpvOpNamedBarrierInitialize), _, _, _)); 162 EXPECT_THAT( 163 CompileFailure("%bar = OpNamedBarrierInitialize %type %count \"extra\"", 164 SPV_ENV_UNIVERSAL_1_1), 165 Eq("Expected <opcode> or <result-id> at the beginning of an instruction, " 166 "found '\"extra\"'.")); 167 } 168 169 } // namespace 170 } // namespace spvtools 171