operand_capabilities_test.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  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. spv::Capability::CAP \
  60. } \
  61. }
  62. #define CASE2(TYPE, VALUE, CAP1, CAP2) \
  63. { \
  64. SPV_OPERAND_TYPE_##TYPE, uint32_t(spv::VALUE), CapabilitySet { \
  65. spv::Capability::CAP1, spv::Capability::CAP2 \
  66. } \
  67. }
  68. #define CASE3(TYPE, VALUE, CAP1, CAP2, CAP3) \
  69. { \
  70. SPV_OPERAND_TYPE_##TYPE, uint32_t(spv::VALUE), CapabilitySet { \
  71. spv::Capability::CAP1, spv::Capability::CAP2, spv::Capability::CAP3 \
  72. } \
  73. }
  74. #define CASE4(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4) \
  75. { \
  76. SPV_OPERAND_TYPE_##TYPE, uint32_t(spv::VALUE), CapabilitySet { \
  77. spv::Capability::CAP1, spv::Capability::CAP2, spv::Capability::CAP3, \
  78. spv::Capability::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. spv::Capability::CAP1, spv::Capability::CAP2, spv::Capability::CAP3, \
  85. spv::Capability::CAP4, spv::Capability::CAP5 \
  86. } \
  87. }
  88. #define CASE6(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4, CAP5, CAP6) \
  89. { \
  90. SPV_OPERAND_TYPE_##TYPE, uint32_t(spv::VALUE), CapabilitySet { \
  91. spv::Capability::CAP1, spv::Capability::CAP2, spv::Capability::CAP3, \
  92. spv::Capability::CAP4, spv::Capability::CAP5, spv::Capability::CAP6 \
  93. } \
  94. }
  95. // See SPIR-V Section 3.3 Execution Model
  96. INSTANTIATE_TEST_SUITE_P(
  97. ExecutionModel, EnumCapabilityTest,
  98. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  99. ValuesIn(std::vector<EnumCapabilityCase>{
  100. CASE1(EXECUTION_MODEL, ExecutionModel::Vertex, Shader),
  101. CASE1(EXECUTION_MODEL, ExecutionModel::TessellationControl,
  102. Tessellation),
  103. CASE1(EXECUTION_MODEL, ExecutionModel::TessellationEvaluation,
  104. Tessellation),
  105. CASE1(EXECUTION_MODEL, ExecutionModel::Geometry, Geometry),
  106. CASE1(EXECUTION_MODEL, ExecutionModel::Fragment, Shader),
  107. CASE1(EXECUTION_MODEL, ExecutionModel::GLCompute, Shader),
  108. CASE1(EXECUTION_MODEL, ExecutionModel::Kernel, Kernel),
  109. })));
  110. // See SPIR-V Section 3.4 Addressing Model
  111. INSTANTIATE_TEST_SUITE_P(
  112. AddressingModel, EnumCapabilityTest,
  113. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  114. ValuesIn(std::vector<EnumCapabilityCase>{
  115. CASE0(ADDRESSING_MODEL, AddressingModel::Logical),
  116. CASE1(ADDRESSING_MODEL, AddressingModel::Physical32, Addresses),
  117. CASE1(ADDRESSING_MODEL, AddressingModel::Physical64, Addresses),
  118. })));
  119. // See SPIR-V Section 3.5 Memory Model
  120. INSTANTIATE_TEST_SUITE_P(
  121. MemoryModel, EnumCapabilityTest,
  122. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  123. ValuesIn(std::vector<EnumCapabilityCase>{
  124. CASE1(MEMORY_MODEL, MemoryModel::Simple, Shader),
  125. CASE1(MEMORY_MODEL, MemoryModel::GLSL450, Shader),
  126. CASE1(MEMORY_MODEL, MemoryModel::OpenCL, Kernel),
  127. })));
  128. // See SPIR-V Section 3.6 Execution Mode
  129. INSTANTIATE_TEST_SUITE_P(
  130. ExecutionMode, EnumCapabilityTest,
  131. Combine(
  132. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  133. ValuesIn(std::vector<EnumCapabilityCase>{
  134. CASE1(EXECUTION_MODE, ExecutionMode::Invocations, Geometry),
  135. CASE1(EXECUTION_MODE, ExecutionMode::SpacingEqual, Tessellation),
  136. CASE1(EXECUTION_MODE, ExecutionMode::SpacingFractionalEven,
  137. Tessellation),
  138. CASE1(EXECUTION_MODE, ExecutionMode::SpacingFractionalOdd,
  139. Tessellation),
  140. CASE1(EXECUTION_MODE, ExecutionMode::VertexOrderCw, Tessellation),
  141. CASE1(EXECUTION_MODE, ExecutionMode::VertexOrderCcw, Tessellation),
  142. CASE1(EXECUTION_MODE, ExecutionMode::PixelCenterInteger, Shader),
  143. CASE1(EXECUTION_MODE, ExecutionMode::OriginUpperLeft, Shader),
  144. CASE1(EXECUTION_MODE, ExecutionMode::OriginLowerLeft, Shader),
  145. CASE1(EXECUTION_MODE, ExecutionMode::EarlyFragmentTests, Shader),
  146. CASE1(EXECUTION_MODE, ExecutionMode::PointMode, Tessellation),
  147. CASE1(EXECUTION_MODE, ExecutionMode::Xfb, TransformFeedback),
  148. CASE1(EXECUTION_MODE, ExecutionMode::DepthReplacing, Shader),
  149. CASE1(EXECUTION_MODE, ExecutionMode::DepthGreater, Shader),
  150. CASE1(EXECUTION_MODE, ExecutionMode::DepthLess, Shader),
  151. CASE1(EXECUTION_MODE, ExecutionMode::DepthUnchanged, Shader),
  152. CASE0(EXECUTION_MODE, ExecutionMode::LocalSize),
  153. CASE1(EXECUTION_MODE, ExecutionMode::LocalSizeHint, Kernel),
  154. CASE1(EXECUTION_MODE, ExecutionMode::InputPoints, Geometry),
  155. CASE1(EXECUTION_MODE, ExecutionMode::InputLines, Geometry),
  156. CASE1(EXECUTION_MODE, ExecutionMode::InputLinesAdjacency, Geometry),
  157. CASE2(EXECUTION_MODE, ExecutionMode::Triangles, Geometry,
  158. Tessellation),
  159. CASE1(EXECUTION_MODE, ExecutionMode::InputTrianglesAdjacency,
  160. Geometry),
  161. CASE1(EXECUTION_MODE, ExecutionMode::Quads, Tessellation),
  162. CASE1(EXECUTION_MODE, ExecutionMode::Isolines, Tessellation),
  163. CASE4(EXECUTION_MODE, ExecutionMode::OutputVertices, Geometry,
  164. Tessellation, MeshShadingNV, MeshShadingEXT),
  165. CASE3(EXECUTION_MODE, ExecutionMode::OutputPoints, Geometry,
  166. MeshShadingNV, MeshShadingEXT),
  167. CASE1(EXECUTION_MODE, ExecutionMode::OutputLineStrip, Geometry),
  168. CASE1(EXECUTION_MODE, ExecutionMode::OutputTriangleStrip, Geometry),
  169. CASE1(EXECUTION_MODE, ExecutionMode::VecTypeHint, Kernel),
  170. CASE1(EXECUTION_MODE, ExecutionMode::ContractionOff, Kernel),
  171. })));
  172. INSTANTIATE_TEST_SUITE_P(
  173. ExecutionModeV11, EnumCapabilityTest,
  174. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  175. ValuesIn(std::vector<EnumCapabilityCase>{
  176. CASE1(EXECUTION_MODE, ExecutionMode::Initializer, Kernel),
  177. CASE1(EXECUTION_MODE, ExecutionMode::Finalizer, Kernel),
  178. CASE1(EXECUTION_MODE, ExecutionMode::SubgroupSize,
  179. SubgroupDispatch),
  180. CASE1(EXECUTION_MODE, ExecutionMode::SubgroupsPerWorkgroup,
  181. SubgroupDispatch)})));
  182. // See SPIR-V Section 3.7 Storage Class
  183. INSTANTIATE_TEST_SUITE_P(
  184. StorageClass, EnumCapabilityTest,
  185. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  186. ValuesIn(std::vector<EnumCapabilityCase>{
  187. CASE0(STORAGE_CLASS, StorageClass::UniformConstant),
  188. CASE1(STORAGE_CLASS, StorageClass::Uniform, Shader),
  189. CASE1(STORAGE_CLASS, StorageClass::Output, Shader),
  190. CASE0(STORAGE_CLASS, StorageClass::Workgroup),
  191. CASE0(STORAGE_CLASS, StorageClass::CrossWorkgroup),
  192. CASE2(STORAGE_CLASS, StorageClass::Private, Shader,
  193. VectorComputeINTEL),
  194. CASE0(STORAGE_CLASS, StorageClass::Function),
  195. CASE1(STORAGE_CLASS, StorageClass::Generic,
  196. GenericPointer), // Bug 14287
  197. CASE1(STORAGE_CLASS, StorageClass::PushConstant, Shader),
  198. CASE1(STORAGE_CLASS, StorageClass::AtomicCounter,
  199. AtomicStorage),
  200. CASE0(STORAGE_CLASS, StorageClass::Image),
  201. })));
  202. // See SPIR-V Section 3.8 Dim
  203. INSTANTIATE_TEST_SUITE_P(
  204. Dim, EnumCapabilityTest,
  205. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  206. ValuesIn(std::vector<EnumCapabilityCase>{
  207. CASE2(DIMENSIONALITY, Dim::Dim1D, Sampled1D, Image1D),
  208. CASE3(DIMENSIONALITY, Dim::Dim2D, Kernel, Shader, ImageMSArray),
  209. CASE0(DIMENSIONALITY, Dim::Dim3D),
  210. CASE2(DIMENSIONALITY, Dim::Cube, Shader, ImageCubeArray),
  211. CASE2(DIMENSIONALITY, Dim::Rect, SampledRect, ImageRect),
  212. CASE2(DIMENSIONALITY, Dim::Buffer, SampledBuffer, ImageBuffer),
  213. CASE1(DIMENSIONALITY, Dim::SubpassData, InputAttachment),
  214. })));
  215. // See SPIR-V Section 3.9 Sampler Addressing Mode
  216. INSTANTIATE_TEST_SUITE_P(
  217. SamplerAddressingMode, EnumCapabilityTest,
  218. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  219. ValuesIn(std::vector<EnumCapabilityCase>{
  220. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingMode::None,
  221. Kernel),
  222. CASE1(SAMPLER_ADDRESSING_MODE,
  223. SamplerAddressingMode::ClampToEdge, Kernel),
  224. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingMode::Clamp,
  225. Kernel),
  226. CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingMode::Repeat,
  227. Kernel),
  228. CASE1(SAMPLER_ADDRESSING_MODE,
  229. SamplerAddressingMode::RepeatMirrored, Kernel),
  230. })));
  231. // See SPIR-V Section 3.10 Sampler Filter Mode
  232. INSTANTIATE_TEST_SUITE_P(
  233. SamplerFilterMode, EnumCapabilityTest,
  234. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  235. ValuesIn(std::vector<EnumCapabilityCase>{
  236. CASE1(SAMPLER_FILTER_MODE, SamplerFilterMode::Nearest, Kernel),
  237. CASE1(SAMPLER_FILTER_MODE, SamplerFilterMode::Linear, Kernel),
  238. })));
  239. // See SPIR-V Section 3.11 Image Format
  240. INSTANTIATE_TEST_SUITE_P(
  241. ImageFormat, EnumCapabilityTest,
  242. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  243. ValuesIn(std::vector<EnumCapabilityCase>{
  244. // clang-format off
  245. CASE0(SAMPLER_IMAGE_FORMAT, ImageFormat::Unknown),
  246. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba32f, Shader),
  247. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba16f, Shader),
  248. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R32f, Shader),
  249. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba8, Shader),
  250. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba8Snorm, Shader),
  251. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg32f, StorageImageExtendedFormats),
  252. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg16f, StorageImageExtendedFormats),
  253. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R11fG11fB10f, StorageImageExtendedFormats),
  254. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R16f, StorageImageExtendedFormats),
  255. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba16, StorageImageExtendedFormats),
  256. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgb10A2, StorageImageExtendedFormats),
  257. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg16, StorageImageExtendedFormats),
  258. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg8, StorageImageExtendedFormats),
  259. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R16, StorageImageExtendedFormats),
  260. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R8, StorageImageExtendedFormats),
  261. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba16Snorm, StorageImageExtendedFormats),
  262. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg16Snorm, StorageImageExtendedFormats),
  263. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg8Snorm, StorageImageExtendedFormats),
  264. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R16Snorm, StorageImageExtendedFormats),
  265. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R8Snorm, StorageImageExtendedFormats),
  266. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba32i, Shader),
  267. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba16i, Shader),
  268. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba8i, Shader),
  269. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R32i, Shader),
  270. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg32i, StorageImageExtendedFormats),
  271. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg16i, StorageImageExtendedFormats),
  272. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg8i, StorageImageExtendedFormats),
  273. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R16i, StorageImageExtendedFormats),
  274. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R8i, StorageImageExtendedFormats),
  275. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba32ui, Shader),
  276. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba16ui, Shader),
  277. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba8ui, Shader),
  278. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgba8ui, Shader),
  279. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rgb10a2ui, StorageImageExtendedFormats),
  280. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg32ui, StorageImageExtendedFormats),
  281. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg16ui, StorageImageExtendedFormats),
  282. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::Rg8ui, StorageImageExtendedFormats),
  283. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R16ui, StorageImageExtendedFormats),
  284. CASE1(SAMPLER_IMAGE_FORMAT, ImageFormat::R8ui, StorageImageExtendedFormats),
  285. // clang-format on
  286. })));
  287. // See SPIR-V Section 3.12 Image Channel Order
  288. INSTANTIATE_TEST_SUITE_P(
  289. ImageChannelOrder, EnumCapabilityTest,
  290. Combine(
  291. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  292. ValuesIn(std::vector<EnumCapabilityCase>{
  293. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::R, Kernel),
  294. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::A, Kernel),
  295. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RG, Kernel),
  296. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RA, Kernel),
  297. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RGB, Kernel),
  298. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RGBA, Kernel),
  299. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::BGRA, Kernel),
  300. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::ARGB, Kernel),
  301. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::Intensity, Kernel),
  302. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::Luminance, Kernel),
  303. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::Rx, Kernel),
  304. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RGx, Kernel),
  305. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::RGBx, Kernel),
  306. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::Depth, Kernel),
  307. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::DepthStencil, Kernel),
  308. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::sRGB, Kernel),
  309. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::sRGBx, Kernel),
  310. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::sRGBA, Kernel),
  311. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::sBGRA, Kernel),
  312. CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrder::ABGR, Kernel),
  313. })));
  314. // See SPIR-V Section 3.13 Image Channel Data Type
  315. INSTANTIATE_TEST_SUITE_P(
  316. ImageChannelDataType, EnumCapabilityTest,
  317. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  318. ValuesIn(std::vector<EnumCapabilityCase>{
  319. // clang-format off
  320. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::SnormInt8, Kernel),
  321. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::SnormInt16, Kernel),
  322. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormInt8, Kernel),
  323. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormInt16, Kernel),
  324. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormShort565, Kernel),
  325. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormShort555, Kernel),
  326. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormInt101010, Kernel),
  327. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::SignedInt8, Kernel),
  328. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::SignedInt16, Kernel),
  329. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::SignedInt32, Kernel),
  330. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnsignedInt8, Kernel),
  331. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnsignedInt16, Kernel),
  332. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnsignedInt32, Kernel),
  333. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::HalfFloat, Kernel),
  334. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::Float, Kernel),
  335. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormInt24, Kernel),
  336. CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataType::UnormInt101010_2, Kernel),
  337. // clang-format on
  338. })));
  339. // See SPIR-V Section 3.14 Image Operands
  340. INSTANTIATE_TEST_SUITE_P(
  341. ImageOperands, EnumCapabilityTest,
  342. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  343. ValuesIn(std::vector<EnumCapabilityCase>{
  344. // clang-format off
  345. CASE0(OPTIONAL_IMAGE, ImageOperandsMask::MaskNone),
  346. CASE1(OPTIONAL_IMAGE, ImageOperandsMask::Bias, Shader),
  347. CASE0(OPTIONAL_IMAGE, ImageOperandsMask::Lod),
  348. CASE0(OPTIONAL_IMAGE, ImageOperandsMask::Grad),
  349. CASE0(OPTIONAL_IMAGE, ImageOperandsMask::ConstOffset),
  350. CASE1(OPTIONAL_IMAGE, ImageOperandsMask::Offset, ImageGatherExtended),
  351. CASE1(OPTIONAL_IMAGE, ImageOperandsMask::ConstOffsets, ImageGatherExtended),
  352. CASE0(OPTIONAL_IMAGE, ImageOperandsMask::Sample),
  353. CASE1(OPTIONAL_IMAGE, ImageOperandsMask::MinLod, MinLod),
  354. // clang-format on
  355. })));
  356. // See SPIR-V Section 3.17 Linkage Type
  357. INSTANTIATE_TEST_SUITE_P(
  358. LinkageType, EnumCapabilityTest,
  359. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  360. ValuesIn(std::vector<EnumCapabilityCase>{
  361. CASE1(LINKAGE_TYPE, LinkageType::Export, Linkage),
  362. CASE1(LINKAGE_TYPE, LinkageType::Import, Linkage),
  363. })));
  364. // See SPIR-V Section 3.18 Access Qualifier
  365. INSTANTIATE_TEST_SUITE_P(
  366. AccessQualifier, EnumCapabilityTest,
  367. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  368. ValuesIn(std::vector<EnumCapabilityCase>{
  369. CASE1(ACCESS_QUALIFIER, AccessQualifier::ReadOnly, Kernel),
  370. CASE1(ACCESS_QUALIFIER, AccessQualifier::WriteOnly, Kernel),
  371. CASE1(ACCESS_QUALIFIER, AccessQualifier::ReadWrite, Kernel),
  372. })));
  373. // See SPIR-V Section 3.19 Function Parameter Attribute
  374. INSTANTIATE_TEST_SUITE_P(
  375. FunctionParameterAttribute, EnumCapabilityTest,
  376. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  377. ValuesIn(std::vector<EnumCapabilityCase>{
  378. // clang-format off
  379. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::Zext, Kernel),
  380. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::Sext, Kernel),
  381. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::ByVal, Kernel),
  382. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::Sret, Kernel),
  383. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::NoAlias, Kernel),
  384. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::NoCapture, Kernel),
  385. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::NoWrite, Kernel),
  386. CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttribute::NoReadWrite, Kernel),
  387. // clang-format on
  388. })));
  389. // See SPIR-V Section 3.20 Decoration
  390. INSTANTIATE_TEST_SUITE_P(
  391. Decoration, EnumCapabilityTest,
  392. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  393. ValuesIn(std::vector<EnumCapabilityCase>{
  394. CASE1(DECORATION, Decoration::RelaxedPrecision, Shader),
  395. // DecorationSpecId handled below.
  396. CASE1(DECORATION, Decoration::Block, Shader),
  397. CASE1(DECORATION, Decoration::BufferBlock, Shader),
  398. CASE1(DECORATION, Decoration::RowMajor, Matrix),
  399. CASE1(DECORATION, Decoration::ColMajor, Matrix),
  400. CASE1(DECORATION, Decoration::ArrayStride, Shader),
  401. CASE1(DECORATION, Decoration::MatrixStride,
  402. Matrix), // Bug 15234
  403. CASE1(DECORATION, Decoration::GLSLShared, Shader),
  404. CASE1(DECORATION, Decoration::GLSLPacked, Shader),
  405. CASE1(DECORATION, Decoration::CPacked, Kernel),
  406. CASE0(DECORATION, Decoration::BuiltIn), // Bug 15248
  407. // Value 12 placeholder
  408. CASE1(DECORATION, Decoration::NoPerspective, Shader),
  409. CASE1(DECORATION, Decoration::Flat, Shader),
  410. CASE1(DECORATION, Decoration::Patch, Tessellation),
  411. CASE1(DECORATION, Decoration::Centroid, Shader),
  412. CASE1(DECORATION, Decoration::Sample,
  413. SampleRateShading), // Bug 15234
  414. CASE1(DECORATION, Decoration::Invariant, Shader),
  415. CASE0(DECORATION, Decoration::Restrict),
  416. CASE0(DECORATION, Decoration::Aliased),
  417. CASE0(DECORATION, Decoration::Volatile),
  418. CASE1(DECORATION, Decoration::Constant, Kernel),
  419. CASE0(DECORATION, Decoration::Coherent),
  420. CASE0(DECORATION, Decoration::NonWritable),
  421. CASE0(DECORATION, Decoration::NonReadable),
  422. CASE1(DECORATION, Decoration::Uniform, Shader),
  423. // Value 27 is an intentional gap in the spec numbering.
  424. CASE1(DECORATION, Decoration::SaturatedConversion, Kernel),
  425. CASE1(DECORATION, Decoration::Stream, GeometryStreams),
  426. CASE1(DECORATION, Decoration::Location, Shader),
  427. CASE1(DECORATION, Decoration::Component, Shader),
  428. CASE1(DECORATION, Decoration::Index, Shader),
  429. CASE1(DECORATION, Decoration::Binding, Shader),
  430. CASE1(DECORATION, Decoration::DescriptorSet, Shader),
  431. CASE1(DECORATION, Decoration::Offset, Shader), // Bug 15268
  432. CASE1(DECORATION, Decoration::XfbBuffer, TransformFeedback),
  433. CASE1(DECORATION, Decoration::XfbStride, TransformFeedback),
  434. CASE1(DECORATION, Decoration::FuncParamAttr, Kernel),
  435. CASE1(DECORATION, Decoration::FPFastMathMode, Kernel),
  436. CASE1(DECORATION, Decoration::LinkageAttributes, Linkage),
  437. CASE1(DECORATION, Decoration::NoContraction, Shader),
  438. CASE1(DECORATION, Decoration::InputAttachmentIndex,
  439. InputAttachment),
  440. CASE1(DECORATION, Decoration::Alignment, 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, Decoration::SpecId, Shader, Kernel),
  454. CASE1(DECORATION, Decoration::MaxByteOffset, 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, BuiltIn::Position, Shader),
  463. CASE1(BUILT_IN, BuiltIn::PointSize, Shader),
  464. // 2 is an intentional gap in the spec numbering.
  465. CASE1(BUILT_IN, BuiltIn::ClipDistance, ClipDistance), // Bug 1407, 15234
  466. CASE1(BUILT_IN, BuiltIn::CullDistance, CullDistance), // Bug 1407, 15234
  467. CASE1(BUILT_IN, BuiltIn::VertexId, Shader),
  468. CASE1(BUILT_IN, BuiltIn::InstanceId, Shader),
  469. CASE6(BUILT_IN, BuiltIn::PrimitiveId, Geometry, Tessellation,
  470. RayTracingNV, RayTracingKHR, MeshShadingNV, MeshShadingEXT),
  471. CASE2(BUILT_IN, BuiltIn::InvocationId, Geometry, Tessellation),
  472. CASE4(BUILT_IN, BuiltIn::Layer, Geometry, ShaderViewportIndexLayerEXT, MeshShadingNV, MeshShadingEXT),
  473. CASE4(BUILT_IN, BuiltIn::ViewportIndex, MultiViewport, ShaderViewportIndexLayerEXT, MeshShadingNV, MeshShadingEXT), // Bug 15234
  474. CASE1(BUILT_IN, BuiltIn::TessLevelOuter, Tessellation),
  475. CASE1(BUILT_IN, BuiltIn::TessLevelInner, Tessellation),
  476. CASE1(BUILT_IN, BuiltIn::TessCoord, Tessellation),
  477. CASE1(BUILT_IN, BuiltIn::PatchVertices, Tessellation),
  478. CASE1(BUILT_IN, BuiltIn::FragCoord, Shader),
  479. CASE1(BUILT_IN, BuiltIn::PointCoord, Shader),
  480. CASE1(BUILT_IN, BuiltIn::FrontFacing, Shader),
  481. CASE1(BUILT_IN, BuiltIn::SampleId, SampleRateShading), // Bug 15234
  482. CASE1(BUILT_IN, BuiltIn::SamplePosition, SampleRateShading), // Bug 15234
  483. CASE1(BUILT_IN, BuiltIn::SampleMask, Shader), // Bug 15234, Issue 182
  484. // Value 21 intentionally missing
  485. CASE1(BUILT_IN, BuiltIn::FragDepth, Shader),
  486. CASE1(BUILT_IN, BuiltIn::HelperInvocation, Shader),
  487. CASE0(BUILT_IN, BuiltIn::NumWorkgroups),
  488. CASE0(BUILT_IN, BuiltIn::WorkgroupSize),
  489. CASE0(BUILT_IN, BuiltIn::WorkgroupId),
  490. CASE0(BUILT_IN, BuiltIn::LocalInvocationId),
  491. CASE0(BUILT_IN, BuiltIn::GlobalInvocationId),
  492. CASE0(BUILT_IN, BuiltIn::LocalInvocationIndex),
  493. CASE1(BUILT_IN, BuiltIn::WorkDim, Kernel),
  494. CASE1(BUILT_IN, BuiltIn::GlobalSize, Kernel),
  495. CASE1(BUILT_IN, BuiltIn::EnqueuedWorkgroupSize, Kernel),
  496. CASE1(BUILT_IN, BuiltIn::GlobalOffset, Kernel),
  497. CASE1(BUILT_IN, BuiltIn::GlobalLinearId, Kernel),
  498. // Value 35 intentionally missing
  499. CASE2(BUILT_IN, BuiltIn::SubgroupSize, Kernel, SubgroupBallotKHR),
  500. CASE1(BUILT_IN, BuiltIn::SubgroupMaxSize, Kernel),
  501. CASE1(BUILT_IN, BuiltIn::NumSubgroups, Kernel),
  502. CASE1(BUILT_IN, BuiltIn::NumEnqueuedSubgroups, Kernel),
  503. CASE1(BUILT_IN, BuiltIn::SubgroupId, Kernel),
  504. CASE2(BUILT_IN, BuiltIn::SubgroupLocalInvocationId, Kernel, SubgroupBallotKHR),
  505. CASE1(BUILT_IN, BuiltIn::VertexIndex, Shader),
  506. CASE1(BUILT_IN, BuiltIn::InstanceIndex, 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. CASE5(BUILT_IN, BuiltIn::Layer, Geometry, ShaderLayer,
  516. ShaderViewportIndexLayerEXT, MeshShadingNV, MeshShadingEXT),
  517. CASE5(BUILT_IN, BuiltIn::ViewportIndex, MultiViewport,
  518. ShaderViewportIndex, ShaderViewportIndexLayerEXT,
  519. MeshShadingNV, MeshShadingEXT),
  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, SelectionControlMask::MaskNone),
  527. CASE0(SELECTION_CONTROL, SelectionControlMask::Flatten),
  528. CASE0(SELECTION_CONTROL, SelectionControlMask::DontFlatten),
  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, LoopControlMask::MaskNone),
  536. CASE0(LOOP_CONTROL, LoopControlMask::Unroll),
  537. CASE0(LOOP_CONTROL, LoopControlMask::DontUnroll),
  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, LoopControlMask::DependencyInfinite),
  544. CASE0(LOOP_CONTROL, LoopControlMask::DependencyLength),
  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, FunctionControlMask::MaskNone),
  552. CASE0(FUNCTION_CONTROL, FunctionControlMask::Inline),
  553. CASE0(FUNCTION_CONTROL, FunctionControlMask::DontInline),
  554. CASE0(FUNCTION_CONTROL, FunctionControlMask::Pure),
  555. CASE0(FUNCTION_CONTROL, FunctionControlMask::Const),
  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, MemorySemanticsMask::MaskNone),
  564. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::Acquire),
  565. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::Release),
  566. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::AcquireRelease),
  567. CASE0(MEMORY_SEMANTICS_ID,
  568. MemorySemanticsMask::SequentiallyConsistent),
  569. CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsMask::UniformMemory,
  570. Shader),
  571. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::SubgroupMemory),
  572. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::WorkgroupMemory),
  573. CASE0(MEMORY_SEMANTICS_ID,
  574. MemorySemanticsMask::CrossWorkgroupMemory),
  575. CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsMask::AtomicCounterMemory,
  576. AtomicStorage), // Bug 15234
  577. CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMask::ImageMemory),
  578. })));
  579. // See SPIR-V Section 3.26 Memory Access
  580. INSTANTIATE_TEST_SUITE_P(
  581. MemoryAccess, EnumCapabilityTest,
  582. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  583. ValuesIn(std::vector<EnumCapabilityCase>{
  584. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMask::MaskNone),
  585. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMask::Volatile),
  586. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMask::Aligned),
  587. CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMask::Nontemporal),
  588. })));
  589. // See SPIR-V Section 3.27 Scope <id>
  590. INSTANTIATE_TEST_SUITE_P(
  591. Scope, EnumCapabilityTest,
  592. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
  593. SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
  594. ValuesIn(std::vector<EnumCapabilityCase>{
  595. CASE0(SCOPE_ID, Scope::CrossDevice),
  596. CASE0(SCOPE_ID, Scope::Device),
  597. CASE0(SCOPE_ID, Scope::Workgroup),
  598. CASE0(SCOPE_ID, Scope::Subgroup),
  599. CASE0(SCOPE_ID, Scope::Invocation),
  600. CASE1(SCOPE_ID, Scope::QueueFamilyKHR, VulkanMemoryModelKHR),
  601. })));
  602. // See SPIR-V Section 3.28 Group Operation
  603. INSTANTIATE_TEST_SUITE_P(
  604. GroupOperation, EnumCapabilityTest,
  605. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  606. ValuesIn(std::vector<EnumCapabilityCase>{
  607. CASE3(GROUP_OPERATION, GroupOperation::Reduce, Kernel,
  608. GroupNonUniformArithmetic, GroupNonUniformBallot),
  609. CASE3(GROUP_OPERATION, GroupOperation::InclusiveScan, Kernel,
  610. GroupNonUniformArithmetic, GroupNonUniformBallot),
  611. CASE3(GROUP_OPERATION, GroupOperation::ExclusiveScan, Kernel,
  612. GroupNonUniformArithmetic, GroupNonUniformBallot),
  613. })));
  614. // See SPIR-V Section 3.29 Kernel Enqueue Flags
  615. INSTANTIATE_TEST_SUITE_P(
  616. KernelEnqueueFlags, EnumCapabilityTest,
  617. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  618. ValuesIn(std::vector<EnumCapabilityCase>{
  619. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlags::NoWait, Kernel),
  620. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlags::WaitKernel, Kernel),
  621. CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlags::WaitWorkGroup,
  622. Kernel),
  623. })));
  624. // See SPIR-V Section 3.30 Kernel Profiling Info
  625. INSTANTIATE_TEST_SUITE_P(
  626. KernelProfilingInfo, EnumCapabilityTest,
  627. Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  628. ValuesIn(std::vector<EnumCapabilityCase>{
  629. CASE0(KERNEL_PROFILING_INFO, KernelProfilingInfoMask::MaskNone),
  630. CASE1(KERNEL_PROFILING_INFO,
  631. KernelProfilingInfoMask::CmdExecTime, Kernel),
  632. })));
  633. // See SPIR-V Section 3.31 Capability
  634. INSTANTIATE_TEST_SUITE_P(
  635. CapabilityDependsOn, EnumCapabilityTest,
  636. Combine(
  637. Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
  638. ValuesIn(std::vector<EnumCapabilityCase>{
  639. // clang-format off
  640. CASE0(CAPABILITY, Capability::Matrix),
  641. CASE1(CAPABILITY, Capability::Shader, Matrix),
  642. CASE1(CAPABILITY, Capability::Geometry, Shader),
  643. CASE1(CAPABILITY, Capability::Tessellation, Shader),
  644. CASE0(CAPABILITY, Capability::Addresses),
  645. CASE0(CAPABILITY, Capability::Linkage),
  646. CASE0(CAPABILITY, Capability::Kernel),
  647. CASE1(CAPABILITY, Capability::Vector16, Kernel),
  648. CASE1(CAPABILITY, Capability::Float16Buffer, Kernel),
  649. CASE0(CAPABILITY, Capability::Float16), // Bug 15234
  650. CASE0(CAPABILITY, Capability::Float64),
  651. CASE0(CAPABILITY, Capability::Int64),
  652. CASE1(CAPABILITY, Capability::Int64Atomics, Int64),
  653. CASE1(CAPABILITY, Capability::ImageBasic, Kernel),
  654. CASE1(CAPABILITY, Capability::ImageReadWrite, ImageBasic),
  655. CASE1(CAPABILITY, Capability::ImageMipmap, ImageBasic),
  656. // Value 16 intentionally missing.
  657. CASE1(CAPABILITY, Capability::Pipes, Kernel),
  658. CASE0(CAPABILITY, Capability::Groups),
  659. CASE1(CAPABILITY, Capability::DeviceEnqueue, Kernel),
  660. CASE1(CAPABILITY, Capability::LiteralSampler, Kernel),
  661. CASE1(CAPABILITY, Capability::AtomicStorage, Shader),
  662. CASE0(CAPABILITY, Capability::Int16),
  663. CASE1(CAPABILITY, Capability::TessellationPointSize, Tessellation),
  664. CASE1(CAPABILITY, Capability::GeometryPointSize, Geometry),
  665. CASE1(CAPABILITY, Capability::ImageGatherExtended, Shader),
  666. // Value 26 intentionally missing.
  667. CASE1(CAPABILITY, Capability::StorageImageMultisample, Shader),
  668. CASE1(CAPABILITY, Capability::UniformBufferArrayDynamicIndexing, Shader),
  669. CASE1(CAPABILITY, Capability::SampledImageArrayDynamicIndexing, Shader),
  670. CASE1(CAPABILITY, Capability::StorageBufferArrayDynamicIndexing, Shader),
  671. CASE1(CAPABILITY, Capability::StorageImageArrayDynamicIndexing, Shader),
  672. CASE1(CAPABILITY, Capability::ClipDistance, Shader),
  673. CASE1(CAPABILITY, Capability::CullDistance, Shader),
  674. CASE1(CAPABILITY, Capability::ImageCubeArray, SampledCubeArray),
  675. CASE1(CAPABILITY, Capability::SampleRateShading, Shader),
  676. CASE1(CAPABILITY, Capability::ImageRect, SampledRect),
  677. CASE1(CAPABILITY, Capability::SampledRect, Shader),
  678. CASE1(CAPABILITY, Capability::GenericPointer, Addresses),
  679. CASE0(CAPABILITY, Capability::Int8),
  680. CASE1(CAPABILITY, Capability::InputAttachment, Shader),
  681. CASE1(CAPABILITY, Capability::SparseResidency, Shader),
  682. CASE1(CAPABILITY, Capability::MinLod, Shader),
  683. CASE1(CAPABILITY, Capability::Image1D, Sampled1D),
  684. CASE1(CAPABILITY, Capability::SampledCubeArray, Shader),
  685. CASE1(CAPABILITY, Capability::ImageBuffer, SampledBuffer),
  686. CASE1(CAPABILITY, Capability::ImageMSArray, Shader),
  687. CASE1(CAPABILITY, Capability::StorageImageExtendedFormats, Shader),
  688. CASE1(CAPABILITY, Capability::ImageQuery, Shader),
  689. CASE1(CAPABILITY, Capability::DerivativeControl, Shader),
  690. CASE1(CAPABILITY, Capability::InterpolationFunction, Shader),
  691. CASE1(CAPABILITY, Capability::TransformFeedback, Shader),
  692. CASE1(CAPABILITY, Capability::GeometryStreams, Geometry),
  693. CASE1(CAPABILITY, Capability::StorageImageReadWithoutFormat, Shader),
  694. CASE1(CAPABILITY, Capability::StorageImageWriteWithoutFormat, Shader),
  695. CASE1(CAPABILITY, Capability::MultiViewport, Geometry),
  696. // clang-format on
  697. })));
  698. INSTANTIATE_TEST_SUITE_P(
  699. CapabilityDependsOnV11, EnumCapabilityTest,
  700. Combine(Values(SPV_ENV_UNIVERSAL_1_1),
  701. ValuesIn(std::vector<EnumCapabilityCase>{
  702. CASE1(CAPABILITY, Capability::SubgroupDispatch, DeviceEnqueue),
  703. CASE1(CAPABILITY, Capability::NamedBarrier, Kernel),
  704. CASE1(CAPABILITY, Capability::PipeStorage, Pipes),
  705. })));
  706. #undef CASE0
  707. #undef CASE1
  708. #undef CASE2
  709. } // namespace
  710. } // namespace spvtools