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 spv::Op opcode;
27 CapabilitySet capabilities;
28 };
29
30 using OpcodeTableCapabilitiesTest =
31 ::testing::TestWithParam<ExpectedOpCodeCapabilities>;
32
TEST_P(OpcodeTableCapabilitiesTest,TableEntryMatchesExpectedCapabilities)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_SUITE_P(
46 TableRowTest, OpcodeTableCapabilitiesTest,
47 // Spot-check a few opcodes.
48 ::testing::Values(
49 ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySize,
50 CapabilitySet{spv::Capability::Kernel,
51 spv::Capability::ImageQuery}},
52 ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySizeLod,
53 CapabilitySet{spv::Capability::Kernel,
54 spv::Capability::ImageQuery}},
55 ExpectedOpCodeCapabilities{spv::Op::OpImageQueryLevels,
56 CapabilitySet{spv::Capability::Kernel,
57 spv::Capability::ImageQuery}},
58 ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySamples,
59 CapabilitySet{spv::Capability::Kernel,
60 spv::Capability::ImageQuery}},
61 ExpectedOpCodeCapabilities{
62 spv::Op::OpImageSparseSampleImplicitLod,
63 CapabilitySet{spv::Capability::SparseResidency}},
64 ExpectedOpCodeCapabilities{
65 spv::Op::OpCopyMemorySized,
66 CapabilitySet{spv::Capability::Addresses,
67 spv::Capability::UntypedPointersKHR}},
68 ExpectedOpCodeCapabilities{spv::Op::OpArrayLength,
69 CapabilitySet{spv::Capability::Shader}},
70 ExpectedOpCodeCapabilities{spv::Op::OpFunction, CapabilitySet()},
71 ExpectedOpCodeCapabilities{spv::Op::OpConvertFToS, CapabilitySet()},
72 ExpectedOpCodeCapabilities{
73 spv::Op::OpEmitStreamVertex,
74 CapabilitySet{spv::Capability::GeometryStreams}},
75 ExpectedOpCodeCapabilities{
76 spv::Op::OpTypeNamedBarrier,
77 CapabilitySet{spv::Capability::NamedBarrier}},
78 ExpectedOpCodeCapabilities{
79 spv::Op::OpGetKernelMaxNumSubgroups,
80 CapabilitySet{spv::Capability::SubgroupDispatch}},
81 ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySamples,
82 CapabilitySet{spv::Capability::Kernel,
83 spv::Capability::ImageQuery}},
84 ExpectedOpCodeCapabilities{
85 spv::Op::OpImageSparseSampleImplicitLod,
86 CapabilitySet{spv::Capability::SparseResidency}},
87 ExpectedOpCodeCapabilities{
88 spv::Op::OpCopyMemorySized,
89 CapabilitySet{spv::Capability::Addresses,
90 spv::Capability::UntypedPointersKHR}},
91 ExpectedOpCodeCapabilities{spv::Op::OpArrayLength,
92 CapabilitySet{spv::Capability::Shader}},
93 ExpectedOpCodeCapabilities{spv::Op::OpFunction, CapabilitySet()},
94 ExpectedOpCodeCapabilities{spv::Op::OpConvertFToS, CapabilitySet()},
95 ExpectedOpCodeCapabilities{
96 spv::Op::OpEmitStreamVertex,
97 CapabilitySet{spv::Capability::GeometryStreams}},
98 ExpectedOpCodeCapabilities{
99 spv::Op::OpTypeNamedBarrier,
100 CapabilitySet{spv::Capability::NamedBarrier}},
101 ExpectedOpCodeCapabilities{
102 spv::Op::OpGetKernelMaxNumSubgroups,
103 CapabilitySet{spv::Capability::SubgroupDispatch}}));
104
105 } // namespace
106 } // namespace spvtools
107