val_non_uniform_test.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. // Copyright (c) 2018 Google LLC.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <sstream>
  15. #include <string>
  16. #include <tuple>
  17. #include "gmock/gmock.h"
  18. #include "test/unit_spirv.h"
  19. #include "test/val/val_fixtures.h"
  20. namespace spvtools {
  21. namespace val {
  22. namespace {
  23. using ::testing::Combine;
  24. using ::testing::HasSubstr;
  25. using ::testing::Values;
  26. using ::testing::ValuesIn;
  27. std::string GenerateShaderCode(
  28. const std::string& body,
  29. const std::string& capabilities_and_extensions = "",
  30. const std::string& execution_model = "GLCompute") {
  31. std::ostringstream ss;
  32. ss << R"(
  33. OpCapability Shader
  34. OpCapability GroupNonUniform
  35. OpCapability GroupNonUniformVote
  36. OpCapability GroupNonUniformBallot
  37. OpCapability GroupNonUniformShuffle
  38. OpCapability GroupNonUniformShuffleRelative
  39. OpCapability GroupNonUniformArithmetic
  40. OpCapability GroupNonUniformClustered
  41. OpCapability GroupNonUniformQuad
  42. OpCapability GroupNonUniformPartitionedNV
  43. OpCapability QuadControlKHR
  44. OpExtension "SPV_NV_shader_subgroup_partitioned"
  45. OpExtension "SPV_KHR_quad_control"
  46. )";
  47. ss << capabilities_and_extensions;
  48. ss << "OpMemoryModel Logical GLSL450\n";
  49. ss << "OpEntryPoint " << execution_model << " %main \"main\"\n";
  50. if (execution_model == "GLCompute") {
  51. ss << "OpExecutionMode %main LocalSize 1 1 1\n";
  52. }
  53. ss << R"(
  54. %void = OpTypeVoid
  55. %func = OpTypeFunction %void
  56. %bool = OpTypeBool
  57. %u32 = OpTypeInt 32 0
  58. %int = OpTypeInt 32 1
  59. %float = OpTypeFloat 32
  60. %u32vec4 = OpTypeVector %u32 4
  61. %u32vec3 = OpTypeVector %u32 3
  62. %v2bool = OpTypeVector %bool 2
  63. %v4float = OpTypeVector %float 4
  64. %struct = OpTypeStruct %int
  65. %v4int = OpTypeVector %int 4
  66. %true = OpConstantTrue %bool
  67. %false = OpConstantFalse %bool
  68. %u32_0 = OpConstant %u32 0
  69. %int_0 = OpConstant %int 0
  70. %float_0 = OpConstant %float 0
  71. %u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0
  72. %u32vec3_null = OpConstantComposite %u32vec3 %u32_0 %u32_0 %u32_0
  73. %v2bool_false = OpConstantNull %v2bool
  74. %v4float_null = OpConstantNull %v4float
  75. %struct_null = OpConstantNull %struct
  76. %v4int_null = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0
  77. %u32_undef = OpUndef %u32
  78. %cross_device = OpConstant %u32 0
  79. %device = OpConstant %u32 1
  80. %workgroup = OpConstant %u32 2
  81. %subgroup = OpConstant %u32 3
  82. %invocation = OpConstant %u32 4
  83. %reduce = OpConstant %u32 0
  84. %inclusive_scan = OpConstant %u32 1
  85. %exclusive_scan = OpConstant %u32 2
  86. %clustered_reduce = OpConstant %u32 3
  87. %main = OpFunction %void None %func
  88. %main_entry = OpLabel
  89. )";
  90. ss << body;
  91. ss << R"(
  92. OpReturn
  93. OpFunctionEnd)";
  94. return ss.str();
  95. }
  96. spv::Scope scopes[] = {spv::Scope::CrossDevice, spv::Scope::Device,
  97. spv::Scope::Workgroup, spv::Scope::Subgroup,
  98. spv::Scope::Invocation};
  99. using ValidateGroupNonUniform = spvtest::ValidateBase<bool>;
  100. using GroupNonUniform = spvtest::ValidateBase<
  101. std::tuple<std::string, std::string, spv::Scope, std::string, std::string>>;
  102. std::string ConvertScope(spv::Scope scope) {
  103. switch (scope) {
  104. case spv::Scope::CrossDevice:
  105. return "%cross_device";
  106. case spv::Scope::Device:
  107. return "%device";
  108. case spv::Scope::Workgroup:
  109. return "%workgroup";
  110. case spv::Scope::Subgroup:
  111. return "%subgroup";
  112. case spv::Scope::Invocation:
  113. return "%invocation";
  114. default:
  115. return "";
  116. }
  117. }
  118. std::string ConvertMatch(const std::string& type) {
  119. if (type == "%bool") {
  120. return "%true";
  121. } else if (type == "%u32") {
  122. return "%u32_0";
  123. } else if (type == "%int") {
  124. return "%int_0";
  125. } else if (type == "%float") {
  126. return "%float_0";
  127. } else if (type == "%u32vec4") {
  128. return "%u32vec4_null";
  129. } else if (type == "%u32vec3") {
  130. return "%u32vec3_null";
  131. } else if (type == "%v2bool") {
  132. return "%v2bool_false";
  133. } else if (type == "%v4float") {
  134. return "%v4float_null";
  135. } else if (type == "%struct") {
  136. return "%struct_null";
  137. } else if (type == "%v4int") {
  138. return "%v4int_null";
  139. }
  140. return "INVALID";
  141. }
  142. TEST_P(GroupNonUniform, Vulkan1p1) {
  143. std::string opcode = std::get<0>(GetParam());
  144. std::string type = std::get<1>(GetParam());
  145. spv::Scope execution_scope = std::get<2>(GetParam());
  146. std::string args = std::get<3>(GetParam());
  147. std::string error = std::get<4>(GetParam());
  148. const std::string match = "match_res";
  149. size_t pos = std::string::npos;
  150. while ((pos = args.find(match)) != std::string::npos) {
  151. const std::string replace = ConvertMatch(type);
  152. args = args.substr(0, pos) + replace + args.substr(pos + match.size());
  153. }
  154. std::ostringstream sstr;
  155. sstr << "%result = " << opcode << " ";
  156. sstr << type << " ";
  157. if (opcode != "OpGroupNonUniformQuadAllKHR" &&
  158. opcode != "OpGroupNonUniformQuadAnyKHR") {
  159. sstr << ConvertScope(execution_scope) << " ";
  160. }
  161. sstr << args << "\n";
  162. CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_VULKAN_1_1);
  163. spv_result_t result = ValidateInstructions(SPV_ENV_VULKAN_1_1);
  164. if (error == "") {
  165. if (execution_scope == spv::Scope::Subgroup) {
  166. EXPECT_EQ(SPV_SUCCESS, result);
  167. } else {
  168. EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
  169. EXPECT_THAT(getDiagnosticString(),
  170. AnyVUID("VUID-StandaloneSpirv-None-04642"));
  171. EXPECT_THAT(
  172. getDiagnosticString(),
  173. HasSubstr(
  174. "in Vulkan environment Execution scope is limited to Subgroup"));
  175. }
  176. } else {
  177. EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
  178. EXPECT_THAT(getDiagnosticString(), HasSubstr(error));
  179. }
  180. }
  181. TEST_P(GroupNonUniform, Spirv1p3) {
  182. std::string opcode = std::get<0>(GetParam());
  183. std::string type = std::get<1>(GetParam());
  184. spv::Scope execution_scope = std::get<2>(GetParam());
  185. std::string args = std::get<3>(GetParam());
  186. std::string error = std::get<4>(GetParam());
  187. const std::string match = "match_res";
  188. size_t pos = std::string::npos;
  189. while ((pos = args.find(match)) != std::string::npos) {
  190. const std::string replace = ConvertMatch(type);
  191. args = args.substr(0, pos) + replace + args.substr(pos + match.size());
  192. }
  193. std::ostringstream sstr;
  194. sstr << "%result = " << opcode << " ";
  195. sstr << type << " ";
  196. if (opcode != "OpGroupNonUniformQuadAllKHR" &&
  197. opcode != "OpGroupNonUniformQuadAnyKHR") {
  198. sstr << ConvertScope(execution_scope) << " ";
  199. }
  200. sstr << args << "\n";
  201. CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_UNIVERSAL_1_3);
  202. spv_result_t result = ValidateInstructions(SPV_ENV_UNIVERSAL_1_3);
  203. if (error == "") {
  204. if (execution_scope == spv::Scope::Subgroup ||
  205. execution_scope == spv::Scope::Workgroup) {
  206. EXPECT_EQ(SPV_SUCCESS, result);
  207. } else {
  208. EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
  209. EXPECT_THAT(
  210. getDiagnosticString(),
  211. HasSubstr("Execution scope is limited to Subgroup or Workgroup"));
  212. }
  213. } else {
  214. EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
  215. EXPECT_THAT(getDiagnosticString(), HasSubstr(error));
  216. }
  217. }
  218. INSTANTIATE_TEST_SUITE_P(GroupNonUniformElect, GroupNonUniform,
  219. Combine(Values("OpGroupNonUniformElect"),
  220. Values("%bool"), ValuesIn(scopes), Values(""),
  221. Values("")));
  222. INSTANTIATE_TEST_SUITE_P(GroupNonUniformVote, GroupNonUniform,
  223. Combine(Values("OpGroupNonUniformAll",
  224. "OpGroupNonUniformAny",
  225. "OpGroupNonUniformAllEqual"),
  226. Values("%bool"), ValuesIn(scopes),
  227. Values("%true"), Values("")));
  228. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcast, GroupNonUniform,
  229. Combine(Values("OpGroupNonUniformBroadcast"),
  230. Values("%bool"), ValuesIn(scopes),
  231. Values("%true %u32_0"), Values("")));
  232. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastFirst, GroupNonUniform,
  233. Combine(Values("OpGroupNonUniformBroadcastFirst"),
  234. Values("%bool"), ValuesIn(scopes),
  235. Values("%true"), Values("")));
  236. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallot, GroupNonUniform,
  237. Combine(Values("OpGroupNonUniformBallot"),
  238. Values("%u32vec4"), ValuesIn(scopes),
  239. Values("%true"), Values("")));
  240. INSTANTIATE_TEST_SUITE_P(GroupNonUniformInverseBallot, GroupNonUniform,
  241. Combine(Values("OpGroupNonUniformInverseBallot"),
  242. Values("%bool"), ValuesIn(scopes),
  243. Values("%u32vec4_null"), Values("")));
  244. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitExtract, GroupNonUniform,
  245. Combine(Values("OpGroupNonUniformBallotBitExtract"),
  246. Values("%bool"), ValuesIn(scopes),
  247. Values("%u32vec4_null %u32_0"), Values("")));
  248. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCount, GroupNonUniform,
  249. Combine(Values("OpGroupNonUniformBallotBitCount"),
  250. Values("%u32"), ValuesIn(scopes),
  251. Values("Reduce %u32vec4_null"), Values("")));
  252. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotFind, GroupNonUniform,
  253. Combine(Values("OpGroupNonUniformBallotFindLSB",
  254. "OpGroupNonUniformBallotFindMSB"),
  255. Values("%u32"), ValuesIn(scopes),
  256. Values("%u32vec4_null"), Values("")));
  257. INSTANTIATE_TEST_SUITE_P(GroupNonUniformShuffle, GroupNonUniform,
  258. Combine(Values("OpGroupNonUniformShuffle",
  259. "OpGroupNonUniformShuffleXor",
  260. "OpGroupNonUniformShuffleUp",
  261. "OpGroupNonUniformShuffleDown"),
  262. Values("%u32"), ValuesIn(scopes),
  263. Values("%u32_0 %u32_0"), Values("")));
  264. INSTANTIATE_TEST_SUITE_P(
  265. GroupNonUniformIntegerArithmetic, GroupNonUniform,
  266. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  267. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  268. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  269. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  270. "OpGroupNonUniformBitwiseXor"),
  271. Values("%u32"), ValuesIn(scopes), Values("Reduce %u32_0"),
  272. Values("")));
  273. INSTANTIATE_TEST_SUITE_P(
  274. GroupNonUniformFloatArithmetic, GroupNonUniform,
  275. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  276. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  277. Values("%float"), ValuesIn(scopes), Values("Reduce %float_0"),
  278. Values("")));
  279. INSTANTIATE_TEST_SUITE_P(GroupNonUniformLogicalArithmetic, GroupNonUniform,
  280. Combine(Values("OpGroupNonUniformLogicalAnd",
  281. "OpGroupNonUniformLogicalOr",
  282. "OpGroupNonUniformLogicalXor"),
  283. Values("%bool"), ValuesIn(scopes),
  284. Values("Reduce %true"), Values("")));
  285. INSTANTIATE_TEST_SUITE_P(GroupNonUniformQuad, GroupNonUniform,
  286. Combine(Values("OpGroupNonUniformQuadBroadcast",
  287. "OpGroupNonUniformQuadSwap"),
  288. Values("%u32"), ValuesIn(scopes),
  289. Values("%u32_0 %u32_0"), Values("")));
  290. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCountScope, GroupNonUniform,
  291. Combine(Values("OpGroupNonUniformBallotBitCount"),
  292. Values("%u32"), ValuesIn(scopes),
  293. Values("Reduce %u32vec4_null"), Values("")));
  294. INSTANTIATE_TEST_SUITE_P(
  295. GroupNonUniformBallotBitCountBadResultType, GroupNonUniform,
  296. Combine(
  297. Values("OpGroupNonUniformBallotBitCount"), Values("%float", "%int"),
  298. Values(spv::Scope::Subgroup), Values("Reduce %u32vec4_null"),
  299. Values("Expected Result Type to be an unsigned integer type scalar.")));
  300. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCountBadValue, GroupNonUniform,
  301. Combine(Values("OpGroupNonUniformBallotBitCount"),
  302. Values("%u32"), Values(spv::Scope::Subgroup),
  303. Values("Reduce %u32vec3_null", "Reduce %u32_0",
  304. "Reduce %float_0"),
  305. Values("Expected Value to be a vector of four "
  306. "components of integer type scalar")));
  307. INSTANTIATE_TEST_SUITE_P(GroupNonUniformElectGood, GroupNonUniform,
  308. Combine(Values("OpGroupNonUniformElect"),
  309. Values("%bool"), Values(spv::Scope::Subgroup),
  310. Values(""), Values("")));
  311. INSTANTIATE_TEST_SUITE_P(
  312. GroupNonUniformElectBadResultType, GroupNonUniform,
  313. Combine(Values("OpGroupNonUniformElect"),
  314. Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
  315. "%v2bool", "%v4float", "%struct"),
  316. Values(spv::Scope::Subgroup), Values(""),
  317. Values("Result must be a boolean scalar type")));
  318. INSTANTIATE_TEST_SUITE_P(GroupNonUniformAnyAllGood, GroupNonUniform,
  319. Combine(Values("OpGroupNonUniformAny",
  320. "OpGroupNonUniformAll"),
  321. Values("%bool"), Values(spv::Scope::Subgroup),
  322. Values("%true", "%false"), Values("")));
  323. INSTANTIATE_TEST_SUITE_P(
  324. GroupNonUniformAnyAllBadResultType, GroupNonUniform,
  325. Combine(Values("OpGroupNonUniformAny", "OpGroupNonUniformAll"),
  326. Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
  327. "%v2bool", "%v4float", "%struct"),
  328. Values(spv::Scope::Subgroup), Values("%true"),
  329. Values("Result must be a boolean scalar type")));
  330. INSTANTIATE_TEST_SUITE_P(
  331. GroupNonUniformAnyAllBadOperand, GroupNonUniform,
  332. Combine(Values("OpGroupNonUniformAny", "OpGroupNonUniformAll"),
  333. Values("%bool"), Values(spv::Scope::Subgroup),
  334. Values("%u32_0", "%int_0", "%float_0", "%u32vec4_null",
  335. "%u32vec3_null", "%v2bool_false", "%v4float_null",
  336. "%struct_null"),
  337. Values("Predicate must be a boolean scalar type")));
  338. INSTANTIATE_TEST_SUITE_P(GroupNonUniformAllEqualGood, GroupNonUniform,
  339. Combine(Values("OpGroupNonUniformAllEqual"),
  340. Values("%bool"), Values(spv::Scope::Subgroup),
  341. Values("%true", "%false"), Values("")));
  342. INSTANTIATE_TEST_SUITE_P(
  343. GroupNonUniformAllEqualBadResultType, GroupNonUniform,
  344. Combine(Values("OpGroupNonUniformAllEqual"),
  345. Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
  346. "%v2bool", "%v4float", "%struct"),
  347. Values(spv::Scope::Subgroup), Values("%true"),
  348. Values("Result must be a boolean scalar type")));
  349. INSTANTIATE_TEST_SUITE_P(
  350. GroupNonUniformAllEqualBadOperand, GroupNonUniform,
  351. Combine(Values("OpGroupNonUniformAllEqual"), Values("%bool"),
  352. Values(spv::Scope::Subgroup), Values("%struct_null"),
  353. Values("Value must be a scalar or vector of integer, "
  354. "floating-point, or boolean type")));
  355. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastGood, GroupNonUniform,
  356. Combine(Values("OpGroupNonUniformBroadcast",
  357. "OpGroupNonUniformQuadBroadcast",
  358. "OpGroupNonUniformQuadSwap"),
  359. Values("%bool", "%u32", "%int", "%float",
  360. "%u32vec4", "%u32vec3", "%v2bool",
  361. "%v4float", "%v4int"),
  362. Values(spv::Scope::Subgroup),
  363. Values("match_res %u32_0"), Values("")));
  364. INSTANTIATE_TEST_SUITE_P(
  365. GroupNonUniformBroadcastShuffleBadResultType, GroupNonUniform,
  366. Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
  367. "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
  368. "OpGroupNonUniformShuffleDown",
  369. "OpGroupNonUniformQuadBroadcast",
  370. "OpGroupNonUniformQuadSwap"),
  371. Values("%void", "%struct"), Values(spv::Scope::Subgroup),
  372. Values("%u32_0 %u32_0"),
  373. Values("Result must be a scalar or vector of integer, "
  374. "floating-point, or boolean type")));
  375. INSTANTIATE_TEST_SUITE_P(
  376. GroupNonUniformBroadcastShuffleBadOperand1, GroupNonUniform,
  377. Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
  378. "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
  379. "OpGroupNonUniformShuffleDown",
  380. "OpGroupNonUniformQuadBroadcast",
  381. "OpGroupNonUniformQuadSwap"),
  382. Values("%bool"), Values(spv::Scope::Subgroup),
  383. Values("%u32_0 %u32_0", "%int_0 %u32_0", "%float_0 %u32_0",
  384. "%u32vec4_null %u32_0", "%u32vec3_null %u32_0",
  385. "%v2bool_false %u32_0", "%v4float_null %u32_0",
  386. "%struct_null %u32_0", "%v4int_null %u32_0"),
  387. Values("The type of Value must match the Result type")));
  388. INSTANTIATE_TEST_SUITE_P(
  389. GroupNonUniformBroadcastShuffleBadOperand2, GroupNonUniform,
  390. Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
  391. "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
  392. "OpGroupNonUniformShuffleDown",
  393. "OpGroupNonUniformQuadBroadcast",
  394. "OpGroupNonUniformQuadSwap"),
  395. Values("%bool"), Values(spv::Scope::Subgroup),
  396. Values("%true %true", "%true %int_0", "%true %float_0",
  397. "%true %u32vec4_null", "%true %u32vec3_null",
  398. "%true %v4float_null", "%true %v2bool_false",
  399. "%true %struct_null", "%true %v4int_null"),
  400. Values("must be an unsigned integer scalar")));
  401. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastShuffleOperand2NotConstant,
  402. GroupNonUniform,
  403. Combine(Values("OpGroupNonUniformBroadcast",
  404. "OpGroupNonUniformQuadBroadcast",
  405. "OpGroupNonUniformQuadSwap"),
  406. Values("%bool"), Values(spv::Scope::Subgroup),
  407. Values("%true %u32_undef"),
  408. Values("must be a constant instruction")));
  409. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastFirstGood, GroupNonUniform,
  410. Combine(Values("OpGroupNonUniformBroadcastFirst"),
  411. Values("%bool", "%u32", "%int", "%float",
  412. "%u32vec4", "%u32vec3", "%v2bool",
  413. "%v4float", "%v4int"),
  414. Values(spv::Scope::Subgroup),
  415. Values("match_res"), Values("")));
  416. INSTANTIATE_TEST_SUITE_P(
  417. GroupNonUniformBroadcasFirsttBadResultType, GroupNonUniform,
  418. Combine(Values("OpGroupNonUniformBroadcastFirst"),
  419. Values("%void", "%struct"), Values(spv::Scope::Subgroup),
  420. Values("%u32_0"),
  421. Values("Result must be a scalar or vector of integer, "
  422. "floating-point, or boolean type")));
  423. INSTANTIATE_TEST_SUITE_P(
  424. GroupNonUniformBroadcastBadOperand, GroupNonUniform,
  425. Combine(Values("OpGroupNonUniformBroadcastFirst"), Values("%bool"),
  426. Values(spv::Scope::Subgroup),
  427. Values("%u32_0", "%int_0", "%float_0", "%u32vec4_null",
  428. "%u32vec3_null", "%v2bool_false", "%v4float_null",
  429. "%struct_null", "%v4int_null"),
  430. Values("The type of Value must match the Result type")));
  431. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotGood, GroupNonUniform,
  432. Combine(Values("OpGroupNonUniformBallot"),
  433. Values("%u32vec4"),
  434. Values(spv::Scope::Subgroup),
  435. Values("%true", "%false"), Values("")));
  436. INSTANTIATE_TEST_SUITE_P(
  437. GroupNonUniformBallotBadResultType, GroupNonUniform,
  438. Combine(Values("OpGroupNonUniformBallot"),
  439. Values("%void", "%bool", "%u32", "%int", "%float", "%u32vec3",
  440. "%v2bool", "%v4float", "%struct", "%v4int"),
  441. Values(spv::Scope::Subgroup), Values("%true", "%false"),
  442. Values("Result must be a 4-component unsigned integer vector")));
  443. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBadOperand, GroupNonUniform,
  444. Combine(Values("OpGroupNonUniformBallot"),
  445. Values("%u32vec4"),
  446. Values(spv::Scope::Subgroup),
  447. Values("%u32_0", "%int_0", "%float_0",
  448. "%u32vec4_null", "%u32vec3_null",
  449. "%v2bool_false", "%v4float_null",
  450. "%struct_null", "%v4int_null"),
  451. Values("Predicate must be a boolean scalar")));
  452. INSTANTIATE_TEST_SUITE_P(GroupNonUniformInverseBallotGood, GroupNonUniform,
  453. Combine(Values("OpGroupNonUniformInverseBallot"),
  454. Values("%bool"), Values(spv::Scope::Subgroup),
  455. Values("%u32vec4_null"), Values("")));
  456. INSTANTIATE_TEST_SUITE_P(
  457. GroupNonUniformInverseBallotBadResultType, GroupNonUniform,
  458. Combine(Values("OpGroupNonUniformInverseBallot"),
  459. Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
  460. "%v2bool", "%v4float", "%struct", "%v4int"),
  461. Values(spv::Scope::Subgroup), Values("%u32vec4_null"),
  462. Values("Result must be a boolean scalar")));
  463. INSTANTIATE_TEST_SUITE_P(
  464. GroupNonUniformInverseBallotBadOperand, GroupNonUniform,
  465. Combine(Values("OpGroupNonUniformInverseBallot"), Values("%bool"),
  466. Values(spv::Scope::Subgroup),
  467. Values("%true", "%false", "%u32_0", "%int_0", "%float_0",
  468. "%u32vec3_null", "%v2bool_false", "%v4float_null",
  469. "%struct_null", "%v4int_null"),
  470. Values("Value must be a 4-component unsigned integer vector")));
  471. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitExtractGood, GroupNonUniform,
  472. Combine(Values("OpGroupNonUniformBallotBitExtract"),
  473. Values("%bool"), Values(spv::Scope::Subgroup),
  474. Values("%u32vec4_null %u32_0"), Values("")));
  475. INSTANTIATE_TEST_SUITE_P(
  476. GroupNonUniformBallotBitExtractBadResultType, GroupNonUniform,
  477. Combine(Values("OpGroupNonUniformBallotBitExtract"),
  478. Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
  479. "%v2bool", "%v4float", "%struct", "%v4int"),
  480. Values(spv::Scope::Subgroup), Values("%u32vec4_null %u32_0"),
  481. Values("Result must be a boolean scalar")));
  482. INSTANTIATE_TEST_SUITE_P(
  483. GroupNonUniformBallotBitExtractBadOperand1, GroupNonUniform,
  484. Combine(Values("OpGroupNonUniformBallotBitExtract"), Values("%bool"),
  485. Values(spv::Scope::Subgroup),
  486. Values("%true %u32_0", "%false %u32_0", "%u32_0 %u32_0",
  487. "%int_0 %u32_0", "%float_0 %u32_0", "%u32vec3_null %u32_0",
  488. "%v2bool_false %u32_0", "%v4float_null %u32_0",
  489. "%struct_null %u32_0", "%v4int_null %u32_0"),
  490. Values("Value must be a 4-component unsigned integer vector")));
  491. INSTANTIATE_TEST_SUITE_P(
  492. GroupNonUniformBallotBitExtractBadOperand2, GroupNonUniform,
  493. Combine(Values("OpGroupNonUniformBallotBitExtract"), Values("%bool"),
  494. Values(spv::Scope::Subgroup),
  495. Values("%u32vec4_null %true", "%u32vec4_null %false",
  496. "%u32vec4_null %int_0", "%u32vec4_null %float_0",
  497. "%u32vec4_null %u32vec3_null", "%u32vec4_null %v2bool_false",
  498. "%u32vec4_null %v4float_null", "%u32vec4_null %struct_null",
  499. "%u32vec4_null %v4int_null"),
  500. Values("Id must be an unsigned integer scalar")));
  501. INSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotFindGood, GroupNonUniform,
  502. Combine(Values("OpGroupNonUniformBallotFindLSB",
  503. "OpGroupNonUniformBallotFindMSB"),
  504. Values("%u32"), Values(spv::Scope::Subgroup),
  505. Values("%u32vec4_null"), Values("")));
  506. INSTANTIATE_TEST_SUITE_P(
  507. GroupNonUniformBallotFindBadResultType, GroupNonUniform,
  508. Combine(Values("OpGroupNonUniformBallotFindLSB",
  509. "OpGroupNonUniformBallotFindMSB"),
  510. Values("%void", "%bool", "%int", "%float", "%u32vec4", "%u32vec3",
  511. "%v2bool", "%v4float", "%struct", "%v4int"),
  512. Values(spv::Scope::Subgroup), Values("%u32vec4_null"),
  513. Values("Result must be an unsigned integer scalar")));
  514. INSTANTIATE_TEST_SUITE_P(
  515. GroupNonUniformBallotFindBadOperand, GroupNonUniform,
  516. Combine(Values("OpGroupNonUniformBallotFindLSB",
  517. "OpGroupNonUniformBallotFindMSB"),
  518. Values("%u32"), Values(spv::Scope::Subgroup),
  519. Values("%true", "%false", "%u32_0", "%int_0", "%float_0",
  520. "%u32vec3_null", "%v2bool_false", "%v4float_null",
  521. "%struct_null", "%v4int_null"),
  522. Values("Value must be a 4-component unsigned integer vector")));
  523. INSTANTIATE_TEST_SUITE_P(
  524. GroupNonUniformIntegerArithmeticGood, GroupNonUniform,
  525. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  526. "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
  527. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  528. "OpGroupNonUniformBitwiseXor"),
  529. Values("%u32", "%int", "%u32vec4", "%u32vec3", "%v4int"),
  530. Values(spv::Scope::Subgroup),
  531. Values("Reduce match_res", "InclusiveScan match_res",
  532. "ExclusiveScan match_res",
  533. "ClusteredReduce match_res %u32_0",
  534. "PartitionedReduceNV match_res %u32vec4_null",
  535. "PartitionedInclusiveScanNV match_res %u32vec4_null",
  536. "PartitionedExclusiveScanNV match_res %v4int_null"),
  537. Values("")));
  538. INSTANTIATE_TEST_SUITE_P(
  539. GroupNonUniformIntegerArithmeticBadResultType, GroupNonUniform,
  540. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  541. "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
  542. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  543. "OpGroupNonUniformBitwiseXor"),
  544. Values("%bool", "%float", "%v4float", "%struct"),
  545. Values(spv::Scope::Subgroup),
  546. Values("Reduce match_res", "InclusiveScan match_res",
  547. "ExclusiveScan match_res",
  548. "ClusteredReduce match_res %u32_0"),
  549. Values("Result must be an integer scalar or vector")));
  550. INSTANTIATE_TEST_SUITE_P(
  551. GroupNonUniformIntegerArithmeticBadValue, GroupNonUniform,
  552. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  553. "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
  554. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  555. "OpGroupNonUniformBitwiseXor"),
  556. Values("%int", "%u32vec4", "%u32vec3", "%v4int"),
  557. Values(spv::Scope::Subgroup),
  558. Values("Reduce %u32_0", "InclusiveScan %u32_0",
  559. "ExclusiveScan %u32_0", "ClusteredReduce %u32_0 %u32_0"),
  560. Values("The type of Value must match the Result type")));
  561. INSTANTIATE_TEST_SUITE_P(
  562. GroupNonUniformIntegerArithmeticMissingClusterSize, GroupNonUniform,
  563. Combine(
  564. Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  565. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  566. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  567. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  568. "OpGroupNonUniformBitwiseXor"),
  569. Values("%u32"), Values(spv::Scope::Subgroup),
  570. Values("ClusteredReduce match_res"),
  571. Values(
  572. "ClusterSize must be present when Operation is ClusteredReduce")));
  573. INSTANTIATE_TEST_SUITE_P(
  574. GroupNonUniformIntegerArithmeticMissingBallot, GroupNonUniform,
  575. Combine(
  576. Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  577. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  578. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  579. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  580. "OpGroupNonUniformBitwiseXor"),
  581. Values("%u32"), Values(spv::Scope::Subgroup),
  582. Values("PartitionedReduceNV match_res",
  583. "PartitionedInclusiveScanNV match_res",
  584. "PartitionedExclusiveScanNV match_res"),
  585. Values("Ballot must be present when Operation is PartitionedReduceNV, "
  586. "PartitionedInclusiveScanNV, or PartitionedExclusiveScanNV")));
  587. INSTANTIATE_TEST_SUITE_P(
  588. GroupNonUniformIntegerArithmeticBadClusterSizeType, GroupNonUniform,
  589. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  590. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  591. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  592. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  593. "OpGroupNonUniformBitwiseXor"),
  594. Values("%u32"), Values(spv::Scope::Subgroup),
  595. Values("ClusteredReduce match_res %true",
  596. "ClusteredReduce match_res %false",
  597. "ClusteredReduce match_res %int_0",
  598. "ClusteredReduce match_res %float_0",
  599. "ClusteredReduce match_res %u32vec4_null",
  600. "ClusteredReduce match_res %u32vec3_null",
  601. "ClusteredReduce match_res %v2bool_false",
  602. "ClusteredReduce match_res %v4float_null",
  603. "ClusteredReduce match_res %struct_null",
  604. "ClusteredReduce match_res %v4int_null"),
  605. Values("ClusterSize must be an unsigned integer scalar")));
  606. INSTANTIATE_TEST_SUITE_P(
  607. GroupNonUniformIntegerArithmeticBadBallotType, GroupNonUniform,
  608. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  609. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  610. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  611. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  612. "OpGroupNonUniformBitwiseXor"),
  613. Values("%u32"), Values(spv::Scope::Subgroup),
  614. Values("PartitionedReduceNV match_res %true",
  615. "PartitionedReduceNV match_res %false",
  616. "PartitionedReduceNV match_res %int_0",
  617. "PartitionedReduceNV match_res %float_0",
  618. "PartitionedReduceNV match_res %u32_0",
  619. "PartitionedReduceNV match_res %u32vec3_null",
  620. "PartitionedReduceNV match_res %v2bool_false",
  621. "PartitionedReduceNV match_res %v4float_null",
  622. "PartitionedReduceNV match_res %struct_null"),
  623. Values("Ballot must be a 4-component integer vector")));
  624. INSTANTIATE_TEST_SUITE_P(
  625. GroupNonUniformIntegerArithmeticClusterSizeNotConstant, GroupNonUniform,
  626. Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
  627. "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
  628. "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
  629. "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
  630. "OpGroupNonUniformBitwiseXor"),
  631. Values("%u32"), Values(spv::Scope::Subgroup),
  632. Values("ClusteredReduce match_res %u32_undef"),
  633. Values("ClusterSize must be a constant instruction")));
  634. INSTANTIATE_TEST_SUITE_P(
  635. GroupNonUniformUnsignedIntegerArithmeticGood, GroupNonUniform,
  636. Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
  637. Values("%u32", "%u32vec4", "%u32vec3"),
  638. Values(spv::Scope::Subgroup),
  639. Values("Reduce match_res", "InclusiveScan match_res",
  640. "ExclusiveScan match_res",
  641. "ClusteredReduce match_res %u32_0"),
  642. Values("")));
  643. INSTANTIATE_TEST_SUITE_P(
  644. GroupNonUniformUnsignedIntegerArithmeticBadResultType, GroupNonUniform,
  645. Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
  646. Values("%bool", "%int", "%float", "%v4float", "%struct", "%v4int"),
  647. Values(spv::Scope::Subgroup),
  648. Values("Reduce match_res", "InclusiveScan match_res",
  649. "ExclusiveScan match_res",
  650. "ClusteredReduce match_res %u32_0"),
  651. Values("Result must be an unsigned integer scalar or vector")));
  652. INSTANTIATE_TEST_SUITE_P(
  653. GroupNonUniformUnsignedIntegerArithmeticBadValue, GroupNonUniform,
  654. Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
  655. Values("%u32vec4", "%u32vec3"), Values(spv::Scope::Subgroup),
  656. Values("Reduce %u32_0", "InclusiveScan %u32_0",
  657. "ExclusiveScan %u32_0", "ClusteredReduce %u32_0 %u32_0"),
  658. Values("The type of Value must match the Result type")));
  659. INSTANTIATE_TEST_SUITE_P(
  660. GroupNonUniformFloatArithmeticGood, GroupNonUniform,
  661. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  662. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  663. Values("%float", "%v4float"), Values(spv::Scope::Subgroup),
  664. Values("Reduce match_res", "InclusiveScan match_res",
  665. "ExclusiveScan match_res",
  666. "ClusteredReduce match_res %u32_0"),
  667. Values("")));
  668. INSTANTIATE_TEST_SUITE_P(
  669. GroupNonUniformFloatArithmeticBadResultType, GroupNonUniform,
  670. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  671. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  672. Values("%bool", "%u32", "%int", "%u32vec4", "%u32vec3", "%struct",
  673. "%v4int"),
  674. Values(spv::Scope::Subgroup),
  675. Values("Reduce match_res", "InclusiveScan match_res",
  676. "ExclusiveScan match_res",
  677. "ClusteredReduce match_res %u32_0"),
  678. Values("Result must be a floating-point scalar or vector")));
  679. INSTANTIATE_TEST_SUITE_P(
  680. GroupNonUniformFloatArithmeticBadValue, GroupNonUniform,
  681. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  682. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  683. Values("%v4float"), Values(spv::Scope::Subgroup),
  684. Values("Reduce %float_0", "InclusiveScan %float_0",
  685. "ExclusiveScan %float_0", "ClusteredReduce %float_0 %u32_0"),
  686. Values("The type of Value must match the Result type")));
  687. INSTANTIATE_TEST_SUITE_P(
  688. GroupNonUniformFloatArithmeticMissingClusterSize, GroupNonUniform,
  689. Combine(
  690. Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  691. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  692. Values("%float"), Values(spv::Scope::Subgroup),
  693. Values("ClusteredReduce match_res"),
  694. Values(
  695. "ClusterSize must be present when Operation is ClusteredReduce")));
  696. INSTANTIATE_TEST_SUITE_P(
  697. GroupNonUniformFloatArithmeticBadClusterSizeType, GroupNonUniform,
  698. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  699. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  700. Values("%float"), Values(spv::Scope::Subgroup),
  701. Values("ClusteredReduce match_res %true",
  702. "ClusteredReduce match_res %false",
  703. "ClusteredReduce match_res %int_0",
  704. "ClusteredReduce match_res %float_0",
  705. "ClusteredReduce match_res %u32vec4_null",
  706. "ClusteredReduce match_res %u32vec3_null",
  707. "ClusteredReduce match_res %v2bool_false",
  708. "ClusteredReduce match_res %v4float_null",
  709. "ClusteredReduce match_res %struct_null",
  710. "ClusteredReduce match_res %v4int_null"),
  711. Values("ClusterSize must be an unsigned integer scalar")));
  712. INSTANTIATE_TEST_SUITE_P(
  713. GroupNonUniformFloatArithmeticClusterSizeNotConstant, GroupNonUniform,
  714. Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
  715. "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
  716. Values("%float"), Values(spv::Scope::Subgroup),
  717. Values("ClusteredReduce match_res %u32_undef"),
  718. Values("ClusterSize must be a constant instruction")));
  719. INSTANTIATE_TEST_SUITE_P(
  720. GroupNonUniformBooleanArithmeticGood, GroupNonUniform,
  721. Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  722. "OpGroupNonUniformLogicalXor"),
  723. Values("%bool", "%v2bool"), Values(spv::Scope::Subgroup),
  724. Values("Reduce match_res", "InclusiveScan match_res",
  725. "ExclusiveScan match_res",
  726. "ClusteredReduce match_res %u32_0"),
  727. Values("")));
  728. INSTANTIATE_TEST_SUITE_P(
  729. GroupNonUniformBooleanArithmeticBadResultType, GroupNonUniform,
  730. Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  731. "OpGroupNonUniformLogicalXor"),
  732. Values("%u32", "%int", "%float", "%u32vec4", "%u32vec3", "%struct",
  733. "%v4float", "%v4int"),
  734. Values(spv::Scope::Subgroup),
  735. Values("Reduce match_res", "InclusiveScan match_res",
  736. "ExclusiveScan match_res",
  737. "ClusteredReduce match_res %u32_0"),
  738. Values("Result must be a boolean scalar or vector")));
  739. INSTANTIATE_TEST_SUITE_P(
  740. GroupNonUniformBooleanArithmeticBadValue, GroupNonUniform,
  741. Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  742. "OpGroupNonUniformLogicalXor"),
  743. Values("%v2bool"), Values(spv::Scope::Subgroup),
  744. Values("Reduce %true", "InclusiveScan %true",
  745. "ExclusiveScan %false", "ClusteredReduce %false %u32_0"),
  746. Values("The type of Value must match the Result type")));
  747. INSTANTIATE_TEST_SUITE_P(
  748. GroupNonUniformBooleanArithmeticMissingClusterSize, GroupNonUniform,
  749. Combine(
  750. Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  751. "OpGroupNonUniformLogicalXor"),
  752. Values("%bool"), Values(spv::Scope::Subgroup),
  753. Values("ClusteredReduce match_res"),
  754. Values(
  755. "ClusterSize must be present when Operation is ClusteredReduce")));
  756. INSTANTIATE_TEST_SUITE_P(
  757. GroupNonUniformBooleanArithmeticBadClusterSizeType, GroupNonUniform,
  758. Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  759. "OpGroupNonUniformLogicalXor"),
  760. Values("%bool"), Values(spv::Scope::Subgroup),
  761. Values("ClusteredReduce match_res %true",
  762. "ClusteredReduce match_res %false",
  763. "ClusteredReduce match_res %int_0",
  764. "ClusteredReduce match_res %float_0",
  765. "ClusteredReduce match_res %u32vec4_null",
  766. "ClusteredReduce match_res %u32vec3_null",
  767. "ClusteredReduce match_res %v2bool_false",
  768. "ClusteredReduce match_res %v4float_null",
  769. "ClusteredReduce match_res %struct_null",
  770. "ClusteredReduce match_res %v4int_null"),
  771. Values("ClusterSize must be an unsigned integer scalar")));
  772. INSTANTIATE_TEST_SUITE_P(
  773. GroupNonUniformBooleanArithmeticClusterSizeNotConstant, GroupNonUniform,
  774. Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
  775. "OpGroupNonUniformLogicalXor"),
  776. Values("%bool"), Values(spv::Scope::Subgroup),
  777. Values("ClusteredReduce match_res %u32_undef"),
  778. Values("ClusterSize must be a constant instruction")));
  779. // Subgroup scope is not actual parameter, but used for test expectations,
  780. INSTANTIATE_TEST_SUITE_P(GroupNonUniformQuadAllKHR, GroupNonUniform,
  781. Combine(Values("OpGroupNonUniformQuadAllKHR"),
  782. Values("%bool"), Values(spv::Scope::Subgroup),
  783. Values("%true"), Values("")));
  784. // Subgroup scope is not actual parameter, but used for test expectations,
  785. INSTANTIATE_TEST_SUITE_P(GroupNonUniformQuadAnyKHR, GroupNonUniform,
  786. Combine(Values("OpGroupNonUniformQuadAnyKHR"),
  787. Values("%bool"), Values(spv::Scope::Subgroup),
  788. Values("%true"), Values("")));
  789. TEST_F(ValidateGroupNonUniform, VulkanGroupNonUniformBallotBitCountOperation) {
  790. std::string test = R"(
  791. OpCapability Shader
  792. OpCapability GroupNonUniform
  793. OpCapability GroupNonUniformBallot
  794. OpCapability GroupNonUniformClustered
  795. OpMemoryModel Logical GLSL450
  796. OpEntryPoint GLCompute %main "main"
  797. OpExecutionMode %main LocalSize 1 1 1
  798. %void = OpTypeVoid
  799. %func = OpTypeFunction %void
  800. %u32 = OpTypeInt 32 0
  801. %u32vec4 = OpTypeVector %u32 4
  802. %u32_0 = OpConstant %u32 0
  803. %u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0
  804. %subgroup = OpConstant %u32 3
  805. %main = OpFunction %void None %func
  806. %main_entry = OpLabel
  807. %result = OpGroupNonUniformBallotBitCount %u32 %subgroup ClusteredReduce %u32vec4_null
  808. OpReturn
  809. OpFunctionEnd
  810. )";
  811. CompileSuccessfully(test, SPV_ENV_VULKAN_1_1);
  812. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  813. EXPECT_THAT(
  814. getDiagnosticString(),
  815. AnyVUID("VUID-StandaloneSpirv-OpGroupNonUniformBallotBitCount-04685"));
  816. EXPECT_THAT(
  817. getDiagnosticString(),
  818. HasSubstr(
  819. "In Vulkan: The OpGroupNonUniformBallotBitCount group operation must "
  820. "be only: Reduce, InclusiveScan, or ExclusiveScan."));
  821. }
  822. TEST_F(ValidateGroupNonUniform, BroadcastNonConstantSpv1p4) {
  823. const std::string text = R"(
  824. OpCapability Shader
  825. OpCapability GroupNonUniformBallot
  826. OpMemoryModel Logical GLSL450
  827. OpEntryPoint GLCompute %main "main" %var
  828. OpExecutionMode %main LocalSize 1 1 1
  829. OpDecorate %var DescriptorSet 0
  830. OpDecorate %var Binding 0
  831. OpDecorate %struct Block
  832. OpMemberDecorate %struct 0 Offset 0
  833. %void = OpTypeVoid
  834. %int = OpTypeInt 32 0
  835. %int_0 = OpConstant %int 0
  836. %subgroup = OpConstant %int 3
  837. %struct = OpTypeStruct %int
  838. %ptr_struct = OpTypePointer StorageBuffer %struct
  839. %ptr_int = OpTypePointer StorageBuffer %int
  840. %var = OpVariable %ptr_struct StorageBuffer
  841. %void_fn = OpTypeFunction %void
  842. %main = OpFunction %void None %void_fn
  843. %entry = OpLabel
  844. %gep = OpAccessChain %ptr_int %var %int_0
  845. %ld = OpLoad %int %gep
  846. %broadcast = OpGroupNonUniformBroadcast %int %subgroup %int_0 %ld
  847. OpReturn
  848. OpFunctionEnd
  849. )";
  850. CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_4);
  851. EXPECT_EQ(SPV_ERROR_INVALID_DATA,
  852. ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
  853. EXPECT_THAT(
  854. getDiagnosticString(),
  855. HasSubstr("Before SPIR-V 1.5, Id must be a constant instruction"));
  856. }
  857. TEST_F(ValidateGroupNonUniform, BroadcastNonConstantSpv1p5) {
  858. const std::string text = R"(
  859. OpCapability Shader
  860. OpCapability GroupNonUniformBallot
  861. OpMemoryModel Logical GLSL450
  862. OpEntryPoint GLCompute %main "main" %var
  863. OpExecutionMode %main LocalSize 1 1 1
  864. OpDecorate %var DescriptorSet 0
  865. OpDecorate %var Binding 0
  866. OpDecorate %struct Block
  867. OpMemberDecorate %struct 0 Offset 0
  868. %void = OpTypeVoid
  869. %int = OpTypeInt 32 0
  870. %int_0 = OpConstant %int 0
  871. %subgroup = OpConstant %int 3
  872. %struct = OpTypeStruct %int
  873. %ptr_struct = OpTypePointer StorageBuffer %struct
  874. %ptr_int = OpTypePointer StorageBuffer %int
  875. %var = OpVariable %ptr_struct StorageBuffer
  876. %void_fn = OpTypeFunction %void
  877. %main = OpFunction %void None %void_fn
  878. %entry = OpLabel
  879. %gep = OpAccessChain %ptr_int %var %int_0
  880. %ld = OpLoad %int %gep
  881. %broadcast = OpGroupNonUniformBroadcast %int %subgroup %int_0 %ld
  882. OpReturn
  883. OpFunctionEnd
  884. )";
  885. CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_5);
  886. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
  887. }
  888. TEST_F(ValidateGroupNonUniform, QuadBroadcastNonConstantSpv1p4) {
  889. const std::string text = R"(
  890. OpCapability Shader
  891. OpCapability GroupNonUniformQuad
  892. OpMemoryModel Logical GLSL450
  893. OpEntryPoint GLCompute %main "main" %var
  894. OpExecutionMode %main LocalSize 1 1 1
  895. OpDecorate %var DescriptorSet 0
  896. OpDecorate %var Binding 0
  897. OpDecorate %struct Block
  898. OpMemberDecorate %struct 0 Offset 0
  899. %void = OpTypeVoid
  900. %int = OpTypeInt 32 0
  901. %int_0 = OpConstant %int 0
  902. %subgroup = OpConstant %int 3
  903. %struct = OpTypeStruct %int
  904. %ptr_struct = OpTypePointer StorageBuffer %struct
  905. %ptr_int = OpTypePointer StorageBuffer %int
  906. %var = OpVariable %ptr_struct StorageBuffer
  907. %void_fn = OpTypeFunction %void
  908. %main = OpFunction %void None %void_fn
  909. %entry = OpLabel
  910. %gep = OpAccessChain %ptr_int %var %int_0
  911. %ld = OpLoad %int %gep
  912. %broadcast = OpGroupNonUniformQuadBroadcast %int %subgroup %int_0 %ld
  913. OpReturn
  914. OpFunctionEnd
  915. )";
  916. CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_4);
  917. EXPECT_EQ(SPV_ERROR_INVALID_DATA,
  918. ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
  919. EXPECT_THAT(
  920. getDiagnosticString(),
  921. HasSubstr("Before SPIR-V 1.5, Index must be a constant instruction"));
  922. }
  923. TEST_F(ValidateGroupNonUniform, QuadBroadcastNonConstantSpv1p5) {
  924. const std::string text = R"(
  925. OpCapability Shader
  926. OpCapability GroupNonUniformQuad
  927. OpMemoryModel Logical GLSL450
  928. OpEntryPoint GLCompute %main "main" %var
  929. OpExecutionMode %main LocalSize 1 1 1
  930. OpDecorate %var DescriptorSet 0
  931. OpDecorate %var Binding 0
  932. OpDecorate %struct Block
  933. OpMemberDecorate %struct 0 Offset 0
  934. %void = OpTypeVoid
  935. %int = OpTypeInt 32 0
  936. %int_0 = OpConstant %int 0
  937. %subgroup = OpConstant %int 3
  938. %struct = OpTypeStruct %int
  939. %ptr_struct = OpTypePointer StorageBuffer %struct
  940. %ptr_int = OpTypePointer StorageBuffer %int
  941. %var = OpVariable %ptr_struct StorageBuffer
  942. %void_fn = OpTypeFunction %void
  943. %main = OpFunction %void None %void_fn
  944. %entry = OpLabel
  945. %gep = OpAccessChain %ptr_int %var %int_0
  946. %ld = OpLoad %int %gep
  947. %broadcast = OpGroupNonUniformQuadBroadcast %int %subgroup %int_0 %ld
  948. OpReturn
  949. OpFunctionEnd
  950. )";
  951. CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_5);
  952. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
  953. }
  954. } // namespace
  955. } // namespace val
  956. } // namespace spvtools