Home | History | Annotate | Download | only in test
      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