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