1fd4e5da5Sopenharmony_ci// Copyright (c) 2015-2016 The Khronos Group Inc.
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h"
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ci#include "source/enum_set.h"
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_cinamespace spvtools {
20fd4e5da5Sopenharmony_cinamespace {
21fd4e5da5Sopenharmony_ci
22fd4e5da5Sopenharmony_ciusing spvtest::ElementsIn;
23fd4e5da5Sopenharmony_ci
24fd4e5da5Sopenharmony_ci// Capabilities required by an Opcode.
25fd4e5da5Sopenharmony_cistruct ExpectedOpCodeCapabilities {
26fd4e5da5Sopenharmony_ci  spv::Op opcode;
27fd4e5da5Sopenharmony_ci  CapabilitySet capabilities;
28fd4e5da5Sopenharmony_ci};
29fd4e5da5Sopenharmony_ci
30fd4e5da5Sopenharmony_ciusing OpcodeTableCapabilitiesTest =
31fd4e5da5Sopenharmony_ci    ::testing::TestWithParam<ExpectedOpCodeCapabilities>;
32fd4e5da5Sopenharmony_ci
33fd4e5da5Sopenharmony_ciTEST_P(OpcodeTableCapabilitiesTest, TableEntryMatchesExpectedCapabilities) {
34fd4e5da5Sopenharmony_ci  auto env = SPV_ENV_UNIVERSAL_1_1;
35fd4e5da5Sopenharmony_ci  spv_opcode_table opcodeTable;
36fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableGet(&opcodeTable, env));
37fd4e5da5Sopenharmony_ci  spv_opcode_desc entry;
38fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableValueLookup(env, opcodeTable,
39fd4e5da5Sopenharmony_ci                                                   GetParam().opcode, &entry));
40fd4e5da5Sopenharmony_ci  EXPECT_EQ(
41fd4e5da5Sopenharmony_ci      ElementsIn(GetParam().capabilities),
42fd4e5da5Sopenharmony_ci      ElementsIn(CapabilitySet(entry->numCapabilities, entry->capabilities)));
43fd4e5da5Sopenharmony_ci}
44fd4e5da5Sopenharmony_ci
45fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
46fd4e5da5Sopenharmony_ci    TableRowTest, OpcodeTableCapabilitiesTest,
47fd4e5da5Sopenharmony_ci    // Spot-check a few opcodes.
48fd4e5da5Sopenharmony_ci    ::testing::Values(
49fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySize,
50fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Kernel,
51fd4e5da5Sopenharmony_ci                                                 spv::Capability::ImageQuery}},
52fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySizeLod,
53fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Kernel,
54fd4e5da5Sopenharmony_ci                                                 spv::Capability::ImageQuery}},
55fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpImageQueryLevels,
56fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Kernel,
57fd4e5da5Sopenharmony_ci                                                 spv::Capability::ImageQuery}},
58fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpImageQuerySamples,
59fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Kernel,
60fd4e5da5Sopenharmony_ci                                                 spv::Capability::ImageQuery}},
61fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{
62fd4e5da5Sopenharmony_ci            spv::Op::OpImageSparseSampleImplicitLod,
63fd4e5da5Sopenharmony_ci            CapabilitySet{spv::Capability::SparseResidency}},
64fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpCopyMemorySized,
65fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Addresses}},
66fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpArrayLength,
67fd4e5da5Sopenharmony_ci                                   CapabilitySet{spv::Capability::Shader}},
68fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpFunction, CapabilitySet()},
69fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{spv::Op::OpConvertFToS, CapabilitySet()},
70fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{
71fd4e5da5Sopenharmony_ci            spv::Op::OpEmitStreamVertex,
72fd4e5da5Sopenharmony_ci            CapabilitySet{spv::Capability::GeometryStreams}},
73fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{
74fd4e5da5Sopenharmony_ci            spv::Op::OpTypeNamedBarrier,
75fd4e5da5Sopenharmony_ci            CapabilitySet{spv::Capability::NamedBarrier}},
76fd4e5da5Sopenharmony_ci        ExpectedOpCodeCapabilities{
77fd4e5da5Sopenharmony_ci            spv::Op::OpGetKernelMaxNumSubgroups,
78fd4e5da5Sopenharmony_ci            CapabilitySet{spv::Capability::SubgroupDispatch}}));
79fd4e5da5Sopenharmony_ci
80fd4e5da5Sopenharmony_ci}  // namespace
81fd4e5da5Sopenharmony_ci}  // namespace spvtools
82