1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 Google Inc. 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// Tests validation rules of GLSL.450.std and OpenCL.std extended instructions. 16fd4e5da5Sopenharmony_ci// Doesn't test OpenCL.std vector size 2, 3, 4, 8 or 16 rules (not supported 17fd4e5da5Sopenharmony_ci// by standard SPIR-V). 18fd4e5da5Sopenharmony_ci 19fd4e5da5Sopenharmony_ci#include <sstream> 20fd4e5da5Sopenharmony_ci#include <string> 21fd4e5da5Sopenharmony_ci#include <vector> 22fd4e5da5Sopenharmony_ci 23fd4e5da5Sopenharmony_ci#include "gmock/gmock.h" 24fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h" 25fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h" 26fd4e5da5Sopenharmony_ci 27fd4e5da5Sopenharmony_cinamespace spvtools { 28fd4e5da5Sopenharmony_cinamespace val { 29fd4e5da5Sopenharmony_cinamespace { 30fd4e5da5Sopenharmony_ci 31fd4e5da5Sopenharmony_ciusing ::testing::Eq; 32fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr; 33fd4e5da5Sopenharmony_ciusing ::testing::Not; 34fd4e5da5Sopenharmony_ci 35fd4e5da5Sopenharmony_ciusing ValidateExtInst = spvtest::ValidateBase<bool>; 36fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SqrtLike = spvtest::ValidateBase<std::string>; 37fd4e5da5Sopenharmony_ciusing ValidateGlslStd450FMinLike = spvtest::ValidateBase<std::string>; 38fd4e5da5Sopenharmony_ciusing ValidateGlslStd450FClampLike = spvtest::ValidateBase<std::string>; 39fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SAbsLike = spvtest::ValidateBase<std::string>; 40fd4e5da5Sopenharmony_ciusing ValidateGlslStd450UMinLike = spvtest::ValidateBase<std::string>; 41fd4e5da5Sopenharmony_ciusing ValidateGlslStd450UClampLike = spvtest::ValidateBase<std::string>; 42fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SinLike = spvtest::ValidateBase<std::string>; 43fd4e5da5Sopenharmony_ciusing ValidateGlslStd450PowLike = spvtest::ValidateBase<std::string>; 44fd4e5da5Sopenharmony_ciusing ValidateGlslStd450Pack = spvtest::ValidateBase<std::string>; 45fd4e5da5Sopenharmony_ciusing ValidateGlslStd450Unpack = spvtest::ValidateBase<std::string>; 46fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdSqrtLike = spvtest::ValidateBase<std::string>; 47fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFMinLike = spvtest::ValidateBase<std::string>; 48fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFClampLike = spvtest::ValidateBase<std::string>; 49fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdSAbsLike = spvtest::ValidateBase<std::string>; 50fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMinLike = spvtest::ValidateBase<std::string>; 51fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUClampLike = spvtest::ValidateBase<std::string>; 52fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMul24Like = spvtest::ValidateBase<std::string>; 53fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMad24Like = spvtest::ValidateBase<std::string>; 54fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdLengthLike = spvtest::ValidateBase<std::string>; 55fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdDistanceLike = spvtest::ValidateBase<std::string>; 56fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdNormalizeLike = spvtest::ValidateBase<std::string>; 57fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdVStoreHalfLike = spvtest::ValidateBase<std::string>; 58fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdVLoadHalfLike = spvtest::ValidateBase<std::string>; 59fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFractLike = spvtest::ValidateBase<std::string>; 60fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFrexpLike = spvtest::ValidateBase<std::string>; 61fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdLdexpLike = spvtest::ValidateBase<std::string>; 62fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUpsampleLike = spvtest::ValidateBase<std::string>; 63fd4e5da5Sopenharmony_ciusing ValidateClspvReflection = spvtest::ValidateBase<bool>; 64fd4e5da5Sopenharmony_ci 65fd4e5da5Sopenharmony_ci// Returns number of components in Pack/Unpack extended instructions. 66fd4e5da5Sopenharmony_ci// |ext_inst_name| is expected to be of the format "PackHalf2x16". 67fd4e5da5Sopenharmony_ci// Number of components is assumed to be single-digit. 68fd4e5da5Sopenharmony_ciuint32_t GetPackedNumComponents(const std::string& ext_inst_name) { 69fd4e5da5Sopenharmony_ci const size_t x_index = ext_inst_name.find_last_of('x'); 70fd4e5da5Sopenharmony_ci const std::string num_components_str = 71fd4e5da5Sopenharmony_ci ext_inst_name.substr(x_index - 1, x_index); 72fd4e5da5Sopenharmony_ci return uint32_t(std::stoul(num_components_str)); 73fd4e5da5Sopenharmony_ci} 74fd4e5da5Sopenharmony_ci 75fd4e5da5Sopenharmony_ci// Returns packed bit width in Pack/Unpack extended instructions. 76fd4e5da5Sopenharmony_ci// |ext_inst_name| is expected to be of the format "PackHalf2x16". 77fd4e5da5Sopenharmony_ciuint32_t GetPackedBitWidth(const std::string& ext_inst_name) { 78fd4e5da5Sopenharmony_ci const size_t x_index = ext_inst_name.find_last_of('x'); 79fd4e5da5Sopenharmony_ci const std::string packed_bit_width_str = ext_inst_name.substr(x_index + 1); 80fd4e5da5Sopenharmony_ci return uint32_t(std::stoul(packed_bit_width_str)); 81fd4e5da5Sopenharmony_ci} 82fd4e5da5Sopenharmony_ci 83fd4e5da5Sopenharmony_cistd::string GenerateShaderCode( 84fd4e5da5Sopenharmony_ci const std::string& body, 85fd4e5da5Sopenharmony_ci const std::string& capabilities_and_extensions = "", 86fd4e5da5Sopenharmony_ci const std::string& execution_model = "Fragment") { 87fd4e5da5Sopenharmony_ci std::ostringstream ss; 88fd4e5da5Sopenharmony_ci ss << R"( 89fd4e5da5Sopenharmony_ciOpCapability Shader 90fd4e5da5Sopenharmony_ciOpCapability Float16 91fd4e5da5Sopenharmony_ciOpCapability Float64 92fd4e5da5Sopenharmony_ciOpCapability Int16 93fd4e5da5Sopenharmony_ciOpCapability Int64 94fd4e5da5Sopenharmony_ci)"; 95fd4e5da5Sopenharmony_ci 96fd4e5da5Sopenharmony_ci ss << capabilities_and_extensions; 97fd4e5da5Sopenharmony_ci ss << "%extinst = OpExtInstImport \"GLSL.std.450\"\n"; 98fd4e5da5Sopenharmony_ci ss << "OpMemoryModel Logical GLSL450\n"; 99fd4e5da5Sopenharmony_ci ss << "OpEntryPoint " << execution_model << " %main \"main\"" 100fd4e5da5Sopenharmony_ci << " %f32_output" 101fd4e5da5Sopenharmony_ci << " %f32vec2_output" 102fd4e5da5Sopenharmony_ci << " %u32_output" 103fd4e5da5Sopenharmony_ci << " %u32vec2_output" 104fd4e5da5Sopenharmony_ci << " %u64_output" 105fd4e5da5Sopenharmony_ci << " %f32_input" 106fd4e5da5Sopenharmony_ci << " %f32vec2_input" 107fd4e5da5Sopenharmony_ci << " %u32_input" 108fd4e5da5Sopenharmony_ci << " %u32vec2_input" 109fd4e5da5Sopenharmony_ci << " %u64_input" 110fd4e5da5Sopenharmony_ci << "\n"; 111fd4e5da5Sopenharmony_ci if (execution_model == "Fragment") { 112fd4e5da5Sopenharmony_ci ss << "OpExecutionMode %main OriginUpperLeft\n"; 113fd4e5da5Sopenharmony_ci } 114fd4e5da5Sopenharmony_ci 115fd4e5da5Sopenharmony_ci ss << R"( 116fd4e5da5Sopenharmony_ci%void = OpTypeVoid 117fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void 118fd4e5da5Sopenharmony_ci%bool = OpTypeBool 119fd4e5da5Sopenharmony_ci%f16 = OpTypeFloat 16 120fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32 121fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64 122fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0 123fd4e5da5Sopenharmony_ci%s32 = OpTypeInt 32 1 124fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0 125fd4e5da5Sopenharmony_ci%s64 = OpTypeInt 64 1 126fd4e5da5Sopenharmony_ci%u16 = OpTypeInt 16 0 127fd4e5da5Sopenharmony_ci%s16 = OpTypeInt 16 1 128fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2 129fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3 130fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4 131fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2 132fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3 133fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4 134fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2 135fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3 136fd4e5da5Sopenharmony_ci%s32vec2 = OpTypeVector %s32 2 137fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4 138fd4e5da5Sopenharmony_ci%s32vec4 = OpTypeVector %s32 4 139fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2 140fd4e5da5Sopenharmony_ci%s64vec2 = OpTypeVector %s64 2 141fd4e5da5Sopenharmony_ci%f64mat22 = OpTypeMatrix %f64vec2 2 142fd4e5da5Sopenharmony_ci%f32mat22 = OpTypeMatrix %f32vec2 2 143fd4e5da5Sopenharmony_ci%f32mat23 = OpTypeMatrix %f32vec2 3 144fd4e5da5Sopenharmony_ci%f32mat32 = OpTypeMatrix %f32vec3 2 145fd4e5da5Sopenharmony_ci%f32mat33 = OpTypeMatrix %f32vec3 3 146fd4e5da5Sopenharmony_ci 147fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0 148fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1 149fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2 150fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3 151fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4 152fd4e5da5Sopenharmony_ci%f32_h = OpConstant %f32 0.5 153fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 154fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 155fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 156fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 157fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 158fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 159fd4e5da5Sopenharmony_ci 160fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0 161fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1 162fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2 163fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3 164fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 165fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 166fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 167fd4e5da5Sopenharmony_ci 168fd4e5da5Sopenharmony_ci%f16_0 = OpConstant %f16 0 169fd4e5da5Sopenharmony_ci%f16_1 = OpConstant %f16 1 170fd4e5da5Sopenharmony_ci%f16_h = OpConstant %f16 0.5 171fd4e5da5Sopenharmony_ci 172fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0 173fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1 174fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2 175fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3 176fd4e5da5Sopenharmony_ci 177fd4e5da5Sopenharmony_ci%s32_0 = OpConstant %s32 0 178fd4e5da5Sopenharmony_ci%s32_1 = OpConstant %s32 1 179fd4e5da5Sopenharmony_ci%s32_2 = OpConstant %s32 2 180fd4e5da5Sopenharmony_ci%s32_3 = OpConstant %s32 3 181fd4e5da5Sopenharmony_ci 182fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0 183fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1 184fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2 185fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3 186fd4e5da5Sopenharmony_ci 187fd4e5da5Sopenharmony_ci%s64_0 = OpConstant %s64 0 188fd4e5da5Sopenharmony_ci%s64_1 = OpConstant %s64 1 189fd4e5da5Sopenharmony_ci%s64_2 = OpConstant %s64 2 190fd4e5da5Sopenharmony_ci%s64_3 = OpConstant %s64 3 191fd4e5da5Sopenharmony_ci 192fd4e5da5Sopenharmony_ci%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1 193fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 194fd4e5da5Sopenharmony_ci 195fd4e5da5Sopenharmony_ci%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2 196fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 197fd4e5da5Sopenharmony_ci 198fd4e5da5Sopenharmony_ci%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3 199fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 200fd4e5da5Sopenharmony_ci 201fd4e5da5Sopenharmony_ci%s64vec2_01 = OpConstantComposite %s64vec2 %s64_0 %s64_1 202fd4e5da5Sopenharmony_ci%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1 203fd4e5da5Sopenharmony_ci 204fd4e5da5Sopenharmony_ci%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12 205fd4e5da5Sopenharmony_ci%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12 206fd4e5da5Sopenharmony_ci 207fd4e5da5Sopenharmony_ci%f32_ptr_output = OpTypePointer Output %f32 208fd4e5da5Sopenharmony_ci%f32vec2_ptr_output = OpTypePointer Output %f32vec2 209fd4e5da5Sopenharmony_ci 210fd4e5da5Sopenharmony_ci%u32_ptr_output = OpTypePointer Output %u32 211fd4e5da5Sopenharmony_ci%u32vec2_ptr_output = OpTypePointer Output %u32vec2 212fd4e5da5Sopenharmony_ci 213fd4e5da5Sopenharmony_ci%u64_ptr_output = OpTypePointer Output %u64 214fd4e5da5Sopenharmony_ci 215fd4e5da5Sopenharmony_ci%f32_output = OpVariable %f32_ptr_output Output 216fd4e5da5Sopenharmony_ci%f32vec2_output = OpVariable %f32vec2_ptr_output Output 217fd4e5da5Sopenharmony_ci 218fd4e5da5Sopenharmony_ci%u32_output = OpVariable %u32_ptr_output Output 219fd4e5da5Sopenharmony_ci%u32vec2_output = OpVariable %u32vec2_ptr_output Output 220fd4e5da5Sopenharmony_ci 221fd4e5da5Sopenharmony_ci%u64_output = OpVariable %u64_ptr_output Output 222fd4e5da5Sopenharmony_ci 223fd4e5da5Sopenharmony_ci%f32_ptr_input = OpTypePointer Input %f32 224fd4e5da5Sopenharmony_ci%f32vec2_ptr_input = OpTypePointer Input %f32vec2 225fd4e5da5Sopenharmony_ci 226fd4e5da5Sopenharmony_ci%u32_ptr_input = OpTypePointer Input %u32 227fd4e5da5Sopenharmony_ci%u32vec2_ptr_input = OpTypePointer Input %u32vec2 228fd4e5da5Sopenharmony_ci 229fd4e5da5Sopenharmony_ci%u64_ptr_input = OpTypePointer Input %u64 230fd4e5da5Sopenharmony_ci 231fd4e5da5Sopenharmony_ci%f32_input = OpVariable %f32_ptr_input Input 232fd4e5da5Sopenharmony_ci%f32vec2_input = OpVariable %f32vec2_ptr_input Input 233fd4e5da5Sopenharmony_ci 234fd4e5da5Sopenharmony_ci%u32_input = OpVariable %u32_ptr_input Input 235fd4e5da5Sopenharmony_ci%u32vec2_input = OpVariable %u32vec2_ptr_input Input 236fd4e5da5Sopenharmony_ci 237fd4e5da5Sopenharmony_ci%u64_input = OpVariable %u64_ptr_input Input 238fd4e5da5Sopenharmony_ci 239fd4e5da5Sopenharmony_ci%struct_f16_u16 = OpTypeStruct %f16 %u16 240fd4e5da5Sopenharmony_ci%struct_f32_f32 = OpTypeStruct %f32 %f32 241fd4e5da5Sopenharmony_ci%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32 242fd4e5da5Sopenharmony_ci%struct_f32_u32 = OpTypeStruct %f32 %u32 243fd4e5da5Sopenharmony_ci%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32 244fd4e5da5Sopenharmony_ci%struct_u32_f32 = OpTypeStruct %u32 %f32 245fd4e5da5Sopenharmony_ci%struct_u32_u32 = OpTypeStruct %u32 %u32 246fd4e5da5Sopenharmony_ci%struct_f32_f64 = OpTypeStruct %f32 %f64 247fd4e5da5Sopenharmony_ci%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2 248fd4e5da5Sopenharmony_ci%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2 249fd4e5da5Sopenharmony_ci 250fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func 251fd4e5da5Sopenharmony_ci%main_entry = OpLabel 252fd4e5da5Sopenharmony_ci)"; 253fd4e5da5Sopenharmony_ci 254fd4e5da5Sopenharmony_ci ss << body; 255fd4e5da5Sopenharmony_ci 256fd4e5da5Sopenharmony_ci ss << R"( 257fd4e5da5Sopenharmony_ciOpReturn 258fd4e5da5Sopenharmony_ciOpFunctionEnd)"; 259fd4e5da5Sopenharmony_ci 260fd4e5da5Sopenharmony_ci return ss.str(); 261fd4e5da5Sopenharmony_ci} 262fd4e5da5Sopenharmony_ci 263fd4e5da5Sopenharmony_cistd::string GenerateKernelCode( 264fd4e5da5Sopenharmony_ci const std::string& body, 265fd4e5da5Sopenharmony_ci const std::string& capabilities_and_extensions = "", 266fd4e5da5Sopenharmony_ci const std::string& memory_model = "Physical32") { 267fd4e5da5Sopenharmony_ci std::ostringstream ss; 268fd4e5da5Sopenharmony_ci ss << R"( 269fd4e5da5Sopenharmony_ciOpCapability Addresses 270fd4e5da5Sopenharmony_ciOpCapability Kernel 271fd4e5da5Sopenharmony_ciOpCapability Linkage 272fd4e5da5Sopenharmony_ciOpCapability GenericPointer 273fd4e5da5Sopenharmony_ciOpCapability Int8 274fd4e5da5Sopenharmony_ciOpCapability Int16 275fd4e5da5Sopenharmony_ciOpCapability Int64 276fd4e5da5Sopenharmony_ciOpCapability Float16 277fd4e5da5Sopenharmony_ciOpCapability Float64 278fd4e5da5Sopenharmony_ciOpCapability Vector16 279fd4e5da5Sopenharmony_ciOpCapability Matrix 280fd4e5da5Sopenharmony_ci)"; 281fd4e5da5Sopenharmony_ci 282fd4e5da5Sopenharmony_ci ss << capabilities_and_extensions; 283fd4e5da5Sopenharmony_ci ss << "%extinst = OpExtInstImport \"OpenCL.std\"\n"; 284fd4e5da5Sopenharmony_ci ss << "OpMemoryModel " << memory_model << " OpenCL\n"; 285fd4e5da5Sopenharmony_ci 286fd4e5da5Sopenharmony_ci ss << R"( 287fd4e5da5Sopenharmony_ci%void = OpTypeVoid 288fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void 289fd4e5da5Sopenharmony_ci%bool = OpTypeBool 290fd4e5da5Sopenharmony_ci%f16 = OpTypeFloat 16 291fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32 292fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64 293fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0 294fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0 295fd4e5da5Sopenharmony_ci%u16 = OpTypeInt 16 0 296fd4e5da5Sopenharmony_ci%u8 = OpTypeInt 8 0 297fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2 298fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3 299fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4 300fd4e5da5Sopenharmony_ci%f32vec8 = OpTypeVector %f32 8 301fd4e5da5Sopenharmony_ci%f16vec8 = OpTypeVector %f16 8 302fd4e5da5Sopenharmony_ci%f32vec16 = OpTypeVector %f32 16 303fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2 304fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3 305fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4 306fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2 307fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3 308fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4 309fd4e5da5Sopenharmony_ci%u32vec8 = OpTypeVector %u32 8 310fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2 311fd4e5da5Sopenharmony_ci%f64mat22 = OpTypeMatrix %f64vec2 2 312fd4e5da5Sopenharmony_ci%f32mat22 = OpTypeMatrix %f32vec2 2 313fd4e5da5Sopenharmony_ci%f32mat23 = OpTypeMatrix %f32vec2 3 314fd4e5da5Sopenharmony_ci%f32mat32 = OpTypeMatrix %f32vec3 2 315fd4e5da5Sopenharmony_ci%f32mat33 = OpTypeMatrix %f32vec3 3 316fd4e5da5Sopenharmony_ci 317fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0 318fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1 319fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2 320fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3 321fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4 322fd4e5da5Sopenharmony_ci%f32_h = OpConstant %f32 0.5 323fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 324fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 325fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 326fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 327fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 328fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 329fd4e5da5Sopenharmony_ci%f32vec8_01010101 = OpConstantComposite %f32vec8 %f32_0 %f32_1 %f32_0 %f32_1 %f32_0 %f32_1 %f32_0 %f32_1 330fd4e5da5Sopenharmony_ci 331fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0 332fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1 333fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2 334fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3 335fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 336fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 337fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 338fd4e5da5Sopenharmony_ci 339fd4e5da5Sopenharmony_ci%f16_0 = OpConstant %f16 0 340fd4e5da5Sopenharmony_ci%f16_1 = OpConstant %f16 1 341fd4e5da5Sopenharmony_ci 342fd4e5da5Sopenharmony_ci%u8_0 = OpConstant %u8 0 343fd4e5da5Sopenharmony_ci%u8_1 = OpConstant %u8 1 344fd4e5da5Sopenharmony_ci%u8_2 = OpConstant %u8 2 345fd4e5da5Sopenharmony_ci%u8_3 = OpConstant %u8 3 346fd4e5da5Sopenharmony_ci 347fd4e5da5Sopenharmony_ci%u16_0 = OpConstant %u16 0 348fd4e5da5Sopenharmony_ci%u16_1 = OpConstant %u16 1 349fd4e5da5Sopenharmony_ci%u16_2 = OpConstant %u16 2 350fd4e5da5Sopenharmony_ci%u16_3 = OpConstant %u16 3 351fd4e5da5Sopenharmony_ci 352fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0 353fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1 354fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2 355fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3 356fd4e5da5Sopenharmony_ci%u32_256 = OpConstant %u32 256 357fd4e5da5Sopenharmony_ci 358fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0 359fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1 360fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2 361fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3 362fd4e5da5Sopenharmony_ci%u64_256 = OpConstant %u64 256 363fd4e5da5Sopenharmony_ci 364fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 365fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 366fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2 367fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 368fd4e5da5Sopenharmony_ci 369fd4e5da5Sopenharmony_ci%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1 370fd4e5da5Sopenharmony_ci 371fd4e5da5Sopenharmony_ci%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12 372fd4e5da5Sopenharmony_ci%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12 373fd4e5da5Sopenharmony_ci 374fd4e5da5Sopenharmony_ci%struct_f32_f32 = OpTypeStruct %f32 %f32 375fd4e5da5Sopenharmony_ci%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32 376fd4e5da5Sopenharmony_ci%struct_f32_u32 = OpTypeStruct %f32 %u32 377fd4e5da5Sopenharmony_ci%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32 378fd4e5da5Sopenharmony_ci%struct_u32_f32 = OpTypeStruct %u32 %f32 379fd4e5da5Sopenharmony_ci%struct_u32_u32 = OpTypeStruct %u32 %u32 380fd4e5da5Sopenharmony_ci%struct_f32_f64 = OpTypeStruct %f32 %f64 381fd4e5da5Sopenharmony_ci%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2 382fd4e5da5Sopenharmony_ci%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2 383fd4e5da5Sopenharmony_ci 384fd4e5da5Sopenharmony_ci%f16vec8_ptr_workgroup = OpTypePointer Workgroup %f16vec8 385fd4e5da5Sopenharmony_ci%f16vec8_workgroup = OpVariable %f16vec8_ptr_workgroup Workgroup 386fd4e5da5Sopenharmony_ci%f16_ptr_workgroup = OpTypePointer Workgroup %f16 387fd4e5da5Sopenharmony_ci 388fd4e5da5Sopenharmony_ci%u32vec8_ptr_workgroup = OpTypePointer Workgroup %u32vec8 389fd4e5da5Sopenharmony_ci%u32vec8_workgroup = OpVariable %u32vec8_ptr_workgroup Workgroup 390fd4e5da5Sopenharmony_ci%u32_ptr_workgroup = OpTypePointer Workgroup %u32 391fd4e5da5Sopenharmony_ci 392fd4e5da5Sopenharmony_ci%f32vec8_ptr_workgroup = OpTypePointer Workgroup %f32vec8 393fd4e5da5Sopenharmony_ci%f32vec8_workgroup = OpVariable %f32vec8_ptr_workgroup Workgroup 394fd4e5da5Sopenharmony_ci%f32_ptr_workgroup = OpTypePointer Workgroup %f32 395fd4e5da5Sopenharmony_ci 396fd4e5da5Sopenharmony_ci%u32arr = OpTypeArray %u32 %u32_256 397fd4e5da5Sopenharmony_ci%u32arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %u32arr 398fd4e5da5Sopenharmony_ci%u32arr_cross_workgroup = OpVariable %u32arr_ptr_cross_workgroup CrossWorkgroup 399fd4e5da5Sopenharmony_ci%u32_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %u32 400fd4e5da5Sopenharmony_ci 401fd4e5da5Sopenharmony_ci%f32arr = OpTypeArray %f32 %u32_256 402fd4e5da5Sopenharmony_ci%f32arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32arr 403fd4e5da5Sopenharmony_ci%f32arr_cross_workgroup = OpVariable %f32arr_ptr_cross_workgroup CrossWorkgroup 404fd4e5da5Sopenharmony_ci%f32_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32 405fd4e5da5Sopenharmony_ci 406fd4e5da5Sopenharmony_ci%f32vec2arr = OpTypeArray %f32vec2 %u32_256 407fd4e5da5Sopenharmony_ci%f32vec2arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32vec2arr 408fd4e5da5Sopenharmony_ci%f32vec2arr_cross_workgroup = OpVariable %f32vec2arr_ptr_cross_workgroup CrossWorkgroup 409fd4e5da5Sopenharmony_ci%f32vec2_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32vec2 410fd4e5da5Sopenharmony_ci 411fd4e5da5Sopenharmony_ci%struct_arr = OpTypeArray %struct_f32_f32 %u32_256 412fd4e5da5Sopenharmony_ci%struct_arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %struct_arr 413fd4e5da5Sopenharmony_ci%struct_arr_cross_workgroup = OpVariable %struct_arr_ptr_cross_workgroup CrossWorkgroup 414fd4e5da5Sopenharmony_ci%struct_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %struct_f32_f32 415fd4e5da5Sopenharmony_ci 416fd4e5da5Sopenharmony_ci%f16vec8_ptr_uniform_constant = OpTypePointer UniformConstant %f16vec8 417fd4e5da5Sopenharmony_ci%f16vec8_uniform_constant = OpVariable %f16vec8_ptr_uniform_constant UniformConstant 418fd4e5da5Sopenharmony_ci%f16_ptr_uniform_constant = OpTypePointer UniformConstant %f16 419fd4e5da5Sopenharmony_ci 420fd4e5da5Sopenharmony_ci%u32vec8_ptr_uniform_constant = OpTypePointer UniformConstant %u32vec8 421fd4e5da5Sopenharmony_ci%u32vec8_uniform_constant = OpVariable %u32vec8_ptr_uniform_constant UniformConstant 422fd4e5da5Sopenharmony_ci%u32_ptr_uniform_constant = OpTypePointer UniformConstant %u32 423fd4e5da5Sopenharmony_ci 424fd4e5da5Sopenharmony_ci%f32vec8_ptr_uniform_constant = OpTypePointer UniformConstant %f32vec8 425fd4e5da5Sopenharmony_ci%f32vec8_uniform_constant = OpVariable %f32vec8_ptr_uniform_constant UniformConstant 426fd4e5da5Sopenharmony_ci%f32_ptr_uniform_constant = OpTypePointer UniformConstant %f32 427fd4e5da5Sopenharmony_ci 428fd4e5da5Sopenharmony_ci%f16vec8_ptr_input = OpTypePointer Input %f16vec8 429fd4e5da5Sopenharmony_ci%f16vec8_input = OpVariable %f16vec8_ptr_input Input 430fd4e5da5Sopenharmony_ci%f16_ptr_input = OpTypePointer Input %f16 431fd4e5da5Sopenharmony_ci 432fd4e5da5Sopenharmony_ci%u32vec8_ptr_input = OpTypePointer Input %u32vec8 433fd4e5da5Sopenharmony_ci%u32vec8_input = OpVariable %u32vec8_ptr_input Input 434fd4e5da5Sopenharmony_ci%u32_ptr_input = OpTypePointer Input %u32 435fd4e5da5Sopenharmony_ci 436fd4e5da5Sopenharmony_ci%f32_ptr_generic = OpTypePointer Generic %f32 437fd4e5da5Sopenharmony_ci%u32_ptr_generic = OpTypePointer Generic %u32 438fd4e5da5Sopenharmony_ci 439fd4e5da5Sopenharmony_ci%f32_ptr_function = OpTypePointer Function %f32 440fd4e5da5Sopenharmony_ci%f32vec2_ptr_function = OpTypePointer Function %f32vec2 441fd4e5da5Sopenharmony_ci%u32_ptr_function = OpTypePointer Function %u32 442fd4e5da5Sopenharmony_ci%u64_ptr_function = OpTypePointer Function %u64 443fd4e5da5Sopenharmony_ci%u32vec2_ptr_function = OpTypePointer Function %u32vec2 444fd4e5da5Sopenharmony_ci 445fd4e5da5Sopenharmony_ci%u8arr = OpTypeArray %u8 %u32_256 446fd4e5da5Sopenharmony_ci%u8arr_ptr_uniform_constant = OpTypePointer UniformConstant %u8arr 447fd4e5da5Sopenharmony_ci%u8arr_uniform_constant = OpVariable %u8arr_ptr_uniform_constant UniformConstant 448fd4e5da5Sopenharmony_ci%u8_ptr_uniform_constant = OpTypePointer UniformConstant %u8 449fd4e5da5Sopenharmony_ci%u8_ptr_generic = OpTypePointer Generic %u8 450fd4e5da5Sopenharmony_ci 451fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func 452fd4e5da5Sopenharmony_ci%main_entry = OpLabel 453fd4e5da5Sopenharmony_ci)"; 454fd4e5da5Sopenharmony_ci 455fd4e5da5Sopenharmony_ci ss << body; 456fd4e5da5Sopenharmony_ci 457fd4e5da5Sopenharmony_ci ss << R"( 458fd4e5da5Sopenharmony_ciOpReturn 459fd4e5da5Sopenharmony_ciOpFunctionEnd)"; 460fd4e5da5Sopenharmony_ci 461fd4e5da5Sopenharmony_ci return ss.str(); 462fd4e5da5Sopenharmony_ci} 463fd4e5da5Sopenharmony_ci 464fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, Success) { 465fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 466fd4e5da5Sopenharmony_ci std::ostringstream ss; 467fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n"; 468fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 469fd4e5da5Sopenharmony_ci << " %f32vec2_01\n"; 470fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name << " %f64_0\n"; 471fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 472fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 473fd4e5da5Sopenharmony_ci} 474fd4e5da5Sopenharmony_ci 475fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, IntResultType) { 476fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 477fd4e5da5Sopenharmony_ci const std::string body = 478fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n"; 479fd4e5da5Sopenharmony_ci 480fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 481fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 482fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 483fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 484fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 485fd4e5da5Sopenharmony_ci "or vector type")); 486fd4e5da5Sopenharmony_ci} 487fd4e5da5Sopenharmony_ci 488fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, IntOperand) { 489fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 490fd4e5da5Sopenharmony_ci const std::string body = 491fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n"; 492fd4e5da5Sopenharmony_ci 493fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 494fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 495fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 496fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 497fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 498fd4e5da5Sopenharmony_ci "Result Type")); 499fd4e5da5Sopenharmony_ci} 500fd4e5da5Sopenharmony_ci 501fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSqrtLike, ValidateGlslStd450SqrtLike, 502fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 503fd4e5da5Sopenharmony_ci "Round", 504fd4e5da5Sopenharmony_ci "RoundEven", 505fd4e5da5Sopenharmony_ci "FAbs", 506fd4e5da5Sopenharmony_ci "Trunc", 507fd4e5da5Sopenharmony_ci "FSign", 508fd4e5da5Sopenharmony_ci "Floor", 509fd4e5da5Sopenharmony_ci "Ceil", 510fd4e5da5Sopenharmony_ci "Fract", 511fd4e5da5Sopenharmony_ci "Sqrt", 512fd4e5da5Sopenharmony_ci "InverseSqrt", 513fd4e5da5Sopenharmony_ci "Normalize", 514fd4e5da5Sopenharmony_ci })); 515fd4e5da5Sopenharmony_ci 516fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, Success) { 517fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 518fd4e5da5Sopenharmony_ci std::ostringstream ss; 519fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 520fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1\n"; 521fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 522fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_12\n"; 523fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name 524fd4e5da5Sopenharmony_ci << " %f64_0 %f64_0\n"; 525fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 526fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 527fd4e5da5Sopenharmony_ci} 528fd4e5da5Sopenharmony_ci 529fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntResultType) { 530fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 531fd4e5da5Sopenharmony_ci const std::string body = 532fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %f32_1\n"; 533fd4e5da5Sopenharmony_ci 534fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 535fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 536fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 537fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 538fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 539fd4e5da5Sopenharmony_ci "or vector type")); 540fd4e5da5Sopenharmony_ci} 541fd4e5da5Sopenharmony_ci 542fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntOperand1) { 543fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 544fd4e5da5Sopenharmony_ci const std::string body = 545fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n"; 546fd4e5da5Sopenharmony_ci 547fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 548fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 549fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 550fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 551fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 552fd4e5da5Sopenharmony_ci "Result Type")); 553fd4e5da5Sopenharmony_ci} 554fd4e5da5Sopenharmony_ci 555fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntOperand2) { 556fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 557fd4e5da5Sopenharmony_ci const std::string body = 558fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n"; 559fd4e5da5Sopenharmony_ci 560fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 561fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 562fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 563fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 564fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 565fd4e5da5Sopenharmony_ci "Result Type")); 566fd4e5da5Sopenharmony_ci} 567fd4e5da5Sopenharmony_ci 568fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFMinLike, ValidateGlslStd450FMinLike, 569fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 570fd4e5da5Sopenharmony_ci "FMin", 571fd4e5da5Sopenharmony_ci "FMax", 572fd4e5da5Sopenharmony_ci "Step", 573fd4e5da5Sopenharmony_ci "Reflect", 574fd4e5da5Sopenharmony_ci "NMin", 575fd4e5da5Sopenharmony_ci "NMax", 576fd4e5da5Sopenharmony_ci })); 577fd4e5da5Sopenharmony_ci 578fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, Success) { 579fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 580fd4e5da5Sopenharmony_ci std::ostringstream ss; 581fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 582fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1 %f32_2\n"; 583fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 584fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_01 %f32vec2_12\n"; 585fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name 586fd4e5da5Sopenharmony_ci << " %f64_0 %f64_0 %f64_1\n"; 587fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 588fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 589fd4e5da5Sopenharmony_ci} 590fd4e5da5Sopenharmony_ci 591fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntResultType) { 592fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 593fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 594fd4e5da5Sopenharmony_ci " %f32_0 %f32_1 %f32_2\n"; 595fd4e5da5Sopenharmony_ci 596fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 597fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 598fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 599fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 600fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 601fd4e5da5Sopenharmony_ci "or vector type")); 602fd4e5da5Sopenharmony_ci} 603fd4e5da5Sopenharmony_ci 604fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand1) { 605fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 606fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 607fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %f32_1\n"; 608fd4e5da5Sopenharmony_ci 609fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 610fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 611fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 612fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 613fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 614fd4e5da5Sopenharmony_ci "Result Type")); 615fd4e5da5Sopenharmony_ci} 616fd4e5da5Sopenharmony_ci 617fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand2) { 618fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 619fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 620fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %f32_1\n"; 621fd4e5da5Sopenharmony_ci 622fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 623fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 624fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 625fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 626fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 627fd4e5da5Sopenharmony_ci "Result Type")); 628fd4e5da5Sopenharmony_ci} 629fd4e5da5Sopenharmony_ci 630fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand3) { 631fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 632fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 633fd4e5da5Sopenharmony_ci " %f32_1 %f32_0 %u32_2\n"; 634fd4e5da5Sopenharmony_ci 635fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 636fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 637fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 638fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 639fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 640fd4e5da5Sopenharmony_ci "Result Type")); 641fd4e5da5Sopenharmony_ci} 642fd4e5da5Sopenharmony_ci 643fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFClampLike, ValidateGlslStd450FClampLike, 644fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 645fd4e5da5Sopenharmony_ci "FClamp", 646fd4e5da5Sopenharmony_ci "FMix", 647fd4e5da5Sopenharmony_ci "SmoothStep", 648fd4e5da5Sopenharmony_ci "Fma", 649fd4e5da5Sopenharmony_ci "FaceForward", 650fd4e5da5Sopenharmony_ci "NClamp", 651fd4e5da5Sopenharmony_ci })); 652fd4e5da5Sopenharmony_ci 653fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, Success) { 654fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 655fd4e5da5Sopenharmony_ci std::ostringstream ss; 656fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name << " %u32_1\n"; 657fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name << " %s32_1\n"; 658fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n"; 659fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name << " %s32_1\n"; 660fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name 661fd4e5da5Sopenharmony_ci << " %s32vec2_01\n"; 662fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 663fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 664fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 665fd4e5da5Sopenharmony_ci << " %s32vec2_01\n"; 666fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name 667fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 668fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 669fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 670fd4e5da5Sopenharmony_ci} 671fd4e5da5Sopenharmony_ci 672fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, FloatResultType) { 673fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 674fd4e5da5Sopenharmony_ci const std::string body = 675fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n"; 676fd4e5da5Sopenharmony_ci 677fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 678fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 679fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 680fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 681fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 682fd4e5da5Sopenharmony_ci "or vector type")); 683fd4e5da5Sopenharmony_ci} 684fd4e5da5Sopenharmony_ci 685fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, FloatOperand) { 686fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 687fd4e5da5Sopenharmony_ci const std::string body = 688fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %f32_0\n"; 689fd4e5da5Sopenharmony_ci 690fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 691fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 692fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 693fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 694fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 695fd4e5da5Sopenharmony_ci "vectors")); 696fd4e5da5Sopenharmony_ci} 697fd4e5da5Sopenharmony_ci 698fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, WrongDimOperand) { 699fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 700fd4e5da5Sopenharmony_ci const std::string body = 701fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %s32vec2_01\n"; 702fd4e5da5Sopenharmony_ci 703fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 704fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 705fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 706fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 707fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 708fd4e5da5Sopenharmony_ci "Result Type")); 709fd4e5da5Sopenharmony_ci} 710fd4e5da5Sopenharmony_ci 711fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, WrongBitWidthOperand) { 712fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 713fd4e5da5Sopenharmony_ci const std::string body = 714fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s32_0\n"; 715fd4e5da5Sopenharmony_ci 716fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 717fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 718fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 719fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 720fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 721fd4e5da5Sopenharmony_ci "Result Type")); 722fd4e5da5Sopenharmony_ci} 723fd4e5da5Sopenharmony_ci 724fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, TypelessOperand) { 725fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 726fd4e5da5Sopenharmony_ci const std::string body = 727fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %main_entry\n"; 728fd4e5da5Sopenharmony_ci 729fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 730fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 731fd4e5da5Sopenharmony_ci EXPECT_THAT( 732fd4e5da5Sopenharmony_ci getDiagnosticString(), 733fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 734fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or vectors")); 735fd4e5da5Sopenharmony_ci} 736fd4e5da5Sopenharmony_ci 737fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSAbsLike, ValidateGlslStd450SAbsLike, 738fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 739fd4e5da5Sopenharmony_ci "SAbs", 740fd4e5da5Sopenharmony_ci "SSign", 741fd4e5da5Sopenharmony_ci "FindILsb", 742fd4e5da5Sopenharmony_ci "FindUMsb", 743fd4e5da5Sopenharmony_ci "FindSMsb", 744fd4e5da5Sopenharmony_ci })); 745fd4e5da5Sopenharmony_ci 746fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, FindUMsbNot32Bit) { 747fd4e5da5Sopenharmony_ci const std::string body = R"( 748fd4e5da5Sopenharmony_ci%val1 = OpExtInst %s64 %extinst FindUMsb %u64_1 749fd4e5da5Sopenharmony_ci)"; 750fd4e5da5Sopenharmony_ci 751fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 752fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 753fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 754fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FindUMsb: this instruction is currently " 755fd4e5da5Sopenharmony_ci "limited to 32-bit width components")); 756fd4e5da5Sopenharmony_ci} 757fd4e5da5Sopenharmony_ci 758fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, FindSMsbNot32Bit) { 759fd4e5da5Sopenharmony_ci const std::string body = R"( 760fd4e5da5Sopenharmony_ci%val1 = OpExtInst %s64 %extinst FindSMsb %u64_1 761fd4e5da5Sopenharmony_ci)"; 762fd4e5da5Sopenharmony_ci 763fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 764fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 765fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 766fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FindSMsb: this instruction is currently " 767fd4e5da5Sopenharmony_ci "limited to 32-bit width components")); 768fd4e5da5Sopenharmony_ci} 769fd4e5da5Sopenharmony_ci 770fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, Success) { 771fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 772fd4e5da5Sopenharmony_ci std::ostringstream ss; 773fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name 774fd4e5da5Sopenharmony_ci << " %u32_1 %s32_2\n"; 775fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name 776fd4e5da5Sopenharmony_ci << " %s32_1 %u32_2\n"; 777fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 778fd4e5da5Sopenharmony_ci << " %u32_1 %s32_2\n"; 779fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 780fd4e5da5Sopenharmony_ci << " %s32_1 %u32_2\n"; 781fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name 782fd4e5da5Sopenharmony_ci << " %s32vec2_01 %u32vec2_01\n"; 783fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 784fd4e5da5Sopenharmony_ci << " %u32vec2_01 %s32vec2_01\n"; 785fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 786fd4e5da5Sopenharmony_ci << " %s32vec2_01 %u32vec2_01\n"; 787fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name 788fd4e5da5Sopenharmony_ci << " %u32vec2_01 %s32vec2_01\n"; 789fd4e5da5Sopenharmony_ci ss << "%val9 = OpExtInst %s64 %extinst " << ext_inst_name 790fd4e5da5Sopenharmony_ci << " %u64_1 %s64_0\n"; 791fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 792fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 793fd4e5da5Sopenharmony_ci} 794fd4e5da5Sopenharmony_ci 795fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatResultType) { 796fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 797fd4e5da5Sopenharmony_ci const std::string body = 798fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n"; 799fd4e5da5Sopenharmony_ci 800fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 801fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 802fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 803fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 804fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 805fd4e5da5Sopenharmony_ci "or vector type")); 806fd4e5da5Sopenharmony_ci} 807fd4e5da5Sopenharmony_ci 808fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatOperand1) { 809fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 810fd4e5da5Sopenharmony_ci const std::string body = 811fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n"; 812fd4e5da5Sopenharmony_ci 813fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 814fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 815fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 816fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 817fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 818fd4e5da5Sopenharmony_ci "vectors")); 819fd4e5da5Sopenharmony_ci} 820fd4e5da5Sopenharmony_ci 821fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatOperand2) { 822fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 823fd4e5da5Sopenharmony_ci const std::string body = 824fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n"; 825fd4e5da5Sopenharmony_ci 826fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 827fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 828fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 829fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 830fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 831fd4e5da5Sopenharmony_ci "vectors")); 832fd4e5da5Sopenharmony_ci} 833fd4e5da5Sopenharmony_ci 834fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongDimOperand1) { 835fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 836fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 837fd4e5da5Sopenharmony_ci " %s32vec2_01 %s32_0\n"; 838fd4e5da5Sopenharmony_ci 839fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 840fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 841fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 842fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 843fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 844fd4e5da5Sopenharmony_ci "Result Type")); 845fd4e5da5Sopenharmony_ci} 846fd4e5da5Sopenharmony_ci 847fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongDimOperand2) { 848fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 849fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 850fd4e5da5Sopenharmony_ci " %s32_0 %s32vec2_01\n"; 851fd4e5da5Sopenharmony_ci 852fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 853fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 854fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 855fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 856fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 857fd4e5da5Sopenharmony_ci "Result Type")); 858fd4e5da5Sopenharmony_ci} 859fd4e5da5Sopenharmony_ci 860fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongBitWidthOperand1) { 861fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 862fd4e5da5Sopenharmony_ci const std::string body = 863fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s32_0 %s64_0\n"; 864fd4e5da5Sopenharmony_ci 865fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 866fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 867fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 868fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 869fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 870fd4e5da5Sopenharmony_ci "Result Type")); 871fd4e5da5Sopenharmony_ci} 872fd4e5da5Sopenharmony_ci 873fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongBitWidthOperand2) { 874fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 875fd4e5da5Sopenharmony_ci const std::string body = 876fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s64_0 %s32_0\n"; 877fd4e5da5Sopenharmony_ci 878fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 879fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 880fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 881fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 882fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 883fd4e5da5Sopenharmony_ci "Result Type")); 884fd4e5da5Sopenharmony_ci} 885fd4e5da5Sopenharmony_ci 886fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, TypelessOperand) { 887fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 888fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + 889fd4e5da5Sopenharmony_ci " %s64_0 %main_entry\n"; 890fd4e5da5Sopenharmony_ci 891fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 892fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 893fd4e5da5Sopenharmony_ci EXPECT_THAT( 894fd4e5da5Sopenharmony_ci getDiagnosticString(), 895fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 896fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or vectors")); 897fd4e5da5Sopenharmony_ci} 898fd4e5da5Sopenharmony_ci 899fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMinLike, ValidateGlslStd450UMinLike, 900fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 901fd4e5da5Sopenharmony_ci "UMin", 902fd4e5da5Sopenharmony_ci "SMin", 903fd4e5da5Sopenharmony_ci "UMax", 904fd4e5da5Sopenharmony_ci "SMax", 905fd4e5da5Sopenharmony_ci })); 906fd4e5da5Sopenharmony_ci 907fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, Success) { 908fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 909fd4e5da5Sopenharmony_ci std::ostringstream ss; 910fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name 911fd4e5da5Sopenharmony_ci << " %s32_0 %u32_1 %s32_2\n"; 912fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name 913fd4e5da5Sopenharmony_ci << " %u32_0 %s32_1 %u32_2\n"; 914fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 915fd4e5da5Sopenharmony_ci << " %s32_0 %u32_1 %s32_2\n"; 916fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 917fd4e5da5Sopenharmony_ci << " %u32_0 %s32_1 %u32_2\n"; 918fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name 919fd4e5da5Sopenharmony_ci << " %s32vec2_01 %u32vec2_01 %u32vec2_12\n"; 920fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 921fd4e5da5Sopenharmony_ci << " %u32vec2_01 %s32vec2_01 %s32vec2_12\n"; 922fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 923fd4e5da5Sopenharmony_ci << " %s32vec2_01 %u32vec2_01 %u32vec2_12\n"; 924fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name 925fd4e5da5Sopenharmony_ci << " %u32vec2_01 %s32vec2_01 %s32vec2_12\n"; 926fd4e5da5Sopenharmony_ci ss << "%val9 = OpExtInst %s64 %extinst " << ext_inst_name 927fd4e5da5Sopenharmony_ci << " %u64_1 %s64_0 %s64_1\n"; 928fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 929fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 930fd4e5da5Sopenharmony_ci} 931fd4e5da5Sopenharmony_ci 932fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatResultType) { 933fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 934fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 935fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %u32_1\n"; 936fd4e5da5Sopenharmony_ci 937fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 938fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 939fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 940fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 941fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 942fd4e5da5Sopenharmony_ci "or vector type")); 943fd4e5da5Sopenharmony_ci} 944fd4e5da5Sopenharmony_ci 945fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand1) { 946fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 947fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 948fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %u32_1\n"; 949fd4e5da5Sopenharmony_ci 950fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 951fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 952fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 953fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 954fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 955fd4e5da5Sopenharmony_ci "vectors")); 956fd4e5da5Sopenharmony_ci} 957fd4e5da5Sopenharmony_ci 958fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand2) { 959fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 960fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 961fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %u32_1\n"; 962fd4e5da5Sopenharmony_ci 963fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 964fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 965fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 966fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 967fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 968fd4e5da5Sopenharmony_ci "vectors")); 969fd4e5da5Sopenharmony_ci} 970fd4e5da5Sopenharmony_ci 971fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand3) { 972fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 973fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 974fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %f32_1\n"; 975fd4e5da5Sopenharmony_ci 976fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 977fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 978fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 979fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 980fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or " 981fd4e5da5Sopenharmony_ci "vectors")); 982fd4e5da5Sopenharmony_ci} 983fd4e5da5Sopenharmony_ci 984fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand1) { 985fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 986fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 987fd4e5da5Sopenharmony_ci " %s32vec2_01 %s32_0 %u32_1\n"; 988fd4e5da5Sopenharmony_ci 989fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 990fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 991fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 992fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 993fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 994fd4e5da5Sopenharmony_ci "Result Type")); 995fd4e5da5Sopenharmony_ci} 996fd4e5da5Sopenharmony_ci 997fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand2) { 998fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 999fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 1000fd4e5da5Sopenharmony_ci " %s32_0 %s32vec2_01 %u32_1\n"; 1001fd4e5da5Sopenharmony_ci 1002fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1003fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1004fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1005fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1006fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 1007fd4e5da5Sopenharmony_ci "Result Type")); 1008fd4e5da5Sopenharmony_ci} 1009fd4e5da5Sopenharmony_ci 1010fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand3) { 1011fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1012fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + 1013fd4e5da5Sopenharmony_ci " %s32_0 %u32_1 %s32vec2_01\n"; 1014fd4e5da5Sopenharmony_ci 1015fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1016fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1017fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1018fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1019fd4e5da5Sopenharmony_ci ": expected all operands to have the same dimension as " 1020fd4e5da5Sopenharmony_ci "Result Type")); 1021fd4e5da5Sopenharmony_ci} 1022fd4e5da5Sopenharmony_ci 1023fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand1) { 1024fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1025fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + 1026fd4e5da5Sopenharmony_ci " %s32_0 %s64_0 %s64_1\n"; 1027fd4e5da5Sopenharmony_ci 1028fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1029fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1030fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1031fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1032fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 1033fd4e5da5Sopenharmony_ci "Result Type")); 1034fd4e5da5Sopenharmony_ci} 1035fd4e5da5Sopenharmony_ci 1036fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand2) { 1037fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1038fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + 1039fd4e5da5Sopenharmony_ci " %s64_0 %s32_0 %s64_1\n"; 1040fd4e5da5Sopenharmony_ci 1041fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1042fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1043fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1044fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1045fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 1046fd4e5da5Sopenharmony_ci "Result Type")); 1047fd4e5da5Sopenharmony_ci} 1048fd4e5da5Sopenharmony_ci 1049fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand3) { 1050fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1051fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + 1052fd4e5da5Sopenharmony_ci " %s64_0 %s64_0 %s32_1\n"; 1053fd4e5da5Sopenharmony_ci 1054fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1055fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1056fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1057fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1058fd4e5da5Sopenharmony_ci ": expected all operands to have the same bit width as " 1059fd4e5da5Sopenharmony_ci "Result Type")); 1060fd4e5da5Sopenharmony_ci} 1061fd4e5da5Sopenharmony_ci 1062fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, TypelessOperand) { 1063fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1064fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + 1065fd4e5da5Sopenharmony_ci " %main_entry %s64_0 %s64_0\n"; 1066fd4e5da5Sopenharmony_ci 1067fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1068fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1069fd4e5da5Sopenharmony_ci EXPECT_THAT( 1070fd4e5da5Sopenharmony_ci getDiagnosticString(), 1071fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1072fd4e5da5Sopenharmony_ci ": expected all operands to be int scalars or vectors")); 1073fd4e5da5Sopenharmony_ci} 1074fd4e5da5Sopenharmony_ci 1075fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUClampLike, ValidateGlslStd450UClampLike, 1076fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 1077fd4e5da5Sopenharmony_ci "UClamp", 1078fd4e5da5Sopenharmony_ci "SClamp", 1079fd4e5da5Sopenharmony_ci })); 1080fd4e5da5Sopenharmony_ci 1081fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, Success) { 1082fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1083fd4e5da5Sopenharmony_ci std::ostringstream ss; 1084fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n"; 1085fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 1086fd4e5da5Sopenharmony_ci << " %f32vec2_01\n"; 1087fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 1088fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1089fd4e5da5Sopenharmony_ci} 1090fd4e5da5Sopenharmony_ci 1091fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, IntResultType) { 1092fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1093fd4e5da5Sopenharmony_ci const std::string body = 1094fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n"; 1095fd4e5da5Sopenharmony_ci 1096fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1097fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1098fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1099fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1100fd4e5da5Sopenharmony_ci ": expected Result Type to be a 16 or 32-bit scalar " 1101fd4e5da5Sopenharmony_ci "or vector float type")); 1102fd4e5da5Sopenharmony_ci} 1103fd4e5da5Sopenharmony_ci 1104fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, F64ResultType) { 1105fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1106fd4e5da5Sopenharmony_ci const std::string body = 1107fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32_0\n"; 1108fd4e5da5Sopenharmony_ci 1109fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1110fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1111fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1112fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1113fd4e5da5Sopenharmony_ci ": expected Result Type to be a 16 or 32-bit scalar " 1114fd4e5da5Sopenharmony_ci "or vector float type")); 1115fd4e5da5Sopenharmony_ci} 1116fd4e5da5Sopenharmony_ci 1117fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, IntOperand) { 1118fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1119fd4e5da5Sopenharmony_ci const std::string body = 1120fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n"; 1121fd4e5da5Sopenharmony_ci 1122fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1123fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1124fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1125fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1126fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 1127fd4e5da5Sopenharmony_ci "Result Type")); 1128fd4e5da5Sopenharmony_ci} 1129fd4e5da5Sopenharmony_ci 1130fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSinLike, ValidateGlslStd450SinLike, 1131fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 1132fd4e5da5Sopenharmony_ci "Radians", 1133fd4e5da5Sopenharmony_ci "Degrees", 1134fd4e5da5Sopenharmony_ci "Sin", 1135fd4e5da5Sopenharmony_ci "Cos", 1136fd4e5da5Sopenharmony_ci "Tan", 1137fd4e5da5Sopenharmony_ci "Asin", 1138fd4e5da5Sopenharmony_ci "Acos", 1139fd4e5da5Sopenharmony_ci "Atan", 1140fd4e5da5Sopenharmony_ci "Sinh", 1141fd4e5da5Sopenharmony_ci "Cosh", 1142fd4e5da5Sopenharmony_ci "Tanh", 1143fd4e5da5Sopenharmony_ci "Asinh", 1144fd4e5da5Sopenharmony_ci "Acosh", 1145fd4e5da5Sopenharmony_ci "Atanh", 1146fd4e5da5Sopenharmony_ci "Exp", 1147fd4e5da5Sopenharmony_ci "Exp2", 1148fd4e5da5Sopenharmony_ci "Log", 1149fd4e5da5Sopenharmony_ci "Log2", 1150fd4e5da5Sopenharmony_ci })); 1151fd4e5da5Sopenharmony_ci 1152fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, Success) { 1153fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1154fd4e5da5Sopenharmony_ci std::ostringstream ss; 1155fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 1156fd4e5da5Sopenharmony_ci << " %f32_1 %f32_1\n"; 1157fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 1158fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_12\n"; 1159fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(ss.str())); 1160fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1161fd4e5da5Sopenharmony_ci} 1162fd4e5da5Sopenharmony_ci 1163fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntResultType) { 1164fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1165fd4e5da5Sopenharmony_ci const std::string body = 1166fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_1 %f32_0\n"; 1167fd4e5da5Sopenharmony_ci 1168fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1169fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1170fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1171fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1172fd4e5da5Sopenharmony_ci ": expected Result Type to be a 16 or 32-bit scalar " 1173fd4e5da5Sopenharmony_ci "or vector float type")); 1174fd4e5da5Sopenharmony_ci} 1175fd4e5da5Sopenharmony_ci 1176fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, F64ResultType) { 1177fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1178fd4e5da5Sopenharmony_ci const std::string body = 1179fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32_1 %f32_0\n"; 1180fd4e5da5Sopenharmony_ci 1181fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1182fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1183fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1184fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1185fd4e5da5Sopenharmony_ci ": expected Result Type to be a 16 or 32-bit scalar " 1186fd4e5da5Sopenharmony_ci "or vector float type")); 1187fd4e5da5Sopenharmony_ci} 1188fd4e5da5Sopenharmony_ci 1189fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntOperand1) { 1190fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1191fd4e5da5Sopenharmony_ci const std::string body = 1192fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n"; 1193fd4e5da5Sopenharmony_ci 1194fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1195fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1196fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1197fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1198fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 1199fd4e5da5Sopenharmony_ci "Result Type")); 1200fd4e5da5Sopenharmony_ci} 1201fd4e5da5Sopenharmony_ci 1202fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntOperand2) { 1203fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1204fd4e5da5Sopenharmony_ci const std::string body = 1205fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n"; 1206fd4e5da5Sopenharmony_ci 1207fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1208fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1209fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1210fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 " + ext_inst_name + 1211fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 1212fd4e5da5Sopenharmony_ci "Result Type")); 1213fd4e5da5Sopenharmony_ci} 1214fd4e5da5Sopenharmony_ci 1215fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllPowLike, ValidateGlslStd450PowLike, 1216fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 1217fd4e5da5Sopenharmony_ci "Atan2", 1218fd4e5da5Sopenharmony_ci "Pow", 1219fd4e5da5Sopenharmony_ci })); 1220fd4e5da5Sopenharmony_ci 1221fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantSuccess) { 1222fd4e5da5Sopenharmony_ci const std::string body = R"( 1223fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32mat22_1212 1224fd4e5da5Sopenharmony_ci)"; 1225fd4e5da5Sopenharmony_ci 1226fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1227fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1228fd4e5da5Sopenharmony_ci} 1229fd4e5da5Sopenharmony_ci 1230fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantIncompatibleResultType) { 1231fd4e5da5Sopenharmony_ci const std::string body = R"( 1232fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst Determinant %f32mat22_1212 1233fd4e5da5Sopenharmony_ci)"; 1234fd4e5da5Sopenharmony_ci 1235fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1236fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1237fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1238fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Determinant: " 1239fd4e5da5Sopenharmony_ci "expected operand X component type to be equal to " 1240fd4e5da5Sopenharmony_ci "Result Type")); 1241fd4e5da5Sopenharmony_ci} 1242fd4e5da5Sopenharmony_ci 1243fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantNotMatrix) { 1244fd4e5da5Sopenharmony_ci const std::string body = R"( 1245fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32_1 1246fd4e5da5Sopenharmony_ci)"; 1247fd4e5da5Sopenharmony_ci 1248fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1249fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1250fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1251fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Determinant: " 1252fd4e5da5Sopenharmony_ci "expected operand X to be a square matrix")); 1253fd4e5da5Sopenharmony_ci} 1254fd4e5da5Sopenharmony_ci 1255fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantMatrixNotSquare) { 1256fd4e5da5Sopenharmony_ci const std::string body = R"( 1257fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32mat23_121212 1258fd4e5da5Sopenharmony_ci)"; 1259fd4e5da5Sopenharmony_ci 1260fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1261fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1262fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1263fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Determinant: " 1264fd4e5da5Sopenharmony_ci "expected operand X to be a square matrix")); 1265fd4e5da5Sopenharmony_ci} 1266fd4e5da5Sopenharmony_ci 1267fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseSuccess) { 1268fd4e5da5Sopenharmony_ci const std::string body = R"( 1269fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat22 %extinst MatrixInverse %f32mat22_1212 1270fd4e5da5Sopenharmony_ci)"; 1271fd4e5da5Sopenharmony_ci 1272fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1273fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1274fd4e5da5Sopenharmony_ci} 1275fd4e5da5Sopenharmony_ci 1276fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseIncompatibleResultType) { 1277fd4e5da5Sopenharmony_ci const std::string body = R"( 1278fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat33 %extinst MatrixInverse %f32mat22_1212 1279fd4e5da5Sopenharmony_ci)"; 1280fd4e5da5Sopenharmony_ci 1281fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1282fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1283fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1284fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 MatrixInverse: " 1285fd4e5da5Sopenharmony_ci "expected operand X type to be equal to " 1286fd4e5da5Sopenharmony_ci "Result Type")); 1287fd4e5da5Sopenharmony_ci} 1288fd4e5da5Sopenharmony_ci 1289fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseNotMatrix) { 1290fd4e5da5Sopenharmony_ci const std::string body = R"( 1291fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst MatrixInverse %f32mat22_1212 1292fd4e5da5Sopenharmony_ci)"; 1293fd4e5da5Sopenharmony_ci 1294fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1295fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1296fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1297fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 MatrixInverse: " 1298fd4e5da5Sopenharmony_ci "expected Result Type to be a square matrix")); 1299fd4e5da5Sopenharmony_ci} 1300fd4e5da5Sopenharmony_ci 1301fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseMatrixNotSquare) { 1302fd4e5da5Sopenharmony_ci const std::string body = R"( 1303fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat23 %extinst MatrixInverse %f32mat23_121212 1304fd4e5da5Sopenharmony_ci)"; 1305fd4e5da5Sopenharmony_ci 1306fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1307fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1308fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1309fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 MatrixInverse: " 1310fd4e5da5Sopenharmony_ci "expected Result Type to be a square matrix")); 1311fd4e5da5Sopenharmony_ci} 1312fd4e5da5Sopenharmony_ci 1313fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfSuccess) { 1314fd4e5da5Sopenharmony_ci const std::string body = R"( 1315fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32_output 1316fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Modf %f32vec2_01 %f32vec2_output 1317fd4e5da5Sopenharmony_ci)"; 1318fd4e5da5Sopenharmony_ci 1319fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1320fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1321fd4e5da5Sopenharmony_ci} 1322fd4e5da5Sopenharmony_ci 1323fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfIntResultType) { 1324fd4e5da5Sopenharmony_ci const std::string body = R"( 1325fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Modf %f32_h %f32_output 1326fd4e5da5Sopenharmony_ci)"; 1327fd4e5da5Sopenharmony_ci 1328fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1329fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1330fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1331fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Modf: " 1332fd4e5da5Sopenharmony_ci "expected Result Type to be a scalar or vector " 1333fd4e5da5Sopenharmony_ci "float type")); 1334fd4e5da5Sopenharmony_ci} 1335fd4e5da5Sopenharmony_ci 1336fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfXNotOfResultType) { 1337fd4e5da5Sopenharmony_ci const std::string body = R"( 1338fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f64_0 %f32_output 1339fd4e5da5Sopenharmony_ci)"; 1340fd4e5da5Sopenharmony_ci 1341fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1342fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1343fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1344fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Modf: " 1345fd4e5da5Sopenharmony_ci "expected operand X type to be equal to Result Type")); 1346fd4e5da5Sopenharmony_ci} 1347fd4e5da5Sopenharmony_ci 1348fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfINotPointer) { 1349fd4e5da5Sopenharmony_ci const std::string body = R"( 1350fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32_1 1351fd4e5da5Sopenharmony_ci)"; 1352fd4e5da5Sopenharmony_ci 1353fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1354fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1355fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1356fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Modf: " 1357fd4e5da5Sopenharmony_ci "expected operand I to be a pointer")); 1358fd4e5da5Sopenharmony_ci} 1359fd4e5da5Sopenharmony_ci 1360fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfIDataNotOfResultType) { 1361fd4e5da5Sopenharmony_ci const std::string body = R"( 1362fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32vec2_output 1363fd4e5da5Sopenharmony_ci)"; 1364fd4e5da5Sopenharmony_ci 1365fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1366fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1367fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1368fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Modf: " 1369fd4e5da5Sopenharmony_ci "expected operand I data type to be equal to " 1370fd4e5da5Sopenharmony_ci "Result Type")); 1371fd4e5da5Sopenharmony_ci} 1372fd4e5da5Sopenharmony_ci 1373fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructSuccess) { 1374fd4e5da5Sopenharmony_ci const std::string body = R"( 1375fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst ModfStruct %f32_h 1376fd4e5da5Sopenharmony_ci%val2 = OpExtInst %struct_f32vec2_f32vec2 %extinst ModfStruct %f32vec2_01 1377fd4e5da5Sopenharmony_ci)"; 1378fd4e5da5Sopenharmony_ci 1379fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1380fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1381fd4e5da5Sopenharmony_ci} 1382fd4e5da5Sopenharmony_ci 1383fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeNotStruct) { 1384fd4e5da5Sopenharmony_ci const std::string body = R"( 1385fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst ModfStruct %f32_h 1386fd4e5da5Sopenharmony_ci)"; 1387fd4e5da5Sopenharmony_ci 1388fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1389fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1390fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1391fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 ModfStruct: " 1392fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two " 1393fd4e5da5Sopenharmony_ci "identical scalar or vector float type members")); 1394fd4e5da5Sopenharmony_ci} 1395fd4e5da5Sopenharmony_ci 1396fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructWrongSize) { 1397fd4e5da5Sopenharmony_ci const std::string body = R"( 1398fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32_f32 %extinst ModfStruct %f32_h 1399fd4e5da5Sopenharmony_ci)"; 1400fd4e5da5Sopenharmony_ci 1401fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1402fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1403fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1404fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 ModfStruct: " 1405fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two " 1406fd4e5da5Sopenharmony_ci "identical scalar or vector float type members")); 1407fd4e5da5Sopenharmony_ci} 1408fd4e5da5Sopenharmony_ci 1409fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructWrongFirstMember) { 1410fd4e5da5Sopenharmony_ci const std::string body = R"( 1411fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_u32_f32 %extinst ModfStruct %f32_h 1412fd4e5da5Sopenharmony_ci)"; 1413fd4e5da5Sopenharmony_ci 1414fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1415fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1416fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1417fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 ModfStruct: " 1418fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two " 1419fd4e5da5Sopenharmony_ci "identical scalar or vector float type members")); 1420fd4e5da5Sopenharmony_ci} 1421fd4e5da5Sopenharmony_ci 1422fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructMembersNotEqual) { 1423fd4e5da5Sopenharmony_ci const std::string body = R"( 1424fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f64 %extinst ModfStruct %f32_h 1425fd4e5da5Sopenharmony_ci)"; 1426fd4e5da5Sopenharmony_ci 1427fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1428fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1429fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1430fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 ModfStruct: " 1431fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two " 1432fd4e5da5Sopenharmony_ci "identical scalar or vector float type members")); 1433fd4e5da5Sopenharmony_ci} 1434fd4e5da5Sopenharmony_ci 1435fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructXWrongType) { 1436fd4e5da5Sopenharmony_ci const std::string body = R"( 1437fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst ModfStruct %f64_0 1438fd4e5da5Sopenharmony_ci)"; 1439fd4e5da5Sopenharmony_ci 1440fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1441fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1442fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1443fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 ModfStruct: " 1444fd4e5da5Sopenharmony_ci "expected operand X type to be equal to members of " 1445fd4e5da5Sopenharmony_ci "Result Type struct")); 1446fd4e5da5Sopenharmony_ci} 1447fd4e5da5Sopenharmony_ci 1448fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpSuccess) { 1449fd4e5da5Sopenharmony_ci const std::string body = R"( 1450fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_h %u32_output 1451fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Frexp %f32vec2_01 %u32vec2_output 1452fd4e5da5Sopenharmony_ci)"; 1453fd4e5da5Sopenharmony_ci 1454fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1455fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1456fd4e5da5Sopenharmony_ci} 1457fd4e5da5Sopenharmony_ci 1458fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpIntResultType) { 1459fd4e5da5Sopenharmony_ci const std::string body = R"( 1460fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Frexp %f32_h %u32_output 1461fd4e5da5Sopenharmony_ci)"; 1462fd4e5da5Sopenharmony_ci 1463fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1464fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1465fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1466fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Frexp: " 1467fd4e5da5Sopenharmony_ci "expected Result Type to be a scalar or vector " 1468fd4e5da5Sopenharmony_ci "float type")); 1469fd4e5da5Sopenharmony_ci} 1470fd4e5da5Sopenharmony_ci 1471fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpWrongXType) { 1472fd4e5da5Sopenharmony_ci const std::string body = R"( 1473fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %u32_1 %u32_output 1474fd4e5da5Sopenharmony_ci)"; 1475fd4e5da5Sopenharmony_ci 1476fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1477fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1478fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1479fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Frexp: " 1480fd4e5da5Sopenharmony_ci "expected operand X type to be equal to Result Type")); 1481fd4e5da5Sopenharmony_ci} 1482fd4e5da5Sopenharmony_ci 1483fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpNotPointer) { 1484fd4e5da5Sopenharmony_ci const std::string body = R"( 1485fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_1 %u32_1 1486fd4e5da5Sopenharmony_ci)"; 1487fd4e5da5Sopenharmony_ci 1488fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1489fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1490fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1491fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Frexp: " 1492fd4e5da5Sopenharmony_ci "expected operand Exp to be a pointer")); 1493fd4e5da5Sopenharmony_ci} 1494fd4e5da5Sopenharmony_ci 1495fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpNotInt32Pointer) { 1496fd4e5da5Sopenharmony_ci const std::string body = R"( 1497fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_1 %f32_output 1498fd4e5da5Sopenharmony_ci)"; 1499fd4e5da5Sopenharmony_ci 1500fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1501fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1502fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1503fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Frexp: " 1504fd4e5da5Sopenharmony_ci "expected operand Exp data type to be a 32-bit int " 1505fd4e5da5Sopenharmony_ci "scalar or vector type")); 1506fd4e5da5Sopenharmony_ci} 1507fd4e5da5Sopenharmony_ci 1508fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpWrongComponentNumber) { 1509fd4e5da5Sopenharmony_ci const std::string body = R"( 1510fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Frexp %f32vec2_01 %u32_output 1511fd4e5da5Sopenharmony_ci)"; 1512fd4e5da5Sopenharmony_ci 1513fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1514fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1515fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1516fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Frexp: " 1517fd4e5da5Sopenharmony_ci "expected operand Exp data type to have the same " 1518fd4e5da5Sopenharmony_ci "component number as Result Type")); 1519fd4e5da5Sopenharmony_ci} 1520fd4e5da5Sopenharmony_ci 1521fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpSuccess) { 1522fd4e5da5Sopenharmony_ci const std::string body = R"( 1523fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_h %u32_2 1524fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Ldexp %f32vec2_01 %u32vec2_12 1525fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Ldexp %f32_h %u64_1 1526fd4e5da5Sopenharmony_ci)"; 1527fd4e5da5Sopenharmony_ci 1528fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1529fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1530fd4e5da5Sopenharmony_ci} 1531fd4e5da5Sopenharmony_ci 1532fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpIntResultType) { 1533fd4e5da5Sopenharmony_ci const std::string body = R"( 1534fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Ldexp %f32_h %u32_2 1535fd4e5da5Sopenharmony_ci)"; 1536fd4e5da5Sopenharmony_ci 1537fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1538fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1539fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1540fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Ldexp: " 1541fd4e5da5Sopenharmony_ci "expected Result Type to be a scalar or vector " 1542fd4e5da5Sopenharmony_ci "float type")); 1543fd4e5da5Sopenharmony_ci} 1544fd4e5da5Sopenharmony_ci 1545fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpWrongXType) { 1546fd4e5da5Sopenharmony_ci const std::string body = R"( 1547fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %u32_1 %u32_2 1548fd4e5da5Sopenharmony_ci)"; 1549fd4e5da5Sopenharmony_ci 1550fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1551fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1552fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1553fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Ldexp: " 1554fd4e5da5Sopenharmony_ci "expected operand X type to be equal to Result Type")); 1555fd4e5da5Sopenharmony_ci} 1556fd4e5da5Sopenharmony_ci 1557fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpFloatExp) { 1558fd4e5da5Sopenharmony_ci const std::string body = R"( 1559fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_1 %f32_2 1560fd4e5da5Sopenharmony_ci)"; 1561fd4e5da5Sopenharmony_ci 1562fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1563fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1564fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1565fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Ldexp: " 1566fd4e5da5Sopenharmony_ci "expected operand Exp to be a 32-bit int scalar " 1567fd4e5da5Sopenharmony_ci "or vector type")); 1568fd4e5da5Sopenharmony_ci} 1569fd4e5da5Sopenharmony_ci 1570fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpExpWrongSize) { 1571fd4e5da5Sopenharmony_ci const std::string body = R"( 1572fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Ldexp %f32vec2_12 %u32_2 1573fd4e5da5Sopenharmony_ci)"; 1574fd4e5da5Sopenharmony_ci 1575fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1576fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1577fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1578fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Ldexp: " 1579fd4e5da5Sopenharmony_ci "expected operand Exp to have the same component " 1580fd4e5da5Sopenharmony_ci "number as Result Type")); 1581fd4e5da5Sopenharmony_ci} 1582fd4e5da5Sopenharmony_ci 1583fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpExpNoType) { 1584fd4e5da5Sopenharmony_ci const std::string body = R"( 1585fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_1 %main_entry 1586fd4e5da5Sopenharmony_ci)"; 1587fd4e5da5Sopenharmony_ci 1588fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1589fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1590fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1591fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Ldexp: " 1592fd4e5da5Sopenharmony_ci "expected operand Exp to be a 32-bit int scalar " 1593fd4e5da5Sopenharmony_ci "or vector type")); 1594fd4e5da5Sopenharmony_ci} 1595fd4e5da5Sopenharmony_ci 1596fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructSuccess) { 1597fd4e5da5Sopenharmony_ci const std::string body = R"( 1598fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32 %extinst FrexpStruct %f32_h 1599fd4e5da5Sopenharmony_ci%val2 = OpExtInst %struct_f32vec2_u32vec2 %extinst FrexpStruct %f32vec2_01 1600fd4e5da5Sopenharmony_ci)"; 1601fd4e5da5Sopenharmony_ci 1602fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1603fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1604fd4e5da5Sopenharmony_ci} 1605fd4e5da5Sopenharmony_ci 1606fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeNotStruct) { 1607fd4e5da5Sopenharmony_ci const std::string body = R"( 1608fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst FrexpStruct %f32_h 1609fd4e5da5Sopenharmony_ci)"; 1610fd4e5da5Sopenharmony_ci 1611fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1612fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1613fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1614fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1615fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two members, " 1616fd4e5da5Sopenharmony_ci "first member a float scalar or vector, second member " 1617fd4e5da5Sopenharmony_ci "a 32-bit int scalar or vector with the same number of " 1618fd4e5da5Sopenharmony_ci "components as the first member")); 1619fd4e5da5Sopenharmony_ci} 1620fd4e5da5Sopenharmony_ci 1621fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongSize) { 1622fd4e5da5Sopenharmony_ci const std::string body = R"( 1623fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32_f32 %extinst FrexpStruct %f32_h 1624fd4e5da5Sopenharmony_ci)"; 1625fd4e5da5Sopenharmony_ci 1626fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1627fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1628fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1629fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1630fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two members, " 1631fd4e5da5Sopenharmony_ci "first member a float scalar or vector, second member " 1632fd4e5da5Sopenharmony_ci "a 32-bit int scalar or vector with the same number of " 1633fd4e5da5Sopenharmony_ci "components as the first member")); 1634fd4e5da5Sopenharmony_ci} 1635fd4e5da5Sopenharmony_ci 1636fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongMember1) { 1637fd4e5da5Sopenharmony_ci const std::string body = R"( 1638fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_u32_u32 %extinst FrexpStruct %f32_h 1639fd4e5da5Sopenharmony_ci)"; 1640fd4e5da5Sopenharmony_ci 1641fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1642fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1643fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1644fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1645fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two members, " 1646fd4e5da5Sopenharmony_ci "first member a float scalar or vector, second member " 1647fd4e5da5Sopenharmony_ci "a 32-bit int scalar or vector with the same number of " 1648fd4e5da5Sopenharmony_ci "components as the first member")); 1649fd4e5da5Sopenharmony_ci} 1650fd4e5da5Sopenharmony_ci 1651fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongMember2) { 1652fd4e5da5Sopenharmony_ci const std::string body = R"( 1653fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst FrexpStruct %f32_h 1654fd4e5da5Sopenharmony_ci)"; 1655fd4e5da5Sopenharmony_ci 1656fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1657fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1658fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1659fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1660fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two members, " 1661fd4e5da5Sopenharmony_ci "first member a float scalar or vector, second member " 1662fd4e5da5Sopenharmony_ci "a 32-bit int scalar or vector with the same number of " 1663fd4e5da5Sopenharmony_ci "components as the first member")); 1664fd4e5da5Sopenharmony_ci} 1665fd4e5da5Sopenharmony_ci 1666fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructXWrongType) { 1667fd4e5da5Sopenharmony_ci const std::string body = R"( 1668fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32 %extinst FrexpStruct %f64_0 1669fd4e5da5Sopenharmony_ci)"; 1670fd4e5da5Sopenharmony_ci 1671fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1672fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1673fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1674fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1675fd4e5da5Sopenharmony_ci "expected operand X type to be equal to the first " 1676fd4e5da5Sopenharmony_ci "member of Result Type struct")); 1677fd4e5da5Sopenharmony_ci} 1678fd4e5da5Sopenharmony_ci 1679fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, 1680fd4e5da5Sopenharmony_ci GlslStd450FrexpStructResultTypeStructRightInt16Member2) { 1681fd4e5da5Sopenharmony_ci const std::string body = R"( 1682fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f16_u16 %extinst FrexpStruct %f16_h 1683fd4e5da5Sopenharmony_ci)"; 1684fd4e5da5Sopenharmony_ci 1685fd4e5da5Sopenharmony_ci const std::string extension = R"( 1686fd4e5da5Sopenharmony_ciOpExtension "SPV_AMD_gpu_shader_int16" 1687fd4e5da5Sopenharmony_ci)"; 1688fd4e5da5Sopenharmony_ci 1689fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body, extension)); 1690fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1691fd4e5da5Sopenharmony_ci} 1692fd4e5da5Sopenharmony_ci 1693fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, 1694fd4e5da5Sopenharmony_ci GlslStd450FrexpStructResultTypeStructWrongInt16Member2) { 1695fd4e5da5Sopenharmony_ci const std::string body = R"( 1696fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f16_u16 %extinst FrexpStruct %f16_h 1697fd4e5da5Sopenharmony_ci)"; 1698fd4e5da5Sopenharmony_ci 1699fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1700fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1701fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1702fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 FrexpStruct: " 1703fd4e5da5Sopenharmony_ci "expected Result Type to be a struct with two members, " 1704fd4e5da5Sopenharmony_ci "first member a float scalar or vector, second member " 1705fd4e5da5Sopenharmony_ci "a 32-bit int scalar or vector with the same number of " 1706fd4e5da5Sopenharmony_ci "components as the first member")); 1707fd4e5da5Sopenharmony_ci} 1708fd4e5da5Sopenharmony_ci 1709fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Success) { 1710fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1711fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1712fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1713fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1714fd4e5da5Sopenharmony_ci const std::string vec_str = 1715fd4e5da5Sopenharmony_ci num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n"; 1716fd4e5da5Sopenharmony_ci 1717fd4e5da5Sopenharmony_ci std::ostringstream body; 1718fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst " 1719fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1720fd4e5da5Sopenharmony_ci body << "%val2 = OpExtInst %s" << total_bit_width << " %extinst " 1721fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1722fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1723fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1724fd4e5da5Sopenharmony_ci} 1725fd4e5da5Sopenharmony_ci 1726fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Float32ResultType) { 1727fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1728fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1729fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1730fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1731fd4e5da5Sopenharmony_ci const std::string vec_str = 1732fd4e5da5Sopenharmony_ci num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n"; 1733fd4e5da5Sopenharmony_ci 1734fd4e5da5Sopenharmony_ci std::ostringstream body; 1735fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %f" << total_bit_width << " %extinst " 1736fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1737fd4e5da5Sopenharmony_ci 1738fd4e5da5Sopenharmony_ci std::ostringstream expected; 1739fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1740fd4e5da5Sopenharmony_ci << ": expected Result Type to be " << total_bit_width 1741fd4e5da5Sopenharmony_ci << "-bit int scalar type"; 1742fd4e5da5Sopenharmony_ci 1743fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1744fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1745fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1746fd4e5da5Sopenharmony_ci} 1747fd4e5da5Sopenharmony_ci 1748fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Int16ResultType) { 1749fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1750fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1751fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1752fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1753fd4e5da5Sopenharmony_ci const std::string vec_str = 1754fd4e5da5Sopenharmony_ci num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n"; 1755fd4e5da5Sopenharmony_ci 1756fd4e5da5Sopenharmony_ci std::ostringstream body; 1757fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u16 %extinst " << ext_inst_name << vec_str; 1758fd4e5da5Sopenharmony_ci 1759fd4e5da5Sopenharmony_ci std::ostringstream expected; 1760fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1761fd4e5da5Sopenharmony_ci << ": expected Result Type to be " << total_bit_width 1762fd4e5da5Sopenharmony_ci << "-bit int scalar type"; 1763fd4e5da5Sopenharmony_ci 1764fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1765fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1766fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1767fd4e5da5Sopenharmony_ci} 1768fd4e5da5Sopenharmony_ci 1769fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotVector) { 1770fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1771fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1772fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1773fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1774fd4e5da5Sopenharmony_ci 1775fd4e5da5Sopenharmony_ci std::ostringstream body; 1776fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst " 1777fd4e5da5Sopenharmony_ci << ext_inst_name << " %f32_1\n"; 1778fd4e5da5Sopenharmony_ci 1779fd4e5da5Sopenharmony_ci std::ostringstream expected; 1780fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1781fd4e5da5Sopenharmony_ci << ": expected operand V to be a 32-bit float vector of size " 1782fd4e5da5Sopenharmony_ci << num_components; 1783fd4e5da5Sopenharmony_ci 1784fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1785fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1786fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1787fd4e5da5Sopenharmony_ci} 1788fd4e5da5Sopenharmony_ci 1789fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotFloatVector) { 1790fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1791fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1792fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1793fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1794fd4e5da5Sopenharmony_ci const std::string vec_str = 1795fd4e5da5Sopenharmony_ci num_components == 2 ? " %u32vec2_01\n" : " %u32vec4_0123\n"; 1796fd4e5da5Sopenharmony_ci 1797fd4e5da5Sopenharmony_ci std::ostringstream body; 1798fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst " 1799fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1800fd4e5da5Sopenharmony_ci 1801fd4e5da5Sopenharmony_ci std::ostringstream expected; 1802fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1803fd4e5da5Sopenharmony_ci << ": expected operand V to be a 32-bit float vector of size " 1804fd4e5da5Sopenharmony_ci << num_components; 1805fd4e5da5Sopenharmony_ci 1806fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1807fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1808fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1809fd4e5da5Sopenharmony_ci} 1810fd4e5da5Sopenharmony_ci 1811fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotFloat32Vector) { 1812fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1813fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1814fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1815fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1816fd4e5da5Sopenharmony_ci const std::string vec_str = 1817fd4e5da5Sopenharmony_ci num_components == 2 ? " %f64vec2_01\n" : " %f64vec4_0123\n"; 1818fd4e5da5Sopenharmony_ci 1819fd4e5da5Sopenharmony_ci std::ostringstream body; 1820fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst " 1821fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1822fd4e5da5Sopenharmony_ci 1823fd4e5da5Sopenharmony_ci std::ostringstream expected; 1824fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1825fd4e5da5Sopenharmony_ci << ": expected operand V to be a 32-bit float vector of size " 1826fd4e5da5Sopenharmony_ci << num_components; 1827fd4e5da5Sopenharmony_ci 1828fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1829fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1830fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1831fd4e5da5Sopenharmony_ci} 1832fd4e5da5Sopenharmony_ci 1833fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VWrongSizeVector) { 1834fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1835fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1836fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1837fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1838fd4e5da5Sopenharmony_ci const std::string vec_str = 1839fd4e5da5Sopenharmony_ci num_components == 4 ? " %f32vec2_01\n" : " %f32vec4_0123\n"; 1840fd4e5da5Sopenharmony_ci 1841fd4e5da5Sopenharmony_ci std::ostringstream body; 1842fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst " 1843fd4e5da5Sopenharmony_ci << ext_inst_name << vec_str; 1844fd4e5da5Sopenharmony_ci 1845fd4e5da5Sopenharmony_ci std::ostringstream expected; 1846fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1847fd4e5da5Sopenharmony_ci << ": expected operand V to be a 32-bit float vector of size " 1848fd4e5da5Sopenharmony_ci << num_components; 1849fd4e5da5Sopenharmony_ci 1850fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1851fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1852fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1853fd4e5da5Sopenharmony_ci} 1854fd4e5da5Sopenharmony_ci 1855fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllPack, ValidateGlslStd450Pack, 1856fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 1857fd4e5da5Sopenharmony_ci "PackSnorm4x8", 1858fd4e5da5Sopenharmony_ci "PackUnorm4x8", 1859fd4e5da5Sopenharmony_ci "PackSnorm2x16", 1860fd4e5da5Sopenharmony_ci "PackUnorm2x16", 1861fd4e5da5Sopenharmony_ci "PackHalf2x16", 1862fd4e5da5Sopenharmony_ci })); 1863fd4e5da5Sopenharmony_ci 1864fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Success) { 1865fd4e5da5Sopenharmony_ci const std::string body = R"( 1866fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u32vec2_01 1867fd4e5da5Sopenharmony_ci)"; 1868fd4e5da5Sopenharmony_ci 1869fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1870fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1871fd4e5da5Sopenharmony_ci} 1872fd4e5da5Sopenharmony_ci 1873fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Float32ResultType) { 1874fd4e5da5Sopenharmony_ci const std::string body = R"( 1875fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst PackDouble2x32 %u32vec2_01 1876fd4e5da5Sopenharmony_ci)"; 1877fd4e5da5Sopenharmony_ci 1878fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1879fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1880fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1881fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected Result Type to " 1882fd4e5da5Sopenharmony_ci "be 64-bit float scalar type")); 1883fd4e5da5Sopenharmony_ci} 1884fd4e5da5Sopenharmony_ci 1885fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Int64ResultType) { 1886fd4e5da5Sopenharmony_ci const std::string body = R"( 1887fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst PackDouble2x32 %u32vec2_01 1888fd4e5da5Sopenharmony_ci)"; 1889fd4e5da5Sopenharmony_ci 1890fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1891fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1892fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1893fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected Result Type to " 1894fd4e5da5Sopenharmony_ci "be 64-bit float scalar type")); 1895fd4e5da5Sopenharmony_ci} 1896fd4e5da5Sopenharmony_ci 1897fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotVector) { 1898fd4e5da5Sopenharmony_ci const std::string body = R"( 1899fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u64_1 1900fd4e5da5Sopenharmony_ci)"; 1901fd4e5da5Sopenharmony_ci 1902fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1903fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1904fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1905fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be " 1906fd4e5da5Sopenharmony_ci "a 32-bit int vector of size 2")); 1907fd4e5da5Sopenharmony_ci} 1908fd4e5da5Sopenharmony_ci 1909fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotIntVector) { 1910fd4e5da5Sopenharmony_ci const std::string body = R"( 1911fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %f32vec2_01 1912fd4e5da5Sopenharmony_ci)"; 1913fd4e5da5Sopenharmony_ci 1914fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1915fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1916fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1917fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be " 1918fd4e5da5Sopenharmony_ci "a 32-bit int vector of size 2")); 1919fd4e5da5Sopenharmony_ci} 1920fd4e5da5Sopenharmony_ci 1921fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotInt32Vector) { 1922fd4e5da5Sopenharmony_ci const std::string body = R"( 1923fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u64vec2_01 1924fd4e5da5Sopenharmony_ci)"; 1925fd4e5da5Sopenharmony_ci 1926fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1927fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1928fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1929fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be " 1930fd4e5da5Sopenharmony_ci "a 32-bit int vector of size 2")); 1931fd4e5da5Sopenharmony_ci} 1932fd4e5da5Sopenharmony_ci 1933fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VWrongSize) { 1934fd4e5da5Sopenharmony_ci const std::string body = R"( 1935fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u32vec4_0123 1936fd4e5da5Sopenharmony_ci)"; 1937fd4e5da5Sopenharmony_ci 1938fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 1939fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1940fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1941fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be " 1942fd4e5da5Sopenharmony_ci "a 32-bit int vector of size 2")); 1943fd4e5da5Sopenharmony_ci} 1944fd4e5da5Sopenharmony_ci 1945fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, Success) { 1946fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1947fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1948fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1949fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1950fd4e5da5Sopenharmony_ci const std::string result_type_str = 1951fd4e5da5Sopenharmony_ci num_components == 2 ? "%f32vec2" : " %f32vec4"; 1952fd4e5da5Sopenharmony_ci 1953fd4e5da5Sopenharmony_ci std::ostringstream body; 1954fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 1955fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << total_bit_width << "_1\n"; 1956fd4e5da5Sopenharmony_ci body << "%val2 = OpExtInst " << result_type_str << " %extinst " 1957fd4e5da5Sopenharmony_ci << ext_inst_name << " %s" << total_bit_width << "_1\n"; 1958fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1959fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1960fd4e5da5Sopenharmony_ci} 1961fd4e5da5Sopenharmony_ci 1962fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotVector) { 1963fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1964fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1965fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1966fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1967fd4e5da5Sopenharmony_ci const std::string result_type_str = "%f32"; 1968fd4e5da5Sopenharmony_ci 1969fd4e5da5Sopenharmony_ci std::ostringstream body; 1970fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 1971fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << total_bit_width << "_1\n"; 1972fd4e5da5Sopenharmony_ci 1973fd4e5da5Sopenharmony_ci std::ostringstream expected; 1974fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1975fd4e5da5Sopenharmony_ci << ": expected Result Type to be a 32-bit float vector of size " 1976fd4e5da5Sopenharmony_ci << num_components; 1977fd4e5da5Sopenharmony_ci 1978fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 1979fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1980fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 1981fd4e5da5Sopenharmony_ci} 1982fd4e5da5Sopenharmony_ci 1983fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotFloatVector) { 1984fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 1985fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 1986fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 1987fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 1988fd4e5da5Sopenharmony_ci const std::string result_type_str = 1989fd4e5da5Sopenharmony_ci num_components == 2 ? "%u32vec2" : " %u32vec4"; 1990fd4e5da5Sopenharmony_ci 1991fd4e5da5Sopenharmony_ci std::ostringstream body; 1992fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 1993fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << total_bit_width << "_1\n"; 1994fd4e5da5Sopenharmony_ci 1995fd4e5da5Sopenharmony_ci std::ostringstream expected; 1996fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 1997fd4e5da5Sopenharmony_ci << ": expected Result Type to be a 32-bit float vector of size " 1998fd4e5da5Sopenharmony_ci << num_components; 1999fd4e5da5Sopenharmony_ci 2000fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 2001fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2002fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 2003fd4e5da5Sopenharmony_ci} 2004fd4e5da5Sopenharmony_ci 2005fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotFloat32Vector) { 2006fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2007fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 2008fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 2009fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 2010fd4e5da5Sopenharmony_ci const std::string result_type_str = 2011fd4e5da5Sopenharmony_ci num_components == 2 ? "%f64vec2" : " %f64vec4"; 2012fd4e5da5Sopenharmony_ci 2013fd4e5da5Sopenharmony_ci std::ostringstream body; 2014fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 2015fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << total_bit_width << "_1\n"; 2016fd4e5da5Sopenharmony_ci 2017fd4e5da5Sopenharmony_ci std::ostringstream expected; 2018fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 2019fd4e5da5Sopenharmony_ci << ": expected Result Type to be a 32-bit float vector of size " 2020fd4e5da5Sopenharmony_ci << num_components; 2021fd4e5da5Sopenharmony_ci 2022fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 2023fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2024fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 2025fd4e5da5Sopenharmony_ci} 2026fd4e5da5Sopenharmony_ci 2027fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeWrongSize) { 2028fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2029fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 2030fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 2031fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 2032fd4e5da5Sopenharmony_ci const std::string result_type_str = 2033fd4e5da5Sopenharmony_ci num_components == 4 ? "%f32vec2" : " %f32vec4"; 2034fd4e5da5Sopenharmony_ci 2035fd4e5da5Sopenharmony_ci std::ostringstream body; 2036fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 2037fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << total_bit_width << "_1\n"; 2038fd4e5da5Sopenharmony_ci 2039fd4e5da5Sopenharmony_ci std::ostringstream expected; 2040fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 2041fd4e5da5Sopenharmony_ci << ": expected Result Type to be a 32-bit float vector of size " 2042fd4e5da5Sopenharmony_ci << num_components; 2043fd4e5da5Sopenharmony_ci 2044fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 2045fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2046fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 2047fd4e5da5Sopenharmony_ci} 2048fd4e5da5Sopenharmony_ci 2049fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultPNotInt) { 2050fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2051fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 2052fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 2053fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 2054fd4e5da5Sopenharmony_ci const std::string result_type_str = 2055fd4e5da5Sopenharmony_ci num_components == 2 ? "%f32vec2" : " %f32vec4"; 2056fd4e5da5Sopenharmony_ci 2057fd4e5da5Sopenharmony_ci std::ostringstream body; 2058fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 2059fd4e5da5Sopenharmony_ci << ext_inst_name << " %f" << total_bit_width << "_1\n"; 2060fd4e5da5Sopenharmony_ci 2061fd4e5da5Sopenharmony_ci std::ostringstream expected; 2062fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 2063fd4e5da5Sopenharmony_ci << ": expected operand P to be a " << total_bit_width 2064fd4e5da5Sopenharmony_ci << "-bit int scalar"; 2065fd4e5da5Sopenharmony_ci 2066fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 2067fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2068fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 2069fd4e5da5Sopenharmony_ci} 2070fd4e5da5Sopenharmony_ci 2071fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultPWrongBitWidth) { 2072fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2073fd4e5da5Sopenharmony_ci const uint32_t num_components = GetPackedNumComponents(ext_inst_name); 2074fd4e5da5Sopenharmony_ci const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name); 2075fd4e5da5Sopenharmony_ci const uint32_t total_bit_width = num_components * packed_bit_width; 2076fd4e5da5Sopenharmony_ci const uint32_t wrong_bit_width = total_bit_width == 32 ? 64 : 32; 2077fd4e5da5Sopenharmony_ci const std::string result_type_str = 2078fd4e5da5Sopenharmony_ci num_components == 2 ? "%f32vec2" : " %f32vec4"; 2079fd4e5da5Sopenharmony_ci 2080fd4e5da5Sopenharmony_ci std::ostringstream body; 2081fd4e5da5Sopenharmony_ci body << "%val1 = OpExtInst " << result_type_str << " %extinst " 2082fd4e5da5Sopenharmony_ci << ext_inst_name << " %u" << wrong_bit_width << "_1\n"; 2083fd4e5da5Sopenharmony_ci 2084fd4e5da5Sopenharmony_ci std::ostringstream expected; 2085fd4e5da5Sopenharmony_ci expected << "GLSL.std.450 " << ext_inst_name 2086fd4e5da5Sopenharmony_ci << ": expected operand P to be a " << total_bit_width 2087fd4e5da5Sopenharmony_ci << "-bit int scalar"; 2088fd4e5da5Sopenharmony_ci 2089fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body.str())); 2090fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2091fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str())); 2092fd4e5da5Sopenharmony_ci} 2093fd4e5da5Sopenharmony_ci 2094fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUnpack, ValidateGlslStd450Unpack, 2095fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 2096fd4e5da5Sopenharmony_ci "UnpackSnorm4x8", 2097fd4e5da5Sopenharmony_ci "UnpackUnorm4x8", 2098fd4e5da5Sopenharmony_ci "UnpackSnorm2x16", 2099fd4e5da5Sopenharmony_ci "UnpackUnorm2x16", 2100fd4e5da5Sopenharmony_ci "UnpackHalf2x16", 2101fd4e5da5Sopenharmony_ci })); 2102fd4e5da5Sopenharmony_ci 2103fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32Success) { 2104fd4e5da5Sopenharmony_ci const std::string body = R"( 2105fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %f64_1 2106fd4e5da5Sopenharmony_ci)"; 2107fd4e5da5Sopenharmony_ci 2108fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2109fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2110fd4e5da5Sopenharmony_ci} 2111fd4e5da5Sopenharmony_ci 2112fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotVector) { 2113fd4e5da5Sopenharmony_ci const std::string body = R"( 2114fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst UnpackDouble2x32 %f64_1 2115fd4e5da5Sopenharmony_ci)"; 2116fd4e5da5Sopenharmony_ci 2117fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2118fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2119fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2120fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type " 2121fd4e5da5Sopenharmony_ci "to be a 32-bit int vector of size 2")); 2122fd4e5da5Sopenharmony_ci} 2123fd4e5da5Sopenharmony_ci 2124fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotIntVector) { 2125fd4e5da5Sopenharmony_ci const std::string body = R"( 2126fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst UnpackDouble2x32 %f64_1 2127fd4e5da5Sopenharmony_ci)"; 2128fd4e5da5Sopenharmony_ci 2129fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2130fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2131fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2132fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type " 2133fd4e5da5Sopenharmony_ci "to be a 32-bit int vector of size 2")); 2134fd4e5da5Sopenharmony_ci} 2135fd4e5da5Sopenharmony_ci 2136fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotInt32Vector) { 2137fd4e5da5Sopenharmony_ci const std::string body = R"( 2138fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64vec2 %extinst UnpackDouble2x32 %f64_1 2139fd4e5da5Sopenharmony_ci)"; 2140fd4e5da5Sopenharmony_ci 2141fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2142fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2143fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2144fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type " 2145fd4e5da5Sopenharmony_ci "to be a 32-bit int vector of size 2")); 2146fd4e5da5Sopenharmony_ci} 2147fd4e5da5Sopenharmony_ci 2148fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeWrongSize) { 2149fd4e5da5Sopenharmony_ci const std::string body = R"( 2150fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec4 %extinst UnpackDouble2x32 %f64_1 2151fd4e5da5Sopenharmony_ci)"; 2152fd4e5da5Sopenharmony_ci 2153fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2154fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2155fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2156fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type " 2157fd4e5da5Sopenharmony_ci "to be a 32-bit int vector of size 2")); 2158fd4e5da5Sopenharmony_ci} 2159fd4e5da5Sopenharmony_ci 2160fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32VNotFloat) { 2161fd4e5da5Sopenharmony_ci const std::string body = R"( 2162fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %u64_1 2163fd4e5da5Sopenharmony_ci)"; 2164fd4e5da5Sopenharmony_ci 2165fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2166fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2167fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2168fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected operand V to " 2169fd4e5da5Sopenharmony_ci "be a 64-bit float scalar")); 2170fd4e5da5Sopenharmony_ci} 2171fd4e5da5Sopenharmony_ci 2172fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32VNotFloat64) { 2173fd4e5da5Sopenharmony_ci const std::string body = R"( 2174fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %f32_1 2175fd4e5da5Sopenharmony_ci)"; 2176fd4e5da5Sopenharmony_ci 2177fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2178fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2179fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2180fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 UnpackDouble2x32: expected operand V to " 2181fd4e5da5Sopenharmony_ci "be a 64-bit float scalar")); 2182fd4e5da5Sopenharmony_ci} 2183fd4e5da5Sopenharmony_ci 2184fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthSuccess) { 2185fd4e5da5Sopenharmony_ci const std::string body = R"( 2186fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Length %f32_1 2187fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32 %extinst Length %f32vec2_01 2188fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Length %f32vec4_0123 2189fd4e5da5Sopenharmony_ci)"; 2190fd4e5da5Sopenharmony_ci 2191fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2192fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2193fd4e5da5Sopenharmony_ci} 2194fd4e5da5Sopenharmony_ci 2195fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthIntResultType) { 2196fd4e5da5Sopenharmony_ci const std::string body = R"( 2197fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Length %f32vec2_01 2198fd4e5da5Sopenharmony_ci)"; 2199fd4e5da5Sopenharmony_ci 2200fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2201fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2202fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2203fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Length: " 2204fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar type")); 2205fd4e5da5Sopenharmony_ci} 2206fd4e5da5Sopenharmony_ci 2207fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthIntX) { 2208fd4e5da5Sopenharmony_ci const std::string body = R"( 2209fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Length %u32vec2_01 2210fd4e5da5Sopenharmony_ci)"; 2211fd4e5da5Sopenharmony_ci 2212fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2213fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2214fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2215fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Length: " 2216fd4e5da5Sopenharmony_ci "expected operand X to be of float scalar or " 2217fd4e5da5Sopenharmony_ci "vector type")); 2218fd4e5da5Sopenharmony_ci} 2219fd4e5da5Sopenharmony_ci 2220fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthDifferentType) { 2221fd4e5da5Sopenharmony_ci const std::string body = R"( 2222fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst Length %f32vec2_01 2223fd4e5da5Sopenharmony_ci)"; 2224fd4e5da5Sopenharmony_ci 2225fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2226fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2227fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2228fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Length: " 2229fd4e5da5Sopenharmony_ci "expected operand X component type to be equal to " 2230fd4e5da5Sopenharmony_ci "Result Type")); 2231fd4e5da5Sopenharmony_ci} 2232fd4e5da5Sopenharmony_ci 2233fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceSuccess) { 2234fd4e5da5Sopenharmony_ci const std::string body = R"( 2235fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32_0 %f32_1 2236fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32 %extinst Distance %f32vec2_01 %f32vec2_12 2237fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Distance %f32vec4_0123 %f32vec4_1234 2238fd4e5da5Sopenharmony_ci)"; 2239fd4e5da5Sopenharmony_ci 2240fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2241fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2242fd4e5da5Sopenharmony_ci} 2243fd4e5da5Sopenharmony_ci 2244fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntResultType) { 2245fd4e5da5Sopenharmony_ci const std::string body = R"( 2246fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Distance %f32vec2_01 %f32vec2_12 2247fd4e5da5Sopenharmony_ci)"; 2248fd4e5da5Sopenharmony_ci 2249fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2250fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2251fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2252fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2253fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar type")); 2254fd4e5da5Sopenharmony_ci} 2255fd4e5da5Sopenharmony_ci 2256fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntP0) { 2257fd4e5da5Sopenharmony_ci const std::string body = R"( 2258fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %u32_0 %f32_1 2259fd4e5da5Sopenharmony_ci)"; 2260fd4e5da5Sopenharmony_ci 2261fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2262fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2263fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2264fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2265fd4e5da5Sopenharmony_ci "expected operand P0 to be of float scalar or " 2266fd4e5da5Sopenharmony_ci "vector type")); 2267fd4e5da5Sopenharmony_ci} 2268fd4e5da5Sopenharmony_ci 2269fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceF64VectorP0) { 2270fd4e5da5Sopenharmony_ci const std::string body = R"( 2271fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f64vec2_01 %f32vec2_12 2272fd4e5da5Sopenharmony_ci)"; 2273fd4e5da5Sopenharmony_ci 2274fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2275fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2276fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2277fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2278fd4e5da5Sopenharmony_ci "expected operand P0 component type to be equal to " 2279fd4e5da5Sopenharmony_ci "Result Type")); 2280fd4e5da5Sopenharmony_ci} 2281fd4e5da5Sopenharmony_ci 2282fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntP1) { 2283fd4e5da5Sopenharmony_ci const std::string body = R"( 2284fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32_0 %u32_1 2285fd4e5da5Sopenharmony_ci)"; 2286fd4e5da5Sopenharmony_ci 2287fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2288fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2289fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2290fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2291fd4e5da5Sopenharmony_ci "expected operand P1 to be of float scalar or " 2292fd4e5da5Sopenharmony_ci "vector type")); 2293fd4e5da5Sopenharmony_ci} 2294fd4e5da5Sopenharmony_ci 2295fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceF64VectorP1) { 2296fd4e5da5Sopenharmony_ci const std::string body = R"( 2297fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32vec2_12 %f64vec2_01 2298fd4e5da5Sopenharmony_ci)"; 2299fd4e5da5Sopenharmony_ci 2300fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2301fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2302fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2303fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2304fd4e5da5Sopenharmony_ci "expected operand P1 component type to be equal to " 2305fd4e5da5Sopenharmony_ci "Result Type")); 2306fd4e5da5Sopenharmony_ci} 2307fd4e5da5Sopenharmony_ci 2308fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceDifferentSize) { 2309fd4e5da5Sopenharmony_ci const std::string body = R"( 2310fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32vec2_01 %f32vec4_0123 2311fd4e5da5Sopenharmony_ci)"; 2312fd4e5da5Sopenharmony_ci 2313fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2314fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2315fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2316fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Distance: " 2317fd4e5da5Sopenharmony_ci "expected operands P0 and P1 to have the same number " 2318fd4e5da5Sopenharmony_ci "of components")); 2319fd4e5da5Sopenharmony_ci} 2320fd4e5da5Sopenharmony_ci 2321fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossSuccess) { 2322fd4e5da5Sopenharmony_ci const std::string body = R"( 2323fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f32vec3_012 %f32vec3_123 2324fd4e5da5Sopenharmony_ci)"; 2325fd4e5da5Sopenharmony_ci 2326fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2327fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2328fd4e5da5Sopenharmony_ci} 2329fd4e5da5Sopenharmony_ci 2330fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossIntVectorResultType) { 2331fd4e5da5Sopenharmony_ci const std::string body = R"( 2332fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec3 %extinst Cross %f32vec3_012 %f32vec3_123 2333fd4e5da5Sopenharmony_ci)"; 2334fd4e5da5Sopenharmony_ci 2335fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2336fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2337fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2338fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Cross: " 2339fd4e5da5Sopenharmony_ci "expected Result Type to be a float vector type")); 2340fd4e5da5Sopenharmony_ci} 2341fd4e5da5Sopenharmony_ci 2342fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossResultTypeWrongSize) { 2343fd4e5da5Sopenharmony_ci const std::string body = R"( 2344fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Cross %f32vec3_012 %f32vec3_123 2345fd4e5da5Sopenharmony_ci)"; 2346fd4e5da5Sopenharmony_ci 2347fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2348fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2349fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2350fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Cross: " 2351fd4e5da5Sopenharmony_ci "expected Result Type to have 3 components")); 2352fd4e5da5Sopenharmony_ci} 2353fd4e5da5Sopenharmony_ci 2354fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossXWrongType) { 2355fd4e5da5Sopenharmony_ci const std::string body = R"( 2356fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f64vec3_012 %f32vec3_123 2357fd4e5da5Sopenharmony_ci)"; 2358fd4e5da5Sopenharmony_ci 2359fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2360fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2361fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2362fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Cross: " 2363fd4e5da5Sopenharmony_ci "expected operand X type to be equal to Result Type")); 2364fd4e5da5Sopenharmony_ci} 2365fd4e5da5Sopenharmony_ci 2366fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossYWrongType) { 2367fd4e5da5Sopenharmony_ci const std::string body = R"( 2368fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f32vec3_123 %f64vec3_012 2369fd4e5da5Sopenharmony_ci)"; 2370fd4e5da5Sopenharmony_ci 2371fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2372fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2373fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2374fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Cross: " 2375fd4e5da5Sopenharmony_ci "expected operand Y type to be equal to Result Type")); 2376fd4e5da5Sopenharmony_ci} 2377fd4e5da5Sopenharmony_ci 2378fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractSuccess) { 2379fd4e5da5Sopenharmony_ci const std::string body = R"( 2380fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Refract %f32_1 %f32_1 %f32_1 2381fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f16_1 2382fd4e5da5Sopenharmony_ci)"; 2383fd4e5da5Sopenharmony_ci 2384fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2385fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2386fd4e5da5Sopenharmony_ci} 2387fd4e5da5Sopenharmony_ci 2388fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorResultType) { 2389fd4e5da5Sopenharmony_ci const std::string body = R"( 2390fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f32_1 2391fd4e5da5Sopenharmony_ci)"; 2392fd4e5da5Sopenharmony_ci 2393fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2394fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2395fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2396fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Refract: " 2397fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar or " 2398fd4e5da5Sopenharmony_ci "vector type")); 2399fd4e5da5Sopenharmony_ci} 2400fd4e5da5Sopenharmony_ci 2401fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorI) { 2402fd4e5da5Sopenharmony_ci const std::string body = R"( 2403fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %u32vec2_01 %f32vec2_01 %f32_1 2404fd4e5da5Sopenharmony_ci)"; 2405fd4e5da5Sopenharmony_ci 2406fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2407fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2408fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2409fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Refract: " 2410fd4e5da5Sopenharmony_ci "expected operand I to be of type equal to " 2411fd4e5da5Sopenharmony_ci "Result Type")); 2412fd4e5da5Sopenharmony_ci} 2413fd4e5da5Sopenharmony_ci 2414fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorN) { 2415fd4e5da5Sopenharmony_ci const std::string body = R"( 2416fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %u32vec2_01 %f32_1 2417fd4e5da5Sopenharmony_ci)"; 2418fd4e5da5Sopenharmony_ci 2419fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2420fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2421fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2422fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Refract: " 2423fd4e5da5Sopenharmony_ci "expected operand N to be of type equal to " 2424fd4e5da5Sopenharmony_ci "Result Type")); 2425fd4e5da5Sopenharmony_ci} 2426fd4e5da5Sopenharmony_ci 2427fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntEta) { 2428fd4e5da5Sopenharmony_ci const std::string body = R"( 2429fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %u32_1 2430fd4e5da5Sopenharmony_ci)"; 2431fd4e5da5Sopenharmony_ci 2432fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2433fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2434fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2435fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Refract: " 2436fd4e5da5Sopenharmony_ci "expected operand Eta to be a float scalar")); 2437fd4e5da5Sopenharmony_ci} 2438fd4e5da5Sopenharmony_ci 2439fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractFloat64Eta) { 2440fd4e5da5Sopenharmony_ci // SPIR-V issue 337: Eta can be 64-bit float scalar. 2441fd4e5da5Sopenharmony_ci const std::string body = R"( 2442fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f64_1 2443fd4e5da5Sopenharmony_ci)"; 2444fd4e5da5Sopenharmony_ci 2445fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2446fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2447fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), Eq("")); 2448fd4e5da5Sopenharmony_ci} 2449fd4e5da5Sopenharmony_ci 2450fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractVectorEta) { 2451fd4e5da5Sopenharmony_ci const std::string body = R"( 2452fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f32vec2_01 2453fd4e5da5Sopenharmony_ci)"; 2454fd4e5da5Sopenharmony_ci 2455fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2456fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2457fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2458fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 Refract: " 2459fd4e5da5Sopenharmony_ci "expected operand Eta to be a float scalar")); 2460fd4e5da5Sopenharmony_ci} 2461fd4e5da5Sopenharmony_ci 2462fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidSuccess) { 2463fd4e5da5Sopenharmony_ci const std::string body = R"( 2464fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input 2465fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %f32vec2_input 2466fd4e5da5Sopenharmony_ci)"; 2467fd4e5da5Sopenharmony_ci 2468fd4e5da5Sopenharmony_ci CompileSuccessfully( 2469fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2470fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2471fd4e5da5Sopenharmony_ci} 2472fd4e5da5Sopenharmony_ci 2473fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidInternalSuccess) { 2474fd4e5da5Sopenharmony_ci const std::string body = R"( 2475fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2476fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %ld1 2477fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2478fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %ld2 2479fd4e5da5Sopenharmony_ci)"; 2480fd4e5da5Sopenharmony_ci 2481fd4e5da5Sopenharmony_ci CompileSuccessfully( 2482fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2483fd4e5da5Sopenharmony_ci getValidatorOptions()->before_hlsl_legalization = true; 2484fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2485fd4e5da5Sopenharmony_ci} 2486fd4e5da5Sopenharmony_ci 2487fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidInternalInvalidDataF32) { 2488fd4e5da5Sopenharmony_ci const std::string body = R"( 2489fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2490fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %ld1 2491fd4e5da5Sopenharmony_ci)"; 2492fd4e5da5Sopenharmony_ci 2493fd4e5da5Sopenharmony_ci CompileSuccessfully( 2494fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2495fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2496fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2497fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2498fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2499fd4e5da5Sopenharmony_ci} 2500fd4e5da5Sopenharmony_ci 2501fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, 2502fd4e5da5Sopenharmony_ci GlslStd450InterpolateAtCentroidInternalInvalidDataF32Vec2) { 2503fd4e5da5Sopenharmony_ci const std::string body = R"( 2504fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2505fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %ld2 2506fd4e5da5Sopenharmony_ci)"; 2507fd4e5da5Sopenharmony_ci 2508fd4e5da5Sopenharmony_ci CompileSuccessfully( 2509fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2510fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2511fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2512fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2513fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2514fd4e5da5Sopenharmony_ci} 2515fd4e5da5Sopenharmony_ci 2516fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidNoCapability) { 2517fd4e5da5Sopenharmony_ci const std::string body = R"( 2518fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input 2519fd4e5da5Sopenharmony_ci)"; 2520fd4e5da5Sopenharmony_ci 2521fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2522fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions()); 2523fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2524fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid requires " 2525fd4e5da5Sopenharmony_ci "capability InterpolationFunction")); 2526fd4e5da5Sopenharmony_ci} 2527fd4e5da5Sopenharmony_ci 2528fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidIntResultType) { 2529fd4e5da5Sopenharmony_ci const std::string body = R"( 2530fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtCentroid %f32_input 2531fd4e5da5Sopenharmony_ci)"; 2532fd4e5da5Sopenharmony_ci 2533fd4e5da5Sopenharmony_ci CompileSuccessfully( 2534fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2535fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2536fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2537fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2538fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2539fd4e5da5Sopenharmony_ci "or vector type")); 2540fd4e5da5Sopenharmony_ci} 2541fd4e5da5Sopenharmony_ci 2542fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidF64ResultType) { 2543fd4e5da5Sopenharmony_ci const std::string body = R"( 2544fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtCentroid %f32_input 2545fd4e5da5Sopenharmony_ci)"; 2546fd4e5da5Sopenharmony_ci 2547fd4e5da5Sopenharmony_ci CompileSuccessfully( 2548fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2549fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2550fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2551fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2552fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2553fd4e5da5Sopenharmony_ci "or vector type")); 2554fd4e5da5Sopenharmony_ci} 2555fd4e5da5Sopenharmony_ci 2556fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidNotPointer) { 2557fd4e5da5Sopenharmony_ci const std::string body = R"( 2558fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_1 2559fd4e5da5Sopenharmony_ci)"; 2560fd4e5da5Sopenharmony_ci 2561fd4e5da5Sopenharmony_ci CompileSuccessfully( 2562fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2563fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2564fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2565fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2566fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2567fd4e5da5Sopenharmony_ci} 2568fd4e5da5Sopenharmony_ci 2569fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongDataType) { 2570fd4e5da5Sopenharmony_ci const std::string body = R"( 2571fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32vec2_input 2572fd4e5da5Sopenharmony_ci)"; 2573fd4e5da5Sopenharmony_ci 2574fd4e5da5Sopenharmony_ci CompileSuccessfully( 2575fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2576fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2577fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2578fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2579fd4e5da5Sopenharmony_ci "expected Interpolant data type to be equal to " 2580fd4e5da5Sopenharmony_ci "Result Type")); 2581fd4e5da5Sopenharmony_ci} 2582fd4e5da5Sopenharmony_ci 2583fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongStorageClass) { 2584fd4e5da5Sopenharmony_ci const std::string body = R"( 2585fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_output 2586fd4e5da5Sopenharmony_ci)"; 2587fd4e5da5Sopenharmony_ci 2588fd4e5da5Sopenharmony_ci CompileSuccessfully( 2589fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2590fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2591fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2592fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid: " 2593fd4e5da5Sopenharmony_ci "expected Interpolant storage class to be Input")); 2594fd4e5da5Sopenharmony_ci} 2595fd4e5da5Sopenharmony_ci 2596fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongExecutionModel) { 2597fd4e5da5Sopenharmony_ci const std::string body = R"( 2598fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input 2599fd4e5da5Sopenharmony_ci)"; 2600fd4e5da5Sopenharmony_ci 2601fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode( 2602fd4e5da5Sopenharmony_ci body, "OpCapability InterpolationFunction\n", "Vertex")); 2603fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 2604fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2605fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtCentroid requires " 2606fd4e5da5Sopenharmony_ci "Fragment execution model")); 2607fd4e5da5Sopenharmony_ci} 2608fd4e5da5Sopenharmony_ci 2609fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleSuccess) { 2610fd4e5da5Sopenharmony_ci const std::string body = R"( 2611fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1 2612fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %f32vec2_input %u32_1 2613fd4e5da5Sopenharmony_ci)"; 2614fd4e5da5Sopenharmony_ci 2615fd4e5da5Sopenharmony_ci CompileSuccessfully( 2616fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2617fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2618fd4e5da5Sopenharmony_ci} 2619fd4e5da5Sopenharmony_ci 2620fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleInternalSuccess) { 2621fd4e5da5Sopenharmony_ci const std::string body = R"( 2622fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2623fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %ld1 %u32_1 2624fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2625fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %ld2 %u32_1 2626fd4e5da5Sopenharmony_ci)"; 2627fd4e5da5Sopenharmony_ci 2628fd4e5da5Sopenharmony_ci CompileSuccessfully( 2629fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2630fd4e5da5Sopenharmony_ci getValidatorOptions()->before_hlsl_legalization = true; 2631fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2632fd4e5da5Sopenharmony_ci} 2633fd4e5da5Sopenharmony_ci 2634fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleInternalInvalidDataF32) { 2635fd4e5da5Sopenharmony_ci const std::string body = R"( 2636fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2637fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %ld1 %u32_1 2638fd4e5da5Sopenharmony_ci)"; 2639fd4e5da5Sopenharmony_ci 2640fd4e5da5Sopenharmony_ci CompileSuccessfully( 2641fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2642fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2643fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2644fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2645fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2646fd4e5da5Sopenharmony_ci} 2647fd4e5da5Sopenharmony_ci 2648fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, 2649fd4e5da5Sopenharmony_ci GlslStd450InterpolateAtSampleInternalInvalidDataF32Vec2) { 2650fd4e5da5Sopenharmony_ci const std::string body = R"( 2651fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2652fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %ld2 %u32_1 2653fd4e5da5Sopenharmony_ci)"; 2654fd4e5da5Sopenharmony_ci 2655fd4e5da5Sopenharmony_ci CompileSuccessfully( 2656fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2657fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2658fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2659fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2660fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2661fd4e5da5Sopenharmony_ci} 2662fd4e5da5Sopenharmony_ci 2663fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleNoCapability) { 2664fd4e5da5Sopenharmony_ci const std::string body = R"( 2665fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1 2666fd4e5da5Sopenharmony_ci)"; 2667fd4e5da5Sopenharmony_ci 2668fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2669fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions()); 2670fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2671fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample requires " 2672fd4e5da5Sopenharmony_ci "capability InterpolationFunction")); 2673fd4e5da5Sopenharmony_ci} 2674fd4e5da5Sopenharmony_ci 2675fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleIntResultType) { 2676fd4e5da5Sopenharmony_ci const std::string body = R"( 2677fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtSample %f32_input %u32_1 2678fd4e5da5Sopenharmony_ci)"; 2679fd4e5da5Sopenharmony_ci 2680fd4e5da5Sopenharmony_ci CompileSuccessfully( 2681fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2682fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2683fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2684fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2685fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2686fd4e5da5Sopenharmony_ci "or vector type")); 2687fd4e5da5Sopenharmony_ci} 2688fd4e5da5Sopenharmony_ci 2689fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleF64ResultType) { 2690fd4e5da5Sopenharmony_ci const std::string body = R"( 2691fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtSample %f32_input %u32_1 2692fd4e5da5Sopenharmony_ci)"; 2693fd4e5da5Sopenharmony_ci 2694fd4e5da5Sopenharmony_ci CompileSuccessfully( 2695fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2696fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2697fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2698fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2699fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2700fd4e5da5Sopenharmony_ci "or vector type")); 2701fd4e5da5Sopenharmony_ci} 2702fd4e5da5Sopenharmony_ci 2703fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleNotPointer) { 2704fd4e5da5Sopenharmony_ci const std::string body = R"( 2705fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_1 %u32_1 2706fd4e5da5Sopenharmony_ci)"; 2707fd4e5da5Sopenharmony_ci 2708fd4e5da5Sopenharmony_ci CompileSuccessfully( 2709fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2710fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2711fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2712fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2713fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2714fd4e5da5Sopenharmony_ci} 2715fd4e5da5Sopenharmony_ci 2716fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongDataType) { 2717fd4e5da5Sopenharmony_ci const std::string body = R"( 2718fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32vec2_input %u32_1 2719fd4e5da5Sopenharmony_ci)"; 2720fd4e5da5Sopenharmony_ci 2721fd4e5da5Sopenharmony_ci CompileSuccessfully( 2722fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2723fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2724fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2725fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2726fd4e5da5Sopenharmony_ci "expected Interpolant data type to be equal to " 2727fd4e5da5Sopenharmony_ci "Result Type")); 2728fd4e5da5Sopenharmony_ci} 2729fd4e5da5Sopenharmony_ci 2730fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongStorageClass) { 2731fd4e5da5Sopenharmony_ci const std::string body = R"( 2732fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_output %u32_1 2733fd4e5da5Sopenharmony_ci)"; 2734fd4e5da5Sopenharmony_ci 2735fd4e5da5Sopenharmony_ci CompileSuccessfully( 2736fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2737fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2738fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2739fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2740fd4e5da5Sopenharmony_ci "expected Interpolant storage class to be Input")); 2741fd4e5da5Sopenharmony_ci} 2742fd4e5da5Sopenharmony_ci 2743fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleFloatSample) { 2744fd4e5da5Sopenharmony_ci const std::string body = R"( 2745fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %f32_1 2746fd4e5da5Sopenharmony_ci)"; 2747fd4e5da5Sopenharmony_ci 2748fd4e5da5Sopenharmony_ci CompileSuccessfully( 2749fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2750fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2751fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2752fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2753fd4e5da5Sopenharmony_ci "expected Sample to be 32-bit integer")); 2754fd4e5da5Sopenharmony_ci} 2755fd4e5da5Sopenharmony_ci 2756fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleU64Sample) { 2757fd4e5da5Sopenharmony_ci const std::string body = R"( 2758fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u64_1 2759fd4e5da5Sopenharmony_ci)"; 2760fd4e5da5Sopenharmony_ci 2761fd4e5da5Sopenharmony_ci CompileSuccessfully( 2762fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2763fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2764fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2765fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample: " 2766fd4e5da5Sopenharmony_ci "expected Sample to be 32-bit integer")); 2767fd4e5da5Sopenharmony_ci} 2768fd4e5da5Sopenharmony_ci 2769fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongExecutionModel) { 2770fd4e5da5Sopenharmony_ci const std::string body = R"( 2771fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1 2772fd4e5da5Sopenharmony_ci)"; 2773fd4e5da5Sopenharmony_ci 2774fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode( 2775fd4e5da5Sopenharmony_ci body, "OpCapability InterpolationFunction\n", "Vertex")); 2776fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 2777fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2778fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtSample requires " 2779fd4e5da5Sopenharmony_ci "Fragment execution model")); 2780fd4e5da5Sopenharmony_ci} 2781fd4e5da5Sopenharmony_ci 2782fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetSuccess) { 2783fd4e5da5Sopenharmony_ci const std::string body = R"( 2784fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01 2785fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %f32vec2_input %f32vec2_01 2786fd4e5da5Sopenharmony_ci)"; 2787fd4e5da5Sopenharmony_ci 2788fd4e5da5Sopenharmony_ci CompileSuccessfully( 2789fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2790fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2791fd4e5da5Sopenharmony_ci} 2792fd4e5da5Sopenharmony_ci 2793fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetInternalSuccess) { 2794fd4e5da5Sopenharmony_ci const std::string body = R"( 2795fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2796fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %ld1 %f32vec2_01 2797fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2798fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %ld2 %f32vec2_01 2799fd4e5da5Sopenharmony_ci)"; 2800fd4e5da5Sopenharmony_ci 2801fd4e5da5Sopenharmony_ci CompileSuccessfully( 2802fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2803fd4e5da5Sopenharmony_ci getValidatorOptions()->before_hlsl_legalization = true; 2804fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2805fd4e5da5Sopenharmony_ci} 2806fd4e5da5Sopenharmony_ci 2807fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetInternalInvalidDataF32) { 2808fd4e5da5Sopenharmony_ci const std::string body = R"( 2809fd4e5da5Sopenharmony_ci%ld1 = OpLoad %f32 %f32_input 2810fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %ld1 %f32vec2_01 2811fd4e5da5Sopenharmony_ci)"; 2812fd4e5da5Sopenharmony_ci 2813fd4e5da5Sopenharmony_ci CompileSuccessfully( 2814fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2815fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2816fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2817fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2818fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2819fd4e5da5Sopenharmony_ci} 2820fd4e5da5Sopenharmony_ci 2821fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, 2822fd4e5da5Sopenharmony_ci GlslStd450InterpolateAtOffsetInternalInvalidDataF32Vec2) { 2823fd4e5da5Sopenharmony_ci const std::string body = R"( 2824fd4e5da5Sopenharmony_ci%ld2 = OpLoad %f32vec2 %f32vec2_input 2825fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %ld2 %f32vec2_01 2826fd4e5da5Sopenharmony_ci)"; 2827fd4e5da5Sopenharmony_ci 2828fd4e5da5Sopenharmony_ci CompileSuccessfully( 2829fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2830fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2831fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2832fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2833fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2834fd4e5da5Sopenharmony_ci} 2835fd4e5da5Sopenharmony_ci 2836fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetNoCapability) { 2837fd4e5da5Sopenharmony_ci const std::string body = R"( 2838fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01 2839fd4e5da5Sopenharmony_ci)"; 2840fd4e5da5Sopenharmony_ci 2841fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body)); 2842fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions()); 2843fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2844fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset requires " 2845fd4e5da5Sopenharmony_ci "capability InterpolationFunction")); 2846fd4e5da5Sopenharmony_ci} 2847fd4e5da5Sopenharmony_ci 2848fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetIntResultType) { 2849fd4e5da5Sopenharmony_ci const std::string body = R"( 2850fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtOffset %f32_input %f32vec2_01 2851fd4e5da5Sopenharmony_ci)"; 2852fd4e5da5Sopenharmony_ci 2853fd4e5da5Sopenharmony_ci CompileSuccessfully( 2854fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2855fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2856fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2857fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2858fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2859fd4e5da5Sopenharmony_ci "or vector type")); 2860fd4e5da5Sopenharmony_ci} 2861fd4e5da5Sopenharmony_ci 2862fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetF64ResultType) { 2863fd4e5da5Sopenharmony_ci const std::string body = R"( 2864fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtOffset %f32_input %f32vec2_01 2865fd4e5da5Sopenharmony_ci)"; 2866fd4e5da5Sopenharmony_ci 2867fd4e5da5Sopenharmony_ci CompileSuccessfully( 2868fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2869fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2870fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2871fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2872fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit float scalar " 2873fd4e5da5Sopenharmony_ci "or vector type")); 2874fd4e5da5Sopenharmony_ci} 2875fd4e5da5Sopenharmony_ci 2876fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetNotPointer) { 2877fd4e5da5Sopenharmony_ci const std::string body = R"( 2878fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_1 %f32vec2_01 2879fd4e5da5Sopenharmony_ci)"; 2880fd4e5da5Sopenharmony_ci 2881fd4e5da5Sopenharmony_ci CompileSuccessfully( 2882fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2883fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2884fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2885fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2886fd4e5da5Sopenharmony_ci "expected Interpolant to be a pointer")); 2887fd4e5da5Sopenharmony_ci} 2888fd4e5da5Sopenharmony_ci 2889fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongDataType) { 2890fd4e5da5Sopenharmony_ci const std::string body = R"( 2891fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32vec2_input %f32vec2_01 2892fd4e5da5Sopenharmony_ci)"; 2893fd4e5da5Sopenharmony_ci 2894fd4e5da5Sopenharmony_ci CompileSuccessfully( 2895fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2896fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2897fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2898fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2899fd4e5da5Sopenharmony_ci "expected Interpolant data type to be equal to " 2900fd4e5da5Sopenharmony_ci "Result Type")); 2901fd4e5da5Sopenharmony_ci} 2902fd4e5da5Sopenharmony_ci 2903fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongStorageClass) { 2904fd4e5da5Sopenharmony_ci const std::string body = R"( 2905fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_output %f32vec2_01 2906fd4e5da5Sopenharmony_ci)"; 2907fd4e5da5Sopenharmony_ci 2908fd4e5da5Sopenharmony_ci CompileSuccessfully( 2909fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2910fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2911fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2912fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2913fd4e5da5Sopenharmony_ci "expected Interpolant storage class to be Input")); 2914fd4e5da5Sopenharmony_ci} 2915fd4e5da5Sopenharmony_ci 2916fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotVector) { 2917fd4e5da5Sopenharmony_ci const std::string body = R"( 2918fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32_0 2919fd4e5da5Sopenharmony_ci)"; 2920fd4e5da5Sopenharmony_ci 2921fd4e5da5Sopenharmony_ci CompileSuccessfully( 2922fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2923fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2924fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2925fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2926fd4e5da5Sopenharmony_ci "expected Offset to be a vector of 2 32-bit floats")); 2927fd4e5da5Sopenharmony_ci} 2928fd4e5da5Sopenharmony_ci 2929fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotVector2) { 2930fd4e5da5Sopenharmony_ci const std::string body = R"( 2931fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec3_012 2932fd4e5da5Sopenharmony_ci)"; 2933fd4e5da5Sopenharmony_ci 2934fd4e5da5Sopenharmony_ci CompileSuccessfully( 2935fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2936fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2937fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2938fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2939fd4e5da5Sopenharmony_ci "expected Offset to be a vector of 2 32-bit floats")); 2940fd4e5da5Sopenharmony_ci} 2941fd4e5da5Sopenharmony_ci 2942fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotFloatVector) { 2943fd4e5da5Sopenharmony_ci const std::string body = R"( 2944fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %u32vec2_01 2945fd4e5da5Sopenharmony_ci)"; 2946fd4e5da5Sopenharmony_ci 2947fd4e5da5Sopenharmony_ci CompileSuccessfully( 2948fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2949fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2950fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2951fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2952fd4e5da5Sopenharmony_ci "expected Offset to be a vector of 2 32-bit floats")); 2953fd4e5da5Sopenharmony_ci} 2954fd4e5da5Sopenharmony_ci 2955fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotFloat32Vector) { 2956fd4e5da5Sopenharmony_ci const std::string body = R"( 2957fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f64vec2_01 2958fd4e5da5Sopenharmony_ci)"; 2959fd4e5da5Sopenharmony_ci 2960fd4e5da5Sopenharmony_ci CompileSuccessfully( 2961fd4e5da5Sopenharmony_ci GenerateShaderCode(body, "OpCapability InterpolationFunction\n")); 2962fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 2963fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2964fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset: " 2965fd4e5da5Sopenharmony_ci "expected Offset to be a vector of 2 32-bit floats")); 2966fd4e5da5Sopenharmony_ci} 2967fd4e5da5Sopenharmony_ci 2968fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongExecutionModel) { 2969fd4e5da5Sopenharmony_ci const std::string body = R"( 2970fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01 2971fd4e5da5Sopenharmony_ci)"; 2972fd4e5da5Sopenharmony_ci 2973fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode( 2974fd4e5da5Sopenharmony_ci body, "OpCapability InterpolationFunction\n", "Vertex")); 2975fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 2976fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 2977fd4e5da5Sopenharmony_ci HasSubstr("GLSL.std.450 InterpolateAtOffset requires " 2978fd4e5da5Sopenharmony_ci "Fragment execution model")); 2979fd4e5da5Sopenharmony_ci} 2980fd4e5da5Sopenharmony_ci 2981fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, Success) { 2982fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2983fd4e5da5Sopenharmony_ci std::ostringstream ss; 2984fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n"; 2985fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 2986fd4e5da5Sopenharmony_ci << " %f32vec2_01\n"; 2987fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name 2988fd4e5da5Sopenharmony_ci << " %f32vec4_0123\n"; 2989fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %f64 %extinst " << ext_inst_name << " %f64_0\n"; 2990fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 2991fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 2992fd4e5da5Sopenharmony_ci} 2993fd4e5da5Sopenharmony_ci 2994fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, IntResultType) { 2995fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 2996fd4e5da5Sopenharmony_ci const std::string body = 2997fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n"; 2998fd4e5da5Sopenharmony_ci 2999fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3000fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3001fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3002fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3003fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 3004fd4e5da5Sopenharmony_ci "or vector type")); 3005fd4e5da5Sopenharmony_ci} 3006fd4e5da5Sopenharmony_ci 3007fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, IntOperand) { 3008fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3009fd4e5da5Sopenharmony_ci const std::string body = 3010fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n"; 3011fd4e5da5Sopenharmony_ci 3012fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3013fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3014fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3015fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3016fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3017fd4e5da5Sopenharmony_ci "Result Type")); 3018fd4e5da5Sopenharmony_ci} 3019fd4e5da5Sopenharmony_ci 3020fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P( 3021fd4e5da5Sopenharmony_ci AllSqrtLike, ValidateOpenCLStdSqrtLike, 3022fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3023fd4e5da5Sopenharmony_ci "acos", "acosh", "acospi", "asin", 3024fd4e5da5Sopenharmony_ci "asinh", "asinpi", "atan", "atanh", 3025fd4e5da5Sopenharmony_ci "atanpi", "cbrt", "ceil", "cos", 3026fd4e5da5Sopenharmony_ci "cosh", "cospi", "erfc", "erf", 3027fd4e5da5Sopenharmony_ci "exp", "exp2", "exp10", "expm1", 3028fd4e5da5Sopenharmony_ci "fabs", "floor", "log", "log2", 3029fd4e5da5Sopenharmony_ci "log10", "log1p", "logb", "rint", 3030fd4e5da5Sopenharmony_ci "round", "rsqrt", "sin", "sinh", 3031fd4e5da5Sopenharmony_ci "sinpi", "sqrt", "tan", "tanh", 3032fd4e5da5Sopenharmony_ci "tanpi", "tgamma", "trunc", "half_cos", 3033fd4e5da5Sopenharmony_ci "half_exp", "half_exp2", "half_exp10", "half_log", 3034fd4e5da5Sopenharmony_ci "half_log2", "half_log10", "half_recip", "half_rsqrt", 3035fd4e5da5Sopenharmony_ci "half_sin", "half_sqrt", "half_tan", "lgamma", 3036fd4e5da5Sopenharmony_ci "native_cos", "native_exp", "native_exp2", "native_exp10", 3037fd4e5da5Sopenharmony_ci "native_log", "native_log2", "native_log10", "native_recip", 3038fd4e5da5Sopenharmony_ci "native_rsqrt", "native_sin", "native_sqrt", "native_tan", 3039fd4e5da5Sopenharmony_ci "degrees", "radians", "sign", 3040fd4e5da5Sopenharmony_ci })); 3041fd4e5da5Sopenharmony_ci 3042fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, Success) { 3043fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3044fd4e5da5Sopenharmony_ci std::ostringstream ss; 3045fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 3046fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1\n"; 3047fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 3048fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_12\n"; 3049fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name 3050fd4e5da5Sopenharmony_ci << " %f64_0 %f64_0\n"; 3051fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3052fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3053fd4e5da5Sopenharmony_ci} 3054fd4e5da5Sopenharmony_ci 3055fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntResultType) { 3056fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3057fd4e5da5Sopenharmony_ci const std::string body = 3058fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %f32_1\n"; 3059fd4e5da5Sopenharmony_ci 3060fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3061fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3062fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3063fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3064fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 3065fd4e5da5Sopenharmony_ci "or vector type")); 3066fd4e5da5Sopenharmony_ci} 3067fd4e5da5Sopenharmony_ci 3068fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntOperand1) { 3069fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3070fd4e5da5Sopenharmony_ci const std::string body = 3071fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n"; 3072fd4e5da5Sopenharmony_ci 3073fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3074fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3075fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3076fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3077fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3078fd4e5da5Sopenharmony_ci "Result Type")); 3079fd4e5da5Sopenharmony_ci} 3080fd4e5da5Sopenharmony_ci 3081fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntOperand2) { 3082fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3083fd4e5da5Sopenharmony_ci const std::string body = 3084fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n"; 3085fd4e5da5Sopenharmony_ci 3086fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3087fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3088fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3089fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3090fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3091fd4e5da5Sopenharmony_ci "Result Type")); 3092fd4e5da5Sopenharmony_ci} 3093fd4e5da5Sopenharmony_ci 3094fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFMinLike, ValidateOpenCLStdFMinLike, 3095fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3096fd4e5da5Sopenharmony_ci "atan2", "atan2pi", "copysign", 3097fd4e5da5Sopenharmony_ci "fdim", "fmax", "fmin", 3098fd4e5da5Sopenharmony_ci "fmod", "maxmag", "minmag", 3099fd4e5da5Sopenharmony_ci "hypot", "nextafter", "pow", 3100fd4e5da5Sopenharmony_ci "powr", "remainder", "half_divide", 3101fd4e5da5Sopenharmony_ci "half_powr", "native_divide", "native_powr", 3102fd4e5da5Sopenharmony_ci "step", "fmax_common", "fmin_common", 3103fd4e5da5Sopenharmony_ci })); 3104fd4e5da5Sopenharmony_ci 3105fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, Success) { 3106fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3107fd4e5da5Sopenharmony_ci std::ostringstream ss; 3108fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 3109fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1 %f32_2\n"; 3110fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 3111fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_01 %f32vec2_12\n"; 3112fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name 3113fd4e5da5Sopenharmony_ci << " %f64_0 %f64_0 %f64_1\n"; 3114fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3115fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3116fd4e5da5Sopenharmony_ci} 3117fd4e5da5Sopenharmony_ci 3118fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntResultType) { 3119fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3120fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3121fd4e5da5Sopenharmony_ci " %f32_0 %f32_1 %f32_2\n"; 3122fd4e5da5Sopenharmony_ci 3123fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3124fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3125fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3126fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3127fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar " 3128fd4e5da5Sopenharmony_ci "or vector type")); 3129fd4e5da5Sopenharmony_ci} 3130fd4e5da5Sopenharmony_ci 3131fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand1) { 3132fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3133fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3134fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %f32_1\n"; 3135fd4e5da5Sopenharmony_ci 3136fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3137fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3138fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3139fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3140fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3141fd4e5da5Sopenharmony_ci "Result Type")); 3142fd4e5da5Sopenharmony_ci} 3143fd4e5da5Sopenharmony_ci 3144fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand2) { 3145fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3146fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3147fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %f32_1\n"; 3148fd4e5da5Sopenharmony_ci 3149fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3150fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3151fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3152fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3153fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3154fd4e5da5Sopenharmony_ci "Result Type")); 3155fd4e5da5Sopenharmony_ci} 3156fd4e5da5Sopenharmony_ci 3157fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand3) { 3158fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3159fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3160fd4e5da5Sopenharmony_ci " %f32_1 %f32_0 %u32_2\n"; 3161fd4e5da5Sopenharmony_ci 3162fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3163fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3164fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3165fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3166fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to " 3167fd4e5da5Sopenharmony_ci "Result Type")); 3168fd4e5da5Sopenharmony_ci} 3169fd4e5da5Sopenharmony_ci 3170fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFClampLike, ValidateOpenCLStdFClampLike, 3171fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3172fd4e5da5Sopenharmony_ci "fma", 3173fd4e5da5Sopenharmony_ci "mad", 3174fd4e5da5Sopenharmony_ci "fclamp", 3175fd4e5da5Sopenharmony_ci "mix", 3176fd4e5da5Sopenharmony_ci "smoothstep", 3177fd4e5da5Sopenharmony_ci })); 3178fd4e5da5Sopenharmony_ci 3179fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, Success) { 3180fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3181fd4e5da5Sopenharmony_ci std::ostringstream ss; 3182fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n"; 3183fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n"; 3184fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n"; 3185fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n"; 3186fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3187fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 3188fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3189fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 3190fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3191fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 3192fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3193fd4e5da5Sopenharmony_ci << " %u32vec2_01\n"; 3194fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3195fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3196fd4e5da5Sopenharmony_ci} 3197fd4e5da5Sopenharmony_ci 3198fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, FloatResultType) { 3199fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3200fd4e5da5Sopenharmony_ci const std::string body = 3201fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n"; 3202fd4e5da5Sopenharmony_ci 3203fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3204fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3205fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3206fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3207fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 3208fd4e5da5Sopenharmony_ci "or vector type")); 3209fd4e5da5Sopenharmony_ci} 3210fd4e5da5Sopenharmony_ci 3211fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, FloatOperand) { 3212fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3213fd4e5da5Sopenharmony_ci const std::string body = 3214fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n"; 3215fd4e5da5Sopenharmony_ci 3216fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3217fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3218fd4e5da5Sopenharmony_ci EXPECT_THAT( 3219fd4e5da5Sopenharmony_ci getDiagnosticString(), 3220fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3221fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3222fd4e5da5Sopenharmony_ci} 3223fd4e5da5Sopenharmony_ci 3224fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, U64Operand) { 3225fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3226fd4e5da5Sopenharmony_ci const std::string body = 3227fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0\n"; 3228fd4e5da5Sopenharmony_ci 3229fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3230fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3231fd4e5da5Sopenharmony_ci EXPECT_THAT( 3232fd4e5da5Sopenharmony_ci getDiagnosticString(), 3233fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3234fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3235fd4e5da5Sopenharmony_ci} 3236fd4e5da5Sopenharmony_ci 3237fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSAbsLike, ValidateOpenCLStdSAbsLike, 3238fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3239fd4e5da5Sopenharmony_ci "s_abs", 3240fd4e5da5Sopenharmony_ci "clz", 3241fd4e5da5Sopenharmony_ci "ctz", 3242fd4e5da5Sopenharmony_ci "popcount", 3243fd4e5da5Sopenharmony_ci "u_abs", 3244fd4e5da5Sopenharmony_ci })); 3245fd4e5da5Sopenharmony_ci 3246fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, Success) { 3247fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3248fd4e5da5Sopenharmony_ci std::ostringstream ss; 3249fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 3250fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3251fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name 3252fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3253fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 3254fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3255fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 3256fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3257fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3258fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3259fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3260fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3261fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3262fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3263fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3264fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3265fd4e5da5Sopenharmony_ci ss << "%val9 = OpExtInst %u64 %extinst " << ext_inst_name 3266fd4e5da5Sopenharmony_ci << " %u64_1 %u64_0\n"; 3267fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3268fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3269fd4e5da5Sopenharmony_ci} 3270fd4e5da5Sopenharmony_ci 3271fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatResultType) { 3272fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3273fd4e5da5Sopenharmony_ci const std::string body = 3274fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n"; 3275fd4e5da5Sopenharmony_ci 3276fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3277fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3278fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3279fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3280fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 3281fd4e5da5Sopenharmony_ci "or vector type")); 3282fd4e5da5Sopenharmony_ci} 3283fd4e5da5Sopenharmony_ci 3284fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatOperand1) { 3285fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3286fd4e5da5Sopenharmony_ci const std::string body = 3287fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n"; 3288fd4e5da5Sopenharmony_ci 3289fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3290fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3291fd4e5da5Sopenharmony_ci EXPECT_THAT( 3292fd4e5da5Sopenharmony_ci getDiagnosticString(), 3293fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3294fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3295fd4e5da5Sopenharmony_ci} 3296fd4e5da5Sopenharmony_ci 3297fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatOperand2) { 3298fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3299fd4e5da5Sopenharmony_ci const std::string body = 3300fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n"; 3301fd4e5da5Sopenharmony_ci 3302fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3303fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3304fd4e5da5Sopenharmony_ci EXPECT_THAT( 3305fd4e5da5Sopenharmony_ci getDiagnosticString(), 3306fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3307fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3308fd4e5da5Sopenharmony_ci} 3309fd4e5da5Sopenharmony_ci 3310fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, U64Operand1) { 3311fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3312fd4e5da5Sopenharmony_ci const std::string body = 3313fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0 %u32_0\n"; 3314fd4e5da5Sopenharmony_ci 3315fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3316fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3317fd4e5da5Sopenharmony_ci EXPECT_THAT( 3318fd4e5da5Sopenharmony_ci getDiagnosticString(), 3319fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3320fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3321fd4e5da5Sopenharmony_ci} 3322fd4e5da5Sopenharmony_ci 3323fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, U64Operand2) { 3324fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3325fd4e5da5Sopenharmony_ci const std::string body = 3326fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %u64_0\n"; 3327fd4e5da5Sopenharmony_ci 3328fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3329fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3330fd4e5da5Sopenharmony_ci EXPECT_THAT( 3331fd4e5da5Sopenharmony_ci getDiagnosticString(), 3332fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3333fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3334fd4e5da5Sopenharmony_ci} 3335fd4e5da5Sopenharmony_ci 3336fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMinLike, ValidateOpenCLStdUMinLike, 3337fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3338fd4e5da5Sopenharmony_ci "s_max", 3339fd4e5da5Sopenharmony_ci "u_max", 3340fd4e5da5Sopenharmony_ci "s_min", 3341fd4e5da5Sopenharmony_ci "u_min", 3342fd4e5da5Sopenharmony_ci "s_abs_diff", 3343fd4e5da5Sopenharmony_ci "s_add_sat", 3344fd4e5da5Sopenharmony_ci "u_add_sat", 3345fd4e5da5Sopenharmony_ci "s_mul_hi", 3346fd4e5da5Sopenharmony_ci "rotate", 3347fd4e5da5Sopenharmony_ci "s_sub_sat", 3348fd4e5da5Sopenharmony_ci "u_sub_sat", 3349fd4e5da5Sopenharmony_ci "s_hadd", 3350fd4e5da5Sopenharmony_ci "u_hadd", 3351fd4e5da5Sopenharmony_ci "s_rhadd", 3352fd4e5da5Sopenharmony_ci "u_rhadd", 3353fd4e5da5Sopenharmony_ci "u_abs_diff", 3354fd4e5da5Sopenharmony_ci "u_mul_hi", 3355fd4e5da5Sopenharmony_ci })); 3356fd4e5da5Sopenharmony_ci 3357fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, Success) { 3358fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3359fd4e5da5Sopenharmony_ci std::ostringstream ss; 3360fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 3361fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3362fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name 3363fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3364fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 3365fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3366fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 3367fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3368fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3369fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3370fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3371fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3372fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3373fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3374fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3375fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3376fd4e5da5Sopenharmony_ci ss << "%val9 = OpExtInst %u64 %extinst " << ext_inst_name 3377fd4e5da5Sopenharmony_ci << " %u64_1 %u64_0 %u64_1\n"; 3378fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3379fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3380fd4e5da5Sopenharmony_ci} 3381fd4e5da5Sopenharmony_ci 3382fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatResultType) { 3383fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3384fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3385fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %u32_1\n"; 3386fd4e5da5Sopenharmony_ci 3387fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3388fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3389fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3390fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3391fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar " 3392fd4e5da5Sopenharmony_ci "or vector type")); 3393fd4e5da5Sopenharmony_ci} 3394fd4e5da5Sopenharmony_ci 3395fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand1) { 3396fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3397fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3398fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %u32_1\n"; 3399fd4e5da5Sopenharmony_ci 3400fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3401fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3402fd4e5da5Sopenharmony_ci EXPECT_THAT( 3403fd4e5da5Sopenharmony_ci getDiagnosticString(), 3404fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3405fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3406fd4e5da5Sopenharmony_ci} 3407fd4e5da5Sopenharmony_ci 3408fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand2) { 3409fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3410fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3411fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %u32_1\n"; 3412fd4e5da5Sopenharmony_ci 3413fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3414fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3415fd4e5da5Sopenharmony_ci EXPECT_THAT( 3416fd4e5da5Sopenharmony_ci getDiagnosticString(), 3417fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3418fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3419fd4e5da5Sopenharmony_ci} 3420fd4e5da5Sopenharmony_ci 3421fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand3) { 3422fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3423fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3424fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %f32_1\n"; 3425fd4e5da5Sopenharmony_ci 3426fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3427fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3428fd4e5da5Sopenharmony_ci EXPECT_THAT( 3429fd4e5da5Sopenharmony_ci getDiagnosticString(), 3430fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3431fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3432fd4e5da5Sopenharmony_ci} 3433fd4e5da5Sopenharmony_ci 3434fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand1) { 3435fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3436fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3437fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %u64_1\n"; 3438fd4e5da5Sopenharmony_ci 3439fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3440fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3441fd4e5da5Sopenharmony_ci EXPECT_THAT( 3442fd4e5da5Sopenharmony_ci getDiagnosticString(), 3443fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3444fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3445fd4e5da5Sopenharmony_ci} 3446fd4e5da5Sopenharmony_ci 3447fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand2) { 3448fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3449fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3450fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %u64_1\n"; 3451fd4e5da5Sopenharmony_ci 3452fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3453fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3454fd4e5da5Sopenharmony_ci EXPECT_THAT( 3455fd4e5da5Sopenharmony_ci getDiagnosticString(), 3456fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3457fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3458fd4e5da5Sopenharmony_ci} 3459fd4e5da5Sopenharmony_ci 3460fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand3) { 3461fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3462fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3463fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %u64_1\n"; 3464fd4e5da5Sopenharmony_ci 3465fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3466fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3467fd4e5da5Sopenharmony_ci EXPECT_THAT( 3468fd4e5da5Sopenharmony_ci getDiagnosticString(), 3469fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3470fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3471fd4e5da5Sopenharmony_ci} 3472fd4e5da5Sopenharmony_ci 3473fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUClampLike, ValidateOpenCLStdUClampLike, 3474fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3475fd4e5da5Sopenharmony_ci "s_clamp", 3476fd4e5da5Sopenharmony_ci "u_clamp", 3477fd4e5da5Sopenharmony_ci "s_mad_hi", 3478fd4e5da5Sopenharmony_ci "u_mad_sat", 3479fd4e5da5Sopenharmony_ci "s_mad_sat", 3480fd4e5da5Sopenharmony_ci "u_mad_hi", 3481fd4e5da5Sopenharmony_ci })); 3482fd4e5da5Sopenharmony_ci 3483fd4e5da5Sopenharmony_ci// ------------------------------------------------------------- 3484fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, Success) { 3485fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3486fd4e5da5Sopenharmony_ci std::ostringstream ss; 3487fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 3488fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3489fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name 3490fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3491fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 3492fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3493fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 3494fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 3495fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3496fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3497fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3498fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3499fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3500fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3501fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3502fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 3503fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3504fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3505fd4e5da5Sopenharmony_ci} 3506fd4e5da5Sopenharmony_ci 3507fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatResultType) { 3508fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3509fd4e5da5Sopenharmony_ci const std::string body = 3510fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n"; 3511fd4e5da5Sopenharmony_ci 3512fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3513fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3514fd4e5da5Sopenharmony_ci EXPECT_THAT( 3515fd4e5da5Sopenharmony_ci getDiagnosticString(), 3516fd4e5da5Sopenharmony_ci HasSubstr( 3517fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 3518fd4e5da5Sopenharmony_ci ": expected Result Type to be a 32-bit int scalar or vector type")); 3519fd4e5da5Sopenharmony_ci} 3520fd4e5da5Sopenharmony_ci 3521fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64ResultType) { 3522fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3523fd4e5da5Sopenharmony_ci const std::string body = 3524fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u64 %extinst " + ext_inst_name + " %u64_0 %u64_0\n"; 3525fd4e5da5Sopenharmony_ci 3526fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3527fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3528fd4e5da5Sopenharmony_ci EXPECT_THAT( 3529fd4e5da5Sopenharmony_ci getDiagnosticString(), 3530fd4e5da5Sopenharmony_ci HasSubstr( 3531fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 3532fd4e5da5Sopenharmony_ci ": expected Result Type to be a 32-bit int scalar or vector type")); 3533fd4e5da5Sopenharmony_ci} 3534fd4e5da5Sopenharmony_ci 3535fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatOperand1) { 3536fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3537fd4e5da5Sopenharmony_ci const std::string body = 3538fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n"; 3539fd4e5da5Sopenharmony_ci 3540fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3541fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3542fd4e5da5Sopenharmony_ci EXPECT_THAT( 3543fd4e5da5Sopenharmony_ci getDiagnosticString(), 3544fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3545fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3546fd4e5da5Sopenharmony_ci} 3547fd4e5da5Sopenharmony_ci 3548fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatOperand2) { 3549fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3550fd4e5da5Sopenharmony_ci const std::string body = 3551fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n"; 3552fd4e5da5Sopenharmony_ci 3553fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3554fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3555fd4e5da5Sopenharmony_ci EXPECT_THAT( 3556fd4e5da5Sopenharmony_ci getDiagnosticString(), 3557fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3558fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3559fd4e5da5Sopenharmony_ci} 3560fd4e5da5Sopenharmony_ci 3561fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64Operand1) { 3562fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3563fd4e5da5Sopenharmony_ci const std::string body = 3564fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0 %u32_0\n"; 3565fd4e5da5Sopenharmony_ci 3566fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3567fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3568fd4e5da5Sopenharmony_ci EXPECT_THAT( 3569fd4e5da5Sopenharmony_ci getDiagnosticString(), 3570fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3571fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3572fd4e5da5Sopenharmony_ci} 3573fd4e5da5Sopenharmony_ci 3574fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64Operand2) { 3575fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3576fd4e5da5Sopenharmony_ci const std::string body = 3577fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %u64_0\n"; 3578fd4e5da5Sopenharmony_ci 3579fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3580fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3581fd4e5da5Sopenharmony_ci EXPECT_THAT( 3582fd4e5da5Sopenharmony_ci getDiagnosticString(), 3583fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3584fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3585fd4e5da5Sopenharmony_ci} 3586fd4e5da5Sopenharmony_ci 3587fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMul24Like, ValidateOpenCLStdUMul24Like, 3588fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3589fd4e5da5Sopenharmony_ci "s_mul24", 3590fd4e5da5Sopenharmony_ci "u_mul24", 3591fd4e5da5Sopenharmony_ci })); 3592fd4e5da5Sopenharmony_ci 3593fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, Success) { 3594fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3595fd4e5da5Sopenharmony_ci std::ostringstream ss; 3596fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 3597fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3598fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name 3599fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3600fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name 3601fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3602fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name 3603fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1 %u32_2\n"; 3604fd4e5da5Sopenharmony_ci ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3605fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3606fd4e5da5Sopenharmony_ci ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3607fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3608fd4e5da5Sopenharmony_ci ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3609fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3610fd4e5da5Sopenharmony_ci ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name 3611fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n"; 3612fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3613fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3614fd4e5da5Sopenharmony_ci} 3615fd4e5da5Sopenharmony_ci 3616fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatResultType) { 3617fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3618fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3619fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %u32_1\n"; 3620fd4e5da5Sopenharmony_ci 3621fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3622fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3623fd4e5da5Sopenharmony_ci EXPECT_THAT( 3624fd4e5da5Sopenharmony_ci getDiagnosticString(), 3625fd4e5da5Sopenharmony_ci HasSubstr( 3626fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 3627fd4e5da5Sopenharmony_ci ": expected Result Type to be a 32-bit int scalar or vector type")); 3628fd4e5da5Sopenharmony_ci} 3629fd4e5da5Sopenharmony_ci 3630fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64ResultType) { 3631fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3632fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u64 %extinst " + ext_inst_name + 3633fd4e5da5Sopenharmony_ci " %u64_0 %u64_0 %u64_1\n"; 3634fd4e5da5Sopenharmony_ci 3635fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3636fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3637fd4e5da5Sopenharmony_ci EXPECT_THAT( 3638fd4e5da5Sopenharmony_ci getDiagnosticString(), 3639fd4e5da5Sopenharmony_ci HasSubstr( 3640fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 3641fd4e5da5Sopenharmony_ci ": expected Result Type to be a 32-bit int scalar or vector type")); 3642fd4e5da5Sopenharmony_ci} 3643fd4e5da5Sopenharmony_ci 3644fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand1) { 3645fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3646fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3647fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %u32_1\n"; 3648fd4e5da5Sopenharmony_ci 3649fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3650fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3651fd4e5da5Sopenharmony_ci EXPECT_THAT( 3652fd4e5da5Sopenharmony_ci getDiagnosticString(), 3653fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3654fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3655fd4e5da5Sopenharmony_ci} 3656fd4e5da5Sopenharmony_ci 3657fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand2) { 3658fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3659fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3660fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %u32_1\n"; 3661fd4e5da5Sopenharmony_ci 3662fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3663fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3664fd4e5da5Sopenharmony_ci EXPECT_THAT( 3665fd4e5da5Sopenharmony_ci getDiagnosticString(), 3666fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3667fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3668fd4e5da5Sopenharmony_ci} 3669fd4e5da5Sopenharmony_ci 3670fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand3) { 3671fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3672fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3673fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %f32_1\n"; 3674fd4e5da5Sopenharmony_ci 3675fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3676fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3677fd4e5da5Sopenharmony_ci EXPECT_THAT( 3678fd4e5da5Sopenharmony_ci getDiagnosticString(), 3679fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3680fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3681fd4e5da5Sopenharmony_ci} 3682fd4e5da5Sopenharmony_ci 3683fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand1) { 3684fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3685fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3686fd4e5da5Sopenharmony_ci " %f32_0 %u32_0 %u64_1\n"; 3687fd4e5da5Sopenharmony_ci 3688fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3689fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3690fd4e5da5Sopenharmony_ci EXPECT_THAT( 3691fd4e5da5Sopenharmony_ci getDiagnosticString(), 3692fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3693fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3694fd4e5da5Sopenharmony_ci} 3695fd4e5da5Sopenharmony_ci 3696fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand2) { 3697fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3698fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3699fd4e5da5Sopenharmony_ci " %u32_0 %f32_0 %u64_1\n"; 3700fd4e5da5Sopenharmony_ci 3701fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3702fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3703fd4e5da5Sopenharmony_ci EXPECT_THAT( 3704fd4e5da5Sopenharmony_ci getDiagnosticString(), 3705fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3706fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3707fd4e5da5Sopenharmony_ci} 3708fd4e5da5Sopenharmony_ci 3709fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand3) { 3710fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3711fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3712fd4e5da5Sopenharmony_ci " %u32_0 %u32_0 %u64_1\n"; 3713fd4e5da5Sopenharmony_ci 3714fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3715fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3716fd4e5da5Sopenharmony_ci EXPECT_THAT( 3717fd4e5da5Sopenharmony_ci getDiagnosticString(), 3718fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3719fd4e5da5Sopenharmony_ci ": expected types of all operands to be equal to Result Type")); 3720fd4e5da5Sopenharmony_ci} 3721fd4e5da5Sopenharmony_ci 3722fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMad24Like, ValidateOpenCLStdUMad24Like, 3723fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3724fd4e5da5Sopenharmony_ci "s_mad24", 3725fd4e5da5Sopenharmony_ci "u_mad24", 3726fd4e5da5Sopenharmony_ci })); 3727fd4e5da5Sopenharmony_ci 3728fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossSuccess) { 3729fd4e5da5Sopenharmony_ci const std::string body = R"( 3730fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f32vec3_012 %f32vec3_123 3731fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst cross %f32vec4_0123 %f32vec4_0123 3732fd4e5da5Sopenharmony_ci)"; 3733fd4e5da5Sopenharmony_ci 3734fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3735fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3736fd4e5da5Sopenharmony_ci} 3737fd4e5da5Sopenharmony_ci 3738fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossIntVectorResultType) { 3739fd4e5da5Sopenharmony_ci const std::string body = R"( 3740fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec3 %extinst cross %f32vec3_012 %f32vec3_123 3741fd4e5da5Sopenharmony_ci)"; 3742fd4e5da5Sopenharmony_ci 3743fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3744fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3745fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3746fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std cross: " 3747fd4e5da5Sopenharmony_ci "expected Result Type to be a float vector type")); 3748fd4e5da5Sopenharmony_ci} 3749fd4e5da5Sopenharmony_ci 3750fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossResultTypeWrongSize) { 3751fd4e5da5Sopenharmony_ci const std::string body = R"( 3752fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst cross %f32vec3_012 %f32vec3_123 3753fd4e5da5Sopenharmony_ci)"; 3754fd4e5da5Sopenharmony_ci 3755fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3756fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3757fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3758fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std cross: " 3759fd4e5da5Sopenharmony_ci "expected Result Type to have 3 or 4 components")); 3760fd4e5da5Sopenharmony_ci} 3761fd4e5da5Sopenharmony_ci 3762fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossXWrongType) { 3763fd4e5da5Sopenharmony_ci const std::string body = R"( 3764fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f64vec3_012 %f32vec3_123 3765fd4e5da5Sopenharmony_ci)"; 3766fd4e5da5Sopenharmony_ci 3767fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3768fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3769fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3770fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std cross: " 3771fd4e5da5Sopenharmony_ci "expected operand X type to be equal to Result Type")); 3772fd4e5da5Sopenharmony_ci} 3773fd4e5da5Sopenharmony_ci 3774fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossYWrongType) { 3775fd4e5da5Sopenharmony_ci const std::string body = R"( 3776fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f32vec3_123 %f64vec3_012 3777fd4e5da5Sopenharmony_ci)"; 3778fd4e5da5Sopenharmony_ci 3779fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3780fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3781fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3782fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std cross: " 3783fd4e5da5Sopenharmony_ci "expected operand Y type to be equal to Result Type")); 3784fd4e5da5Sopenharmony_ci} 3785fd4e5da5Sopenharmony_ci 3786fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, Success) { 3787fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3788fd4e5da5Sopenharmony_ci std::ostringstream ss; 3789fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32vec2_01\n"; 3790fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32 %extinst " << ext_inst_name 3791fd4e5da5Sopenharmony_ci << " %f32vec4_0123\n"; 3792fd4e5da5Sopenharmony_ci 3793fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3794fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3795fd4e5da5Sopenharmony_ci} 3796fd4e5da5Sopenharmony_ci 3797fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, IntResultType) { 3798fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3799fd4e5da5Sopenharmony_ci const std::string body = 3800fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32vec2_01\n"; 3801fd4e5da5Sopenharmony_ci 3802fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3803fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3804fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3805fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3806fd4e5da5Sopenharmony_ci ": " 3807fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar type")); 3808fd4e5da5Sopenharmony_ci} 3809fd4e5da5Sopenharmony_ci 3810fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, IntX) { 3811fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3812fd4e5da5Sopenharmony_ci const std::string body = 3813fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32vec2_01\n"; 3814fd4e5da5Sopenharmony_ci 3815fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3816fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3817fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3818fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3819fd4e5da5Sopenharmony_ci ": " 3820fd4e5da5Sopenharmony_ci "expected operand P to be a float scalar or vector")); 3821fd4e5da5Sopenharmony_ci} 3822fd4e5da5Sopenharmony_ci 3823fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, VectorTooBig) { 3824fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3825fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3826fd4e5da5Sopenharmony_ci " %f32vec8_01010101\n"; 3827fd4e5da5Sopenharmony_ci 3828fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3829fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3830fd4e5da5Sopenharmony_ci EXPECT_THAT( 3831fd4e5da5Sopenharmony_ci getDiagnosticString(), 3832fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3833fd4e5da5Sopenharmony_ci ": " 3834fd4e5da5Sopenharmony_ci "expected operand P to have no more than 4 components")); 3835fd4e5da5Sopenharmony_ci} 3836fd4e5da5Sopenharmony_ci 3837fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, DifferentType) { 3838fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3839fd4e5da5Sopenharmony_ci const std::string body = 3840fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32vec2_01\n"; 3841fd4e5da5Sopenharmony_ci 3842fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3843fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3844fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3845fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3846fd4e5da5Sopenharmony_ci ": " 3847fd4e5da5Sopenharmony_ci "expected operand P component type to be equal to " 3848fd4e5da5Sopenharmony_ci "Result Type")); 3849fd4e5da5Sopenharmony_ci} 3850fd4e5da5Sopenharmony_ci 3851fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllLengthLike, ValidateOpenCLStdLengthLike, 3852fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3853fd4e5da5Sopenharmony_ci "length", 3854fd4e5da5Sopenharmony_ci "fast_length", 3855fd4e5da5Sopenharmony_ci })); 3856fd4e5da5Sopenharmony_ci 3857fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, Success) { 3858fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3859fd4e5da5Sopenharmony_ci std::ostringstream ss; 3860fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 3861fd4e5da5Sopenharmony_ci << " %f32vec2_01 %f32vec2_01\n"; 3862fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32 %extinst " << ext_inst_name 3863fd4e5da5Sopenharmony_ci << " %f32vec4_0123 %f32vec4_1234\n"; 3864fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32 %extinst " << ext_inst_name 3865fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1\n"; 3866fd4e5da5Sopenharmony_ci 3867fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3868fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3869fd4e5da5Sopenharmony_ci} 3870fd4e5da5Sopenharmony_ci 3871fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, IntResultType) { 3872fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3873fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + 3874fd4e5da5Sopenharmony_ci " %f32vec2_01 %f32vec2_12\n"; 3875fd4e5da5Sopenharmony_ci 3876fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3877fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3878fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3879fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3880fd4e5da5Sopenharmony_ci ": " 3881fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar type")); 3882fd4e5da5Sopenharmony_ci} 3883fd4e5da5Sopenharmony_ci 3884fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, IntP0) { 3885fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3886fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3887fd4e5da5Sopenharmony_ci " %u32vec2_01 %f32vec2_12\n"; 3888fd4e5da5Sopenharmony_ci 3889fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3890fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3891fd4e5da5Sopenharmony_ci EXPECT_THAT( 3892fd4e5da5Sopenharmony_ci getDiagnosticString(), 3893fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3894fd4e5da5Sopenharmony_ci ": " 3895fd4e5da5Sopenharmony_ci "expected operand P0 to be of float scalar or vector type")); 3896fd4e5da5Sopenharmony_ci} 3897fd4e5da5Sopenharmony_ci 3898fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, VectorTooBig) { 3899fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3900fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3901fd4e5da5Sopenharmony_ci " %f32vec8_01010101 %f32vec8_01010101\n"; 3902fd4e5da5Sopenharmony_ci 3903fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3904fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3905fd4e5da5Sopenharmony_ci EXPECT_THAT( 3906fd4e5da5Sopenharmony_ci getDiagnosticString(), 3907fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3908fd4e5da5Sopenharmony_ci ": " 3909fd4e5da5Sopenharmony_ci "expected operand P0 to have no more than 4 components")); 3910fd4e5da5Sopenharmony_ci} 3911fd4e5da5Sopenharmony_ci 3912fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, F64P0) { 3913fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3914fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + 3915fd4e5da5Sopenharmony_ci " %f64vec2_01 %f32vec2_12\n"; 3916fd4e5da5Sopenharmony_ci 3917fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3918fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3919fd4e5da5Sopenharmony_ci EXPECT_THAT( 3920fd4e5da5Sopenharmony_ci getDiagnosticString(), 3921fd4e5da5Sopenharmony_ci HasSubstr( 3922fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 3923fd4e5da5Sopenharmony_ci ": " 3924fd4e5da5Sopenharmony_ci "expected operand P0 component type to be equal to Result Type")); 3925fd4e5da5Sopenharmony_ci} 3926fd4e5da5Sopenharmony_ci 3927fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, DifferentOperands) { 3928fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3929fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + 3930fd4e5da5Sopenharmony_ci " %f64vec2_01 %f32vec2_12\n"; 3931fd4e5da5Sopenharmony_ci 3932fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3933fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3934fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3935fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3936fd4e5da5Sopenharmony_ci ": " 3937fd4e5da5Sopenharmony_ci "expected operands P0 and P1 to be of the same type")); 3938fd4e5da5Sopenharmony_ci} 3939fd4e5da5Sopenharmony_ci 3940fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllDistanceLike, ValidateOpenCLStdDistanceLike, 3941fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 3942fd4e5da5Sopenharmony_ci "distance", 3943fd4e5da5Sopenharmony_ci "fast_distance", 3944fd4e5da5Sopenharmony_ci })); 3945fd4e5da5Sopenharmony_ci 3946fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, Success) { 3947fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3948fd4e5da5Sopenharmony_ci std::ostringstream ss; 3949fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 3950fd4e5da5Sopenharmony_ci << " %f32vec2_01\n"; 3951fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec4 %extinst " << ext_inst_name 3952fd4e5da5Sopenharmony_ci << " %f32vec4_0123\n"; 3953fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_2\n"; 3954fd4e5da5Sopenharmony_ci 3955fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 3956fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 3957fd4e5da5Sopenharmony_ci} 3958fd4e5da5Sopenharmony_ci 3959fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, IntResultType) { 3960fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3961fd4e5da5Sopenharmony_ci const std::string body = 3962fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_2\n"; 3963fd4e5da5Sopenharmony_ci 3964fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3965fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3966fd4e5da5Sopenharmony_ci EXPECT_THAT( 3967fd4e5da5Sopenharmony_ci getDiagnosticString(), 3968fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3969fd4e5da5Sopenharmony_ci ": " 3970fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar or vector type")); 3971fd4e5da5Sopenharmony_ci} 3972fd4e5da5Sopenharmony_ci 3973fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, VectorTooBig) { 3974fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3975fd4e5da5Sopenharmony_ci const std::string body = "%val1 = OpExtInst %f32vec8 %extinst " + 3976fd4e5da5Sopenharmony_ci ext_inst_name + " %f32vec8_01010101\n"; 3977fd4e5da5Sopenharmony_ci 3978fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3979fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3980fd4e5da5Sopenharmony_ci EXPECT_THAT( 3981fd4e5da5Sopenharmony_ci getDiagnosticString(), 3982fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3983fd4e5da5Sopenharmony_ci ": " 3984fd4e5da5Sopenharmony_ci "expected Result Type to have no more than 4 components")); 3985fd4e5da5Sopenharmony_ci} 3986fd4e5da5Sopenharmony_ci 3987fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, DifferentType) { 3988fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 3989fd4e5da5Sopenharmony_ci const std::string body = 3990fd4e5da5Sopenharmony_ci "%val1 = OpExtInst %f64vec2 %extinst " + ext_inst_name + " %f32vec2_01\n"; 3991fd4e5da5Sopenharmony_ci 3992fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 3993fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 3994fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 3995fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 3996fd4e5da5Sopenharmony_ci ": " 3997fd4e5da5Sopenharmony_ci "expected operand P type to be equal to Result Type")); 3998fd4e5da5Sopenharmony_ci} 3999fd4e5da5Sopenharmony_ci 4000fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllNormalizeLike, ValidateOpenCLStdNormalizeLike, 4001fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 4002fd4e5da5Sopenharmony_ci "normalize", 4003fd4e5da5Sopenharmony_ci "fast_normalize", 4004fd4e5da5Sopenharmony_ci })); 4005fd4e5da5Sopenharmony_ci 4006fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectSuccess) { 4007fd4e5da5Sopenharmony_ci const std::string body = R"( 4008fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst bitselect %f32_2 %f32_1 %f32_1 4009fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst bitselect %f32vec4_0123 %f32vec4_1234 %f32vec4_0123 4010fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %u32_1 %u32_1 4011fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst bitselect %u32vec4_0123 %u32vec4_0123 %u32vec4_0123 4012fd4e5da5Sopenharmony_ci%val5 = OpExtInst %u64 %extinst bitselect %u64_2 %u64_1 %u64_1 4013fd4e5da5Sopenharmony_ci)"; 4014fd4e5da5Sopenharmony_ci 4015fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4016fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4017fd4e5da5Sopenharmony_ci} 4018fd4e5da5Sopenharmony_ci 4019fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectWrongResultType) { 4020fd4e5da5Sopenharmony_ci const std::string body = R"( 4021fd4e5da5Sopenharmony_ci%val3 = OpExtInst %struct_f32_f32 %extinst bitselect %u32_2 %u32_1 %u32_1 4022fd4e5da5Sopenharmony_ci)"; 4023fd4e5da5Sopenharmony_ci 4024fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4025fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4026fd4e5da5Sopenharmony_ci EXPECT_THAT( 4027fd4e5da5Sopenharmony_ci getDiagnosticString(), 4028fd4e5da5Sopenharmony_ci HasSubstr( 4029fd4e5da5Sopenharmony_ci "OpenCL.std bitselect: " 4030fd4e5da5Sopenharmony_ci "expected Result Type to be an int or float scalar or vector type")); 4031fd4e5da5Sopenharmony_ci} 4032fd4e5da5Sopenharmony_ci 4033fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectAWrongType) { 4034fd4e5da5Sopenharmony_ci const std::string body = R"( 4035fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %f32_2 %u32_1 %u32_1 4036fd4e5da5Sopenharmony_ci)"; 4037fd4e5da5Sopenharmony_ci 4038fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4039fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4040fd4e5da5Sopenharmony_ci EXPECT_THAT( 4041fd4e5da5Sopenharmony_ci getDiagnosticString(), 4042fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std bitselect: " 4043fd4e5da5Sopenharmony_ci "expected types of all operands to be equal to Result Type")); 4044fd4e5da5Sopenharmony_ci} 4045fd4e5da5Sopenharmony_ci 4046fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectBWrongType) { 4047fd4e5da5Sopenharmony_ci const std::string body = R"( 4048fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %f32_1 %u32_1 4049fd4e5da5Sopenharmony_ci)"; 4050fd4e5da5Sopenharmony_ci 4051fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4052fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4053fd4e5da5Sopenharmony_ci EXPECT_THAT( 4054fd4e5da5Sopenharmony_ci getDiagnosticString(), 4055fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std bitselect: " 4056fd4e5da5Sopenharmony_ci "expected types of all operands to be equal to Result Type")); 4057fd4e5da5Sopenharmony_ci} 4058fd4e5da5Sopenharmony_ci 4059fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectCWrongType) { 4060fd4e5da5Sopenharmony_ci const std::string body = R"( 4061fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %u32_1 %f32_1 4062fd4e5da5Sopenharmony_ci)"; 4063fd4e5da5Sopenharmony_ci 4064fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4065fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4066fd4e5da5Sopenharmony_ci EXPECT_THAT( 4067fd4e5da5Sopenharmony_ci getDiagnosticString(), 4068fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std bitselect: " 4069fd4e5da5Sopenharmony_ci "expected types of all operands to be equal to Result Type")); 4070fd4e5da5Sopenharmony_ci} 4071fd4e5da5Sopenharmony_ci 4072fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectSuccess) { 4073fd4e5da5Sopenharmony_ci const std::string body = R"( 4074fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst select %f32_2 %f32_1 %u32_1 4075fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst select %f32vec4_0123 %f32vec4_1234 %u32vec4_0123 4076fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %u32_2 %u32_1 %u32_1 4077fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst select %u32vec4_0123 %u32vec4_0123 %u32vec4_0123 4078fd4e5da5Sopenharmony_ci%val5 = OpExtInst %u64 %extinst select %u64_2 %u64_1 %u64_1 4079fd4e5da5Sopenharmony_ci)"; 4080fd4e5da5Sopenharmony_ci 4081fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4082fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4083fd4e5da5Sopenharmony_ci} 4084fd4e5da5Sopenharmony_ci 4085fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectWrongResultType) { 4086fd4e5da5Sopenharmony_ci const std::string body = R"( 4087fd4e5da5Sopenharmony_ci%val3 = OpExtInst %struct_f32_f32 %extinst select %u32_2 %u32_1 %u32_1 4088fd4e5da5Sopenharmony_ci)"; 4089fd4e5da5Sopenharmony_ci 4090fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4091fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4092fd4e5da5Sopenharmony_ci EXPECT_THAT( 4093fd4e5da5Sopenharmony_ci getDiagnosticString(), 4094fd4e5da5Sopenharmony_ci HasSubstr( 4095fd4e5da5Sopenharmony_ci "OpenCL.std select: " 4096fd4e5da5Sopenharmony_ci "expected Result Type to be an int or float scalar or vector type")); 4097fd4e5da5Sopenharmony_ci} 4098fd4e5da5Sopenharmony_ci 4099fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectAWrongType) { 4100fd4e5da5Sopenharmony_ci const std::string body = R"( 4101fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %f32_2 %u32_1 %u32_1 4102fd4e5da5Sopenharmony_ci)"; 4103fd4e5da5Sopenharmony_ci 4104fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4105fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4106fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4107fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std select: " 4108fd4e5da5Sopenharmony_ci "expected operand A type to be equal to Result Type")); 4109fd4e5da5Sopenharmony_ci} 4110fd4e5da5Sopenharmony_ci 4111fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectBWrongType) { 4112fd4e5da5Sopenharmony_ci const std::string body = R"( 4113fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %u32_2 %f32_1 %u32_1 4114fd4e5da5Sopenharmony_ci)"; 4115fd4e5da5Sopenharmony_ci 4116fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4117fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4118fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4119fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std select: " 4120fd4e5da5Sopenharmony_ci "expected operand B type to be equal to Result Type")); 4121fd4e5da5Sopenharmony_ci} 4122fd4e5da5Sopenharmony_ci 4123fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongType) { 4124fd4e5da5Sopenharmony_ci const std::string body = R"( 4125fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst select %f32_2 %f32_1 %f32_1 4126fd4e5da5Sopenharmony_ci)"; 4127fd4e5da5Sopenharmony_ci 4128fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4129fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4130fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4131fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std select: " 4132fd4e5da5Sopenharmony_ci "expected operand C to be an int scalar or vector")); 4133fd4e5da5Sopenharmony_ci} 4134fd4e5da5Sopenharmony_ci 4135fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongComponentNumber) { 4136fd4e5da5Sopenharmony_ci const std::string body = R"( 4137fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32vec2 %extinst select %f32vec2_12 %f32vec2_01 %u32_1 4138fd4e5da5Sopenharmony_ci)"; 4139fd4e5da5Sopenharmony_ci 4140fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4141fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4142fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4143fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std select: " 4144fd4e5da5Sopenharmony_ci "expected operand C to have the same number of " 4145fd4e5da5Sopenharmony_ci "components as Result Type")); 4146fd4e5da5Sopenharmony_ci} 4147fd4e5da5Sopenharmony_ci 4148fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongBitWidth) { 4149fd4e5da5Sopenharmony_ci const std::string body = R"( 4150fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32vec2 %extinst select %f32vec2_12 %f32vec2_01 %u64vec2_01 4151fd4e5da5Sopenharmony_ci)"; 4152fd4e5da5Sopenharmony_ci 4153fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4154fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4155fd4e5da5Sopenharmony_ci EXPECT_THAT( 4156fd4e5da5Sopenharmony_ci getDiagnosticString(), 4157fd4e5da5Sopenharmony_ci HasSubstr( 4158fd4e5da5Sopenharmony_ci "OpenCL.std select: " 4159fd4e5da5Sopenharmony_ci "expected operand C to have the same bit width as Result Type")); 4160fd4e5da5Sopenharmony_ci} 4161fd4e5da5Sopenharmony_ci 4162fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, SuccessPhysical32) { 4163fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4164fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4165fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4166fd4e5da5Sopenharmony_ci 4167fd4e5da5Sopenharmony_ci std::ostringstream ss; 4168fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4169fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4170fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4171fd4e5da5Sopenharmony_ci << " %f32_1 %u32_1 %ptr" << rounding_mode << "\n"; 4172fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name 4173fd4e5da5Sopenharmony_ci << " %f64_0 %u32_2 %ptr" << rounding_mode << "\n"; 4174fd4e5da5Sopenharmony_ci } else { 4175fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4176fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4177fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name 4178fd4e5da5Sopenharmony_ci << " %f32vec4_0123 %u32_0 %ptr" << rounding_mode << "\n"; 4179fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %void %extinst " << ext_inst_name 4180fd4e5da5Sopenharmony_ci << " %f64vec2_01 %u32_2 %ptr" << rounding_mode << "\n"; 4181fd4e5da5Sopenharmony_ci } 4182fd4e5da5Sopenharmony_ci 4183fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4184fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4185fd4e5da5Sopenharmony_ci} 4186fd4e5da5Sopenharmony_ci 4187fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, SuccessPhysical64) { 4188fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4189fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4190fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4191fd4e5da5Sopenharmony_ci 4192fd4e5da5Sopenharmony_ci std::ostringstream ss; 4193fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4194fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4195fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4196fd4e5da5Sopenharmony_ci << " %f32_1 %u64_1 %ptr" << rounding_mode << "\n"; 4197fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name 4198fd4e5da5Sopenharmony_ci << " %f64_0 %u64_2 %ptr" << rounding_mode << "\n"; 4199fd4e5da5Sopenharmony_ci } else { 4200fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4201fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u64_1 %ptr" << rounding_mode << "\n"; 4202fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name 4203fd4e5da5Sopenharmony_ci << " %f32vec4_0123 %u64_0 %ptr" << rounding_mode << "\n"; 4204fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %void %extinst " << ext_inst_name 4205fd4e5da5Sopenharmony_ci << " %f64vec2_01 %u64_2 %ptr" << rounding_mode << "\n"; 4206fd4e5da5Sopenharmony_ci } 4207fd4e5da5Sopenharmony_ci 4208fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4209fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4210fd4e5da5Sopenharmony_ci} 4211fd4e5da5Sopenharmony_ci 4212fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, NonVoidResultType) { 4213fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4214fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4215fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4216fd4e5da5Sopenharmony_ci 4217fd4e5da5Sopenharmony_ci std::ostringstream ss; 4218fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4219fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4220fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 4221fd4e5da5Sopenharmony_ci << " %f32_1 %u32_1 %ptr" << rounding_mode << "\n"; 4222fd4e5da5Sopenharmony_ci } else { 4223fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 4224fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4225fd4e5da5Sopenharmony_ci } 4226fd4e5da5Sopenharmony_ci 4227fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4228fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4229fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4230fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4231fd4e5da5Sopenharmony_ci ": expected Result Type to be void")); 4232fd4e5da5Sopenharmony_ci} 4233fd4e5da5Sopenharmony_ci 4234fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, WrongDataType) { 4235fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4236fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4237fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4238fd4e5da5Sopenharmony_ci 4239fd4e5da5Sopenharmony_ci std::ostringstream ss; 4240fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4241fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4242fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4243fd4e5da5Sopenharmony_ci << " %f64vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4244fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4245fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4246fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4247fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4248fd4e5da5Sopenharmony_ci ": expected Data to be a 32 or 64-bit float scalar")); 4249fd4e5da5Sopenharmony_ci } else { 4250fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4251fd4e5da5Sopenharmony_ci << " %f64_0 %u32_1 %ptr" << rounding_mode << "\n"; 4252fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4253fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4254fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4255fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4256fd4e5da5Sopenharmony_ci ": expected Data to be a 32 or 64-bit float vector")); 4257fd4e5da5Sopenharmony_ci } 4258fd4e5da5Sopenharmony_ci} 4259fd4e5da5Sopenharmony_ci 4260fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, AddressingModelLogical) { 4261fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4262fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4263fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4264fd4e5da5Sopenharmony_ci 4265fd4e5da5Sopenharmony_ci std::ostringstream ss; 4266fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4267fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4268fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4269fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n"; 4270fd4e5da5Sopenharmony_ci } else { 4271fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4272fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4273fd4e5da5Sopenharmony_ci } 4274fd4e5da5Sopenharmony_ci 4275fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical")); 4276fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4277fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4278fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4279fd4e5da5Sopenharmony_ci " can only be used with physical addressing models")); 4280fd4e5da5Sopenharmony_ci} 4281fd4e5da5Sopenharmony_ci 4282fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, OffsetNotSizeT) { 4283fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4284fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4285fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4286fd4e5da5Sopenharmony_ci 4287fd4e5da5Sopenharmony_ci std::ostringstream ss; 4288fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4289fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4290fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4291fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n"; 4292fd4e5da5Sopenharmony_ci } else { 4293fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4294fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4295fd4e5da5Sopenharmony_ci } 4296fd4e5da5Sopenharmony_ci 4297fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4298fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4299fd4e5da5Sopenharmony_ci EXPECT_THAT( 4300fd4e5da5Sopenharmony_ci getDiagnosticString(), 4301fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4302fd4e5da5Sopenharmony_ci ": " 4303fd4e5da5Sopenharmony_ci "expected operand Offset to be of type size_t (64-bit integer " 4304fd4e5da5Sopenharmony_ci "for the addressing model used in the module)")); 4305fd4e5da5Sopenharmony_ci} 4306fd4e5da5Sopenharmony_ci 4307fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PNotPointer) { 4308fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4309fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4310fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4311fd4e5da5Sopenharmony_ci 4312fd4e5da5Sopenharmony_ci std::ostringstream ss; 4313fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4314fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4315fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %f16_ptr_workgroup" << rounding_mode << "\n"; 4316fd4e5da5Sopenharmony_ci } else { 4317fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4318fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %f16_ptr_workgroup" << rounding_mode << "\n"; 4319fd4e5da5Sopenharmony_ci } 4320fd4e5da5Sopenharmony_ci 4321fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4322fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 4323fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4324fd4e5da5Sopenharmony_ci HasSubstr("Operand '89[%_ptr_Workgroup_half]' cannot be a type")); 4325fd4e5da5Sopenharmony_ci} 4326fd4e5da5Sopenharmony_ci 4327fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, ConstPointer) { 4328fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4329fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4330fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4331fd4e5da5Sopenharmony_ci 4332fd4e5da5Sopenharmony_ci std::ostringstream ss; 4333fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4334fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4335fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4336fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4337fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n"; 4338fd4e5da5Sopenharmony_ci } else { 4339fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4340fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4341fd4e5da5Sopenharmony_ci } 4342fd4e5da5Sopenharmony_ci 4343fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4344fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4345fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4346fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4347fd4e5da5Sopenharmony_ci ": expected operand P storage class to be Generic, " 4348fd4e5da5Sopenharmony_ci "CrossWorkgroup, Workgroup or Function")); 4349fd4e5da5Sopenharmony_ci} 4350fd4e5da5Sopenharmony_ci 4351fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PDataTypeInt) { 4352fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4353fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4354fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4355fd4e5da5Sopenharmony_ci 4356fd4e5da5Sopenharmony_ci std::ostringstream ss; 4357fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n"; 4358fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4359fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4360fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n"; 4361fd4e5da5Sopenharmony_ci } else { 4362fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4363fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4364fd4e5da5Sopenharmony_ci } 4365fd4e5da5Sopenharmony_ci 4366fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4367fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4368fd4e5da5Sopenharmony_ci EXPECT_THAT( 4369fd4e5da5Sopenharmony_ci getDiagnosticString(), 4370fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4371fd4e5da5Sopenharmony_ci ": expected operand P data type to be 16-bit float scalar")); 4372fd4e5da5Sopenharmony_ci} 4373fd4e5da5Sopenharmony_ci 4374fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PDataTypeFloat32) { 4375fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4376fd4e5da5Sopenharmony_ci const std::string rounding_mode = 4377fd4e5da5Sopenharmony_ci ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : ""; 4378fd4e5da5Sopenharmony_ci 4379fd4e5da5Sopenharmony_ci std::ostringstream ss; 4380fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4381fd4e5da5Sopenharmony_ci if (std::string::npos == ext_inst_name.find("halfn")) { 4382fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4383fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n"; 4384fd4e5da5Sopenharmony_ci } else { 4385fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name 4386fd4e5da5Sopenharmony_ci << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n"; 4387fd4e5da5Sopenharmony_ci } 4388fd4e5da5Sopenharmony_ci 4389fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4390fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4391fd4e5da5Sopenharmony_ci EXPECT_THAT( 4392fd4e5da5Sopenharmony_ci getDiagnosticString(), 4393fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4394fd4e5da5Sopenharmony_ci ": expected operand P data type to be 16-bit float scalar")); 4395fd4e5da5Sopenharmony_ci} 4396fd4e5da5Sopenharmony_ci 4397fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllVStoreHalfLike, ValidateOpenCLStdVStoreHalfLike, 4398fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 4399fd4e5da5Sopenharmony_ci "vstore_half", 4400fd4e5da5Sopenharmony_ci "vstore_half_r", 4401fd4e5da5Sopenharmony_ci "vstore_halfn", 4402fd4e5da5Sopenharmony_ci "vstore_halfn_r", 4403fd4e5da5Sopenharmony_ci "vstorea_halfn", 4404fd4e5da5Sopenharmony_ci "vstorea_halfn_r", 4405fd4e5da5Sopenharmony_ci })); 4406fd4e5da5Sopenharmony_ci 4407fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, SuccessPhysical32) { 4408fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4409fd4e5da5Sopenharmony_ci 4410fd4e5da5Sopenharmony_ci std::ostringstream ss; 4411fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4412fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4413fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 2\n"; 4414fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec3 %extinst " << ext_inst_name 4415fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 3\n"; 4416fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name 4417fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 4\n"; 4418fd4e5da5Sopenharmony_ci 4419fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4420fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4421fd4e5da5Sopenharmony_ci} 4422fd4e5da5Sopenharmony_ci 4423fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, SuccessPhysical64) { 4424fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4425fd4e5da5Sopenharmony_ci 4426fd4e5da5Sopenharmony_ci std::ostringstream ss; 4427fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4428fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4429fd4e5da5Sopenharmony_ci << " %u64_1 %ptr 2\n"; 4430fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec3 %extinst " << ext_inst_name 4431fd4e5da5Sopenharmony_ci << " %u64_1 %ptr 3\n"; 4432fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name 4433fd4e5da5Sopenharmony_ci << " %u64_1 %ptr 4\n"; 4434fd4e5da5Sopenharmony_ci 4435fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4436fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4437fd4e5da5Sopenharmony_ci} 4438fd4e5da5Sopenharmony_ci 4439fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, ResultTypeNotFloatVector) { 4440fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4441fd4e5da5Sopenharmony_ci 4442fd4e5da5Sopenharmony_ci std::ostringstream ss; 4443fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4444fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 4445fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 1\n"; 4446fd4e5da5Sopenharmony_ci 4447fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4448fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4449fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4450fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4451fd4e5da5Sopenharmony_ci ": expected Result Type to be a float vector type")); 4452fd4e5da5Sopenharmony_ci} 4453fd4e5da5Sopenharmony_ci 4454fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, AddressingModelLogical) { 4455fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4456fd4e5da5Sopenharmony_ci 4457fd4e5da5Sopenharmony_ci std::ostringstream ss; 4458fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4459fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4460fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 2\n"; 4461fd4e5da5Sopenharmony_ci 4462fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical")); 4463fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4464fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4465fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4466fd4e5da5Sopenharmony_ci " can only be used with physical addressing models")); 4467fd4e5da5Sopenharmony_ci} 4468fd4e5da5Sopenharmony_ci 4469fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, OffsetNotSizeT) { 4470fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4471fd4e5da5Sopenharmony_ci 4472fd4e5da5Sopenharmony_ci std::ostringstream ss; 4473fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4474fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4475fd4e5da5Sopenharmony_ci << " %u64_1 %ptr 2\n"; 4476fd4e5da5Sopenharmony_ci 4477fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4478fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4479fd4e5da5Sopenharmony_ci EXPECT_THAT( 4480fd4e5da5Sopenharmony_ci getDiagnosticString(), 4481fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4482fd4e5da5Sopenharmony_ci ": expected operand Offset to be of type size_t (32-bit " 4483fd4e5da5Sopenharmony_ci "integer for the addressing model used in the module)")); 4484fd4e5da5Sopenharmony_ci} 4485fd4e5da5Sopenharmony_ci 4486fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PNotPointer) { 4487fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4488fd4e5da5Sopenharmony_ci 4489fd4e5da5Sopenharmony_ci std::ostringstream ss; 4490fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4491fd4e5da5Sopenharmony_ci << " %u32_1 %f16_ptr_workgroup 2\n"; 4492fd4e5da5Sopenharmony_ci 4493fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4494fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 4495fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4496fd4e5da5Sopenharmony_ci HasSubstr("Operand '89[%_ptr_Workgroup_half]' cannot be a type")); 4497fd4e5da5Sopenharmony_ci} 4498fd4e5da5Sopenharmony_ci 4499fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, OffsetWrongStorageType) { 4500fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4501fd4e5da5Sopenharmony_ci 4502fd4e5da5Sopenharmony_ci std::ostringstream ss; 4503fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_input %f16vec8_input %u32_1\n"; 4504fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4505fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 2\n"; 4506fd4e5da5Sopenharmony_ci 4507fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4508fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4509fd4e5da5Sopenharmony_ci EXPECT_THAT( 4510fd4e5da5Sopenharmony_ci getDiagnosticString(), 4511fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4512fd4e5da5Sopenharmony_ci ": expected operand P storage class to be UniformConstant, " 4513fd4e5da5Sopenharmony_ci "Generic, CrossWorkgroup, Workgroup or Function")); 4514fd4e5da5Sopenharmony_ci} 4515fd4e5da5Sopenharmony_ci 4516fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PDataTypeInt) { 4517fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4518fd4e5da5Sopenharmony_ci 4519fd4e5da5Sopenharmony_ci std::ostringstream ss; 4520fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n"; 4521fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4522fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 2\n"; 4523fd4e5da5Sopenharmony_ci 4524fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4525fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4526fd4e5da5Sopenharmony_ci EXPECT_THAT( 4527fd4e5da5Sopenharmony_ci getDiagnosticString(), 4528fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4529fd4e5da5Sopenharmony_ci ": expected operand P data type to be 16-bit float scalar")); 4530fd4e5da5Sopenharmony_ci} 4531fd4e5da5Sopenharmony_ci 4532fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PDataTypeFloat32) { 4533fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4534fd4e5da5Sopenharmony_ci 4535fd4e5da5Sopenharmony_ci std::ostringstream ss; 4536fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4537fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4538fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 2\n"; 4539fd4e5da5Sopenharmony_ci 4540fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4541fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4542fd4e5da5Sopenharmony_ci EXPECT_THAT( 4543fd4e5da5Sopenharmony_ci getDiagnosticString(), 4544fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4545fd4e5da5Sopenharmony_ci ": expected operand P data type to be 16-bit float scalar")); 4546fd4e5da5Sopenharmony_ci} 4547fd4e5da5Sopenharmony_ci 4548fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, WrongN) { 4549fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 4550fd4e5da5Sopenharmony_ci 4551fd4e5da5Sopenharmony_ci std::ostringstream ss; 4552fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n"; 4553fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 4554fd4e5da5Sopenharmony_ci << " %u32_1 %ptr 3\n"; 4555fd4e5da5Sopenharmony_ci 4556fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4557fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4558fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4559fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 4560fd4e5da5Sopenharmony_ci ": expected literal N to be equal to the number of " 4561fd4e5da5Sopenharmony_ci "components of Result Type")); 4562fd4e5da5Sopenharmony_ci} 4563fd4e5da5Sopenharmony_ci 4564fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllVLoadHalfLike, ValidateOpenCLStdVLoadHalfLike, 4565fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 4566fd4e5da5Sopenharmony_ci "vload_halfn", 4567fd4e5da5Sopenharmony_ci "vloada_halfn", 4568fd4e5da5Sopenharmony_ci })); 4569fd4e5da5Sopenharmony_ci 4570fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessFloatPhysical32) { 4571fd4e5da5Sopenharmony_ci std::ostringstream ss; 4572fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4573fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4574fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 2\n"; 4575fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec3 %extinst vloadn %u32_1 %ptr 3\n"; 4576fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32vec4 %extinst vloadn %u32_1 %ptr 4\n"; 4577fd4e5da5Sopenharmony_ci 4578fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4579fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4580fd4e5da5Sopenharmony_ci} 4581fd4e5da5Sopenharmony_ci 4582fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessIntPhysical32) { 4583fd4e5da5Sopenharmony_ci std::ostringstream ss; 4584fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant " 4585fd4e5da5Sopenharmony_ci "%u32vec8_uniform_constant %u32_1\n"; 4586fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n"; 4587fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32vec3 %extinst vloadn %u32_1 %ptr 3\n"; 4588fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32vec4 %extinst vloadn %u32_1 %ptr 4\n"; 4589fd4e5da5Sopenharmony_ci 4590fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4591fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4592fd4e5da5Sopenharmony_ci} 4593fd4e5da5Sopenharmony_ci 4594fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessFloatPhysical64) { 4595fd4e5da5Sopenharmony_ci std::ostringstream ss; 4596fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4597fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4598fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u64_1 %ptr 2\n"; 4599fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec3 %extinst vloadn %u64_1 %ptr 3\n"; 4600fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %f32vec4 %extinst vloadn %u64_1 %ptr 4\n"; 4601fd4e5da5Sopenharmony_ci 4602fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4603fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4604fd4e5da5Sopenharmony_ci} 4605fd4e5da5Sopenharmony_ci 4606fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessIntPhysical64) { 4607fd4e5da5Sopenharmony_ci std::ostringstream ss; 4608fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant " 4609fd4e5da5Sopenharmony_ci "%u32vec8_uniform_constant %u32_1\n"; 4610fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u64_1 %ptr 2\n"; 4611fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32vec3 %extinst vloadn %u64_1 %ptr 3\n"; 4612fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u32vec4 %extinst vloadn %u64_1 %ptr 4\n"; 4613fd4e5da5Sopenharmony_ci 4614fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4615fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4616fd4e5da5Sopenharmony_ci} 4617fd4e5da5Sopenharmony_ci 4618fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongResultType) { 4619fd4e5da5Sopenharmony_ci std::ostringstream ss; 4620fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4621fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4622fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vloadn %u32_1 %ptr 2\n"; 4623fd4e5da5Sopenharmony_ci 4624fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4625fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4626fd4e5da5Sopenharmony_ci EXPECT_THAT( 4627fd4e5da5Sopenharmony_ci getDiagnosticString(), 4628fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vloadn: " 4629fd4e5da5Sopenharmony_ci "expected Result Type to be an int or float vector type")); 4630fd4e5da5Sopenharmony_ci} 4631fd4e5da5Sopenharmony_ci 4632fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNAddressingModelLogical) { 4633fd4e5da5Sopenharmony_ci std::ostringstream ss; 4634fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4635fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4636fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 2\n"; 4637fd4e5da5Sopenharmony_ci 4638fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical")); 4639fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4640fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4641fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vloadn can only be used with physical " 4642fd4e5da5Sopenharmony_ci "addressing models")); 4643fd4e5da5Sopenharmony_ci} 4644fd4e5da5Sopenharmony_ci 4645fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNOffsetNotSizeT) { 4646fd4e5da5Sopenharmony_ci std::ostringstream ss; 4647fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4648fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4649fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u64_1 %ptr 2\n"; 4650fd4e5da5Sopenharmony_ci 4651fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4652fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4653fd4e5da5Sopenharmony_ci EXPECT_THAT( 4654fd4e5da5Sopenharmony_ci getDiagnosticString(), 4655fd4e5da5Sopenharmony_ci HasSubstr( 4656fd4e5da5Sopenharmony_ci "OpenCL.std vloadn: expected operand Offset to be of type size_t " 4657fd4e5da5Sopenharmony_ci "(32-bit integer for the addressing model used in the module)")); 4658fd4e5da5Sopenharmony_ci} 4659fd4e5da5Sopenharmony_ci 4660fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNPNotPointer) { 4661fd4e5da5Sopenharmony_ci std::ostringstream ss; 4662fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 " 4663fd4e5da5Sopenharmony_ci "%f32_ptr_uniform_constant 2\n"; 4664fd4e5da5Sopenharmony_ci 4665fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4666fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 4667fd4e5da5Sopenharmony_ci EXPECT_THAT( 4668fd4e5da5Sopenharmony_ci getDiagnosticString(), 4669fd4e5da5Sopenharmony_ci HasSubstr("Operand '120[%_ptr_UniformConstant_float]' cannot be a " 4670fd4e5da5Sopenharmony_ci "type")); 4671fd4e5da5Sopenharmony_ci} 4672fd4e5da5Sopenharmony_ci 4673fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongStorageClass) { 4674fd4e5da5Sopenharmony_ci std::ostringstream ss; 4675fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_input %u32vec8_input %u32_1\n"; 4676fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n"; 4677fd4e5da5Sopenharmony_ci 4678fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4679fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4680fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4681fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vloadn: expected operand P storage class " 4682fd4e5da5Sopenharmony_ci "to be UniformConstant, Generic, CrossWorkgroup, " 4683fd4e5da5Sopenharmony_ci "Workgroup or Function")); 4684fd4e5da5Sopenharmony_ci} 4685fd4e5da5Sopenharmony_ci 4686fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongComponentType) { 4687fd4e5da5Sopenharmony_ci std::ostringstream ss; 4688fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4689fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4690fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n"; 4691fd4e5da5Sopenharmony_ci 4692fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4693fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4694fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4695fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vloadn: expected operand P data type to be " 4696fd4e5da5Sopenharmony_ci "equal to component type of Result Type")); 4697fd4e5da5Sopenharmony_ci} 4698fd4e5da5Sopenharmony_ci 4699fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongN) { 4700fd4e5da5Sopenharmony_ci std::ostringstream ss; 4701fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4702fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4703fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 3\n"; 4704fd4e5da5Sopenharmony_ci 4705fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4706fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4707fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4708fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vloadn: expected literal N to be equal to " 4709fd4e5da5Sopenharmony_ci "the number of components of Result Type")); 4710fd4e5da5Sopenharmony_ci} 4711fd4e5da5Sopenharmony_ci 4712fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfSuccessPhysical32) { 4713fd4e5da5Sopenharmony_ci std::ostringstream ss; 4714fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4715fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4716fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n"; 4717fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f64 %extinst vload_half %u32_1 %ptr\n"; 4718fd4e5da5Sopenharmony_ci 4719fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4720fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4721fd4e5da5Sopenharmony_ci} 4722fd4e5da5Sopenharmony_ci 4723fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfSuccessPhysical64) { 4724fd4e5da5Sopenharmony_ci std::ostringstream ss; 4725fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4726fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4727fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u64_1 %ptr\n"; 4728fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f64 %extinst vload_half %u64_1 %ptr\n"; 4729fd4e5da5Sopenharmony_ci 4730fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4731fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4732fd4e5da5Sopenharmony_ci} 4733fd4e5da5Sopenharmony_ci 4734fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfWrongResultType) { 4735fd4e5da5Sopenharmony_ci std::ostringstream ss; 4736fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4737fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4738fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst vload_half %u32_1 %ptr\n"; 4739fd4e5da5Sopenharmony_ci 4740fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4741fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4742fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4743fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vload_half: " 4744fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar type")); 4745fd4e5da5Sopenharmony_ci} 4746fd4e5da5Sopenharmony_ci 4747fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfAddressingModelLogical) { 4748fd4e5da5Sopenharmony_ci std::ostringstream ss; 4749fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4750fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4751fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n"; 4752fd4e5da5Sopenharmony_ci 4753fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical")); 4754fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4755fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4756fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vload_half can only be used with physical " 4757fd4e5da5Sopenharmony_ci "addressing models")); 4758fd4e5da5Sopenharmony_ci} 4759fd4e5da5Sopenharmony_ci 4760fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfOffsetNotSizeT) { 4761fd4e5da5Sopenharmony_ci std::ostringstream ss; 4762fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant " 4763fd4e5da5Sopenharmony_ci "%f16vec8_uniform_constant %u32_1\n"; 4764fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u64_1 %ptr\n"; 4765fd4e5da5Sopenharmony_ci 4766fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4767fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4768fd4e5da5Sopenharmony_ci EXPECT_THAT( 4769fd4e5da5Sopenharmony_ci getDiagnosticString(), 4770fd4e5da5Sopenharmony_ci HasSubstr( 4771fd4e5da5Sopenharmony_ci "OpenCL.std vload_half: expected operand Offset to be of type size_t " 4772fd4e5da5Sopenharmony_ci "(32-bit integer for the addressing model used in the module)")); 4773fd4e5da5Sopenharmony_ci} 4774fd4e5da5Sopenharmony_ci 4775fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPNotPointer) { 4776fd4e5da5Sopenharmony_ci std::ostringstream ss; 4777fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 " 4778fd4e5da5Sopenharmony_ci "%f16_ptr_uniform_constant\n"; 4779fd4e5da5Sopenharmony_ci 4780fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4781fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 4782fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4783fd4e5da5Sopenharmony_ci HasSubstr("Operand '114[%_ptr_UniformConstant_half]' cannot be a " 4784fd4e5da5Sopenharmony_ci "type")); 4785fd4e5da5Sopenharmony_ci} 4786fd4e5da5Sopenharmony_ci 4787fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfWrongStorageClass) { 4788fd4e5da5Sopenharmony_ci std::ostringstream ss; 4789fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f16_ptr_input %f16vec8_input %u32_1\n"; 4790fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n"; 4791fd4e5da5Sopenharmony_ci 4792fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4793fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4794fd4e5da5Sopenharmony_ci EXPECT_THAT( 4795fd4e5da5Sopenharmony_ci getDiagnosticString(), 4796fd4e5da5Sopenharmony_ci HasSubstr( 4797fd4e5da5Sopenharmony_ci "OpenCL.std vload_half: expected operand P storage class to be " 4798fd4e5da5Sopenharmony_ci "UniformConstant, Generic, CrossWorkgroup, Workgroup or Function")); 4799fd4e5da5Sopenharmony_ci} 4800fd4e5da5Sopenharmony_ci 4801fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPDataTypeInt) { 4802fd4e5da5Sopenharmony_ci std::ostringstream ss; 4803fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant " 4804fd4e5da5Sopenharmony_ci "%u32vec8_uniform_constant %u32_1\n"; 4805fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n"; 4806fd4e5da5Sopenharmony_ci 4807fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4808fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4809fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4810fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vload_half: expected operand P data type " 4811fd4e5da5Sopenharmony_ci "to be 16-bit float scalar")); 4812fd4e5da5Sopenharmony_ci} 4813fd4e5da5Sopenharmony_ci 4814fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPDataTypeFloat32) { 4815fd4e5da5Sopenharmony_ci std::ostringstream ss; 4816fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 4817fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4818fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n"; 4819fd4e5da5Sopenharmony_ci 4820fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4821fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4822fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4823fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vload_half: expected operand P data type " 4824fd4e5da5Sopenharmony_ci "to be 16-bit float scalar")); 4825fd4e5da5Sopenharmony_ci} 4826fd4e5da5Sopenharmony_ci 4827fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessFloatPhysical32) { 4828fd4e5da5Sopenharmony_ci std::ostringstream ss; 4829fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4830fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4831fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n"; 4832fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst vstoren %f32vec4_0123 %u32_1 " 4833fd4e5da5Sopenharmony_ci "%ptr_g\n"; 4834fd4e5da5Sopenharmony_ci 4835fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4836fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4837fd4e5da5Sopenharmony_ci} 4838fd4e5da5Sopenharmony_ci 4839fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessFloatPhysical64) { 4840fd4e5da5Sopenharmony_ci std::ostringstream ss; 4841fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4842fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4843fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u64_1 %ptr_g\n"; 4844fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst vstoren %f32vec4_0123 %u64_1 " 4845fd4e5da5Sopenharmony_ci "%ptr_g\n"; 4846fd4e5da5Sopenharmony_ci 4847fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4848fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4849fd4e5da5Sopenharmony_ci} 4850fd4e5da5Sopenharmony_ci 4851fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessIntPhysical32) { 4852fd4e5da5Sopenharmony_ci std::ostringstream ss; 4853fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n"; 4854fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %u32_ptr_generic %ptr_w\n"; 4855fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u32_1 %ptr_g\n"; 4856fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst vstoren %u32vec4_0123 %u32_1 " 4857fd4e5da5Sopenharmony_ci "%ptr_g\n"; 4858fd4e5da5Sopenharmony_ci 4859fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4860fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4861fd4e5da5Sopenharmony_ci} 4862fd4e5da5Sopenharmony_ci 4863fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessIntPhysical64) { 4864fd4e5da5Sopenharmony_ci std::ostringstream ss; 4865fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n"; 4866fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %u32_ptr_generic %ptr_w\n"; 4867fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u64_1 %ptr_g\n"; 4868fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %void %extinst vstoren %u32vec4_0123 %u64_1 " 4869fd4e5da5Sopenharmony_ci "%ptr_g\n"; 4870fd4e5da5Sopenharmony_ci 4871fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4872fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4873fd4e5da5Sopenharmony_ci} 4874fd4e5da5Sopenharmony_ci 4875fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNResultTypeNotVoid) { 4876fd4e5da5Sopenharmony_ci std::ostringstream ss; 4877fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4878fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4879fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n"; 4880fd4e5da5Sopenharmony_ci 4881fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4882fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4883fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4884fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vstoren: expected Result Type to be void")); 4885fd4e5da5Sopenharmony_ci} 4886fd4e5da5Sopenharmony_ci 4887fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNDataWrongType) { 4888fd4e5da5Sopenharmony_ci std::ostringstream ss; 4889fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4890fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4891fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32_1 %u32_1 %ptr_g\n"; 4892fd4e5da5Sopenharmony_ci 4893fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4894fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4895fd4e5da5Sopenharmony_ci EXPECT_THAT( 4896fd4e5da5Sopenharmony_ci getDiagnosticString(), 4897fd4e5da5Sopenharmony_ci HasSubstr( 4898fd4e5da5Sopenharmony_ci "OpenCL.std vstoren: expected Data to be an int or float vector")); 4899fd4e5da5Sopenharmony_ci} 4900fd4e5da5Sopenharmony_ci 4901fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNAddressingModelLogical) { 4902fd4e5da5Sopenharmony_ci std::ostringstream ss; 4903fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4904fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4905fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n"; 4906fd4e5da5Sopenharmony_ci 4907fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical")); 4908fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4909fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4910fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vstoren can only be used with physical " 4911fd4e5da5Sopenharmony_ci "addressing models")); 4912fd4e5da5Sopenharmony_ci} 4913fd4e5da5Sopenharmony_ci 4914fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNOffsetNotSizeT) { 4915fd4e5da5Sopenharmony_ci std::ostringstream ss; 4916fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4917fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4918fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n"; 4919fd4e5da5Sopenharmony_ci 4920fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64")); 4921fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4922fd4e5da5Sopenharmony_ci EXPECT_THAT( 4923fd4e5da5Sopenharmony_ci getDiagnosticString(), 4924fd4e5da5Sopenharmony_ci HasSubstr( 4925fd4e5da5Sopenharmony_ci "OpenCL.std vstoren: expected operand Offset to be of type size_t " 4926fd4e5da5Sopenharmony_ci "(64-bit integer for the addressing model used in the module)")); 4927fd4e5da5Sopenharmony_ci} 4928fd4e5da5Sopenharmony_ci 4929fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNPNotPointer) { 4930fd4e5da5Sopenharmony_ci std::ostringstream ss; 4931fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 " 4932fd4e5da5Sopenharmony_ci "%f32_ptr_generic\n"; 4933fd4e5da5Sopenharmony_ci 4934fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4935fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 4936fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4937fd4e5da5Sopenharmony_ci HasSubstr("Operand '127[%_ptr_Generic_float]' cannot be a type")); 4938fd4e5da5Sopenharmony_ci} 4939fd4e5da5Sopenharmony_ci 4940fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNWrongStorageClass) { 4941fd4e5da5Sopenharmony_ci std::ostringstream ss; 4942fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_uniform_constant " 4943fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 4944fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_w\n"; 4945fd4e5da5Sopenharmony_ci 4946fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4947fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4948fd4e5da5Sopenharmony_ci EXPECT_THAT( 4949fd4e5da5Sopenharmony_ci getDiagnosticString(), 4950fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vstoren: expected operand P storage class " 4951fd4e5da5Sopenharmony_ci "to be Generic, CrossWorkgroup, Workgroup or Function")); 4952fd4e5da5Sopenharmony_ci} 4953fd4e5da5Sopenharmony_ci 4954fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStorePWrongDataType) { 4955fd4e5da5Sopenharmony_ci std::ostringstream ss; 4956fd4e5da5Sopenharmony_ci ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n"; 4957fd4e5da5Sopenharmony_ci ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n"; 4958fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u32_1 %ptr_g\n"; 4959fd4e5da5Sopenharmony_ci 4960fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 4961fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4962fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 4963fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std vstoren: expected operand P data type to " 4964fd4e5da5Sopenharmony_ci "be equal to the type of operand Data components")); 4965fd4e5da5Sopenharmony_ci} 4966fd4e5da5Sopenharmony_ci 4967fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleSuccess) { 4968fd4e5da5Sopenharmony_ci const std::string body = R"( 4969fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec4_0123 %u32vec2_01 4970fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst shuffle %f32vec4_0123 %u32vec4_0123 4971fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32vec2 %extinst shuffle %u32vec4_0123 %u32vec2_01 4972fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst shuffle %u32vec4_0123 %u32vec4_0123 4973fd4e5da5Sopenharmony_ci)"; 4974fd4e5da5Sopenharmony_ci 4975fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4976fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 4977fd4e5da5Sopenharmony_ci} 4978fd4e5da5Sopenharmony_ci 4979fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleWrongResultType) { 4980fd4e5da5Sopenharmony_ci const std::string body = R"( 4981fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst shuffle %f32vec4_0123 %u32vec2_01 4982fd4e5da5Sopenharmony_ci)"; 4983fd4e5da5Sopenharmony_ci 4984fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4985fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4986fd4e5da5Sopenharmony_ci EXPECT_THAT( 4987fd4e5da5Sopenharmony_ci getDiagnosticString(), 4988fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 4989fd4e5da5Sopenharmony_ci "expected Result Type to be an int or float vector type")); 4990fd4e5da5Sopenharmony_ci} 4991fd4e5da5Sopenharmony_ci 4992fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleResultTypeInvalidNumComponents) { 4993fd4e5da5Sopenharmony_ci const std::string body = R"( 4994fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst shuffle %f32vec4_0123 %u32vec3_012 4995fd4e5da5Sopenharmony_ci)"; 4996fd4e5da5Sopenharmony_ci 4997fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 4998fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 4999fd4e5da5Sopenharmony_ci EXPECT_THAT( 5000fd4e5da5Sopenharmony_ci getDiagnosticString(), 5001fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5002fd4e5da5Sopenharmony_ci "expected Result Type to have 2, 4, 8 or 16 components")); 5003fd4e5da5Sopenharmony_ci} 5004fd4e5da5Sopenharmony_ci 5005fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXWrongType) { 5006fd4e5da5Sopenharmony_ci const std::string body = R"( 5007fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32_0 %u32vec2_01 5008fd4e5da5Sopenharmony_ci)"; 5009fd4e5da5Sopenharmony_ci 5010fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5011fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5012fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5013fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5014fd4e5da5Sopenharmony_ci "expected operand X to be an int or float vector")); 5015fd4e5da5Sopenharmony_ci} 5016fd4e5da5Sopenharmony_ci 5017fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXInvalidNumComponents) { 5018fd4e5da5Sopenharmony_ci const std::string body = R"( 5019fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec3_012 %u32vec2_01 5020fd4e5da5Sopenharmony_ci)"; 5021fd4e5da5Sopenharmony_ci 5022fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5023fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5024fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5025fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5026fd4e5da5Sopenharmony_ci "expected operand X to have 2, 4, 8 or 16 components")); 5027fd4e5da5Sopenharmony_ci} 5028fd4e5da5Sopenharmony_ci 5029fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXInvalidComponentType) { 5030fd4e5da5Sopenharmony_ci const std::string body = R"( 5031fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f64vec4_0123 %u32vec2_01 5032fd4e5da5Sopenharmony_ci)"; 5033fd4e5da5Sopenharmony_ci 5034fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5035fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5036fd4e5da5Sopenharmony_ci EXPECT_THAT( 5037fd4e5da5Sopenharmony_ci getDiagnosticString(), 5038fd4e5da5Sopenharmony_ci HasSubstr( 5039fd4e5da5Sopenharmony_ci "OpenCL.std shuffle: " 5040fd4e5da5Sopenharmony_ci "expected operand X and Result Type to have equal component types")); 5041fd4e5da5Sopenharmony_ci} 5042fd4e5da5Sopenharmony_ci 5043fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskNotIntVector) { 5044fd4e5da5Sopenharmony_ci const std::string body = R"( 5045fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec4_0123 %f32vec2_01 5046fd4e5da5Sopenharmony_ci)"; 5047fd4e5da5Sopenharmony_ci 5048fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5049fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5050fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5051fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5052fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask to be an int vector")); 5053fd4e5da5Sopenharmony_ci} 5054fd4e5da5Sopenharmony_ci 5055fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskInvalidNumComponents) { 5056fd4e5da5Sopenharmony_ci const std::string body = R"( 5057fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec4 %extinst shuffle %f32vec4_0123 %u32vec2_01 5058fd4e5da5Sopenharmony_ci)"; 5059fd4e5da5Sopenharmony_ci 5060fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5061fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5062fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5063fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5064fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask to have the same number " 5065fd4e5da5Sopenharmony_ci "of components as Result Type")); 5066fd4e5da5Sopenharmony_ci} 5067fd4e5da5Sopenharmony_ci 5068fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskInvalidBitWidth) { 5069fd4e5da5Sopenharmony_ci const std::string body = R"( 5070fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64vec2 %extinst shuffle %f64vec4_0123 %u32vec2_01 5071fd4e5da5Sopenharmony_ci)"; 5072fd4e5da5Sopenharmony_ci 5073fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5074fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5075fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5076fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle: " 5077fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask components to have the " 5078fd4e5da5Sopenharmony_ci "same bit width as Result Type components")); 5079fd4e5da5Sopenharmony_ci} 5080fd4e5da5Sopenharmony_ci 5081fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2Success) { 5082fd4e5da5Sopenharmony_ci const std::string body = R"( 5083fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01 5084fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec4_0123 5085fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32vec2 %extinst shuffle2 %u32vec4_0123 %u32vec4_0123 %u32vec2_01 5086fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst shuffle2 %u32vec4_0123 %u32vec4_0123 %u32vec4_0123 5087fd4e5da5Sopenharmony_ci)"; 5088fd4e5da5Sopenharmony_ci 5089fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5090fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5091fd4e5da5Sopenharmony_ci} 5092fd4e5da5Sopenharmony_ci 5093fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2WrongResultType) { 5094fd4e5da5Sopenharmony_ci const std::string body = R"( 5095fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01 5096fd4e5da5Sopenharmony_ci)"; 5097fd4e5da5Sopenharmony_ci 5098fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5099fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5100fd4e5da5Sopenharmony_ci EXPECT_THAT( 5101fd4e5da5Sopenharmony_ci getDiagnosticString(), 5102fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5103fd4e5da5Sopenharmony_ci "expected Result Type to be an int or float vector type")); 5104fd4e5da5Sopenharmony_ci} 5105fd4e5da5Sopenharmony_ci 5106fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ResultTypeInvalidNumComponents) { 5107fd4e5da5Sopenharmony_ci const std::string body = R"( 5108fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec3_012 5109fd4e5da5Sopenharmony_ci)"; 5110fd4e5da5Sopenharmony_ci 5111fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5112fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5113fd4e5da5Sopenharmony_ci EXPECT_THAT( 5114fd4e5da5Sopenharmony_ci getDiagnosticString(), 5115fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5116fd4e5da5Sopenharmony_ci "expected Result Type to have 2, 4, 8 or 16 components")); 5117fd4e5da5Sopenharmony_ci} 5118fd4e5da5Sopenharmony_ci 5119fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XWrongType) { 5120fd4e5da5Sopenharmony_ci const std::string body = R"( 5121fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32_0 %f32_0 %u32vec2_01 5122fd4e5da5Sopenharmony_ci)"; 5123fd4e5da5Sopenharmony_ci 5124fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5125fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5126fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5127fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5128fd4e5da5Sopenharmony_ci "expected operand X to be an int or float vector")); 5129fd4e5da5Sopenharmony_ci} 5130fd4e5da5Sopenharmony_ci 5131fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2YTypeDifferentFromX) { 5132fd4e5da5Sopenharmony_ci const std::string body = R"( 5133fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec2_01 %f32vec4_0123 %u32vec2_01 5134fd4e5da5Sopenharmony_ci)"; 5135fd4e5da5Sopenharmony_ci 5136fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5137fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5138fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5139fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5140fd4e5da5Sopenharmony_ci "expected operands X and Y to be of the same type")); 5141fd4e5da5Sopenharmony_ci} 5142fd4e5da5Sopenharmony_ci 5143fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XInvalidNumComponents) { 5144fd4e5da5Sopenharmony_ci const std::string body = R"( 5145fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec3_012 %f32vec3_012 %u32vec2_01 5146fd4e5da5Sopenharmony_ci)"; 5147fd4e5da5Sopenharmony_ci 5148fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5149fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5150fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5151fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5152fd4e5da5Sopenharmony_ci "expected operand X to have 2, 4, 8 or 16 components")); 5153fd4e5da5Sopenharmony_ci} 5154fd4e5da5Sopenharmony_ci 5155fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XInvalidComponentType) { 5156fd4e5da5Sopenharmony_ci const std::string body = R"( 5157fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f64vec4_0123 %f64vec4_0123 %u32vec2_01 5158fd4e5da5Sopenharmony_ci)"; 5159fd4e5da5Sopenharmony_ci 5160fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5161fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5162fd4e5da5Sopenharmony_ci EXPECT_THAT( 5163fd4e5da5Sopenharmony_ci getDiagnosticString(), 5164fd4e5da5Sopenharmony_ci HasSubstr( 5165fd4e5da5Sopenharmony_ci "OpenCL.std shuffle2: " 5166fd4e5da5Sopenharmony_ci "expected operand X and Result Type to have equal component types")); 5167fd4e5da5Sopenharmony_ci} 5168fd4e5da5Sopenharmony_ci 5169fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskNotIntVector) { 5170fd4e5da5Sopenharmony_ci const std::string body = R"( 5171fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %f32vec2_01 5172fd4e5da5Sopenharmony_ci)"; 5173fd4e5da5Sopenharmony_ci 5174fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5175fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5176fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5177fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5178fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask to be an int vector")); 5179fd4e5da5Sopenharmony_ci} 5180fd4e5da5Sopenharmony_ci 5181fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskInvalidNumComponents) { 5182fd4e5da5Sopenharmony_ci const std::string body = R"( 5183fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec4 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01 5184fd4e5da5Sopenharmony_ci)"; 5185fd4e5da5Sopenharmony_ci 5186fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5187fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5188fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5189fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5190fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask to have the same number " 5191fd4e5da5Sopenharmony_ci "of components as Result Type")); 5192fd4e5da5Sopenharmony_ci} 5193fd4e5da5Sopenharmony_ci 5194fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskInvalidBitWidth) { 5195fd4e5da5Sopenharmony_ci const std::string body = R"( 5196fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64vec2 %extinst shuffle2 %f64vec4_0123 %f64vec4_0123 %u32vec2_01 5197fd4e5da5Sopenharmony_ci)"; 5198fd4e5da5Sopenharmony_ci 5199fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5200fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5201fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5202fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std shuffle2: " 5203fd4e5da5Sopenharmony_ci "expected operand Shuffle Mask components to have the " 5204fd4e5da5Sopenharmony_ci "same bit width as Result Type components")); 5205fd4e5da5Sopenharmony_ci} 5206fd4e5da5Sopenharmony_ci 5207fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfSuccess) { 5208fd4e5da5Sopenharmony_ci const std::string body = R"( 5209fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0 5210fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1 5211fd4e5da5Sopenharmony_ci)"; 5212fd4e5da5Sopenharmony_ci 5213fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5214fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5215fd4e5da5Sopenharmony_ci} 5216fd4e5da5Sopenharmony_ci 5217fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfBoolResultType) { 5218fd4e5da5Sopenharmony_ci const std::string body = R"( 5219fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0 5220fd4e5da5Sopenharmony_ci%val1 = OpExtInst %bool %extinst printf %format %u32_0 %u32_1 5221fd4e5da5Sopenharmony_ci)"; 5222fd4e5da5Sopenharmony_ci 5223fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5224fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5225fd4e5da5Sopenharmony_ci EXPECT_THAT( 5226fd4e5da5Sopenharmony_ci getDiagnosticString(), 5227fd4e5da5Sopenharmony_ci HasSubstr( 5228fd4e5da5Sopenharmony_ci "OpenCL.std printf: expected Result Type to be a 32-bit int type")); 5229fd4e5da5Sopenharmony_ci} 5230fd4e5da5Sopenharmony_ci 5231fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfU64ResultType) { 5232fd4e5da5Sopenharmony_ci const std::string body = R"( 5233fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0 5234fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst printf %format %u32_0 %u32_1 5235fd4e5da5Sopenharmony_ci)"; 5236fd4e5da5Sopenharmony_ci 5237fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5238fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5239fd4e5da5Sopenharmony_ci EXPECT_THAT( 5240fd4e5da5Sopenharmony_ci getDiagnosticString(), 5241fd4e5da5Sopenharmony_ci HasSubstr( 5242fd4e5da5Sopenharmony_ci "OpenCL.std printf: expected Result Type to be a 32-bit int type")); 5243fd4e5da5Sopenharmony_ci} 5244fd4e5da5Sopenharmony_ci 5245fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotPointer) { 5246fd4e5da5Sopenharmony_ci const std::string body = R"( 5247fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %u8_ptr_uniform_constant %u32_0 %u32_1 5248fd4e5da5Sopenharmony_ci)"; 5249fd4e5da5Sopenharmony_ci 5250fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5251fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 5252fd4e5da5Sopenharmony_ci EXPECT_THAT( 5253fd4e5da5Sopenharmony_ci getDiagnosticString(), 5254fd4e5da5Sopenharmony_ci HasSubstr("Operand '137[%_ptr_UniformConstant_uchar]' cannot be a " 5255fd4e5da5Sopenharmony_ci "type")); 5256fd4e5da5Sopenharmony_ci} 5257fd4e5da5Sopenharmony_ci 5258fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotUniformConstStorageClass) { 5259fd4e5da5Sopenharmony_ci const std::string body = R"( 5260fd4e5da5Sopenharmony_ci%format_const = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0 5261fd4e5da5Sopenharmony_ci%format = OpBitcast %u8_ptr_generic %format_const 5262fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1 5263fd4e5da5Sopenharmony_ci)"; 5264fd4e5da5Sopenharmony_ci 5265fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5266fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5267fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5268fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std printf: expected Format storage class to " 5269fd4e5da5Sopenharmony_ci "be UniformConstant")); 5270fd4e5da5Sopenharmony_ci} 5271fd4e5da5Sopenharmony_ci 5272fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotU8Pointer) { 5273fd4e5da5Sopenharmony_ci const std::string body = R"( 5274fd4e5da5Sopenharmony_ci%format = OpAccessChain %u32_ptr_uniform_constant %u32vec8_uniform_constant %u32_0 5275fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1 5276fd4e5da5Sopenharmony_ci)"; 5277fd4e5da5Sopenharmony_ci 5278fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5279fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5280fd4e5da5Sopenharmony_ci EXPECT_THAT( 5281fd4e5da5Sopenharmony_ci getDiagnosticString(), 5282fd4e5da5Sopenharmony_ci HasSubstr( 5283fd4e5da5Sopenharmony_ci "OpenCL.std printf: expected Format data type to be 8-bit int")); 5284fd4e5da5Sopenharmony_ci} 5285fd4e5da5Sopenharmony_ci 5286fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchU32Success) { 5287fd4e5da5Sopenharmony_ci const std::string body = R"( 5288fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0 5289fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5290fd4e5da5Sopenharmony_ci)"; 5291fd4e5da5Sopenharmony_ci 5292fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5293fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5294fd4e5da5Sopenharmony_ci} 5295fd4e5da5Sopenharmony_ci 5296fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchU32Physical64Success) { 5297fd4e5da5Sopenharmony_ci const std::string body = R"( 5298fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0 5299fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u64_256 5300fd4e5da5Sopenharmony_ci)"; 5301fd4e5da5Sopenharmony_ci 5302fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body, "", "Physical64")); 5303fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5304fd4e5da5Sopenharmony_ci} 5305fd4e5da5Sopenharmony_ci 5306fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchF32Success) { 5307fd4e5da5Sopenharmony_ci const std::string body = R"( 5308fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_cross_workgroup %f32arr_cross_workgroup %u32_0 5309fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5310fd4e5da5Sopenharmony_ci)"; 5311fd4e5da5Sopenharmony_ci 5312fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5313fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5314fd4e5da5Sopenharmony_ci} 5315fd4e5da5Sopenharmony_ci 5316fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchF32Vec2Success) { 5317fd4e5da5Sopenharmony_ci const std::string body = R"( 5318fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32vec2_ptr_cross_workgroup %f32vec2arr_cross_workgroup %u32_0 5319fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5320fd4e5da5Sopenharmony_ci)"; 5321fd4e5da5Sopenharmony_ci 5322fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5323fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5324fd4e5da5Sopenharmony_ci} 5325fd4e5da5Sopenharmony_ci 5326fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchResultTypeNotVoid) { 5327fd4e5da5Sopenharmony_ci const std::string body = R"( 5328fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0 5329fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst prefetch %ptr %u32_256 5330fd4e5da5Sopenharmony_ci)"; 5331fd4e5da5Sopenharmony_ci 5332fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5333fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5334fd4e5da5Sopenharmony_ci EXPECT_THAT( 5335fd4e5da5Sopenharmony_ci getDiagnosticString(), 5336fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std prefetch: expected Result Type to be void")); 5337fd4e5da5Sopenharmony_ci} 5338fd4e5da5Sopenharmony_ci 5339fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotPointer) { 5340fd4e5da5Sopenharmony_ci const std::string body = R"( 5341fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %u32_ptr_cross_workgroup %u32_256 5342fd4e5da5Sopenharmony_ci)"; 5343fd4e5da5Sopenharmony_ci 5344fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5345fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 5346fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5347fd4e5da5Sopenharmony_ci HasSubstr("Operand '99[%_ptr_CrossWorkgroup_uint]' cannot be a " 5348fd4e5da5Sopenharmony_ci "type")); 5349fd4e5da5Sopenharmony_ci} 5350fd4e5da5Sopenharmony_ci 5351fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotCrossWorkgroup) { 5352fd4e5da5Sopenharmony_ci const std::string body = R"( 5353fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0 5354fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5355fd4e5da5Sopenharmony_ci)"; 5356fd4e5da5Sopenharmony_ci 5357fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5358fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5359fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5360fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std prefetch: expected operand Ptr storage " 5361fd4e5da5Sopenharmony_ci "class to be CrossWorkgroup")); 5362fd4e5da5Sopenharmony_ci} 5363fd4e5da5Sopenharmony_ci 5364fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchInvalidDataType) { 5365fd4e5da5Sopenharmony_ci const std::string body = R"( 5366fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %struct_ptr_cross_workgroup %struct_arr_cross_workgroup %u32_0 5367fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5368fd4e5da5Sopenharmony_ci)"; 5369fd4e5da5Sopenharmony_ci 5370fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5371fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5372fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5373fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std prefetch: expected Ptr data type to be int " 5374fd4e5da5Sopenharmony_ci "or float scalar or vector")); 5375fd4e5da5Sopenharmony_ci} 5376fd4e5da5Sopenharmony_ci 5377fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchAddressingModelLogical) { 5378fd4e5da5Sopenharmony_ci const std::string body = R"( 5379fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0 5380fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5381fd4e5da5Sopenharmony_ci)"; 5382fd4e5da5Sopenharmony_ci 5383fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body, "", "Logical")); 5384fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5385fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5386fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std prefetch can only be used with physical " 5387fd4e5da5Sopenharmony_ci "addressing models")); 5388fd4e5da5Sopenharmony_ci} 5389fd4e5da5Sopenharmony_ci 5390fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchNumElementsNotSizeT) { 5391fd4e5da5Sopenharmony_ci const std::string body = R"( 5392fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_cross_workgroup %f32arr_cross_workgroup %u32_0 5393fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256 5394fd4e5da5Sopenharmony_ci)"; 5395fd4e5da5Sopenharmony_ci 5396fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body, "", "Physical64")); 5397fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5398fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5399fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std prefetch: expected operand Num Elements to " 5400fd4e5da5Sopenharmony_ci "be of type size_t (64-bit integer for the addressing " 5401fd4e5da5Sopenharmony_ci "model used in the module)")); 5402fd4e5da5Sopenharmony_ci} 5403fd4e5da5Sopenharmony_ci 5404fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, Success) { 5405fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5406fd4e5da5Sopenharmony_ci std::ostringstream ss; 5407fd4e5da5Sopenharmony_ci ss << "%var_f32 = OpVariable %f32_ptr_function Function\n"; 5408fd4e5da5Sopenharmony_ci ss << "%var_f32vec2 = OpVariable %f32vec2_ptr_function Function\n"; 5409fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5410fd4e5da5Sopenharmony_ci << " %f32_0 %var_f32\n"; 5411fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 5412fd4e5da5Sopenharmony_ci << " %f32vec2_01 %var_f32vec2\n"; 5413fd4e5da5Sopenharmony_ci 5414fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5415fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5416fd4e5da5Sopenharmony_ci} 5417fd4e5da5Sopenharmony_ci 5418fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, IntResultType) { 5419fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5420fd4e5da5Sopenharmony_ci std::ostringstream ss; 5421fd4e5da5Sopenharmony_ci ss << "%var_f32 = OpVariable %f32_ptr_function Function\n"; 5422fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 5423fd4e5da5Sopenharmony_ci << " %f32_0 %var_f32\n"; 5424fd4e5da5Sopenharmony_ci 5425fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5426fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5427fd4e5da5Sopenharmony_ci EXPECT_THAT( 5428fd4e5da5Sopenharmony_ci getDiagnosticString(), 5429fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5430fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar or vector type")); 5431fd4e5da5Sopenharmony_ci} 5432fd4e5da5Sopenharmony_ci 5433fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, XWrongType) { 5434fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5435fd4e5da5Sopenharmony_ci std::ostringstream ss; 5436fd4e5da5Sopenharmony_ci ss << "%var_f32 = OpVariable %f32_ptr_function Function\n"; 5437fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5438fd4e5da5Sopenharmony_ci << " %f64_0 %var_f32\n"; 5439fd4e5da5Sopenharmony_ci 5440fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5441fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5442fd4e5da5Sopenharmony_ci EXPECT_THAT( 5443fd4e5da5Sopenharmony_ci getDiagnosticString(), 5444fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5445fd4e5da5Sopenharmony_ci ": expected type of operand X to be equal to Result Type")); 5446fd4e5da5Sopenharmony_ci} 5447fd4e5da5Sopenharmony_ci 5448fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, NotPointer) { 5449fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5450fd4e5da5Sopenharmony_ci std::ostringstream ss; 5451fd4e5da5Sopenharmony_ci ss << "%var_f32 = OpVariable %f32_ptr_function Function\n"; 5452fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5453fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1\n"; 5454fd4e5da5Sopenharmony_ci 5455fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5456fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5457fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5458fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5459fd4e5da5Sopenharmony_ci ": expected the last operand to be a pointer")); 5460fd4e5da5Sopenharmony_ci} 5461fd4e5da5Sopenharmony_ci 5462fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, PointerInvalidStorageClass) { 5463fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5464fd4e5da5Sopenharmony_ci std::ostringstream ss; 5465fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 5466fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 5467fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0 %ptr\n"; 5468fd4e5da5Sopenharmony_ci 5469fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5470fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5471fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5472fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5473fd4e5da5Sopenharmony_ci ": expected storage class of the pointer to be " 5474fd4e5da5Sopenharmony_ci "Generic, CrossWorkgroup, Workgroup or Function")); 5475fd4e5da5Sopenharmony_ci} 5476fd4e5da5Sopenharmony_ci 5477fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, PointerWrongDataType) { 5478fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5479fd4e5da5Sopenharmony_ci std::ostringstream ss; 5480fd4e5da5Sopenharmony_ci ss << "%var_u32 = OpVariable %u32_ptr_function Function\n"; 5481fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5482fd4e5da5Sopenharmony_ci << " %f32_0 %var_u32\n"; 5483fd4e5da5Sopenharmony_ci 5484fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5485fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5486fd4e5da5Sopenharmony_ci EXPECT_THAT( 5487fd4e5da5Sopenharmony_ci getDiagnosticString(), 5488fd4e5da5Sopenharmony_ci HasSubstr( 5489fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 5490fd4e5da5Sopenharmony_ci ": expected data type of the pointer to be equal to Result Type")); 5491fd4e5da5Sopenharmony_ci} 5492fd4e5da5Sopenharmony_ci 5493fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFractLike, ValidateOpenCLStdFractLike, 5494fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 5495fd4e5da5Sopenharmony_ci "fract", 5496fd4e5da5Sopenharmony_ci "modf", 5497fd4e5da5Sopenharmony_ci "sincos", 5498fd4e5da5Sopenharmony_ci })); 5499fd4e5da5Sopenharmony_ci 5500fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoSuccess) { 5501fd4e5da5Sopenharmony_ci const std::string body = R"( 5502fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %u32_ptr_function Function 5503fd4e5da5Sopenharmony_ci%var_u32vec2 = OpVariable %u32vec2_ptr_function Function 5504fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u32 5505fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst remquo %f32vec2_01 %f32vec2_12 %var_u32vec2 5506fd4e5da5Sopenharmony_ci)"; 5507fd4e5da5Sopenharmony_ci 5508fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5509fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5510fd4e5da5Sopenharmony_ci} 5511fd4e5da5Sopenharmony_ci 5512fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoIntResultType) { 5513fd4e5da5Sopenharmony_ci const std::string body = R"( 5514fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %u32_ptr_function Function 5515fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst remquo %f32_3 %f32_2 %var_u32 5516fd4e5da5Sopenharmony_ci)"; 5517fd4e5da5Sopenharmony_ci 5518fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5519fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5520fd4e5da5Sopenharmony_ci EXPECT_THAT( 5521fd4e5da5Sopenharmony_ci getDiagnosticString(), 5522fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5523fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar or vector type")); 5524fd4e5da5Sopenharmony_ci} 5525fd4e5da5Sopenharmony_ci 5526fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoXWrongType) { 5527fd4e5da5Sopenharmony_ci const std::string body = R"( 5528fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %f32_ptr_function Function 5529fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %u32_3 %f32_2 %var_u32 5530fd4e5da5Sopenharmony_ci)"; 5531fd4e5da5Sopenharmony_ci 5532fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5533fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5534fd4e5da5Sopenharmony_ci EXPECT_THAT( 5535fd4e5da5Sopenharmony_ci getDiagnosticString(), 5536fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5537fd4e5da5Sopenharmony_ci "expected type of operand X to be equal to Result Type")); 5538fd4e5da5Sopenharmony_ci} 5539fd4e5da5Sopenharmony_ci 5540fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoYWrongType) { 5541fd4e5da5Sopenharmony_ci const std::string body = R"( 5542fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %f32_ptr_function Function 5543fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %u32_2 %var_u32 5544fd4e5da5Sopenharmony_ci)"; 5545fd4e5da5Sopenharmony_ci 5546fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5547fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5548fd4e5da5Sopenharmony_ci EXPECT_THAT( 5549fd4e5da5Sopenharmony_ci getDiagnosticString(), 5550fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5551fd4e5da5Sopenharmony_ci "expected type of operand Y to be equal to Result Type")); 5552fd4e5da5Sopenharmony_ci} 5553fd4e5da5Sopenharmony_ci 5554fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoNotPointer) { 5555fd4e5da5Sopenharmony_ci const std::string body = R"( 5556fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %f32_1 5557fd4e5da5Sopenharmony_ci)"; 5558fd4e5da5Sopenharmony_ci 5559fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5560fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5561fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5562fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5563fd4e5da5Sopenharmony_ci "expected the last operand to be a pointer")); 5564fd4e5da5Sopenharmony_ci} 5565fd4e5da5Sopenharmony_ci 5566fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongStorageClass) { 5567fd4e5da5Sopenharmony_ci const std::string body = R"( 5568fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_uniform_constant %f32vec8_uniform_constant %u32_1 5569fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %ptr 5570fd4e5da5Sopenharmony_ci)"; 5571fd4e5da5Sopenharmony_ci 5572fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5573fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5574fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5575fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5576fd4e5da5Sopenharmony_ci "expected storage class of the pointer to be Generic, " 5577fd4e5da5Sopenharmony_ci "CrossWorkgroup, Workgroup or Function")); 5578fd4e5da5Sopenharmony_ci} 5579fd4e5da5Sopenharmony_ci 5580fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongDataType) { 5581fd4e5da5Sopenharmony_ci const std::string body = R"( 5582fd4e5da5Sopenharmony_ci%var_f32 = OpVariable %f32_ptr_function Function 5583fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_f32 5584fd4e5da5Sopenharmony_ci)"; 5585fd4e5da5Sopenharmony_ci 5586fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5587fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5588fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5589fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5590fd4e5da5Sopenharmony_ci "expected data type of the pointer to be a 32-bit int " 5591fd4e5da5Sopenharmony_ci "scalar or vector type")); 5592fd4e5da5Sopenharmony_ci} 5593fd4e5da5Sopenharmony_ci 5594fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongDataTypeWidth) { 5595fd4e5da5Sopenharmony_ci const std::string body = R"( 5596fd4e5da5Sopenharmony_ci%var_u64 = OpVariable %u64_ptr_function Function 5597fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u64 5598fd4e5da5Sopenharmony_ci)"; 5599fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5600fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5601fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5602fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5603fd4e5da5Sopenharmony_ci "expected data type of the pointer to be a 32-bit int " 5604fd4e5da5Sopenharmony_ci "scalar or vector type")); 5605fd4e5da5Sopenharmony_ci} 5606fd4e5da5Sopenharmony_ci 5607fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongNumberOfComponents) { 5608fd4e5da5Sopenharmony_ci const std::string body = R"( 5609fd4e5da5Sopenharmony_ci%var_u32vec2 = OpVariable %u32vec2_ptr_function Function 5610fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u32vec2 5611fd4e5da5Sopenharmony_ci)"; 5612fd4e5da5Sopenharmony_ci 5613fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5614fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5615fd4e5da5Sopenharmony_ci EXPECT_THAT( 5616fd4e5da5Sopenharmony_ci getDiagnosticString(), 5617fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std remquo: " 5618fd4e5da5Sopenharmony_ci "expected data type of the pointer to have the same number " 5619fd4e5da5Sopenharmony_ci "of components as Result Type")); 5620fd4e5da5Sopenharmony_ci} 5621fd4e5da5Sopenharmony_ci 5622fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, Success) { 5623fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5624fd4e5da5Sopenharmony_ci std::ostringstream ss; 5625fd4e5da5Sopenharmony_ci ss << "%var_u32 = OpVariable %u32_ptr_function Function\n"; 5626fd4e5da5Sopenharmony_ci ss << "%var_u32vec2 = OpVariable %u32vec2_ptr_function Function\n"; 5627fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5628fd4e5da5Sopenharmony_ci << " %f32_0 %var_u32\n"; 5629fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 5630fd4e5da5Sopenharmony_ci << " %f32vec2_01 %var_u32vec2\n"; 5631fd4e5da5Sopenharmony_ci 5632fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5633fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5634fd4e5da5Sopenharmony_ci} 5635fd4e5da5Sopenharmony_ci 5636fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, IntResultType) { 5637fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5638fd4e5da5Sopenharmony_ci std::ostringstream ss; 5639fd4e5da5Sopenharmony_ci ss << "%var_u32 = OpVariable %u32_ptr_function Function\n"; 5640fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 5641fd4e5da5Sopenharmony_ci << " %f32_0 %var_u32\n"; 5642fd4e5da5Sopenharmony_ci 5643fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5644fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5645fd4e5da5Sopenharmony_ci EXPECT_THAT( 5646fd4e5da5Sopenharmony_ci getDiagnosticString(), 5647fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5648fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar or vector type")); 5649fd4e5da5Sopenharmony_ci} 5650fd4e5da5Sopenharmony_ci 5651fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, XWrongType) { 5652fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5653fd4e5da5Sopenharmony_ci std::ostringstream ss; 5654fd4e5da5Sopenharmony_ci ss << "%var_u32 = OpVariable %u32_ptr_function Function\n"; 5655fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5656fd4e5da5Sopenharmony_ci << " %f64_0 %var_u32\n"; 5657fd4e5da5Sopenharmony_ci 5658fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5659fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5660fd4e5da5Sopenharmony_ci EXPECT_THAT( 5661fd4e5da5Sopenharmony_ci getDiagnosticString(), 5662fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5663fd4e5da5Sopenharmony_ci ": expected type of operand X to be equal to Result Type")); 5664fd4e5da5Sopenharmony_ci} 5665fd4e5da5Sopenharmony_ci 5666fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, NotPointer) { 5667fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5668fd4e5da5Sopenharmony_ci std::ostringstream ss; 5669fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5670fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1\n"; 5671fd4e5da5Sopenharmony_ci 5672fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5673fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5674fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5675fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5676fd4e5da5Sopenharmony_ci ": expected the last operand to be a pointer")); 5677fd4e5da5Sopenharmony_ci} 5678fd4e5da5Sopenharmony_ci 5679fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerInvalidStorageClass) { 5680fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5681fd4e5da5Sopenharmony_ci std::ostringstream ss; 5682fd4e5da5Sopenharmony_ci ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant " 5683fd4e5da5Sopenharmony_ci "%f32vec8_uniform_constant %u32_1\n"; 5684fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0 %ptr\n"; 5685fd4e5da5Sopenharmony_ci 5686fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5687fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5688fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5689fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5690fd4e5da5Sopenharmony_ci ": expected storage class of the pointer to be " 5691fd4e5da5Sopenharmony_ci "Generic, CrossWorkgroup, Workgroup or Function")); 5692fd4e5da5Sopenharmony_ci} 5693fd4e5da5Sopenharmony_ci 5694fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeFloat) { 5695fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5696fd4e5da5Sopenharmony_ci std::ostringstream ss; 5697fd4e5da5Sopenharmony_ci ss << "%var_f32 = OpVariable %f32_ptr_function Function\n"; 5698fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5699fd4e5da5Sopenharmony_ci << " %f32_0 %var_f32\n"; 5700fd4e5da5Sopenharmony_ci 5701fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5702fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5703fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5704fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5705fd4e5da5Sopenharmony_ci ": expected data type of the pointer to be a 32-bit " 5706fd4e5da5Sopenharmony_ci "int scalar or vector type")); 5707fd4e5da5Sopenharmony_ci} 5708fd4e5da5Sopenharmony_ci 5709fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeU64) { 5710fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5711fd4e5da5Sopenharmony_ci std::ostringstream ss; 5712fd4e5da5Sopenharmony_ci ss << "%var_u64 = OpVariable %u64_ptr_function Function\n"; 5713fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5714fd4e5da5Sopenharmony_ci << " %f32_0 %var_u64\n"; 5715fd4e5da5Sopenharmony_ci 5716fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5717fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5718fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5719fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5720fd4e5da5Sopenharmony_ci ": expected data type of the pointer to be a 32-bit " 5721fd4e5da5Sopenharmony_ci "int scalar or vector type")); 5722fd4e5da5Sopenharmony_ci} 5723fd4e5da5Sopenharmony_ci 5724fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeDiffSize) { 5725fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5726fd4e5da5Sopenharmony_ci std::ostringstream ss; 5727fd4e5da5Sopenharmony_ci ss << "%var_u32 = OpVariable %u32_ptr_function Function\n"; 5728fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name 5729fd4e5da5Sopenharmony_ci << " %f32vec2_01 %var_u32\n"; 5730fd4e5da5Sopenharmony_ci 5731fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5732fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5733fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5734fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5735fd4e5da5Sopenharmony_ci ": expected data type of the pointer to have the same " 5736fd4e5da5Sopenharmony_ci "number of components as Result Type")); 5737fd4e5da5Sopenharmony_ci} 5738fd4e5da5Sopenharmony_ci 5739fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFrexpLike, ValidateOpenCLStdFrexpLike, 5740fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 5741fd4e5da5Sopenharmony_ci "frexp", 5742fd4e5da5Sopenharmony_ci "lgamma_r", 5743fd4e5da5Sopenharmony_ci })); 5744fd4e5da5Sopenharmony_ci 5745fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbSuccess) { 5746fd4e5da5Sopenharmony_ci const std::string body = R"( 5747fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst ilogb %f32_3 5748fd4e5da5Sopenharmony_ci%val2 = OpExtInst %u32vec2 %extinst ilogb %f32vec2_12 5749fd4e5da5Sopenharmony_ci)"; 5750fd4e5da5Sopenharmony_ci 5751fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5752fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5753fd4e5da5Sopenharmony_ci} 5754fd4e5da5Sopenharmony_ci 5755fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbFloatResultType) { 5756fd4e5da5Sopenharmony_ci const std::string body = R"( 5757fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst ilogb %f32_3 5758fd4e5da5Sopenharmony_ci)"; 5759fd4e5da5Sopenharmony_ci 5760fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5761fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5762fd4e5da5Sopenharmony_ci EXPECT_THAT( 5763fd4e5da5Sopenharmony_ci getDiagnosticString(), 5764fd4e5da5Sopenharmony_ci HasSubstr( 5765fd4e5da5Sopenharmony_ci "OpenCL.std ilogb: " 5766fd4e5da5Sopenharmony_ci "expected Result Type to be a 32-bit int scalar or vector type")); 5767fd4e5da5Sopenharmony_ci} 5768fd4e5da5Sopenharmony_ci 5769fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbIntX) { 5770fd4e5da5Sopenharmony_ci const std::string body = R"( 5771fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst ilogb %u32_3 5772fd4e5da5Sopenharmony_ci)"; 5773fd4e5da5Sopenharmony_ci 5774fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5775fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5776fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5777fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std ilogb: " 5778fd4e5da5Sopenharmony_ci "expected operand X to be a float scalar or vector")); 5779fd4e5da5Sopenharmony_ci} 5780fd4e5da5Sopenharmony_ci 5781fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbDiffSize) { 5782fd4e5da5Sopenharmony_ci const std::string body = R"( 5783fd4e5da5Sopenharmony_ci%val2 = OpExtInst %u32vec2 %extinst ilogb %f32_1 5784fd4e5da5Sopenharmony_ci)"; 5785fd4e5da5Sopenharmony_ci 5786fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5787fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5788fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5789fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std ilogb: " 5790fd4e5da5Sopenharmony_ci "expected operand X to have the same number of " 5791fd4e5da5Sopenharmony_ci "components as Result Type")); 5792fd4e5da5Sopenharmony_ci} 5793fd4e5da5Sopenharmony_ci 5794fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanSuccess) { 5795fd4e5da5Sopenharmony_ci const std::string body = R"( 5796fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %u32_3 5797fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst nan %u32vec2_12 5798fd4e5da5Sopenharmony_ci)"; 5799fd4e5da5Sopenharmony_ci 5800fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5801fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5802fd4e5da5Sopenharmony_ci} 5803fd4e5da5Sopenharmony_ci 5804fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanIntResultType) { 5805fd4e5da5Sopenharmony_ci const std::string body = R"( 5806fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst nan %u32_3 5807fd4e5da5Sopenharmony_ci)"; 5808fd4e5da5Sopenharmony_ci 5809fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5810fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5811fd4e5da5Sopenharmony_ci EXPECT_THAT( 5812fd4e5da5Sopenharmony_ci getDiagnosticString(), 5813fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std nan: " 5814fd4e5da5Sopenharmony_ci "expected Result Type to be a float scalar or vector type")); 5815fd4e5da5Sopenharmony_ci} 5816fd4e5da5Sopenharmony_ci 5817fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatNancode) { 5818fd4e5da5Sopenharmony_ci const std::string body = R"( 5819fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %f32_3 5820fd4e5da5Sopenharmony_ci)"; 5821fd4e5da5Sopenharmony_ci 5822fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5823fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5824fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5825fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std nan: " 5826fd4e5da5Sopenharmony_ci "expected Nancode to be an int scalar or vector type")); 5827fd4e5da5Sopenharmony_ci} 5828fd4e5da5Sopenharmony_ci 5829fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatDiffSize) { 5830fd4e5da5Sopenharmony_ci const std::string body = R"( 5831fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %u32vec2_12 5832fd4e5da5Sopenharmony_ci)"; 5833fd4e5da5Sopenharmony_ci 5834fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5835fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5836fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5837fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std nan: " 5838fd4e5da5Sopenharmony_ci "expected Nancode to have the same number of " 5839fd4e5da5Sopenharmony_ci "components as Result Type")); 5840fd4e5da5Sopenharmony_ci} 5841fd4e5da5Sopenharmony_ci 5842fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatDiffBitWidth) { 5843fd4e5da5Sopenharmony_ci const std::string body = R"( 5844fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst nan %u32_2 5845fd4e5da5Sopenharmony_ci)"; 5846fd4e5da5Sopenharmony_ci 5847fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body)); 5848fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5849fd4e5da5Sopenharmony_ci EXPECT_THAT( 5850fd4e5da5Sopenharmony_ci getDiagnosticString(), 5851fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std nan: " 5852fd4e5da5Sopenharmony_ci "expected Nancode to have the same bit width as Result Type")); 5853fd4e5da5Sopenharmony_ci} 5854fd4e5da5Sopenharmony_ci 5855fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, Success) { 5856fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5857fd4e5da5Sopenharmony_ci std::ostringstream ss; 5858fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5859fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1\n"; 5860fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name 5861fd4e5da5Sopenharmony_ci << " %f32vec2_12 %u32vec2_12\n"; 5862fd4e5da5Sopenharmony_ci 5863fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5864fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5865fd4e5da5Sopenharmony_ci} 5866fd4e5da5Sopenharmony_ci 5867fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, IntResultType) { 5868fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5869fd4e5da5Sopenharmony_ci std::ostringstream ss; 5870fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name 5871fd4e5da5Sopenharmony_ci << " %f32_0 %u32_1\n"; 5872fd4e5da5Sopenharmony_ci 5873fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5874fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5875fd4e5da5Sopenharmony_ci EXPECT_THAT( 5876fd4e5da5Sopenharmony_ci getDiagnosticString(), 5877fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5878fd4e5da5Sopenharmony_ci ": expected Result Type to be a float scalar or vector type")); 5879fd4e5da5Sopenharmony_ci} 5880fd4e5da5Sopenharmony_ci 5881fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, XWrongType) { 5882fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5883fd4e5da5Sopenharmony_ci std::ostringstream ss; 5884fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5885fd4e5da5Sopenharmony_ci << " %u32_0 %u32_1\n"; 5886fd4e5da5Sopenharmony_ci 5887fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5888fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5889fd4e5da5Sopenharmony_ci EXPECT_THAT( 5890fd4e5da5Sopenharmony_ci getDiagnosticString(), 5891fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5892fd4e5da5Sopenharmony_ci ": expected type of operand X to be equal to Result Type")); 5893fd4e5da5Sopenharmony_ci} 5894fd4e5da5Sopenharmony_ci 5895fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentNotInt) { 5896fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5897fd4e5da5Sopenharmony_ci std::ostringstream ss; 5898fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5899fd4e5da5Sopenharmony_ci << " %f32_0 %f32_1\n"; 5900fd4e5da5Sopenharmony_ci 5901fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5902fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5903fd4e5da5Sopenharmony_ci EXPECT_THAT( 5904fd4e5da5Sopenharmony_ci getDiagnosticString(), 5905fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5906fd4e5da5Sopenharmony_ci ": expected the exponent to be a 32-bit int scalar or vector")); 5907fd4e5da5Sopenharmony_ci} 5908fd4e5da5Sopenharmony_ci 5909fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentNotInt32) { 5910fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5911fd4e5da5Sopenharmony_ci std::ostringstream ss; 5912fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5913fd4e5da5Sopenharmony_ci << " %f32_0 %u64_1\n"; 5914fd4e5da5Sopenharmony_ci 5915fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5916fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5917fd4e5da5Sopenharmony_ci EXPECT_THAT( 5918fd4e5da5Sopenharmony_ci getDiagnosticString(), 5919fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5920fd4e5da5Sopenharmony_ci ": expected the exponent to be a 32-bit int scalar or vector")); 5921fd4e5da5Sopenharmony_ci} 5922fd4e5da5Sopenharmony_ci 5923fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentWrongSize) { 5924fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5925fd4e5da5Sopenharmony_ci std::ostringstream ss; 5926fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name 5927fd4e5da5Sopenharmony_ci << " %f32_0 %u32vec2_01\n"; 5928fd4e5da5Sopenharmony_ci 5929fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5930fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5931fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5932fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5933fd4e5da5Sopenharmony_ci ": expected the exponent to have the same number of " 5934fd4e5da5Sopenharmony_ci "components as Result Type")); 5935fd4e5da5Sopenharmony_ci} 5936fd4e5da5Sopenharmony_ci 5937fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllLdexpLike, ValidateOpenCLStdLdexpLike, 5938fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 5939fd4e5da5Sopenharmony_ci "ldexp", 5940fd4e5da5Sopenharmony_ci "pown", 5941fd4e5da5Sopenharmony_ci "rootn", 5942fd4e5da5Sopenharmony_ci })); 5943fd4e5da5Sopenharmony_ci 5944fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, Success) { 5945fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5946fd4e5da5Sopenharmony_ci std::ostringstream ss; 5947fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u16 %extinst " << ext_inst_name << " %u8_1 %u8_2\n"; 5948fd4e5da5Sopenharmony_ci ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name 5949fd4e5da5Sopenharmony_ci << " %u16_1 %u16_2\n"; 5950fd4e5da5Sopenharmony_ci ss << "%val3 = OpExtInst %u64 %extinst " << ext_inst_name 5951fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 5952fd4e5da5Sopenharmony_ci ss << "%val4 = OpExtInst %u64vec2 %extinst " << ext_inst_name 5953fd4e5da5Sopenharmony_ci << " %u32vec2_01 %u32vec2_01\n"; 5954fd4e5da5Sopenharmony_ci 5955fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5956fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 5957fd4e5da5Sopenharmony_ci} 5958fd4e5da5Sopenharmony_ci 5959fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, FloatResultType) { 5960fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5961fd4e5da5Sopenharmony_ci std::ostringstream ss; 5962fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %f64 %extinst " << ext_inst_name 5963fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 5964fd4e5da5Sopenharmony_ci 5965fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5966fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5967fd4e5da5Sopenharmony_ci EXPECT_THAT( 5968fd4e5da5Sopenharmony_ci getDiagnosticString(), 5969fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5970fd4e5da5Sopenharmony_ci ": expected Result Type to be an int scalar or vector type")); 5971fd4e5da5Sopenharmony_ci} 5972fd4e5da5Sopenharmony_ci 5973fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, InvalidResultTypeBitWidth) { 5974fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5975fd4e5da5Sopenharmony_ci std::ostringstream ss; 5976fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u8 %extinst " << ext_inst_name << " %u8_1 %u8_2\n"; 5977fd4e5da5Sopenharmony_ci 5978fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5979fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5980fd4e5da5Sopenharmony_ci EXPECT_THAT( 5981fd4e5da5Sopenharmony_ci getDiagnosticString(), 5982fd4e5da5Sopenharmony_ci HasSubstr( 5983fd4e5da5Sopenharmony_ci "OpenCL.std " + ext_inst_name + 5984fd4e5da5Sopenharmony_ci ": expected bit width of Result Type components to be 16, 32 or 64")); 5985fd4e5da5Sopenharmony_ci} 5986fd4e5da5Sopenharmony_ci 5987fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, LoHiDiffType) { 5988fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 5989fd4e5da5Sopenharmony_ci std::ostringstream ss; 5990fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u64 %extinst " << ext_inst_name 5991fd4e5da5Sopenharmony_ci << " %u32_1 %u16_2\n"; 5992fd4e5da5Sopenharmony_ci 5993fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 5994fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 5995fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 5996fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 5997fd4e5da5Sopenharmony_ci ": expected Hi and Lo operands to have the same type")); 5998fd4e5da5Sopenharmony_ci} 5999fd4e5da5Sopenharmony_ci 6000fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, DiffNumberOfComponents) { 6001fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 6002fd4e5da5Sopenharmony_ci std::ostringstream ss; 6003fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u64vec2 %extinst " << ext_inst_name 6004fd4e5da5Sopenharmony_ci << " %u32_1 %u32_2\n"; 6005fd4e5da5Sopenharmony_ci 6006fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 6007fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6008fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6009fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 6010fd4e5da5Sopenharmony_ci ": expected Hi and Lo operands to have the same number " 6011fd4e5da5Sopenharmony_ci "of components as Result Type")); 6012fd4e5da5Sopenharmony_ci} 6013fd4e5da5Sopenharmony_ci 6014fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, HiLoWrongBitWidth) { 6015fd4e5da5Sopenharmony_ci const std::string ext_inst_name = GetParam(); 6016fd4e5da5Sopenharmony_ci std::ostringstream ss; 6017fd4e5da5Sopenharmony_ci ss << "%val1 = OpExtInst %u64 %extinst " << ext_inst_name 6018fd4e5da5Sopenharmony_ci << " %u16_1 %u16_2\n"; 6019fd4e5da5Sopenharmony_ci 6020fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(ss.str())); 6021fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6022fd4e5da5Sopenharmony_ci EXPECT_THAT( 6023fd4e5da5Sopenharmony_ci getDiagnosticString(), 6024fd4e5da5Sopenharmony_ci HasSubstr("OpenCL.std " + ext_inst_name + 6025fd4e5da5Sopenharmony_ci ": expected bit width of components of Hi and Lo operands to " 6026fd4e5da5Sopenharmony_ci "be half of the bit width of components of Result Type")); 6027fd4e5da5Sopenharmony_ci} 6028fd4e5da5Sopenharmony_ci 6029fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUpsampleLike, ValidateOpenCLStdUpsampleLike, 6030fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::string>{ 6031fd4e5da5Sopenharmony_ci "u_upsample", 6032fd4e5da5Sopenharmony_ci "s_upsample", 6033fd4e5da5Sopenharmony_ci })); 6034fd4e5da5Sopenharmony_ci 6035fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, RequiresNonSemanticExtension) { 6036fd4e5da5Sopenharmony_ci const std::string text = R"( 6037fd4e5da5Sopenharmony_ciOpCapability Shader 6038fd4e5da5Sopenharmony_ciOpCapability Linkage 6039fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1" 6040fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6041fd4e5da5Sopenharmony_ci)"; 6042fd4e5da5Sopenharmony_ci 6043fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6044fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6045fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6046fd4e5da5Sopenharmony_ci HasSubstr("NonSemantic extended instruction sets cannot be " 6047fd4e5da5Sopenharmony_ci "declared without SPV_KHR_non_semantic_info")); 6048fd4e5da5Sopenharmony_ci} 6049fd4e5da5Sopenharmony_ci 6050fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, DoesNotRequiresNonSemanticExtensionPost1p6) { 6051fd4e5da5Sopenharmony_ci const std::string text = R"( 6052fd4e5da5Sopenharmony_ciOpCapability Shader 6053fd4e5da5Sopenharmony_ciOpCapability Linkage 6054fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1" 6055fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6056fd4e5da5Sopenharmony_ci)"; 6057fd4e5da5Sopenharmony_ci 6058fd4e5da5Sopenharmony_ci CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_6); 6059fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_6)); 6060fd4e5da5Sopenharmony_ci} 6061fd4e5da5Sopenharmony_ci 6062fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, MissingVersion) { 6063fd4e5da5Sopenharmony_ci const std::string text = R"( 6064fd4e5da5Sopenharmony_ciOpCapability Shader 6065fd4e5da5Sopenharmony_ciOpCapability Linkage 6066fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6067fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection." 6068fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6069fd4e5da5Sopenharmony_ci%2 = OpTypeVoid 6070fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0 6071fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1 6072fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4 6073fd4e5da5Sopenharmony_ci)"; 6074fd4e5da5Sopenharmony_ci 6075fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6076fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6077fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6078fd4e5da5Sopenharmony_ci HasSubstr("Missing NonSemantic.ClspvReflection import version")); 6079fd4e5da5Sopenharmony_ci} 6080fd4e5da5Sopenharmony_ci 6081fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, BadVersion0) { 6082fd4e5da5Sopenharmony_ci const std::string text = R"( 6083fd4e5da5Sopenharmony_ciOpCapability Shader 6084fd4e5da5Sopenharmony_ciOpCapability Linkage 6085fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6086fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.0" 6087fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6088fd4e5da5Sopenharmony_ci%2 = OpTypeVoid 6089fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0 6090fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1 6091fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4 6092fd4e5da5Sopenharmony_ci)"; 6093fd4e5da5Sopenharmony_ci 6094fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6095fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6096fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6097fd4e5da5Sopenharmony_ci HasSubstr("Unknown NonSemantic.ClspvReflection import version")); 6098fd4e5da5Sopenharmony_ci} 6099fd4e5da5Sopenharmony_ci 6100fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, BadVersionNotANumber) { 6101fd4e5da5Sopenharmony_ci const std::string text = R"( 6102fd4e5da5Sopenharmony_ciOpCapability Shader 6103fd4e5da5Sopenharmony_ciOpCapability Linkage 6104fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6105fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1a" 6106fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6107fd4e5da5Sopenharmony_ci%2 = OpTypeVoid 6108fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0 6109fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1 6110fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4 6111fd4e5da5Sopenharmony_ci)"; 6112fd4e5da5Sopenharmony_ci 6113fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6114fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 6115fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6116fd4e5da5Sopenharmony_ci HasSubstr("NonSemantic.ClspvReflection import does not encode " 6117fd4e5da5Sopenharmony_ci "the version correctly")); 6118fd4e5da5Sopenharmony_ci} 6119fd4e5da5Sopenharmony_ci 6120fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, Kernel) { 6121fd4e5da5Sopenharmony_ci const std::string text = R"( 6122fd4e5da5Sopenharmony_ciOpCapability Shader 6123fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6124fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 6125fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6126fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6127fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6128fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6129fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6130fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6131fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6132fd4e5da5Sopenharmony_ci%entry = OpLabel 6133fd4e5da5Sopenharmony_ciOpReturn 6134fd4e5da5Sopenharmony_ciOpFunctionEnd 6135fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6136fd4e5da5Sopenharmony_ci)"; 6137fd4e5da5Sopenharmony_ci 6138fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6139fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 6140fd4e5da5Sopenharmony_ci} 6141fd4e5da5Sopenharmony_ci 6142fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotAFunction) { 6143fd4e5da5Sopenharmony_ci const std::string text = R"( 6144fd4e5da5Sopenharmony_ciOpCapability Shader 6145fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6146fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 6147fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6148fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6149fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6150fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6151fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6152fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6153fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6154fd4e5da5Sopenharmony_ci%entry = OpLabel 6155fd4e5da5Sopenharmony_ciOpReturn 6156fd4e5da5Sopenharmony_ciOpFunctionEnd 6157fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo_name %foo_name 6158fd4e5da5Sopenharmony_ci)"; 6159fd4e5da5Sopenharmony_ci 6160fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6161fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6162fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6163fd4e5da5Sopenharmony_ci HasSubstr("Kernel does not reference a function")); 6164fd4e5da5Sopenharmony_ci} 6165fd4e5da5Sopenharmony_ci 6166fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotAnEntryPoint) { 6167fd4e5da5Sopenharmony_ci const std::string text = R"( 6168fd4e5da5Sopenharmony_ciOpCapability Shader 6169fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6170fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 6171fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6172fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6173fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6174fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6175fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6176fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6177fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6178fd4e5da5Sopenharmony_ci%entry = OpLabel 6179fd4e5da5Sopenharmony_ciOpReturn 6180fd4e5da5Sopenharmony_ciOpFunctionEnd 6181fd4e5da5Sopenharmony_ci%bar = OpFunction %void None %void_fn 6182fd4e5da5Sopenharmony_ci%bar_entry = OpLabel 6183fd4e5da5Sopenharmony_ciOpReturn 6184fd4e5da5Sopenharmony_ciOpFunctionEnd 6185fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %bar %foo_name 6186fd4e5da5Sopenharmony_ci)"; 6187fd4e5da5Sopenharmony_ci 6188fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6189fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6190fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6191fd4e5da5Sopenharmony_ci HasSubstr("Kernel does not reference an entry-point")); 6192fd4e5da5Sopenharmony_ci} 6193fd4e5da5Sopenharmony_ci 6194fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotGLCompute) { 6195fd4e5da5Sopenharmony_ci const std::string text = R"( 6196fd4e5da5Sopenharmony_ciOpCapability Shader 6197fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6198fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 6199fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6200fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %foo "foo" 6201fd4e5da5Sopenharmony_ciOpExecutionMode %foo OriginUpperLeft 6202fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6203fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6204fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6205fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6206fd4e5da5Sopenharmony_ci%entry = OpLabel 6207fd4e5da5Sopenharmony_ciOpReturn 6208fd4e5da5Sopenharmony_ciOpFunctionEnd 6209fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6210fd4e5da5Sopenharmony_ci)"; 6211fd4e5da5Sopenharmony_ci 6212fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6213fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6214fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6215fd4e5da5Sopenharmony_ci HasSubstr("Kernel must refer only to GLCompute entry-points")); 6216fd4e5da5Sopenharmony_ci} 6217fd4e5da5Sopenharmony_ci 6218fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNameMismatch) { 6219fd4e5da5Sopenharmony_ci const std::string text = R"( 6220fd4e5da5Sopenharmony_ciOpCapability Shader 6221fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6222fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 6223fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6224fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6225fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6226fd4e5da5Sopenharmony_ci%foo_name = OpString "bar" 6227fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6228fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6229fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6230fd4e5da5Sopenharmony_ci%entry = OpLabel 6231fd4e5da5Sopenharmony_ciOpReturn 6232fd4e5da5Sopenharmony_ciOpFunctionEnd 6233fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6234fd4e5da5Sopenharmony_ci)"; 6235fd4e5da5Sopenharmony_ci 6236fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6237fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6238fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6239fd4e5da5Sopenharmony_ci HasSubstr("Name must match an entry-point for Kernel")); 6240fd4e5da5Sopenharmony_ci} 6241fd4e5da5Sopenharmony_ci 6242fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelArgumentsVersionGood) { 6243fd4e5da5Sopenharmony_ci const std::string text = R"( 6244fd4e5da5Sopenharmony_ciOpCapability Shader 6245fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6246fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6247fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6248fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6249fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6250fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6251fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6252fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6253fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6254fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 6255fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6256fd4e5da5Sopenharmony_ci%entry = OpLabel 6257fd4e5da5Sopenharmony_ciOpReturn 6258fd4e5da5Sopenharmony_ciOpFunctionEnd 6259fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_1 6260fd4e5da5Sopenharmony_ci)"; 6261fd4e5da5Sopenharmony_ci 6262fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6263fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 6264fd4e5da5Sopenharmony_ci} 6265fd4e5da5Sopenharmony_ci 6266fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelArgumentsVersionBad) { 6267fd4e5da5Sopenharmony_ci const std::string text = R"( 6268fd4e5da5Sopenharmony_ciOpCapability Shader 6269fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6270fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.4" 6271fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6272fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6273fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6274fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6275fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6276fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6277fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6278fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 6279fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6280fd4e5da5Sopenharmony_ci%entry = OpLabel 6281fd4e5da5Sopenharmony_ciOpReturn 6282fd4e5da5Sopenharmony_ciOpFunctionEnd 6283fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_1 6284fd4e5da5Sopenharmony_ci)"; 6285fd4e5da5Sopenharmony_ci 6286fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6287fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6288fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6289fd4e5da5Sopenharmony_ci HasSubstr("Version 4 of the Kernel instruction can only have 2 " 6290fd4e5da5Sopenharmony_ci "additional operands")); 6291fd4e5da5Sopenharmony_ci} 6292fd4e5da5Sopenharmony_ci 6293fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNumArgumentsNotInt) { 6294fd4e5da5Sopenharmony_ci const std::string text = R"( 6295fd4e5da5Sopenharmony_ciOpCapability Shader 6296fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6297fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6298fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6299fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6300fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6301fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6302fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6303fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6304fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6305fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6306fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 6307fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 6308fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6309fd4e5da5Sopenharmony_ci%entry = OpLabel 6310fd4e5da5Sopenharmony_ciOpReturn 6311fd4e5da5Sopenharmony_ciOpFunctionEnd 6312fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %float_0 6313fd4e5da5Sopenharmony_ci)"; 6314fd4e5da5Sopenharmony_ci 6315fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6316fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6317fd4e5da5Sopenharmony_ci EXPECT_THAT( 6318fd4e5da5Sopenharmony_ci getDiagnosticString(), 6319fd4e5da5Sopenharmony_ci HasSubstr("NumArguments must be a 32-bit unsigned integer OpConstant")); 6320fd4e5da5Sopenharmony_ci} 6321fd4e5da5Sopenharmony_ci 6322fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNumArgumentsNotConstant) { 6323fd4e5da5Sopenharmony_ci const std::string text = R"( 6324fd4e5da5Sopenharmony_ciOpCapability Shader 6325fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6326fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6327fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6328fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6329fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6330fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6331fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6332fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6333fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6334fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6335fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 6336fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6337fd4e5da5Sopenharmony_ci%entry = OpLabel 6338fd4e5da5Sopenharmony_ciOpReturn 6339fd4e5da5Sopenharmony_ciOpFunctionEnd 6340fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %null 6341fd4e5da5Sopenharmony_ci)"; 6342fd4e5da5Sopenharmony_ci 6343fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6344fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6345fd4e5da5Sopenharmony_ci EXPECT_THAT( 6346fd4e5da5Sopenharmony_ci getDiagnosticString(), 6347fd4e5da5Sopenharmony_ci HasSubstr("NumArguments must be a 32-bit unsigned integer OpConstant")); 6348fd4e5da5Sopenharmony_ci} 6349fd4e5da5Sopenharmony_ci 6350fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelFlagsNotInt) { 6351fd4e5da5Sopenharmony_ci const std::string text = R"( 6352fd4e5da5Sopenharmony_ciOpCapability Shader 6353fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6354fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6355fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6356fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6357fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6358fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6359fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6360fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6361fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6362fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6363fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 6364fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 6365fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6366fd4e5da5Sopenharmony_ci%entry = OpLabel 6367fd4e5da5Sopenharmony_ciOpReturn 6368fd4e5da5Sopenharmony_ciOpFunctionEnd 6369fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %float_0 6370fd4e5da5Sopenharmony_ci)"; 6371fd4e5da5Sopenharmony_ci 6372fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6373fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6374fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6375fd4e5da5Sopenharmony_ci HasSubstr("Flags must be a 32-bit unsigned integer OpConstant")); 6376fd4e5da5Sopenharmony_ci} 6377fd4e5da5Sopenharmony_ci 6378fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelFlagsNotConstant) { 6379fd4e5da5Sopenharmony_ci const std::string text = R"( 6380fd4e5da5Sopenharmony_ciOpCapability Shader 6381fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6382fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6383fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6384fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6385fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6386fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6387fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6388fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6389fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6390fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6391fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 6392fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6393fd4e5da5Sopenharmony_ci%entry = OpLabel 6394fd4e5da5Sopenharmony_ciOpReturn 6395fd4e5da5Sopenharmony_ciOpFunctionEnd 6396fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %null 6397fd4e5da5Sopenharmony_ci)"; 6398fd4e5da5Sopenharmony_ci 6399fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6400fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6401fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6402fd4e5da5Sopenharmony_ci HasSubstr("Flags must be a 32-bit unsigned integer OpConstant")); 6403fd4e5da5Sopenharmony_ci} 6404fd4e5da5Sopenharmony_ci 6405fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelAttributesNotString) { 6406fd4e5da5Sopenharmony_ci const std::string text = R"( 6407fd4e5da5Sopenharmony_ciOpCapability Shader 6408fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6409fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6410fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6411fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6412fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6413fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6414fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6415fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6416fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6417fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6418fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 6419fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 6420fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6421fd4e5da5Sopenharmony_ci%entry = OpLabel 6422fd4e5da5Sopenharmony_ciOpReturn 6423fd4e5da5Sopenharmony_ciOpFunctionEnd 6424fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %int_0 %int_0 6425fd4e5da5Sopenharmony_ci)"; 6426fd4e5da5Sopenharmony_ci 6427fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6428fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6429fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6430fd4e5da5Sopenharmony_ci HasSubstr("Attributes must be an OpString")); 6431fd4e5da5Sopenharmony_ci} 6432fd4e5da5Sopenharmony_ci 6433fd4e5da5Sopenharmony_ciusing ArgumentBasics = 6434fd4e5da5Sopenharmony_ci spvtest::ValidateBase<std::pair<std::string, std::string>>; 6435fd4e5da5Sopenharmony_ci 6436fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P( 6437fd4e5da5Sopenharmony_ci ValidateClspvReflectionArgumentKernel, ArgumentBasics, 6438fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{ 6439fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer", "%int_0 %int_0"), 6440fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform", "%int_0 %int_0"), 6441fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer", 6442fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_4"), 6443fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodUniform", "%int_0 %int_0 %int_0 %int_4"), 6444fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant", "%int_0 %int_4"), 6445fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage", "%int_0 %int_0"), 6446fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage", "%int_0 %int_0"), 6447fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler", "%int_0 %int_0"), 6448fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup", "%int_0 %int_0"), 6449fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerPushConstant", "%int_0 %int_4"), 6450fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerUniform", "%int_0 %int_0 %int_0 %int_4"), 6451fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageTexelBuffer", "%int_0 %int_0"), 6452fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniformTexelBuffer", "%int_0 %int_0")})); 6453fd4e5da5Sopenharmony_ci 6454fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelNotAnExtendedInstruction) { 6455fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6456fd4e5da5Sopenharmony_ci const std::string extra = std::get<1>(GetParam()); 6457fd4e5da5Sopenharmony_ci const std::string text = R"( 6458fd4e5da5Sopenharmony_ciOpCapability Shader 6459fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6460fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6461fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6462fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6463fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6464fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6465fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6466fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6467fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6468fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6469fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6470fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6471fd4e5da5Sopenharmony_ci%entry = OpLabel 6472fd4e5da5Sopenharmony_ciOpReturn 6473fd4e5da5Sopenharmony_ciOpFunctionEnd 6474fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6475fd4e5da5Sopenharmony_ci ext_inst + " %int_0 %int_0 " + extra; 6476fd4e5da5Sopenharmony_ci 6477fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6478fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6479fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6480fd4e5da5Sopenharmony_ci HasSubstr("Kernel must be a Kernel extended instruction")); 6481fd4e5da5Sopenharmony_ci} 6482fd4e5da5Sopenharmony_ci 6483fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelFromDifferentImport) { 6484fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6485fd4e5da5Sopenharmony_ci const std::string extra = std::get<1>(GetParam()); 6486fd4e5da5Sopenharmony_ci const std::string text = R"( 6487fd4e5da5Sopenharmony_ciOpCapability Shader 6488fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6489fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6490fd4e5da5Sopenharmony_ci%ext2 = OpExtInstImport "NonSemantic.ClspvReflection.5" 6491fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6492fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6493fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6494fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6495fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6496fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6497fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6498fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6499fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6500fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6501fd4e5da5Sopenharmony_ci%entry = OpLabel 6502fd4e5da5Sopenharmony_ciOpReturn 6503fd4e5da5Sopenharmony_ciOpFunctionEnd 6504fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext2 Kernel %foo %foo_name 6505fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6506fd4e5da5Sopenharmony_ci ext_inst + " %decl %int_0 " + extra; 6507fd4e5da5Sopenharmony_ci 6508fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6509fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6510fd4e5da5Sopenharmony_ci EXPECT_THAT( 6511fd4e5da5Sopenharmony_ci getDiagnosticString(), 6512fd4e5da5Sopenharmony_ci HasSubstr("Kernel must be from the same extended instruction import")); 6513fd4e5da5Sopenharmony_ci} 6514fd4e5da5Sopenharmony_ci 6515fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelWrongExtendedInstruction) { 6516fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6517fd4e5da5Sopenharmony_ci const std::string extra = std::get<1>(GetParam()); 6518fd4e5da5Sopenharmony_ci const std::string text = R"( 6519fd4e5da5Sopenharmony_ciOpCapability Shader 6520fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6521fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6522fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6523fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6524fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6525fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6526fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6527fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6528fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6529fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6530fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6531fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6532fd4e5da5Sopenharmony_ci%entry = OpLabel 6533fd4e5da5Sopenharmony_ciOpReturn 6534fd4e5da5Sopenharmony_ciOpFunctionEnd 6535fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext ArgumentInfo %foo_name 6536fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6537fd4e5da5Sopenharmony_ci ext_inst + " %decl %int_0 " + extra; 6538fd4e5da5Sopenharmony_ci 6539fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6540fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6541fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 6542fd4e5da5Sopenharmony_ci HasSubstr("Kernel must be a Kernel extended instruction")); 6543fd4e5da5Sopenharmony_ci} 6544fd4e5da5Sopenharmony_ci 6545fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfo) { 6546fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6547fd4e5da5Sopenharmony_ci const std::string operands = std::get<1>(GetParam()); 6548fd4e5da5Sopenharmony_ci const std::string text = R"( 6549fd4e5da5Sopenharmony_ciOpCapability Shader 6550fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6551fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6552fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6553fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6554fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6555fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6556fd4e5da5Sopenharmony_ci%in_name = OpString "in" 6557fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6558fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6559fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6560fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6561fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6562fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6563fd4e5da5Sopenharmony_ci%entry = OpLabel 6564fd4e5da5Sopenharmony_ciOpReturn 6565fd4e5da5Sopenharmony_ciOpFunctionEnd 6566fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6567fd4e5da5Sopenharmony_ci%info = OpExtInst %void %ext ArgumentInfo %in_name 6568fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6569fd4e5da5Sopenharmony_ci ext_inst + " %decl %int_0 " + operands + " %info"; 6570fd4e5da5Sopenharmony_ci 6571fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6572fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 6573fd4e5da5Sopenharmony_ci} 6574fd4e5da5Sopenharmony_ci 6575fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfoNotAnExtendedInstruction) { 6576fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6577fd4e5da5Sopenharmony_ci const std::string operands = std::get<1>(GetParam()); 6578fd4e5da5Sopenharmony_ci const std::string text = R"( 6579fd4e5da5Sopenharmony_ciOpCapability Shader 6580fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6581fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6582fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6583fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6584fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6585fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6586fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6587fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6588fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6589fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6590fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6591fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6592fd4e5da5Sopenharmony_ci%entry = OpLabel 6593fd4e5da5Sopenharmony_ciOpReturn 6594fd4e5da5Sopenharmony_ciOpFunctionEnd 6595fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6596fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6597fd4e5da5Sopenharmony_ci ext_inst + " %decl %int_0 " + operands + " %int_0"; 6598fd4e5da5Sopenharmony_ci 6599fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6600fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6601fd4e5da5Sopenharmony_ci EXPECT_THAT( 6602fd4e5da5Sopenharmony_ci getDiagnosticString(), 6603fd4e5da5Sopenharmony_ci HasSubstr("ArgInfo must be an ArgumentInfo extended instruction")); 6604fd4e5da5Sopenharmony_ci} 6605fd4e5da5Sopenharmony_ci 6606fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfoFromDifferentImport) { 6607fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 6608fd4e5da5Sopenharmony_ci const std::string operands = std::get<1>(GetParam()); 6609fd4e5da5Sopenharmony_ci const std::string text = R"( 6610fd4e5da5Sopenharmony_ciOpCapability Shader 6611fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 6612fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 6613fd4e5da5Sopenharmony_ci%ext2 = OpExtInstImport "NonSemantic.ClspvReflection.5" 6614fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 6615fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 6616fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 6617fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 6618fd4e5da5Sopenharmony_ci%in_name = OpString "in" 6619fd4e5da5Sopenharmony_ci%void = OpTypeVoid 6620fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 6621fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 6622fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 6623fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 6624fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 6625fd4e5da5Sopenharmony_ci%entry = OpLabel 6626fd4e5da5Sopenharmony_ciOpReturn 6627fd4e5da5Sopenharmony_ciOpFunctionEnd 6628fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 6629fd4e5da5Sopenharmony_ci%info = OpExtInst %void %ext2 ArgumentInfo %in_name 6630fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" + 6631fd4e5da5Sopenharmony_ci ext_inst + " %decl %int_0 " + operands + " %info"; 6632fd4e5da5Sopenharmony_ci 6633fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 6634fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 6635fd4e5da5Sopenharmony_ci EXPECT_THAT( 6636fd4e5da5Sopenharmony_ci getDiagnosticString(), 6637fd4e5da5Sopenharmony_ci HasSubstr("ArgInfo must be from the same extended instruction import")); 6638fd4e5da5Sopenharmony_ci} 6639fd4e5da5Sopenharmony_ci 6640fd4e5da5Sopenharmony_ciusing Uint32Constant = 6641fd4e5da5Sopenharmony_ci spvtest::ValidateBase<std::pair<std::string, std::string>>; 6642fd4e5da5Sopenharmony_ci 6643fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P( 6644fd4e5da5Sopenharmony_ci ValidateClspvReflectionUint32Constants, Uint32Constant, 6645fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{ 6646fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %float_0 %int_0 %int_0", 6647fd4e5da5Sopenharmony_ci "Ordinal"), 6648fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %null %int_0 %int_0", 6649fd4e5da5Sopenharmony_ci "Ordinal"), 6650fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %int_0 %float_0 %int_0", 6651fd4e5da5Sopenharmony_ci "DescriptorSet"), 6652fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %int_0 %null %int_0", 6653fd4e5da5Sopenharmony_ci "DescriptorSet"), 6654fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %float_0", 6655fd4e5da5Sopenharmony_ci "Binding"), 6656fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %null", 6657fd4e5da5Sopenharmony_ci "Binding"), 6658fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %float_0 %int_0 %int_0", 6659fd4e5da5Sopenharmony_ci "Ordinal"), 6660fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %null %int_0 %int_0", "Ordinal"), 6661fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %int_0 %float_0 %int_0", 6662fd4e5da5Sopenharmony_ci "DescriptorSet"), 6663fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %int_0 %null %int_0", 6664fd4e5da5Sopenharmony_ci "DescriptorSet"), 6665fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %int_0 %int_0 %float_0", 6666fd4e5da5Sopenharmony_ci "Binding"), 6667fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %int_0 %int_0 %null", "Binding"), 6668fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %float_0 %int_0 %int_0", 6669fd4e5da5Sopenharmony_ci "Ordinal"), 6670fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %null %int_0 %int_0", 6671fd4e5da5Sopenharmony_ci "Ordinal"), 6672fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %int_0 %float_0 %int_0", 6673fd4e5da5Sopenharmony_ci "DescriptorSet"), 6674fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %int_0 %null %int_0", 6675fd4e5da5Sopenharmony_ci "DescriptorSet"), 6676fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %float_0", 6677fd4e5da5Sopenharmony_ci "Binding"), 6678fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %null", 6679fd4e5da5Sopenharmony_ci "Binding"), 6680fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %float_0 %int_0 %int_0", 6681fd4e5da5Sopenharmony_ci "Ordinal"), 6682fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %null %int_0 %int_0", 6683fd4e5da5Sopenharmony_ci "Ordinal"), 6684fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %int_0 %float_0 %int_0", 6685fd4e5da5Sopenharmony_ci "DescriptorSet"), 6686fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %int_0 %null %int_0", 6687fd4e5da5Sopenharmony_ci "DescriptorSet"), 6688fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %float_0", 6689fd4e5da5Sopenharmony_ci "Binding"), 6690fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %null", 6691fd4e5da5Sopenharmony_ci "Binding"), 6692fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %float_0 %int_0 %int_0", 6693fd4e5da5Sopenharmony_ci "Ordinal"), 6694fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %null %int_0 %int_0", "Ordinal"), 6695fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %int_0 %float_0 %int_0", 6696fd4e5da5Sopenharmony_ci "DescriptorSet"), 6697fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %int_0 %null %int_0", 6698fd4e5da5Sopenharmony_ci "DescriptorSet"), 6699fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %int_0 %int_0 %float_0", 6700fd4e5da5Sopenharmony_ci "Binding"), 6701fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %int_0 %int_0 %null", "Binding"), 6702fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer %decl %float_0 %int_0 %int_0 " 6703fd4e5da5Sopenharmony_ci "%int_0 %int_4", 6704fd4e5da5Sopenharmony_ci "Ordinal"), 6705fd4e5da5Sopenharmony_ci std::make_pair( 6706fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %null %int_0 %int_0 %int_0 %int_4", 6707fd4e5da5Sopenharmony_ci "Ordinal"), 6708fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %float_0 %int_0 " 6709fd4e5da5Sopenharmony_ci "%int_0 %int_4", 6710fd4e5da5Sopenharmony_ci "DescriptorSet"), 6711fd4e5da5Sopenharmony_ci std::make_pair( 6712fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %int_0 %null %int_0 %int_0 %int_4", 6713fd4e5da5Sopenharmony_ci "DescriptorSet"), 6714fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %float_0 " 6715fd4e5da5Sopenharmony_ci "%int_0 %int_4", 6716fd4e5da5Sopenharmony_ci "Binding"), 6717fd4e5da5Sopenharmony_ci std::make_pair( 6718fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %int_0 %int_0 %null %int_0 %int_4", 6719fd4e5da5Sopenharmony_ci "Binding"), 6720fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 " 6721fd4e5da5Sopenharmony_ci "%float_0 %int_4", 6722fd4e5da5Sopenharmony_ci "Offset"), 6723fd4e5da5Sopenharmony_ci std::make_pair( 6724fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %null %int_4", 6725fd4e5da5Sopenharmony_ci "Offset"), 6726fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 " 6727fd4e5da5Sopenharmony_ci "%int_0 %float_0", 6728fd4e5da5Sopenharmony_ci "Size"), 6729fd4e5da5Sopenharmony_ci std::make_pair( 6730fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %int_0 %null", 6731fd4e5da5Sopenharmony_ci "Size"), 6732fd4e5da5Sopenharmony_ci std::make_pair( 6733fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %float_0 %int_0 %int_0 %int_0 %int_4", 6734fd4e5da5Sopenharmony_ci "Ordinal"), 6735fd4e5da5Sopenharmony_ci std::make_pair( 6736fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %null %int_0 %int_0 %int_0 %int_4", 6737fd4e5da5Sopenharmony_ci "Ordinal"), 6738fd4e5da5Sopenharmony_ci std::make_pair( 6739fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %float_0 %int_0 %int_0 %int_4", 6740fd4e5da5Sopenharmony_ci "DescriptorSet"), 6741fd4e5da5Sopenharmony_ci std::make_pair( 6742fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %null %int_0 %int_0 %int_4", 6743fd4e5da5Sopenharmony_ci "DescriptorSet"), 6744fd4e5da5Sopenharmony_ci std::make_pair( 6745fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %float_0 %int_0 %int_4", 6746fd4e5da5Sopenharmony_ci "Binding"), 6747fd4e5da5Sopenharmony_ci std::make_pair( 6748fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %null %int_0 %int_4", 6749fd4e5da5Sopenharmony_ci "Binding"), 6750fd4e5da5Sopenharmony_ci std::make_pair( 6751fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %float_0 %int_4", 6752fd4e5da5Sopenharmony_ci "Offset"), 6753fd4e5da5Sopenharmony_ci std::make_pair( 6754fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %null %int_4", 6755fd4e5da5Sopenharmony_ci "Offset"), 6756fd4e5da5Sopenharmony_ci std::make_pair( 6757fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %float_0", 6758fd4e5da5Sopenharmony_ci "Size"), 6759fd4e5da5Sopenharmony_ci std::make_pair( 6760fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %null", 6761fd4e5da5Sopenharmony_ci "Size"), 6762fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %float_0 %int_0 %int_4", 6763fd4e5da5Sopenharmony_ci "Ordinal"), 6764fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %null %int_0 %int_4", 6765fd4e5da5Sopenharmony_ci "Ordinal"), 6766fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %int_0 %float_0 %int_4", 6767fd4e5da5Sopenharmony_ci "Offset"), 6768fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %int_0 %null %int_4", 6769fd4e5da5Sopenharmony_ci "Offset"), 6770fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %float_0", 6771fd4e5da5Sopenharmony_ci "Size"), 6772fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %null", 6773fd4e5da5Sopenharmony_ci "Size"), 6774fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %float_0 %int_0 %int_4", 6775fd4e5da5Sopenharmony_ci "Ordinal"), 6776fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %null %int_0 %int_4", 6777fd4e5da5Sopenharmony_ci "Ordinal"), 6778fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %int_0 %float_0 %int_4", 6779fd4e5da5Sopenharmony_ci "SpecId"), 6780fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %int_0 %null %int_4", "SpecId"), 6781fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %float_0", 6782fd4e5da5Sopenharmony_ci "ElemSize"), 6783fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %null", 6784fd4e5da5Sopenharmony_ci "ElemSize"), 6785fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %float_0 %int_0 %int_4", "X"), 6786fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %null %int_0 %int_4", "X"), 6787fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %int_0 %float_0 %int_4", "Y"), 6788fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %int_0 %null %int_4", "Y"), 6789fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %float_0", "Z"), 6790fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %null", "Z"), 6791fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %float_0 %int_0 %int_4", "X"), 6792fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %null %int_0 %int_4", "X"), 6793fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %int_0 %float_0 %int_4", "Y"), 6794fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %int_0 %null %int_4", "Y"), 6795fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %float_0", "Z"), 6796fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %null", "Z"), 6797fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkDim %float_0", "Dim"), 6798fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkDim %null", "Dim"), 6799fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalOffset %float_0 %int_0", "Offset"), 6800fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalOffset %null %int_0", "Offset"), 6801fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalOffset %int_0 %float_0", "Size"), 6802fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalOffset %int_0 %null", "Size"), 6803fd4e5da5Sopenharmony_ci std::make_pair("PushConstantEnqueuedLocalSize %float_0 %int_0", 6804fd4e5da5Sopenharmony_ci "Offset"), 6805fd4e5da5Sopenharmony_ci std::make_pair("PushConstantEnqueuedLocalSize %null %int_0", "Offset"), 6806fd4e5da5Sopenharmony_ci std::make_pair("PushConstantEnqueuedLocalSize %int_0 %float_0", "Size"), 6807fd4e5da5Sopenharmony_ci std::make_pair("PushConstantEnqueuedLocalSize %int_0 %null", "Size"), 6808fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalSize %float_0 %int_0", "Offset"), 6809fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalSize %null %int_0", "Offset"), 6810fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalSize %int_0 %float_0", "Size"), 6811fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalSize %int_0 %null", "Size"), 6812fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionOffset %float_0 %int_0", "Offset"), 6813fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionOffset %null %int_0", "Offset"), 6814fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionOffset %int_0 %float_0", "Size"), 6815fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionOffset %int_0 %null", "Size"), 6816fd4e5da5Sopenharmony_ci std::make_pair("PushConstantNumWorkgroups %float_0 %int_0", "Offset"), 6817fd4e5da5Sopenharmony_ci std::make_pair("PushConstantNumWorkgroups %null %int_0", "Offset"), 6818fd4e5da5Sopenharmony_ci std::make_pair("PushConstantNumWorkgroups %int_0 %float_0", "Size"), 6819fd4e5da5Sopenharmony_ci std::make_pair("PushConstantNumWorkgroups %int_0 %null", "Size"), 6820fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionGroupOffset %float_0 %int_0", 6821fd4e5da5Sopenharmony_ci "Offset"), 6822fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionGroupOffset %null %int_0", "Offset"), 6823fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionGroupOffset %int_0 %float_0", "Size"), 6824fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionGroupOffset %int_0 %null", "Size"), 6825fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %float_0 %int_0 %data", 6826fd4e5da5Sopenharmony_ci "DescriptorSet"), 6827fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %null %int_0 %data", 6828fd4e5da5Sopenharmony_ci "DescriptorSet"), 6829fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %int_0 %float_0 %data", 6830fd4e5da5Sopenharmony_ci "Binding"), 6831fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %int_0 %null %data", 6832fd4e5da5Sopenharmony_ci "Binding"), 6833fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %float_0 %int_0 %data", 6834fd4e5da5Sopenharmony_ci "DescriptorSet"), 6835fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %null %int_0 %data", 6836fd4e5da5Sopenharmony_ci "DescriptorSet"), 6837fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %int_0 %float_0 %data", "Binding"), 6838fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %int_0 %null %data", "Binding"), 6839fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %float_0 %int_0 %int_4", 6840fd4e5da5Sopenharmony_ci "DescriptorSet"), 6841fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %null %int_0 %int_4", "DescriptorSet"), 6842fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %int_0 %float_0 %int_4", "Binding"), 6843fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %int_0 %null %int_4", "Binding"), 6844fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %int_0 %int_0 %float_0", "Mask"), 6845fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %int_0 %int_0 %null", "Mask"), 6846fd4e5da5Sopenharmony_ci std::make_pair( 6847fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %float_0 %int_1 %int_4", "X"), 6848fd4e5da5Sopenharmony_ci std::make_pair( 6849fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %null %int_1 %int_4", "X"), 6850fd4e5da5Sopenharmony_ci std::make_pair( 6851fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %int_1 %float_0 %int_4", "Y"), 6852fd4e5da5Sopenharmony_ci std::make_pair( 6853fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %int_1 %null %int_4", "Y"), 6854fd4e5da5Sopenharmony_ci std::make_pair( 6855fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %int_1 %int_1 %float_0", "Z"), 6856fd4e5da5Sopenharmony_ci std::make_pair( 6857fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %int_1 %int_1 %null", "Z"), 6858fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantSubgroupMaxSize %float_0", "Size"), 6859fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantSubgroupMaxSize %null", "Size"), 6860fd4e5da5Sopenharmony_ci std::make_pair( 6861fd4e5da5Sopenharmony_ci "ArgumentPointerPushConstant %decl %float_0 %int_0 %int_0", 6862fd4e5da5Sopenharmony_ci "Ordinal"), 6863fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerPushConstant %decl %null %int_0 %int_0", 6864fd4e5da5Sopenharmony_ci "Ordinal"), 6865fd4e5da5Sopenharmony_ci std::make_pair( 6866fd4e5da5Sopenharmony_ci "ArgumentPointerPushConstant %decl %int_0 %float_0 %int_0", 6867fd4e5da5Sopenharmony_ci "Offset"), 6868fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerPushConstant %decl %int_0 %null %int_0", 6869fd4e5da5Sopenharmony_ci "Offset"), 6870fd4e5da5Sopenharmony_ci std::make_pair( 6871fd4e5da5Sopenharmony_ci "ArgumentPointerPushConstant %decl %int_0 %int_0 %float_0", "Size"), 6872fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerPushConstant %decl %int_0 %int_0 %null", 6873fd4e5da5Sopenharmony_ci "Size"), 6874fd4e5da5Sopenharmony_ci std::make_pair( 6875fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %float_0 %int_0 %int_0 %int_0 %int_4", 6876fd4e5da5Sopenharmony_ci "Ordinal"), 6877fd4e5da5Sopenharmony_ci std::make_pair( 6878fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %null %int_0 %int_0 %int_0 %int_4", 6879fd4e5da5Sopenharmony_ci "Ordinal"), 6880fd4e5da5Sopenharmony_ci std::make_pair( 6881fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %float_0 %int_0 %int_0 %int_4", 6882fd4e5da5Sopenharmony_ci "DescriptorSet"), 6883fd4e5da5Sopenharmony_ci std::make_pair( 6884fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %null %int_0 %int_0 %int_4", 6885fd4e5da5Sopenharmony_ci "DescriptorSet"), 6886fd4e5da5Sopenharmony_ci std::make_pair( 6887fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %float_0 %int_0 %int_4", 6888fd4e5da5Sopenharmony_ci "Binding"), 6889fd4e5da5Sopenharmony_ci std::make_pair( 6890fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %null %int_0 %int_4", 6891fd4e5da5Sopenharmony_ci "Binding"), 6892fd4e5da5Sopenharmony_ci std::make_pair( 6893fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %float_0 %int_4", 6894fd4e5da5Sopenharmony_ci "Offset"), 6895fd4e5da5Sopenharmony_ci std::make_pair( 6896fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %null %int_4", 6897fd4e5da5Sopenharmony_ci "Offset"), 6898fd4e5da5Sopenharmony_ci std::make_pair( 6899fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %float_0", 6900fd4e5da5Sopenharmony_ci "Size"), 6901fd4e5da5Sopenharmony_ci std::make_pair( 6902fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %null", 6903fd4e5da5Sopenharmony_ci "Size"), 6904fd4e5da5Sopenharmony_ci std::make_pair( 6905fd4e5da5Sopenharmony_ci "ProgramScopeVariablesStorageBuffer %float_0 %int_0 %data", 6906fd4e5da5Sopenharmony_ci "DescriptorSet"), 6907fd4e5da5Sopenharmony_ci std::make_pair("ProgramScopeVariablesStorageBuffer %null %int_0 %data", 6908fd4e5da5Sopenharmony_ci "DescriptorSet"), 6909fd4e5da5Sopenharmony_ci std::make_pair( 6910fd4e5da5Sopenharmony_ci "ProgramScopeVariablesStorageBuffer %int_0 %float_0 %data", 6911fd4e5da5Sopenharmony_ci "Binding"), 6912fd4e5da5Sopenharmony_ci std::make_pair("ProgramScopeVariablesStorageBuffer %int_0 %null %data", 6913fd4e5da5Sopenharmony_ci "Binding"), 6914fd4e5da5Sopenharmony_ci std::make_pair( 6915fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %float_0 %int_0 %int_4", 6916fd4e5da5Sopenharmony_ci "ObjectOffset"), 6917fd4e5da5Sopenharmony_ci std::make_pair( 6918fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %null %int_0 %int_4", 6919fd4e5da5Sopenharmony_ci "ObjectOffset"), 6920fd4e5da5Sopenharmony_ci std::make_pair( 6921fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %int_0 %float_0 %int_4", 6922fd4e5da5Sopenharmony_ci "PointerOffset"), 6923fd4e5da5Sopenharmony_ci std::make_pair( 6924fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %int_0 %null %int_4", 6925fd4e5da5Sopenharmony_ci "PointerOffset"), 6926fd4e5da5Sopenharmony_ci std::make_pair( 6927fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %int_0 %int_0 %float_0", 6928fd4e5da5Sopenharmony_ci "PointerSize"), 6929fd4e5da5Sopenharmony_ci std::make_pair( 6930fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %int_0 %int_0 %null", 6931fd4e5da5Sopenharmony_ci "PointerSize"), 6932fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl " 6933fd4e5da5Sopenharmony_ci "%float_0 %int_0 %int_4", 6934fd4e5da5Sopenharmony_ci "Ordinal"), 6935fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %null " 6936fd4e5da5Sopenharmony_ci "%int_0 %int_4", 6937fd4e5da5Sopenharmony_ci "Ordinal"), 6938fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 " 6939fd4e5da5Sopenharmony_ci "%float_0 %int_4", 6940fd4e5da5Sopenharmony_ci "Offset"), 6941fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 " 6942fd4e5da5Sopenharmony_ci "%null %int_4", 6943fd4e5da5Sopenharmony_ci "Offset"), 6944fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 " 6945fd4e5da5Sopenharmony_ci "%int_0 %float_0", 6946fd4e5da5Sopenharmony_ci "Size"), 6947fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 " 6948fd4e5da5Sopenharmony_ci "%int_0 %null", 6949fd4e5da5Sopenharmony_ci "Size"), 6950fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6951fd4e5da5Sopenharmony_ci "%float_0 %int_0 %int_4", 6952fd4e5da5Sopenharmony_ci "Ordinal"), 6953fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6954fd4e5da5Sopenharmony_ci "%null %int_0 %int_4", 6955fd4e5da5Sopenharmony_ci "Ordinal"), 6956fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6957fd4e5da5Sopenharmony_ci "%int_0 %float_0 %int_4", 6958fd4e5da5Sopenharmony_ci "Offset"), 6959fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6960fd4e5da5Sopenharmony_ci "%int_0 %null %int_4", 6961fd4e5da5Sopenharmony_ci "Offset"), 6962fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6963fd4e5da5Sopenharmony_ci "%int_0 %int_0 %float_0", 6964fd4e5da5Sopenharmony_ci "Size"), 6965fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 6966fd4e5da5Sopenharmony_ci "%int_0 %int_0 %null", 6967fd4e5da5Sopenharmony_ci "Size"), 6968fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %float_0 " 6969fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_4", 6970fd4e5da5Sopenharmony_ci "Ordinal"), 6971fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %null " 6972fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_4", 6973fd4e5da5Sopenharmony_ci "Ordinal"), 6974fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6975fd4e5da5Sopenharmony_ci "%float_0 %int_0 %int_0 %int_4", 6976fd4e5da5Sopenharmony_ci "DescriptorSet"), 6977fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6978fd4e5da5Sopenharmony_ci "%null %int_0 %int_0 %int_4", 6979fd4e5da5Sopenharmony_ci "DescriptorSet"), 6980fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6981fd4e5da5Sopenharmony_ci "%int_0 %float_0 %int_0 %int_4", 6982fd4e5da5Sopenharmony_ci "Binding"), 6983fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6984fd4e5da5Sopenharmony_ci "%int_0 %null %int_0 %int_4", 6985fd4e5da5Sopenharmony_ci "Binding"), 6986fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6987fd4e5da5Sopenharmony_ci "%int_0 %int_0 %float_0 %int_4", 6988fd4e5da5Sopenharmony_ci "Offset"), 6989fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6990fd4e5da5Sopenharmony_ci "%int_0 %int_0 %null %int_4", 6991fd4e5da5Sopenharmony_ci "Offset"), 6992fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6993fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %float_0", 6994fd4e5da5Sopenharmony_ci "Size"), 6995fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 6996fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %null", 6997fd4e5da5Sopenharmony_ci "Size"), 6998fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %float_0 " 6999fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_4", 7000fd4e5da5Sopenharmony_ci "Ordinal"), 7001fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %null " 7002fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_4", 7003fd4e5da5Sopenharmony_ci "Ordinal"), 7004fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7005fd4e5da5Sopenharmony_ci "%float_0 %int_0 %int_0 %int_4", 7006fd4e5da5Sopenharmony_ci "DescriptorSet"), 7007fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7008fd4e5da5Sopenharmony_ci "%null %int_0 %int_0 %int_4", 7009fd4e5da5Sopenharmony_ci "DescriptorSet"), 7010fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7011fd4e5da5Sopenharmony_ci "%int_0 %float_0 %int_0 %int_4", 7012fd4e5da5Sopenharmony_ci "Binding"), 7013fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7014fd4e5da5Sopenharmony_ci "%int_0 %null %int_0 %int_4", 7015fd4e5da5Sopenharmony_ci "Binding"), 7016fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7017fd4e5da5Sopenharmony_ci "%int_0 %int_0 %float_0 %int_4", 7018fd4e5da5Sopenharmony_ci "Offset"), 7019fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7020fd4e5da5Sopenharmony_ci "%int_0 %int_0 %null %int_4", 7021fd4e5da5Sopenharmony_ci "Offset"), 7022fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7023fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %float_0", 7024fd4e5da5Sopenharmony_ci "Size"), 7025fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7026fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %null", 7027fd4e5da5Sopenharmony_ci "Size"), 7028fd4e5da5Sopenharmony_ci std::make_pair( 7029fd4e5da5Sopenharmony_ci "ArgumentStorageTexelBuffer %decl %float_0 %int_0 %int_0", 7030fd4e5da5Sopenharmony_ci "Ordinal"), 7031fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageTexelBuffer %decl %null %int_0 %int_0", 7032fd4e5da5Sopenharmony_ci "Ordinal"), 7033fd4e5da5Sopenharmony_ci std::make_pair( 7034fd4e5da5Sopenharmony_ci "ArgumentStorageTexelBuffer %decl %int_0 %float_0 %int_0", 7035fd4e5da5Sopenharmony_ci "DescriptorSet"), 7036fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %null %int_0", 7037fd4e5da5Sopenharmony_ci "DescriptorSet"), 7038fd4e5da5Sopenharmony_ci std::make_pair( 7039fd4e5da5Sopenharmony_ci "ArgumentStorageTexelBuffer %decl %int_0 %int_0 %float_0", 7040fd4e5da5Sopenharmony_ci "Binding"), 7041fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %int_0 %null", 7042fd4e5da5Sopenharmony_ci "Binding"), 7043fd4e5da5Sopenharmony_ci std::make_pair( 7044fd4e5da5Sopenharmony_ci "ArgumentUniformTexelBuffer %decl %float_0 %int_0 %int_0", 7045fd4e5da5Sopenharmony_ci "Ordinal"), 7046fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniformTexelBuffer %decl %null %int_0 %int_0", 7047fd4e5da5Sopenharmony_ci "Ordinal"), 7048fd4e5da5Sopenharmony_ci std::make_pair( 7049fd4e5da5Sopenharmony_ci "ArgumentUniformTexelBuffer %decl %int_0 %float_0 %int_0", 7050fd4e5da5Sopenharmony_ci "DescriptorSet"), 7051fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %null %int_0", 7052fd4e5da5Sopenharmony_ci "DescriptorSet"), 7053fd4e5da5Sopenharmony_ci std::make_pair( 7054fd4e5da5Sopenharmony_ci "ArgumentUniformTexelBuffer %decl %int_0 %int_0 %float_0", 7055fd4e5da5Sopenharmony_ci "Binding"), 7056fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %int_0 %null", 7057fd4e5da5Sopenharmony_ci "Binding"), 7058fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %float_0 %int_4 %data", 7059fd4e5da5Sopenharmony_ci "Offset"), 7060fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %null %int_4 %data", 7061fd4e5da5Sopenharmony_ci "Offset"), 7062fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %int_0 %float_0 %data", 7063fd4e5da5Sopenharmony_ci "Size"), 7064fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %int_0 %null %data", 7065fd4e5da5Sopenharmony_ci "Size"), 7066fd4e5da5Sopenharmony_ci std::make_pair( 7067fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %float_0 %int_4 %data", 7068fd4e5da5Sopenharmony_ci "Offset"), 7069fd4e5da5Sopenharmony_ci std::make_pair( 7070fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %null %int_4 %data", 7071fd4e5da5Sopenharmony_ci "Offset"), 7072fd4e5da5Sopenharmony_ci std::make_pair( 7073fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %int_0 %float_0 %data", 7074fd4e5da5Sopenharmony_ci "Size"), 7075fd4e5da5Sopenharmony_ci std::make_pair( 7076fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %int_0 %null %data", 7077fd4e5da5Sopenharmony_ci "Size"), 7078fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %float_0 %data %int_0 %int_0 %int_0", 7079fd4e5da5Sopenharmony_ci "PrintfID"), 7080fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %null %data %int_0 %int_0 %int_0", 7081fd4e5da5Sopenharmony_ci "PrintfID"), 7082fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %float_0 %int_0 %int_0", 7083fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7084fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %null %int_0 %int_0", 7085fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7086fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %float_0 %int_0", 7087fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7088fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %null %int_0", 7089fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7090fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %int_0 %null", 7091fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7092fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %int_0 %float_0", 7093fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7094fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %float_0", 7095fd4e5da5Sopenharmony_ci "ArgumentSizes"), 7096fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data %int_0 %null", "ArgumentSizes"), 7097fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %float_0 %int_0 %int_4", 7098fd4e5da5Sopenharmony_ci "DescriptorSet"), 7099fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %null %int_0 %int_4", 7100fd4e5da5Sopenharmony_ci "DescriptorSet"), 7101fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %int_0 %float_0 %int_4", 7102fd4e5da5Sopenharmony_ci "Binding"), 7103fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %int_0 %null %int_4", 7104fd4e5da5Sopenharmony_ci "Binding"), 7105fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %float_0", 7106fd4e5da5Sopenharmony_ci "Size"), 7107fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %null", "Size"), 7108fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %float_0 %int_0 %int_4", 7109fd4e5da5Sopenharmony_ci "Offset"), 7110fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %null %int_0 %int_4", 7111fd4e5da5Sopenharmony_ci "Offset"), 7112fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %int_0 %float_0 %int_4", 7113fd4e5da5Sopenharmony_ci "Size"), 7114fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %int_0 %null %int_4", 7115fd4e5da5Sopenharmony_ci "Size"), 7116fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %float_0", 7117fd4e5da5Sopenharmony_ci "BufferSize"), 7118fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %null", 7119fd4e5da5Sopenharmony_ci "BufferSize")})); 7120fd4e5da5Sopenharmony_ci 7121fd4e5da5Sopenharmony_ciTEST_P(Uint32Constant, Invalid) { 7122fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7123fd4e5da5Sopenharmony_ci const std::string name = std::get<1>(GetParam()); 7124fd4e5da5Sopenharmony_ci const std::string text = R"( 7125fd4e5da5Sopenharmony_ciOpCapability Shader 7126fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7127fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 7128fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7129fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7130fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7131fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7132fd4e5da5Sopenharmony_ci%data = OpString "1234" 7133fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7134fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7135fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7136fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7137fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7138fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7139fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7140fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7141fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7142fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7143fd4e5da5Sopenharmony_ci%entry = OpLabel 7144fd4e5da5Sopenharmony_ciOpReturn 7145fd4e5da5Sopenharmony_ciOpFunctionEnd 7146fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7147fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7148fd4e5da5Sopenharmony_ci ext_inst; 7149fd4e5da5Sopenharmony_ci 7150fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7151fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7152fd4e5da5Sopenharmony_ci EXPECT_THAT( 7153fd4e5da5Sopenharmony_ci getDiagnosticString(), 7154fd4e5da5Sopenharmony_ci HasSubstr(name + " must be a 32-bit unsigned integer OpConstant")); 7155fd4e5da5Sopenharmony_ci} 7156fd4e5da5Sopenharmony_ci 7157fd4e5da5Sopenharmony_ciusing StringOperand = 7158fd4e5da5Sopenharmony_ci spvtest::ValidateBase<std::pair<std::string, std::string>>; 7159fd4e5da5Sopenharmony_ci 7160fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P( 7161fd4e5da5Sopenharmony_ci ValidateClspvReflectionStringOperands, StringOperand, 7162fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{ 7163fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %int_0 %int_0 %int_0", 7164fd4e5da5Sopenharmony_ci "Data"), 7165fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %int_0 %int_0 %int_0", "Data"), 7166fd4e5da5Sopenharmony_ci std::make_pair( 7167fd4e5da5Sopenharmony_ci "ProgramScopeVariablesStorageBuffer %int_0 %int_0 %int_0", "Data"), 7168fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %int_0 %int_0 %int_0", 7169fd4e5da5Sopenharmony_ci "Data"), 7170fd4e5da5Sopenharmony_ci std::make_pair( 7171fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %int_0 %int_0 %int_0", 7172fd4e5da5Sopenharmony_ci "Data"), 7173fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %int_0", "FormatString")})); 7174fd4e5da5Sopenharmony_ci 7175fd4e5da5Sopenharmony_ciTEST_P(StringOperand, Invalid) { 7176fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7177fd4e5da5Sopenharmony_ci const std::string name = std::get<1>(GetParam()); 7178fd4e5da5Sopenharmony_ci const std::string text = R"( 7179fd4e5da5Sopenharmony_ciOpCapability Shader 7180fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7181fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 7182fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7183fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7184fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7185fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7186fd4e5da5Sopenharmony_ci%data = OpString "1234" 7187fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7188fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7189fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7190fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7191fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7192fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7193fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7194fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7195fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7196fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7197fd4e5da5Sopenharmony_ci%entry = OpLabel 7198fd4e5da5Sopenharmony_ciOpReturn 7199fd4e5da5Sopenharmony_ciOpFunctionEnd 7200fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7201fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7202fd4e5da5Sopenharmony_ci ext_inst; 7203fd4e5da5Sopenharmony_ci 7204fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7205fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7206fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), HasSubstr(name + " must be an OpString")); 7207fd4e5da5Sopenharmony_ci} 7208fd4e5da5Sopenharmony_ci 7209fd4e5da5Sopenharmony_ciusing VersionCheck = spvtest::ValidateBase<std::pair<std::string, uint32_t>>; 7210fd4e5da5Sopenharmony_ci 7211fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P( 7212fd4e5da5Sopenharmony_ci ValidateClspvReflectionVersionCheck, VersionCheck, 7213fd4e5da5Sopenharmony_ci ::testing::ValuesIn(std::vector<std::pair<std::string, uint32_t>>{ 7214fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %int_0", 1), 7215fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniform %decl %int_0 %int_0 %int_0", 1), 7216fd4e5da5Sopenharmony_ci std::make_pair( 7217fd4e5da5Sopenharmony_ci "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %int_0 %int_0", 7218fd4e5da5Sopenharmony_ci 1), 7219fd4e5da5Sopenharmony_ci std::make_pair( 7220fd4e5da5Sopenharmony_ci "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %int_0", 1), 7221fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %int_0", 1), 7222fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %int_0", 1), 7223fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %int_0", 1), 7224fd4e5da5Sopenharmony_ci std::make_pair("ArgumentSampler %decl %int_0 %int_0 %int_0", 1), 7225fd4e5da5Sopenharmony_ci std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %int_0", 1), 7226fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %int_0", 1), 7227fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %int_0", 1), 7228fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantWorkDim %int_0", 1), 7229fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalOffset %int_0 %int_0", 1), 7230fd4e5da5Sopenharmony_ci std::make_pair("PushConstantEnqueuedLocalSize %int_0 %int_0", 1), 7231fd4e5da5Sopenharmony_ci std::make_pair("PushConstantGlobalSize %int_0 %int_0", 1), 7232fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionOffset %int_0 %int_0", 1), 7233fd4e5da5Sopenharmony_ci std::make_pair("PushConstantNumWorkgroups %int_0 %int_0", 1), 7234fd4e5da5Sopenharmony_ci std::make_pair("PushConstantRegionGroupOffset %int_0 %int_0", 1), 7235fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataStorageBuffer %int_0 %int_0 %data", 1), 7236fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataUniform %int_0 %int_0 %data", 1), 7237fd4e5da5Sopenharmony_ci std::make_pair("LiteralSampler %int_0 %int_0 %int_0", 1), 7238fd4e5da5Sopenharmony_ci std::make_pair( 7239fd4e5da5Sopenharmony_ci "PropertyRequiredWorkgroupSize %decl %int_0 %int_0 %int_0", 1), 7240fd4e5da5Sopenharmony_ci std::make_pair("SpecConstantSubgroupMaxSize %int_0", 2), 7241fd4e5da5Sopenharmony_ci std::make_pair("ArgumentPointerPushConstant %decl %int_0 %int_0 %int_0", 7242fd4e5da5Sopenharmony_ci 3), 7243fd4e5da5Sopenharmony_ci std::make_pair( 7244fd4e5da5Sopenharmony_ci "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %int_0", 7245fd4e5da5Sopenharmony_ci 3), 7246fd4e5da5Sopenharmony_ci std::make_pair("ProgramScopeVariablesStorageBuffer %int_0 %int_0 %data", 7247fd4e5da5Sopenharmony_ci 3), 7248fd4e5da5Sopenharmony_ci std::make_pair( 7249fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerRelocation %int_0 %int_0 %int_0", 3), 7250fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 " 7251fd4e5da5Sopenharmony_ci "%int_0 %int_0", 7252fd4e5da5Sopenharmony_ci 3), 7253fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl " 7254fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0", 7255fd4e5da5Sopenharmony_ci 3), 7256fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 " 7257fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_0", 7258fd4e5da5Sopenharmony_ci 3), 7259fd4e5da5Sopenharmony_ci std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 " 7260fd4e5da5Sopenharmony_ci "%int_0 %int_0 %int_0 %int_0", 7261fd4e5da5Sopenharmony_ci 3), 7262fd4e5da5Sopenharmony_ci std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %int_0 %int_0", 7263fd4e5da5Sopenharmony_ci 4), 7264fd4e5da5Sopenharmony_ci std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %int_0 %int_0", 7265fd4e5da5Sopenharmony_ci 4), 7266fd4e5da5Sopenharmony_ci std::make_pair("ConstantDataPointerPushConstant %int_0 %int_0 %data", 7267fd4e5da5Sopenharmony_ci 5), 7268fd4e5da5Sopenharmony_ci std::make_pair( 7269fd4e5da5Sopenharmony_ci "ProgramScopeVariablePointerPushConstant %int_0 %int_0 %data", 5), 7270fd4e5da5Sopenharmony_ci std::make_pair("PrintfInfo %int_0 %data", 5), 7271fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %int_0", 5), 7272fd4e5da5Sopenharmony_ci std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %int_0", 7273fd4e5da5Sopenharmony_ci 5)})); 7274fd4e5da5Sopenharmony_ci 7275fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V1) { 7276fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7277fd4e5da5Sopenharmony_ci const uint32_t version = std::get<1>(GetParam()); 7278fd4e5da5Sopenharmony_ci const std::string text = R"( 7279fd4e5da5Sopenharmony_ciOpCapability Shader 7280fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7281fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1" 7282fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7283fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7284fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7285fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7286fd4e5da5Sopenharmony_ci%data = OpString "1234" 7287fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7288fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7289fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7290fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7291fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7292fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7293fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7294fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7295fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7296fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7297fd4e5da5Sopenharmony_ci%entry = OpLabel 7298fd4e5da5Sopenharmony_ciOpReturn 7299fd4e5da5Sopenharmony_ciOpFunctionEnd 7300fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7301fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7302fd4e5da5Sopenharmony_ci ext_inst; 7303fd4e5da5Sopenharmony_ci 7304fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7305fd4e5da5Sopenharmony_ci if (version <= 1) { 7306fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); 7307fd4e5da5Sopenharmony_ci } else { 7308fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7309fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 7310fd4e5da5Sopenharmony_ci HasSubstr("requires version " + std::to_string(version) + 7311fd4e5da5Sopenharmony_ci ", but parsed version is 1")); 7312fd4e5da5Sopenharmony_ci } 7313fd4e5da5Sopenharmony_ci} 7314fd4e5da5Sopenharmony_ci 7315fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V2) { 7316fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7317fd4e5da5Sopenharmony_ci const uint32_t version = std::get<1>(GetParam()); 7318fd4e5da5Sopenharmony_ci const std::string text = R"( 7319fd4e5da5Sopenharmony_ciOpCapability Shader 7320fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7321fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.2" 7322fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7323fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7324fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7325fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7326fd4e5da5Sopenharmony_ci%data = OpString "1234" 7327fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7328fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7329fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7330fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7331fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7332fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7333fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7334fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7335fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7336fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7337fd4e5da5Sopenharmony_ci%entry = OpLabel 7338fd4e5da5Sopenharmony_ciOpReturn 7339fd4e5da5Sopenharmony_ciOpFunctionEnd 7340fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7341fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7342fd4e5da5Sopenharmony_ci ext_inst; 7343fd4e5da5Sopenharmony_ci 7344fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7345fd4e5da5Sopenharmony_ci if (version <= 2) { 7346fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); 7347fd4e5da5Sopenharmony_ci } else { 7348fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7349fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 7350fd4e5da5Sopenharmony_ci HasSubstr("requires version " + std::to_string(version) + 7351fd4e5da5Sopenharmony_ci ", but parsed version is 2")); 7352fd4e5da5Sopenharmony_ci } 7353fd4e5da5Sopenharmony_ci} 7354fd4e5da5Sopenharmony_ci 7355fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V3) { 7356fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7357fd4e5da5Sopenharmony_ci const uint32_t version = std::get<1>(GetParam()); 7358fd4e5da5Sopenharmony_ci const std::string text = R"( 7359fd4e5da5Sopenharmony_ciOpCapability Shader 7360fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7361fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.3" 7362fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7363fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7364fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7365fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7366fd4e5da5Sopenharmony_ci%data = OpString "1234" 7367fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7368fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7369fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7370fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7371fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7372fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7373fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7374fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7375fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7376fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7377fd4e5da5Sopenharmony_ci%entry = OpLabel 7378fd4e5da5Sopenharmony_ciOpReturn 7379fd4e5da5Sopenharmony_ciOpFunctionEnd 7380fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7381fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7382fd4e5da5Sopenharmony_ci ext_inst; 7383fd4e5da5Sopenharmony_ci 7384fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7385fd4e5da5Sopenharmony_ci if (version <= 3) { 7386fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); 7387fd4e5da5Sopenharmony_ci } else { 7388fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7389fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 7390fd4e5da5Sopenharmony_ci HasSubstr("requires version " + std::to_string(version) + 7391fd4e5da5Sopenharmony_ci ", but parsed version is 3")); 7392fd4e5da5Sopenharmony_ci } 7393fd4e5da5Sopenharmony_ci} 7394fd4e5da5Sopenharmony_ci 7395fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V4) { 7396fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7397fd4e5da5Sopenharmony_ci const uint32_t version = std::get<1>(GetParam()); 7398fd4e5da5Sopenharmony_ci const std::string text = R"( 7399fd4e5da5Sopenharmony_ciOpCapability Shader 7400fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7401fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.4" 7402fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7403fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7404fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7405fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7406fd4e5da5Sopenharmony_ci%data = OpString "1234" 7407fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7408fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7409fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7410fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7411fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7412fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7413fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7414fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7415fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7416fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7417fd4e5da5Sopenharmony_ci%entry = OpLabel 7418fd4e5da5Sopenharmony_ciOpReturn 7419fd4e5da5Sopenharmony_ciOpFunctionEnd 7420fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7421fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7422fd4e5da5Sopenharmony_ci ext_inst; 7423fd4e5da5Sopenharmony_ci 7424fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7425fd4e5da5Sopenharmony_ci if (version <= 4) { 7426fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); 7427fd4e5da5Sopenharmony_ci } else { 7428fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7429fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 7430fd4e5da5Sopenharmony_ci HasSubstr("requires version " + std::to_string(version) + 7431fd4e5da5Sopenharmony_ci ", but parsed version is 4")); 7432fd4e5da5Sopenharmony_ci } 7433fd4e5da5Sopenharmony_ci} 7434fd4e5da5Sopenharmony_ci 7435fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V5) { 7436fd4e5da5Sopenharmony_ci const std::string ext_inst = std::get<0>(GetParam()); 7437fd4e5da5Sopenharmony_ci const uint32_t version = std::get<1>(GetParam()); 7438fd4e5da5Sopenharmony_ci const std::string text = R"( 7439fd4e5da5Sopenharmony_ciOpCapability Shader 7440fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info" 7441fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5" 7442fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 7443fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo" 7444fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1 7445fd4e5da5Sopenharmony_ci%foo_name = OpString "foo" 7446fd4e5da5Sopenharmony_ci%data = OpString "1234" 7447fd4e5da5Sopenharmony_ci%void = OpTypeVoid 7448fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 7449fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0 7450fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1 7451fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4 7452fd4e5da5Sopenharmony_ci%null = OpConstantNull %int 7453fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32 7454fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0 7455fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 7456fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn 7457fd4e5da5Sopenharmony_ci%entry = OpLabel 7458fd4e5da5Sopenharmony_ciOpReturn 7459fd4e5da5Sopenharmony_ciOpFunctionEnd 7460fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name 7461fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" + 7462fd4e5da5Sopenharmony_ci ext_inst; 7463fd4e5da5Sopenharmony_ci 7464fd4e5da5Sopenharmony_ci CompileSuccessfully(text); 7465fd4e5da5Sopenharmony_ci if (version <= 5) { 7466fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); 7467fd4e5da5Sopenharmony_ci } else { 7468fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); 7469fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 7470fd4e5da5Sopenharmony_ci HasSubstr("requires version " + std::to_string(version) + 7471fd4e5da5Sopenharmony_ci ", but parsed version is 1")); 7472fd4e5da5Sopenharmony_ci } 7473fd4e5da5Sopenharmony_ci} 7474fd4e5da5Sopenharmony_ci 7475fd4e5da5Sopenharmony_ci} // namespace 7476fd4e5da5Sopenharmony_ci} // namespace val 7477fd4e5da5Sopenharmony_ci} // namespace spvtools 7478