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