operand_capabilities_test.cpp 41 KB

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