opcode_require_capabilities_test.cpp 3.1 KB

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