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