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 #include "test/unit_spirv.h"
     16 
     17 #include "source/enum_set.h"
     18 
     19 namespace spvtools {
     20 namespace {
     21 
     22 using spvtest::ElementsIn;
     23 
     24 // Capabilities required by an Opcode.
     25 struct ExpectedOpCodeCapabilities {
     26   SpvOp opcode;
     27   CapabilitySet capabilities;
     28 };
     29 
     30 using OpcodeTableCapabilitiesTest =
     31     ::testing::TestWithParam<ExpectedOpCodeCapabilities>;
     32 
     33 TEST_P(OpcodeTableCapabilitiesTest, TableEntryMatchesExpectedCapabilities) {
     34   auto env = SPV_ENV_UNIVERSAL_1_1;
     35   spv_opcode_table opcodeTable;
     36   ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableGet(&opcodeTable, env));
     37   spv_opcode_desc entry;
     38   ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableValueLookup(env, opcodeTable,
     39                                                    GetParam().opcode, &entry));
     40   EXPECT_EQ(
     41       ElementsIn(GetParam().capabilities),
     42       ElementsIn(CapabilitySet(entry->numCapabilities, entry->capabilities)));
     43 }
     44 
     45 INSTANTIATE_TEST_CASE_P(
     46     TableRowTest, OpcodeTableCapabilitiesTest,
     47     // Spot-check a few opcodes.
     48     ::testing::Values(
     49         ExpectedOpCodeCapabilities{
     50             SpvOpImageQuerySize,
     51             CapabilitySet{SpvCapabilityKernel, SpvCapabilityImageQuery}},
     52         ExpectedOpCodeCapabilities{
     53             SpvOpImageQuerySizeLod,
     54             CapabilitySet{SpvCapabilityKernel, SpvCapabilityImageQuery}},
     55         ExpectedOpCodeCapabilities{
     56             SpvOpImageQueryLevels,
     57             CapabilitySet{SpvCapabilityKernel, SpvCapabilityImageQuery}},
     58         ExpectedOpCodeCapabilities{
     59             SpvOpImageQuerySamples,
     60             CapabilitySet{SpvCapabilityKernel, SpvCapabilityImageQuery}},
     61         ExpectedOpCodeCapabilities{SpvOpImageSparseSampleImplicitLod,
     62                                    CapabilitySet{SpvCapabilitySparseResidency}},
     63         ExpectedOpCodeCapabilities{SpvOpCopyMemorySized,
     64                                    CapabilitySet{SpvCapabilityAddresses}},
     65         ExpectedOpCodeCapabilities{SpvOpArrayLength,
     66                                    CapabilitySet{SpvCapabilityShader}},
     67         ExpectedOpCodeCapabilities{SpvOpFunction, CapabilitySet()},
     68         ExpectedOpCodeCapabilities{SpvOpConvertFToS, CapabilitySet()},
     69         ExpectedOpCodeCapabilities{SpvOpEmitStreamVertex,
     70                                    CapabilitySet{SpvCapabilityGeometryStreams}},
     71         ExpectedOpCodeCapabilities{SpvOpTypeNamedBarrier,
     72                                    CapabilitySet{SpvCapabilityNamedBarrier}},
     73         ExpectedOpCodeCapabilities{
     74             SpvOpGetKernelMaxNumSubgroups,
     75             CapabilitySet{SpvCapabilitySubgroupDispatch}}), );
     76 
     77 }  // namespace
     78 }  // namespace spvtools
     79