|  | // Copyright (c) 2015-2016 The Khronos Group Inc. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | // Assembler tests for instructions in the "Barrier Instructions" section | 
|  | // of the SPIR-V spec. | 
|  |  | 
|  | #include "unit_spirv.h" | 
|  |  | 
|  | #include "test_fixture.h" | 
|  | #include "gmock/gmock.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | using ::testing::ElementsAre; | 
|  | using ::testing::Eq; | 
|  | using ::testing::_; | 
|  | using spvtest::MakeInstruction; | 
|  | using spvtest::TextToBinaryTest; | 
|  |  | 
|  | // Test OpMemoryBarrier | 
|  |  | 
|  | using OpMemoryBarrier = spvtest::TextToBinaryTest; | 
|  |  | 
|  | TEST_F(OpMemoryBarrier, Good) { | 
|  | const std::string input = "OpMemoryBarrier %1 %2\n"; | 
|  | EXPECT_THAT(CompiledInstructions(input), | 
|  | Eq(MakeInstruction(SpvOpMemoryBarrier, {1, 2}))); | 
|  | EXPECT_THAT(EncodeAndDecodeSuccessfully(input), Eq(input)); | 
|  | } | 
|  |  | 
|  | TEST_F(OpMemoryBarrier, BadMissingScopeId) { | 
|  | const std::string input = "OpMemoryBarrier\n"; | 
|  | EXPECT_THAT(CompileFailure(input), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | } | 
|  |  | 
|  | TEST_F(OpMemoryBarrier, BadInvalidScopeId) { | 
|  | const std::string input = "OpMemoryBarrier 99\n"; | 
|  | EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %.")); | 
|  | } | 
|  |  | 
|  | TEST_F(OpMemoryBarrier, BadMissingMemorySemanticsId) { | 
|  | const std::string input = "OpMemoryBarrier %scope\n"; | 
|  | EXPECT_THAT(CompileFailure(input), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | } | 
|  |  | 
|  | TEST_F(OpMemoryBarrier, BadInvalidMemorySemanticsId) { | 
|  | const std::string input = "OpMemoryBarrier %scope 14\n"; | 
|  | EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %.")); | 
|  | } | 
|  |  | 
|  | // TODO(dneto): OpControlBarrier | 
|  | // TODO(dneto): OpGroupAsyncCopy | 
|  | // TODO(dneto): OpGroupWaitEvents | 
|  | // TODO(dneto): OpGroupAll | 
|  | // TODO(dneto): OpGroupAny | 
|  | // TODO(dneto): OpGroupBroadcast | 
|  | // TODO(dneto): OpGroupIAdd | 
|  | // TODO(dneto): OpGroupFAdd | 
|  | // TODO(dneto): OpGroupFMin | 
|  | // TODO(dneto): OpGroupUMin | 
|  | // TODO(dneto): OpGroupSMin | 
|  | // TODO(dneto): OpGroupFMax | 
|  | // TODO(dneto): OpGroupUMax | 
|  | // TODO(dneto): OpGroupSMax | 
|  |  | 
|  | using NamedMemoryBarrierTest = spvtest::TextToBinaryTest; | 
|  |  | 
|  | TEST_F(NamedMemoryBarrierTest, OpcodeUnrecognizedInV10) { | 
|  | EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier %bar %scope %semantics", | 
|  | SPV_ENV_UNIVERSAL_1_0), | 
|  | Eq("Invalid Opcode name 'OpMemoryNamedBarrier'")); | 
|  | } | 
|  |  | 
|  | TEST_F(NamedMemoryBarrierTest, ArgumentCount) { | 
|  | EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | EXPECT_THAT( | 
|  | CompileFailure("OpMemoryNamedBarrier %bar", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | EXPECT_THAT( | 
|  | CompileFailure("OpMemoryNamedBarrier %bar %scope", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | EXPECT_THAT( | 
|  | CompiledInstructions("OpMemoryNamedBarrier %bar %scope %semantics", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | ElementsAre(spvOpcodeMake(4, SpvOpMemoryNamedBarrier), _, _, _)); | 
|  | EXPECT_THAT( | 
|  | CompileFailure("OpMemoryNamedBarrier %bar %scope %semantics %extra", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected '=', found end of stream.")); | 
|  | } | 
|  |  | 
|  | TEST_F(NamedMemoryBarrierTest, ArgumentTypes) { | 
|  | EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier 123 %scope %semantics", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected id to start with %.")); | 
|  | EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier %bar %scope \"semantics\"", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected id to start with %.")); | 
|  | } | 
|  |  | 
|  | using TypeNamedBarrierTest = spvtest::TextToBinaryTest; | 
|  |  | 
|  | TEST_F(TypeNamedBarrierTest, OpcodeUnrecognizedInV10) { | 
|  | EXPECT_THAT(CompileFailure("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_0), | 
|  | Eq("Invalid Opcode name 'OpTypeNamedBarrier'")); | 
|  | } | 
|  |  | 
|  | TEST_F(TypeNamedBarrierTest, ArgumentCount) { | 
|  | EXPECT_THAT(CompileFailure("OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected <result-id> at the beginning of an instruction, " | 
|  | "found 'OpTypeNamedBarrier'.")); | 
|  | EXPECT_THAT( | 
|  | CompiledInstructions("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1), | 
|  | ElementsAre(spvOpcodeMake(2, SpvOpTypeNamedBarrier), _)); | 
|  | EXPECT_THAT( | 
|  | CompileFailure("%t = OpTypeNamedBarrier 1 2 3", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected <opcode> or <result-id> at the beginning of an instruction, " | 
|  | "found '1'.")); | 
|  | } | 
|  |  | 
|  | using NamedBarrierInitializeTest = spvtest::TextToBinaryTest; | 
|  |  | 
|  | TEST_F(NamedBarrierInitializeTest, OpcodeUnrecognizedInV10) { | 
|  | EXPECT_THAT(CompileFailure("%bar = OpNamedBarrierInitialize %type %count", | 
|  | SPV_ENV_UNIVERSAL_1_0), | 
|  | Eq("Invalid Opcode name 'OpNamedBarrierInitialize'")); | 
|  | } | 
|  |  | 
|  | TEST_F(NamedBarrierInitializeTest, ArgumentCount) { | 
|  | EXPECT_THAT( | 
|  | CompileFailure("%bar = OpNamedBarrierInitialize", SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | EXPECT_THAT(CompileFailure("%bar = OpNamedBarrierInitialize %ype", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected operand, found end of stream.")); | 
|  | EXPECT_THAT( | 
|  | CompiledInstructions("%bar = OpNamedBarrierInitialize %type %count", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | ElementsAre(spvOpcodeMake(4, SpvOpNamedBarrierInitialize), _, _, _)); | 
|  | EXPECT_THAT( | 
|  | CompileFailure("%bar = OpNamedBarrierInitialize %type %count \"extra\"", | 
|  | SPV_ENV_UNIVERSAL_1_1), | 
|  | Eq("Expected <opcode> or <result-id> at the beginning of an instruction, " | 
|  | "found '\"extra\"'.")); | 
|  | } | 
|  |  | 
|  | }  // anonymous namespace |