operand_capabilities_test.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  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. // Test capability dependencies for enums.
  15. #include <tuple>
  16. #include <vector>
  17. #include "gmock/gmock.h"
  18. #include "source/enum_set.h"
  19. #include "test/unit_spirv.h"
  20. namespace spvtools {
  21. namespace {
  22. using spvtest::ElementsIn;
  23. using ::testing::Combine;
  24. using ::testing::Eq;
  25. using ::testing::TestWithParam;
  26. using ::testing::Values;
  27. using ::testing::ValuesIn;
  28. // A test case for mapping an enum to a capability mask.
  29. struct EnumCapabilityCase {
  30. spv_operand_type_t type;
  31. uint32_t value;
  32. CapabilitySet expected_capabilities;
  33. };
  34. // Test fixture for testing EnumCapabilityCases.
  35. using EnumCapabilityTest =
  36. TestWithParam<std::tuple<spv_target_env, EnumCapabilityCase>>;
  37. TEST_P(EnumCapabilityTest, Sample) {
  38. const auto env = std::get<0>(GetParam());
  39. const auto context = spvContextCreate(env);
  40. const AssemblyGrammar grammar(context);
  41. spv_operand_desc entry;
  42. ASSERT_EQ(SPV_SUCCESS,
  43. grammar.lookupOperand(std::get<1>(GetParam()).type,
  44. std::get<1>(GetParam()).value, &entry));
  45. const auto cap_set = grammar.filterCapsAgainstTargetEnv(
  46. entry->capabilities, entry->numCapabilities);
  47. EXPECT_THAT(ElementsIn(cap_set),
  48. Eq(ElementsIn(std::get<1>(GetParam()).expected_capabilities)))
  49. << " capability value " << std::get<1>(GetParam()).value;
  50. spvContextDestroy(context);
  51. }
  52. #define CASE0(TYPE, VALUE) \
  53. { \
  54. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), {} \
  55. }
  56. #define CASE1(TYPE, VALUE, CAP) \
  57. { \
  58. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
  59. SpvCapability##CAP \
  60. } \
  61. }
  62. #define CASE2(TYPE, VALUE, CAP1, CAP2) \
  63. { \
  64. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
  65. SpvCapability##CAP1, SpvCapability##CAP2 \
  66. } \
  67. }
  68. #define CASE3(TYPE, VALUE, CAP1, CAP2, CAP3) \
  69. { \
  70. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
  71. SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3 \
  72. } \
  73. }
  74. #define CASE4(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4) \
  75. { \
  76. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
  77. SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3, \
  78. SpvCapability##CAP4 \
  79. } \
  80. }
  81. #define CASE5(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4, CAP5) \
  82. { \
  83. SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
  84. SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3, \
  85. SpvCapability##CAP4, SpvCapability##CAP5 \
  86. } \
  87. }
  88. // See SPIR-V Section 3.3 Execution Model
  89. INSTANTIATE_TEST_SUITE_P(
  90. ExecutionModel, EnumCapabilityTest,
  91. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  92. ValuesIn(std::vector<EnumCapabilityCase>{
  93. CASE1(EXECUTION_MODEL, ExecutionModelVertex, Shader),
  94. CASE1(EXECUTION_MODEL, ExecutionModelTessellationControl,
  95. Tessellation),
  96. CASE1(EXECUTION_MODEL, ExecutionModelTessellationEvaluation,
  97. Tessellation),
  98. CASE1(EXECUTION_MODEL, ExecutionModelGeometry, Geometry),
  99. CASE1(EXECUTION_MODEL, ExecutionModelFragment, Shader),
  100. CASE1(EXECUTION_MODEL, ExecutionModelGLCompute, Shader),
  101. CASE1(EXECUTION_MODEL, ExecutionModelKernel, Kernel),
  102. })));
  103. // See SPIR-V Section 3.4 Addressing Model
  104. INSTANTIATE_TEST_SUITE_P(
  105. AddressingModel, EnumCapabilityTest,
  106. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  107. ValuesIn(std::vector<EnumCapabilityCase>{
  108. CASE0(ADDRESSING_MODEL, AddressingModelLogical),
  109. CASE1(ADDRESSING_MODEL, AddressingModelPhysical32, Addresses),
  110. CASE1(ADDRESSING_MODEL, AddressingModelPhysical64, Addresses),
  111. })));
  112. // See SPIR-V Section 3.5 Memory Model
  113. INSTANTIATE_TEST_SUITE_P(
  114. MemoryModel, EnumCapabilityTest,
  115. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  116. ValuesIn(std::vector<EnumCapabilityCase>{
  117. CASE1(MEMORY_MODEL, MemoryModelSimple, Shader),
  118. CASE1(MEMORY_MODEL, MemoryModelGLSL450, Shader),
  119. CASE1(MEMORY_MODEL, MemoryModelOpenCL, Kernel),
  120. })));
  121. // See SPIR-V Section 3.6 Execution Mode
  122. INSTANTIATE_TEST_SUITE_P(
  123. ExecutionMode, EnumCapabilityTest,
  124. Combine(
  125. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  126. ValuesIn(std::vector<EnumCapabilityCase>{
  127. CASE1(EXECUTION_MODE, ExecutionModeInvocations, Geometry),
  128. CASE1(EXECUTION_MODE, ExecutionModeSpacingEqual, Tessellation),
  129. CASE1(EXECUTION_MODE, ExecutionModeSpacingFractionalEven,
  130. Tessellation),
  131. CASE1(EXECUTION_MODE, ExecutionModeSpacingFractionalOdd,
  132. Tessellation),
  133. CASE1(EXECUTION_MODE, ExecutionModeVertexOrderCw, Tessellation),
  134. CASE1(EXECUTION_MODE, ExecutionModeVertexOrderCcw, Tessellation),
  135. CASE1(EXECUTION_MODE, ExecutionModePixelCenterInteger, Shader),
  136. CASE1(EXECUTION_MODE, ExecutionModeOriginUpperLeft, Shader),
  137. CASE1(EXECUTION_MODE, ExecutionModeOriginLowerLeft, Shader),
  138. CASE1(EXECUTION_MODE, ExecutionModeEarlyFragmentTests, Shader),
  139. CASE1(EXECUTION_MODE, ExecutionModePointMode, Tessellation),
  140. CASE1(EXECUTION_MODE, ExecutionModeXfb, TransformFeedback),
  141. CASE1(EXECUTION_MODE, ExecutionModeDepthReplacing, Shader),
  142. CASE1(EXECUTION_MODE, ExecutionModeDepthGreater, Shader),
  143. CASE1(EXECUTION_MODE, ExecutionModeDepthLess, Shader),
  144. CASE1(EXECUTION_MODE, ExecutionModeDepthUnchanged, Shader),
  145. CASE0(EXECUTION_MODE, ExecutionModeLocalSize),
  146. CASE1(EXECUTION_MODE, ExecutionModeLocalSizeHint, Kernel),
  147. CASE1(EXECUTION_MODE, ExecutionModeInputPoints, Geometry),
  148. CASE1(EXECUTION_MODE, ExecutionModeInputLines, Geometry),
  149. CASE1(EXECUTION_MODE, ExecutionModeInputLinesAdjacency, Geometry),
  150. CASE2(EXECUTION_MODE, ExecutionModeTriangles, Geometry,
  151. Tessellation),
  152. CASE1(EXECUTION_MODE, ExecutionModeInputTrianglesAdjacency,
  153. Geometry),
  154. CASE1(EXECUTION_MODE, ExecutionModeQuads, Tessellation),
  155. CASE1(EXECUTION_MODE, ExecutionModeIsolines, Tessellation),
  156. CASE3(EXECUTION_MODE, ExecutionModeOutputVertices, Geometry,
  157. Tessellation, MeshShadingNV),
  158. CASE2(EXECUTION_MODE, ExecutionModeOutputPoints, Geometry,
  159. MeshShadingNV),
  160. CASE1(EXECUTION_MODE, ExecutionModeOutputLineStrip, Geometry),
  161. CASE1(EXECUTION_MODE, ExecutionModeOutputTriangleStrip, Geometry),
  162. CASE1(EXECUTION_MODE, ExecutionModeVecTypeHint, Kernel),
  163. CASE1(EXECUTION_MODE, ExecutionModeContractionOff, Kernel),
  164. })));
  165. INSTANTIATE_TEST_SUITE_P(
  166. ExecutionModeV11, EnumCapabilityTest,
  167. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  168. ValuesIn(std::vector<EnumCapabilityCase>{
  169. CASE1(EXECUTION_MODE, ExecutionModeInitializer, Kernel),
  170. CASE1(EXECUTION_MODE, ExecutionModeFinalizer, Kernel),
  171. CASE1(EXECUTION_MODE, ExecutionModeSubgroupSize,
  172. SubgroupDispatch),
  173. CASE1(EXECUTION_MODE, ExecutionModeSubgroupsPerWorkgroup,
  174. SubgroupDispatch)})));
  175. // See SPIR-V Section 3.7 Storage Class
  176. INSTANTIATE_TEST_SUITE_P(
  177. StorageClass, EnumCapabilityTest,
  178. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  179. ValuesIn(std::vector<EnumCapabilityCase>{
  180. CASE0(STORAGE_CLASS, StorageClassUniformConstant),
  181. CASE1(STORAGE_CLASS, StorageClassUniform, Shader),
  182. CASE1(STORAGE_CLASS, StorageClassOutput, Shader),
  183. CASE0(STORAGE_CLASS, StorageClassWorkgroup),
  184. CASE0(STORAGE_CLASS, StorageClassCrossWorkgroup),
  185. CASE1(STORAGE_CLASS, StorageClassPrivate, Shader),
  186. CASE0(STORAGE_CLASS, StorageClassFunction),
  187. CASE1(STORAGE_CLASS, StorageClassGeneric,
  188. GenericPointer), // Bug 14287
  189. CASE1(STORAGE_CLASS, StorageClassPushConstant, Shader),
  190. CASE1(STORAGE_CLASS, StorageClassAtomicCounter, AtomicStorage),
  191. CASE0(STORAGE_CLASS, StorageClassImage),
  192. })));
  193. // See SPIR-V Section 3.8 Dim
  194. INSTANTIATE_TEST_SUITE_P(
  195. Dim, EnumCapabilityTest,
  196. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  197. ValuesIn(std::vector<EnumCapabilityCase>{
  198. CASE2(DIMENSIONALITY, Dim1D, Sampled1D, Image1D),
  199. CASE3(DIMENSIONALITY, Dim2D, Kernel, Shader, ImageMSArray),
  200. CASE0(DIMENSIONALITY, Dim3D),
  201. CASE2(DIMENSIONALITY, DimCube, Shader, ImageCubeArray),
  202. CASE2(DIMENSIONALITY, DimRect, SampledRect, ImageRect),
  203. CASE2(DIMENSIONALITY, DimBuffer, SampledBuffer, ImageBuffer),
  204. CASE1(DIMENSIONALITY, DimSubpassData, InputAttachment),
  205. })));
  206. // See SPIR-V Section 3.9 Sampler Addressing Mode
  207. INSTANTIATE_TEST_SUITE_P(
  208. SamplerAddressingMode, EnumCapabilityTest,
  209. Combine(
  210. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  211. ValuesIn(std::vector<EnumCapabilityCase>{
  212. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeNone, Kernel),
  213. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeClampToEdge,
  214. Kernel),
  215. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeClamp, Kernel),
  216. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeRepeat, Kernel),
  217. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeRepeatMirrored,
  218. Kernel),
  219. })));
  220. // See SPIR-V Section 3.10 Sampler Filter Mode
  221. INSTANTIATE_TEST_SUITE_P(
  222. SamplerFilterMode, EnumCapabilityTest,
  223. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  224. ValuesIn(std::vector<EnumCapabilityCase>{
  225. CASE1(SAMPLER_FILTER_MODE, SamplerFilterModeNearest, Kernel),
  226. CASE1(SAMPLER_FILTER_MODE, SamplerFilterModeLinear, Kernel),
  227. })));
  228. // See SPIR-V Section 3.11 Image Format
  229. INSTANTIATE_TEST_SUITE_P(
  230. ImageFormat, EnumCapabilityTest,
  231. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  232. ValuesIn(std::vector<EnumCapabilityCase>{
  233. // clang-format off
  234. CASE0(SAMPLER_IMAGE_FORMAT, ImageFormatUnknown),
  235. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32f, Shader),
  236. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16f, Shader),
  237. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR32f, Shader),
  238. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8, Shader),
  239. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8Snorm, Shader),
  240. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32f, StorageImageExtendedFormats),
  241. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16f, StorageImageExtendedFormats),
  242. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR11fG11fB10f, StorageImageExtendedFormats),
  243. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16f, StorageImageExtendedFormats),
  244. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16, StorageImageExtendedFormats),
  245. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgb10A2, StorageImageExtendedFormats),
  246. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16, StorageImageExtendedFormats),
  247. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8, StorageImageExtendedFormats),
  248. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16, StorageImageExtendedFormats),
  249. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8, StorageImageExtendedFormats),
  250. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16Snorm, StorageImageExtendedFormats),
  251. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16Snorm, StorageImageExtendedFormats),
  252. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8Snorm, StorageImageExtendedFormats),
  253. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16Snorm, StorageImageExtendedFormats),
  254. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8Snorm, StorageImageExtendedFormats),
  255. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32i, Shader),
  256. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16i, Shader),
  257. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8i, Shader),
  258. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR32i, Shader),
  259. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32i, StorageImageExtendedFormats),
  260. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16i, StorageImageExtendedFormats),
  261. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8i, StorageImageExtendedFormats),
  262. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16i, StorageImageExtendedFormats),
  263. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8i, StorageImageExtendedFormats),
  264. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32ui, Shader),
  265. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16ui, Shader),
  266. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8ui, Shader),
  267. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8ui, Shader),
  268. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgb10a2ui, StorageImageExtendedFormats),
  269. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32ui, StorageImageExtendedFormats),
  270. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16ui, StorageImageExtendedFormats),
  271. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8ui, StorageImageExtendedFormats),
  272. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16ui, StorageImageExtendedFormats),
  273. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8ui, StorageImageExtendedFormats),
  274. // clang-format on
  275. })));
  276. // See SPIR-V Section 3.12 Image Channel Order
  277. INSTANTIATE_TEST_SUITE_P(
  278. ImageChannelOrder, EnumCapabilityTest,
  279. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  280. ValuesIn(std::vector<EnumCapabilityCase>{
  281. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderR, Kernel),
  282. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderA, Kernel),
  283. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRG, Kernel),
  284. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRA, Kernel),
  285. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGB, Kernel),
  286. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGBA, Kernel),
  287. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderBGRA, Kernel),
  288. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderARGB, Kernel),
  289. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderIntensity, Kernel),
  290. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderLuminance, Kernel),
  291. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRx, Kernel),
  292. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGx, Kernel),
  293. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGBx, Kernel),
  294. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderDepth, Kernel),
  295. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderDepthStencil,
  296. Kernel),
  297. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGB, Kernel),
  298. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGBx, Kernel),
  299. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGBA, Kernel),
  300. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersBGRA, Kernel),
  301. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderABGR, Kernel),
  302. })));
  303. // See SPIR-V Section 3.13 Image Channel Data Type
  304. INSTANTIATE_TEST_SUITE_P(
  305. ImageChannelDataType, EnumCapabilityTest,
  306. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  307. ValuesIn(std::vector<EnumCapabilityCase>{
  308. // clang-format off
  309. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSnormInt8, Kernel),
  310. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSnormInt16, Kernel),
  311. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt8, Kernel),
  312. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt16, Kernel),
  313. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormShort565, Kernel),
  314. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormShort555, Kernel),
  315. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt101010, Kernel),
  316. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt8, Kernel),
  317. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt16, Kernel),
  318. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt32, Kernel),
  319. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt8, Kernel),
  320. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt16, Kernel),
  321. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt32, Kernel),
  322. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeHalfFloat, Kernel),
  323. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeFloat, Kernel),
  324. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt24, Kernel),
  325. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt101010_2, Kernel),
  326. // clang-format on
  327. })));
  328. // See SPIR-V Section 3.14 Image Operands
  329. INSTANTIATE_TEST_SUITE_P(
  330. ImageOperands, EnumCapabilityTest,
  331. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  332. ValuesIn(std::vector<EnumCapabilityCase>{
  333. // clang-format off
  334. CASE0(OPTIONAL_IMAGE, ImageOperandsMaskNone),
  335. CASE1(OPTIONAL_IMAGE, ImageOperandsBiasMask, Shader),
  336. CASE0(OPTIONAL_IMAGE, ImageOperandsLodMask),
  337. CASE0(OPTIONAL_IMAGE, ImageOperandsGradMask),
  338. CASE0(OPTIONAL_IMAGE, ImageOperandsConstOffsetMask),
  339. CASE1(OPTIONAL_IMAGE, ImageOperandsOffsetMask, ImageGatherExtended),
  340. CASE1(OPTIONAL_IMAGE, ImageOperandsConstOffsetsMask, ImageGatherExtended),
  341. CASE0(OPTIONAL_IMAGE, ImageOperandsSampleMask),
  342. CASE1(OPTIONAL_IMAGE, ImageOperandsMinLodMask, MinLod),
  343. // clang-format on
  344. })));
  345. // See SPIR-V Section 3.15 FP Fast Math Mode
  346. INSTANTIATE_TEST_SUITE_P(
  347. FPFastMathMode, EnumCapabilityTest,
  348. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  349. ValuesIn(std::vector<EnumCapabilityCase>{
  350. CASE0(FP_FAST_MATH_MODE, FPFastMathModeMaskNone),
  351. CASE1(FP_FAST_MATH_MODE, FPFastMathModeNotNaNMask, Kernel),
  352. CASE1(FP_FAST_MATH_MODE, FPFastMathModeNotInfMask, Kernel),
  353. CASE1(FP_FAST_MATH_MODE, FPFastMathModeNSZMask, Kernel),
  354. CASE1(FP_FAST_MATH_MODE, FPFastMathModeAllowRecipMask, Kernel),
  355. CASE1(FP_FAST_MATH_MODE, FPFastMathModeFastMask, Kernel),
  356. })));
  357. // See SPIR-V Section 3.17 Linkage Type
  358. INSTANTIATE_TEST_SUITE_P(
  359. LinkageType, EnumCapabilityTest,
  360. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  361. ValuesIn(std::vector<EnumCapabilityCase>{
  362. CASE1(LINKAGE_TYPE, LinkageTypeExport, Linkage),
  363. CASE1(LINKAGE_TYPE, LinkageTypeImport, Linkage),
  364. })));
  365. // See SPIR-V Section 3.18 Access Qualifier
  366. INSTANTIATE_TEST_SUITE_P(
  367. AccessQualifier, EnumCapabilityTest,
  368. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  369. ValuesIn(std::vector<EnumCapabilityCase>{
  370. CASE1(ACCESS_QUALIFIER, AccessQualifierReadOnly, Kernel),
  371. CASE1(ACCESS_QUALIFIER, AccessQualifierWriteOnly, Kernel),
  372. CASE1(ACCESS_QUALIFIER, AccessQualifierReadWrite, Kernel),
  373. })));
  374. // See SPIR-V Section 3.19 Function Parameter Attribute
  375. INSTANTIATE_TEST_SUITE_P(
  376. FunctionParameterAttribute, EnumCapabilityTest,
  377. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  378. ValuesIn(std::vector<EnumCapabilityCase>{
  379. // clang-format off
  380. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeZext, Kernel),
  381. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeSext, Kernel),
  382. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeByVal, Kernel),
  383. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeSret, Kernel),
  384. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoAlias, Kernel),
  385. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoCapture, Kernel),
  386. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoWrite, Kernel),
  387. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoReadWrite, Kernel),
  388. // clang-format on
  389. })));
  390. // See SPIR-V Section 3.20 Decoration
  391. INSTANTIATE_TEST_SUITE_P(
  392. Decoration, EnumCapabilityTest,
  393. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  394. ValuesIn(std::vector<EnumCapabilityCase>{
  395. CASE1(DECORATION, DecorationRelaxedPrecision, Shader),
  396. // DecorationSpecId handled below.
  397. CASE1(DECORATION, DecorationBlock, Shader),
  398. CASE1(DECORATION, DecorationBufferBlock, Shader),
  399. CASE1(DECORATION, DecorationRowMajor, Matrix),
  400. CASE1(DECORATION, DecorationColMajor, Matrix),
  401. CASE1(DECORATION, DecorationArrayStride, Shader),
  402. CASE1(DECORATION, DecorationMatrixStride, Matrix), // Bug 15234
  403. CASE1(DECORATION, DecorationGLSLShared, Shader),
  404. CASE1(DECORATION, DecorationGLSLPacked, Shader),
  405. CASE1(DECORATION, DecorationCPacked, Kernel),
  406. CASE0(DECORATION, DecorationBuiltIn), // Bug 15248
  407. // Value 12 placeholder
  408. CASE1(DECORATION, DecorationNoPerspective, Shader),
  409. CASE1(DECORATION, DecorationFlat, Shader),
  410. CASE1(DECORATION, DecorationPatch, Tessellation),
  411. CASE1(DECORATION, DecorationCentroid, Shader),
  412. CASE1(DECORATION, DecorationSample,
  413. SampleRateShading), // Bug 15234
  414. CASE1(DECORATION, DecorationInvariant, Shader),
  415. CASE0(DECORATION, DecorationRestrict),
  416. CASE0(DECORATION, DecorationAliased),
  417. CASE0(DECORATION, DecorationVolatile),
  418. CASE1(DECORATION, DecorationConstant, Kernel),
  419. CASE0(DECORATION, DecorationCoherent),
  420. CASE0(DECORATION, DecorationNonWritable),
  421. CASE0(DECORATION, DecorationNonReadable),
  422. CASE1(DECORATION, DecorationUniform, Shader),
  423. // Value 27 is an intentional gap in the spec numbering.
  424. CASE1(DECORATION, DecorationSaturatedConversion, Kernel),
  425. CASE1(DECORATION, DecorationStream, GeometryStreams),
  426. CASE1(DECORATION, DecorationLocation, Shader),
  427. CASE1(DECORATION, DecorationComponent, Shader),
  428. CASE1(DECORATION, DecorationIndex, Shader),
  429. CASE1(DECORATION, DecorationBinding, Shader),
  430. CASE1(DECORATION, DecorationDescriptorSet, Shader),
  431. CASE1(DECORATION, DecorationOffset, Shader), // Bug 15268
  432. CASE1(DECORATION, DecorationXfbBuffer, TransformFeedback),
  433. CASE1(DECORATION, DecorationXfbStride, TransformFeedback),
  434. CASE1(DECORATION, DecorationFuncParamAttr, Kernel),
  435. CASE1(DECORATION, DecorationFPFastMathMode, Kernel),
  436. CASE1(DECORATION, DecorationLinkageAttributes, Linkage),
  437. CASE1(DECORATION, DecorationNoContraction, Shader),
  438. CASE1(DECORATION, DecorationInputAttachmentIndex,
  439. InputAttachment),
  440. CASE1(DECORATION, DecorationAlignment, Kernel),
  441. })));
  442. #if 0
  443. // SpecId has different requirements in v1.0 and v1.1:
  444. INSTANTIATE_TEST_SUITE_P(DecorationSpecIdV10, EnumCapabilityTest,
  445. Combine(Values(SPV_ENV_UNIVERSAL_1_0),
  446. ValuesIn(std::vector<EnumCapabilityCase>{CASE1(
  447. DECORATION, DecorationSpecId, Shader)})));
  448. #endif
  449. INSTANTIATE_TEST_SUITE_P(
  450. DecorationV11, EnumCapabilityTest,
  451. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  452. ValuesIn(std::vector<EnumCapabilityCase>{
  453. CASE2(DECORATION, DecorationSpecId, Shader, Kernel),
  454. CASE1(DECORATION, DecorationMaxByteOffset, Addresses)})));
  455. // See SPIR-V Section 3.21 BuiltIn
  456. INSTANTIATE_TEST_SUITE_P(
  457. BuiltIn, EnumCapabilityTest,
  458. Combine(
  459. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  460. ValuesIn(std::vector<EnumCapabilityCase>{
  461. // clang-format off
  462. CASE1(BUILT_IN, BuiltInPosition, Shader),
  463. CASE1(BUILT_IN, BuiltInPointSize, Shader),
  464. // 2 is an intentional gap in the spec numbering.
  465. CASE1(BUILT_IN, BuiltInClipDistance, ClipDistance), // Bug 1407, 15234
  466. CASE1(BUILT_IN, BuiltInCullDistance, CullDistance), // Bug 1407, 15234
  467. CASE1(BUILT_IN, BuiltInVertexId, Shader),
  468. CASE1(BUILT_IN, BuiltInInstanceId, Shader),
  469. CASE5(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation,
  470. RayTracingNV, RayTracingKHR, MeshShadingNV),
  471. CASE2(BUILT_IN, BuiltInInvocationId, Geometry, Tessellation),
  472. CASE3(BUILT_IN, BuiltInLayer, Geometry, ShaderViewportIndexLayerEXT, MeshShadingNV),
  473. CASE3(BUILT_IN, BuiltInViewportIndex, MultiViewport, ShaderViewportIndexLayerEXT, MeshShadingNV), // Bug 15234
  474. CASE1(BUILT_IN, BuiltInTessLevelOuter, Tessellation),
  475. CASE1(BUILT_IN, BuiltInTessLevelInner, Tessellation),
  476. CASE1(BUILT_IN, BuiltInTessCoord, Tessellation),
  477. CASE1(BUILT_IN, BuiltInPatchVertices, Tessellation),
  478. CASE1(BUILT_IN, BuiltInFragCoord, Shader),
  479. CASE1(BUILT_IN, BuiltInPointCoord, Shader),
  480. CASE1(BUILT_IN, BuiltInFrontFacing, Shader),
  481. CASE1(BUILT_IN, BuiltInSampleId, SampleRateShading), // Bug 15234
  482. CASE1(BUILT_IN, BuiltInSamplePosition, SampleRateShading), // Bug 15234
  483. CASE1(BUILT_IN, BuiltInSampleMask, Shader), // Bug 15234, Issue 182
  484. // Value 21 intentionally missing
  485. CASE1(BUILT_IN, BuiltInFragDepth, Shader),
  486. CASE1(BUILT_IN, BuiltInHelperInvocation, Shader),
  487. CASE0(BUILT_IN, BuiltInNumWorkgroups),
  488. CASE0(BUILT_IN, BuiltInWorkgroupSize),
  489. CASE0(BUILT_IN, BuiltInWorkgroupId),
  490. CASE0(BUILT_IN, BuiltInLocalInvocationId),
  491. CASE0(BUILT_IN, BuiltInGlobalInvocationId),
  492. CASE0(BUILT_IN, BuiltInLocalInvocationIndex),
  493. CASE1(BUILT_IN, BuiltInWorkDim, Kernel),
  494. CASE1(BUILT_IN, BuiltInGlobalSize, Kernel),
  495. CASE1(BUILT_IN, BuiltInEnqueuedWorkgroupSize, Kernel),
  496. CASE1(BUILT_IN, BuiltInGlobalOffset, Kernel),
  497. CASE1(BUILT_IN, BuiltInGlobalLinearId, Kernel),
  498. // Value 35 intentionally missing
  499. CASE2(BUILT_IN, BuiltInSubgroupSize, Kernel, SubgroupBallotKHR),
  500. CASE1(BUILT_IN, BuiltInSubgroupMaxSize, Kernel),
  501. CASE1(BUILT_IN, BuiltInNumSubgroups, Kernel),
  502. CASE1(BUILT_IN, BuiltInNumEnqueuedSubgroups, Kernel),
  503. CASE1(BUILT_IN, BuiltInSubgroupId, Kernel),
  504. CASE2(BUILT_IN, BuiltInSubgroupLocalInvocationId, Kernel, SubgroupBallotKHR),
  505. CASE1(BUILT_IN, BuiltInVertexIndex, Shader),
  506. CASE1(BUILT_IN, BuiltInInstanceIndex, Shader),
  507. // clang-format on
  508. })));
  509. INSTANTIATE_TEST_SUITE_P(
  510. BuiltInV1_5, EnumCapabilityTest,
  511. Combine(
  512. Values(SPV_ENV_UNIVERSAL_1_5),
  513. ValuesIn(std::vector<EnumCapabilityCase>{
  514. // SPIR-V 1.5 adds new capabilities to enable these two builtins.
  515. CASE4(BUILT_IN, BuiltInLayer, Geometry, ShaderLayer,
  516. ShaderViewportIndexLayerEXT, MeshShadingNV),
  517. CASE4(BUILT_IN, BuiltInViewportIndex, MultiViewport,
  518. ShaderViewportIndex, ShaderViewportIndexLayerEXT,
  519. MeshShadingNV),
  520. })));
  521. // See SPIR-V Section 3.22 Selection Control
  522. INSTANTIATE_TEST_SUITE_P(
  523. SelectionControl, EnumCapabilityTest,
  524. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  525. ValuesIn(std::vector<EnumCapabilityCase>{
  526. CASE0(SELECTION_CONTROL, SelectionControlMaskNone),
  527. CASE0(SELECTION_CONTROL, SelectionControlFlattenMask),
  528. CASE0(SELECTION_CONTROL, SelectionControlDontFlattenMask),
  529. })));
  530. // See SPIR-V Section 3.23 Loop Control
  531. INSTANTIATE_TEST_SUITE_P(
  532. LoopControl, EnumCapabilityTest,
  533. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  534. ValuesIn(std::vector<EnumCapabilityCase>{
  535. CASE0(LOOP_CONTROL, LoopControlMaskNone),
  536. CASE0(LOOP_CONTROL, LoopControlUnrollMask),
  537. CASE0(LOOP_CONTROL, LoopControlDontUnrollMask),
  538. })));
  539. INSTANTIATE_TEST_SUITE_P(
  540. LoopControlV11, EnumCapabilityTest,
  541. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  542. ValuesIn(std::vector<EnumCapabilityCase>{
  543. CASE0(LOOP_CONTROL, LoopControlDependencyInfiniteMask),
  544. CASE0(LOOP_CONTROL, LoopControlDependencyLengthMask),
  545. })));
  546. // See SPIR-V Section 3.24 Function Control
  547. INSTANTIATE_TEST_SUITE_P(
  548. FunctionControl, EnumCapabilityTest,
  549. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  550. ValuesIn(std::vector<EnumCapabilityCase>{
  551. CASE0(FUNCTION_CONTROL, FunctionControlMaskNone),
  552. CASE0(FUNCTION_CONTROL, FunctionControlInlineMask),
  553. CASE0(FUNCTION_CONTROL, FunctionControlDontInlineMask),
  554. CASE0(FUNCTION_CONTROL, FunctionControlPureMask),
  555. CASE0(FUNCTION_CONTROL, FunctionControlConstMask),
  556. })));
  557. // See SPIR-V Section 3.25 Memory Semantics <id>
  558. INSTANTIATE_TEST_SUITE_P(
  559. MemorySemantics, EnumCapabilityTest,
  560. Combine(
  561. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  562. ValuesIn(std::vector<EnumCapabilityCase>{
  563. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMaskNone),
  564. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsAcquireMask),
  565. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsReleaseMask),
  566. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsAcquireReleaseMask),
  567. CASE0(MEMORY_SEMANTICS_ID,
  568. MemorySemanticsSequentiallyConsistentMask),
  569. CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsUniformMemoryMask,
  570. Shader),
  571. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsSubgroupMemoryMask),
  572. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsWorkgroupMemoryMask),
  573. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsCrossWorkgroupMemoryMask),
  574. CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsAtomicCounterMemoryMask,
  575. AtomicStorage), // Bug 15234
  576. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsImageMemoryMask),
  577. })));
  578. // See SPIR-V Section 3.26 Memory Access
  579. INSTANTIATE_TEST_SUITE_P(
  580. MemoryAccess, EnumCapabilityTest,
  581. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  582. ValuesIn(std::vector<EnumCapabilityCase>{
  583. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMaskNone),
  584. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessVolatileMask),
  585. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessAlignedMask),
  586. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessNontemporalMask),
  587. })));
  588. // See SPIR-V Section 3.27 Scope <id>
  589. INSTANTIATE_TEST_SUITE_P(
  590. Scope, EnumCapabilityTest,
  591. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
  592. SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
  593. ValuesIn(std::vector<EnumCapabilityCase>{
  594. CASE0(SCOPE_ID, ScopeCrossDevice),
  595. CASE0(SCOPE_ID, ScopeDevice),
  596. CASE0(SCOPE_ID, ScopeWorkgroup),
  597. CASE0(SCOPE_ID, ScopeSubgroup),
  598. CASE0(SCOPE_ID, ScopeInvocation),
  599. CASE1(SCOPE_ID, ScopeQueueFamilyKHR, VulkanMemoryModelKHR),
  600. })));
  601. // See SPIR-V Section 3.28 Group Operation
  602. INSTANTIATE_TEST_SUITE_P(
  603. GroupOperation, EnumCapabilityTest,
  604. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  605. ValuesIn(std::vector<EnumCapabilityCase>{
  606. CASE3(GROUP_OPERATION, GroupOperationReduce, Kernel,
  607. GroupNonUniformArithmetic, GroupNonUniformBallot),
  608. CASE3(GROUP_OPERATION, GroupOperationInclusiveScan, Kernel,
  609. GroupNonUniformArithmetic, GroupNonUniformBallot),
  610. CASE3(GROUP_OPERATION, GroupOperationExclusiveScan, Kernel,
  611. GroupNonUniformArithmetic, GroupNonUniformBallot),
  612. })));
  613. // See SPIR-V Section 3.29 Kernel Enqueue Flags
  614. INSTANTIATE_TEST_SUITE_P(
  615. KernelEnqueueFlags, EnumCapabilityTest,
  616. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  617. ValuesIn(std::vector<EnumCapabilityCase>{
  618. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsNoWait, Kernel),
  619. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsWaitKernel, Kernel),
  620. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsWaitWorkGroup,
  621. Kernel),
  622. })));
  623. // See SPIR-V Section 3.30 Kernel Profiling Info
  624. INSTANTIATE_TEST_SUITE_P(
  625. KernelProfilingInfo, EnumCapabilityTest,
  626. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  627. ValuesIn(std::vector<EnumCapabilityCase>{
  628. CASE0(KERNEL_PROFILING_INFO, KernelProfilingInfoMaskNone),
  629. CASE1(KERNEL_PROFILING_INFO, KernelProfilingInfoCmdExecTimeMask,
  630. Kernel),
  631. })));
  632. // See SPIR-V Section 3.31 Capability
  633. INSTANTIATE_TEST_SUITE_P(
  634. CapabilityDependsOn, EnumCapabilityTest,
  635. Combine(
  636. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  637. ValuesIn(std::vector<EnumCapabilityCase>{
  638. // clang-format off
  639. CASE0(CAPABILITY, CapabilityMatrix),
  640. CASE1(CAPABILITY, CapabilityShader, Matrix),
  641. CASE1(CAPABILITY, CapabilityGeometry, Shader),
  642. CASE1(CAPABILITY, CapabilityTessellation, Shader),
  643. CASE0(CAPABILITY, CapabilityAddresses),
  644. CASE0(CAPABILITY, CapabilityLinkage),
  645. CASE0(CAPABILITY, CapabilityKernel),
  646. CASE1(CAPABILITY, CapabilityVector16, Kernel),
  647. CASE1(CAPABILITY, CapabilityFloat16Buffer, Kernel),
  648. CASE0(CAPABILITY, CapabilityFloat16), // Bug 15234
  649. CASE0(CAPABILITY, CapabilityFloat64),
  650. CASE0(CAPABILITY, CapabilityInt64),
  651. CASE1(CAPABILITY, CapabilityInt64Atomics, Int64),
  652. CASE1(CAPABILITY, CapabilityImageBasic, Kernel),
  653. CASE1(CAPABILITY, CapabilityImageReadWrite, ImageBasic),
  654. CASE1(CAPABILITY, CapabilityImageMipmap, ImageBasic),
  655. // Value 16 intentionally missing.
  656. CASE1(CAPABILITY, CapabilityPipes, Kernel),
  657. CASE0(CAPABILITY, CapabilityGroups),
  658. CASE1(CAPABILITY, CapabilityDeviceEnqueue, Kernel),
  659. CASE1(CAPABILITY, CapabilityLiteralSampler, Kernel),
  660. CASE1(CAPABILITY, CapabilityAtomicStorage, Shader),
  661. CASE0(CAPABILITY, CapabilityInt16),
  662. CASE1(CAPABILITY, CapabilityTessellationPointSize, Tessellation),
  663. CASE1(CAPABILITY, CapabilityGeometryPointSize, Geometry),
  664. CASE1(CAPABILITY, CapabilityImageGatherExtended, Shader),
  665. // Value 26 intentionally missing.
  666. CASE1(CAPABILITY, CapabilityStorageImageMultisample, Shader),
  667. CASE1(CAPABILITY, CapabilityUniformBufferArrayDynamicIndexing, Shader),
  668. CASE1(CAPABILITY, CapabilitySampledImageArrayDynamicIndexing, Shader),
  669. CASE1(CAPABILITY, CapabilityStorageBufferArrayDynamicIndexing, Shader),
  670. CASE1(CAPABILITY, CapabilityStorageImageArrayDynamicIndexing, Shader),
  671. CASE1(CAPABILITY, CapabilityClipDistance, Shader),
  672. CASE1(CAPABILITY, CapabilityCullDistance, Shader),
  673. CASE1(CAPABILITY, CapabilityImageCubeArray, SampledCubeArray),
  674. CASE1(CAPABILITY, CapabilitySampleRateShading, Shader),
  675. CASE1(CAPABILITY, CapabilityImageRect, SampledRect),
  676. CASE1(CAPABILITY, CapabilitySampledRect, Shader),
  677. CASE1(CAPABILITY, CapabilityGenericPointer, Addresses),
  678. CASE0(CAPABILITY, CapabilityInt8),
  679. CASE1(CAPABILITY, CapabilityInputAttachment, Shader),
  680. CASE1(CAPABILITY, CapabilitySparseResidency, Shader),
  681. CASE1(CAPABILITY, CapabilityMinLod, Shader),
  682. CASE1(CAPABILITY, CapabilityImage1D, Sampled1D),
  683. CASE1(CAPABILITY, CapabilitySampledCubeArray, Shader),
  684. CASE1(CAPABILITY, CapabilityImageBuffer, SampledBuffer),
  685. CASE1(CAPABILITY, CapabilityImageMSArray, Shader),
  686. CASE1(CAPABILITY, CapabilityStorageImageExtendedFormats, Shader),
  687. CASE1(CAPABILITY, CapabilityImageQuery, Shader),
  688. CASE1(CAPABILITY, CapabilityDerivativeControl, Shader),
  689. CASE1(CAPABILITY, CapabilityInterpolationFunction, Shader),
  690. CASE1(CAPABILITY, CapabilityTransformFeedback, Shader),
  691. CASE1(CAPABILITY, CapabilityGeometryStreams, Geometry),
  692. CASE1(CAPABILITY, CapabilityStorageImageReadWithoutFormat, Shader),
  693. CASE1(CAPABILITY, CapabilityStorageImageWriteWithoutFormat, Shader),
  694. CASE1(CAPABILITY, CapabilityMultiViewport, Geometry),
  695. // clang-format on
  696. })));
  697. INSTANTIATE_TEST_SUITE_P(
  698. CapabilityDependsOnV11, EnumCapabilityTest,
  699. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  700. ValuesIn(std::vector<EnumCapabilityCase>{
  701. CASE1(CAPABILITY, CapabilitySubgroupDispatch, DeviceEnqueue),
  702. CASE1(CAPABILITY, CapabilityNamedBarrier, Kernel),
  703. CASE1(CAPABILITY, CapabilityPipeStorage, Pipes),
  704. })));
  705. #undef CASE0
  706. #undef CASE1
  707. #undef CASE2
  708. } // namespace
  709. } // namespace spvtools