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 for unique type declaration rules validator. 16fd4e5da5Sopenharmony_ci 17fd4e5da5Sopenharmony_ci#include <string> 18fd4e5da5Sopenharmony_ci 19fd4e5da5Sopenharmony_ci#include "gmock/gmock.h" 20fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h" 21fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h" 22fd4e5da5Sopenharmony_ci 23fd4e5da5Sopenharmony_cinamespace spvtools { 24fd4e5da5Sopenharmony_cinamespace val { 25fd4e5da5Sopenharmony_cinamespace { 26fd4e5da5Sopenharmony_ci 27fd4e5da5Sopenharmony_ciusing ::testing::Eq; 28fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr; 29fd4e5da5Sopenharmony_ciusing ::testing::Not; 30fd4e5da5Sopenharmony_ci 31fd4e5da5Sopenharmony_ciusing ValidateLogicals = spvtest::ValidateBase<bool>; 32fd4e5da5Sopenharmony_ci 33fd4e5da5Sopenharmony_cistd::string GenerateShaderCode( 34fd4e5da5Sopenharmony_ci const std::string& body, 35fd4e5da5Sopenharmony_ci const std::string& capabilities_and_extensions = "") { 36fd4e5da5Sopenharmony_ci const std::string capabilities = 37fd4e5da5Sopenharmony_ci R"( 38fd4e5da5Sopenharmony_ciOpCapability Shader 39fd4e5da5Sopenharmony_ciOpCapability Int64 40fd4e5da5Sopenharmony_ciOpCapability Float64)"; 41fd4e5da5Sopenharmony_ci 42fd4e5da5Sopenharmony_ci const std::string after_extension_before_body = 43fd4e5da5Sopenharmony_ci R"( 44fd4e5da5Sopenharmony_ci%ext_inst = OpExtInstImport "GLSL.std.450" 45fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 46fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" 47fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft 48fd4e5da5Sopenharmony_ci%void = OpTypeVoid 49fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void 50fd4e5da5Sopenharmony_ci%bool = OpTypeBool 51fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32 52fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0 53fd4e5da5Sopenharmony_ci%s32 = OpTypeInt 32 1 54fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64 55fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0 56fd4e5da5Sopenharmony_ci%s64 = OpTypeInt 64 1 57fd4e5da5Sopenharmony_ci%boolvec2 = OpTypeVector %bool 2 58fd4e5da5Sopenharmony_ci%s32vec2 = OpTypeVector %s32 2 59fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2 60fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2 61fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2 62fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2 63fd4e5da5Sopenharmony_ci%boolvec3 = OpTypeVector %bool 3 64fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3 65fd4e5da5Sopenharmony_ci%u64vec3 = OpTypeVector %u64 3 66fd4e5da5Sopenharmony_ci%s32vec3 = OpTypeVector %s32 3 67fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3 68fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3 69fd4e5da5Sopenharmony_ci%boolvec4 = OpTypeVector %bool 4 70fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4 71fd4e5da5Sopenharmony_ci%u64vec4 = OpTypeVector %u64 4 72fd4e5da5Sopenharmony_ci%s32vec4 = OpTypeVector %s32 4 73fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4 74fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4 75fd4e5da5Sopenharmony_ci 76fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0 77fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1 78fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2 79fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3 80fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4 81fd4e5da5Sopenharmony_ci 82fd4e5da5Sopenharmony_ci%s32_0 = OpConstant %s32 0 83fd4e5da5Sopenharmony_ci%s32_1 = OpConstant %s32 1 84fd4e5da5Sopenharmony_ci%s32_2 = OpConstant %s32 2 85fd4e5da5Sopenharmony_ci%s32_3 = OpConstant %s32 3 86fd4e5da5Sopenharmony_ci%s32_4 = OpConstant %s32 4 87fd4e5da5Sopenharmony_ci%s32_m1 = OpConstant %s32 -1 88fd4e5da5Sopenharmony_ci 89fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0 90fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1 91fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2 92fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3 93fd4e5da5Sopenharmony_ci%u32_4 = OpConstant %u32 4 94fd4e5da5Sopenharmony_ci 95fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0 96fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1 97fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2 98fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3 99fd4e5da5Sopenharmony_ci%f64_4 = OpConstant %f64 4 100fd4e5da5Sopenharmony_ci 101fd4e5da5Sopenharmony_ci%s64_0 = OpConstant %s64 0 102fd4e5da5Sopenharmony_ci%s64_1 = OpConstant %s64 1 103fd4e5da5Sopenharmony_ci%s64_2 = OpConstant %s64 2 104fd4e5da5Sopenharmony_ci%s64_3 = OpConstant %s64 3 105fd4e5da5Sopenharmony_ci%s64_4 = OpConstant %s64 4 106fd4e5da5Sopenharmony_ci%s64_m1 = OpConstant %s64 -1 107fd4e5da5Sopenharmony_ci 108fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0 109fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1 110fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2 111fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3 112fd4e5da5Sopenharmony_ci%u64_4 = OpConstant %u64 4 113fd4e5da5Sopenharmony_ci 114fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 115fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 116fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2 117fd4e5da5Sopenharmony_ci%u32vec3_123 = OpConstantComposite %u32vec3 %u32_1 %u32_2 %u32_3 118fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 119fd4e5da5Sopenharmony_ci%u32vec4_1234 = OpConstantComposite %u32vec4 %u32_1 %u32_2 %u32_3 %u32_4 120fd4e5da5Sopenharmony_ci 121fd4e5da5Sopenharmony_ci%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1 122fd4e5da5Sopenharmony_ci%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2 123fd4e5da5Sopenharmony_ci%s32vec3_012 = OpConstantComposite %s32vec3 %s32_0 %s32_1 %s32_2 124fd4e5da5Sopenharmony_ci%s32vec3_123 = OpConstantComposite %s32vec3 %s32_1 %s32_2 %s32_3 125fd4e5da5Sopenharmony_ci%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3 126fd4e5da5Sopenharmony_ci%s32vec4_1234 = OpConstantComposite %s32vec4 %s32_1 %s32_2 %s32_3 %s32_4 127fd4e5da5Sopenharmony_ci 128fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 129fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 130fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 131fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 132fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 133fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 134fd4e5da5Sopenharmony_ci 135fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 136fd4e5da5Sopenharmony_ci%f64vec2_12 = OpConstantComposite %f64vec2 %f64_1 %f64_2 137fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 138fd4e5da5Sopenharmony_ci%f64vec3_123 = OpConstantComposite %f64vec3 %f64_1 %f64_2 %f64_3 139fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 140fd4e5da5Sopenharmony_ci%f64vec4_1234 = OpConstantComposite %f64vec4 %f64_1 %f64_2 %f64_3 %f64_4 141fd4e5da5Sopenharmony_ci 142fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool 143fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool 144fd4e5da5Sopenharmony_ci%boolvec2_tf = OpConstantComposite %boolvec2 %true %false 145fd4e5da5Sopenharmony_ci%boolvec3_tft = OpConstantComposite %boolvec3 %true %false %true 146fd4e5da5Sopenharmony_ci%boolvec4_tftf = OpConstantComposite %boolvec4 %true %false %true %false 147fd4e5da5Sopenharmony_ci 148fd4e5da5Sopenharmony_ci%arr_u32_2 = OpTypeArray %u32 %u32_2 149fd4e5da5Sopenharmony_ci%st_u32_u32 = OpTypeStruct %u32 %u32 150fd4e5da5Sopenharmony_ci%mat_f32_2_2 = OpTypeMatrix %f32vec2 2 151fd4e5da5Sopenharmony_ci 152fd4e5da5Sopenharmony_ci%nul_arr_u32_2 = OpConstantNull %arr_u32_2 153fd4e5da5Sopenharmony_ci%nul_st_u32_u32 = OpConstantNull %st_u32_u32 154fd4e5da5Sopenharmony_ci%nul_mat_f32_2_2 = OpConstantNull %mat_f32_2_2 155fd4e5da5Sopenharmony_ci 156fd4e5da5Sopenharmony_ci%arr_u32_2_1_2 = OpConstantComposite %arr_u32_2 %u32_1 %u32_2 157fd4e5da5Sopenharmony_ci%st_u32_u32_1_2 = OpConstantComposite %st_u32_u32 %u32_1 %u32_2 158fd4e5da5Sopenharmony_ci%mat_f32_2_2_01_12 = OpConstantComposite %mat_f32_2_2 %f32vec2_01 %f32vec2_12 159fd4e5da5Sopenharmony_ci 160fd4e5da5Sopenharmony_ci%f32vec4ptr = OpTypePointer Function %f32vec4 161fd4e5da5Sopenharmony_ci 162fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func 163fd4e5da5Sopenharmony_ci%main_entry = OpLabel)"; 164fd4e5da5Sopenharmony_ci 165fd4e5da5Sopenharmony_ci const std::string after_body = 166fd4e5da5Sopenharmony_ci R"( 167fd4e5da5Sopenharmony_ciOpReturn 168fd4e5da5Sopenharmony_ciOpFunctionEnd)"; 169fd4e5da5Sopenharmony_ci 170fd4e5da5Sopenharmony_ci return capabilities + capabilities_and_extensions + 171fd4e5da5Sopenharmony_ci after_extension_before_body + body + after_body; 172fd4e5da5Sopenharmony_ci} 173fd4e5da5Sopenharmony_ci 174fd4e5da5Sopenharmony_cistd::string GenerateKernelCode( 175fd4e5da5Sopenharmony_ci const std::string& body, 176fd4e5da5Sopenharmony_ci const std::string& capabilities_and_extensions = "") { 177fd4e5da5Sopenharmony_ci const std::string capabilities = 178fd4e5da5Sopenharmony_ci R"( 179fd4e5da5Sopenharmony_ciOpCapability Addresses 180fd4e5da5Sopenharmony_ciOpCapability Kernel 181fd4e5da5Sopenharmony_ciOpCapability Linkage 182fd4e5da5Sopenharmony_ciOpCapability Int64 183fd4e5da5Sopenharmony_ciOpCapability Float64)"; 184fd4e5da5Sopenharmony_ci 185fd4e5da5Sopenharmony_ci const std::string after_extension_before_body = 186fd4e5da5Sopenharmony_ci R"( 187fd4e5da5Sopenharmony_ciOpMemoryModel Physical32 OpenCL 188fd4e5da5Sopenharmony_ci%void = OpTypeVoid 189fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void 190fd4e5da5Sopenharmony_ci%bool = OpTypeBool 191fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32 192fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0 193fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64 194fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0 195fd4e5da5Sopenharmony_ci%boolvec2 = OpTypeVector %bool 2 196fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2 197fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2 198fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2 199fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2 200fd4e5da5Sopenharmony_ci%boolvec3 = OpTypeVector %bool 3 201fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3 202fd4e5da5Sopenharmony_ci%u64vec3 = OpTypeVector %u64 3 203fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3 204fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3 205fd4e5da5Sopenharmony_ci%boolvec4 = OpTypeVector %bool 4 206fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4 207fd4e5da5Sopenharmony_ci%u64vec4 = OpTypeVector %u64 4 208fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4 209fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4 210fd4e5da5Sopenharmony_ci 211fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0 212fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1 213fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2 214fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3 215fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4 216fd4e5da5Sopenharmony_ci 217fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0 218fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1 219fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2 220fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3 221fd4e5da5Sopenharmony_ci%u32_4 = OpConstant %u32 4 222fd4e5da5Sopenharmony_ci 223fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0 224fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1 225fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2 226fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3 227fd4e5da5Sopenharmony_ci%f64_4 = OpConstant %f64 4 228fd4e5da5Sopenharmony_ci 229fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0 230fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1 231fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2 232fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3 233fd4e5da5Sopenharmony_ci%u64_4 = OpConstant %u64 4 234fd4e5da5Sopenharmony_ci 235fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 236fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 237fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2 238fd4e5da5Sopenharmony_ci%u32vec3_123 = OpConstantComposite %u32vec3 %u32_1 %u32_2 %u32_3 239fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 240fd4e5da5Sopenharmony_ci%u32vec4_1234 = OpConstantComposite %u32vec4 %u32_1 %u32_2 %u32_3 %u32_4 241fd4e5da5Sopenharmony_ci 242fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 243fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 244fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 245fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 246fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 247fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 248fd4e5da5Sopenharmony_ci 249fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 250fd4e5da5Sopenharmony_ci%f64vec2_12 = OpConstantComposite %f64vec2 %f64_1 %f64_2 251fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 252fd4e5da5Sopenharmony_ci%f64vec3_123 = OpConstantComposite %f64vec3 %f64_1 %f64_2 %f64_3 253fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 254fd4e5da5Sopenharmony_ci%f64vec4_1234 = OpConstantComposite %f64vec4 %f64_1 %f64_2 %f64_3 %f64_4 255fd4e5da5Sopenharmony_ci 256fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool 257fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool 258fd4e5da5Sopenharmony_ci%boolvec2_tf = OpConstantComposite %boolvec2 %true %false 259fd4e5da5Sopenharmony_ci%boolvec3_tft = OpConstantComposite %boolvec3 %true %false %true 260fd4e5da5Sopenharmony_ci%boolvec4_tftf = OpConstantComposite %boolvec4 %true %false %true %false 261fd4e5da5Sopenharmony_ci 262fd4e5da5Sopenharmony_ci%f32vec4ptr = OpTypePointer Function %f32vec4 263fd4e5da5Sopenharmony_ci 264fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func 265fd4e5da5Sopenharmony_ci%main_entry = OpLabel)"; 266fd4e5da5Sopenharmony_ci 267fd4e5da5Sopenharmony_ci const std::string after_body = 268fd4e5da5Sopenharmony_ci R"( 269fd4e5da5Sopenharmony_ciOpReturn 270fd4e5da5Sopenharmony_ciOpFunctionEnd)"; 271fd4e5da5Sopenharmony_ci 272fd4e5da5Sopenharmony_ci return capabilities + capabilities_and_extensions + 273fd4e5da5Sopenharmony_ci after_extension_before_body + body + after_body; 274fd4e5da5Sopenharmony_ci} 275fd4e5da5Sopenharmony_ci 276fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnySuccess) { 277fd4e5da5Sopenharmony_ci const std::string body = R"( 278fd4e5da5Sopenharmony_ci%val1 = OpAny %bool %boolvec2_tf 279fd4e5da5Sopenharmony_ci%val2 = OpAny %bool %boolvec3_tft 280fd4e5da5Sopenharmony_ci%val3 = OpAny %bool %boolvec4_tftf 281fd4e5da5Sopenharmony_ci)"; 282fd4e5da5Sopenharmony_ci 283fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 284fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 285fd4e5da5Sopenharmony_ci} 286fd4e5da5Sopenharmony_ci 287fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnyWrongTypeId) { 288fd4e5da5Sopenharmony_ci const std::string body = R"( 289fd4e5da5Sopenharmony_ci%val = OpAny %u32 %boolvec2_tf 290fd4e5da5Sopenharmony_ci)"; 291fd4e5da5Sopenharmony_ci 292fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 293fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 294fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 295fd4e5da5Sopenharmony_ci HasSubstr("Expected bool scalar type as Result Type: Any")); 296fd4e5da5Sopenharmony_ci} 297fd4e5da5Sopenharmony_ci 298fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpAnyWrongOperand) { 299fd4e5da5Sopenharmony_ci const std::string body = R"( 300fd4e5da5Sopenharmony_ci%val = OpAny %bool %u32vec3_123 301fd4e5da5Sopenharmony_ci)"; 302fd4e5da5Sopenharmony_ci 303fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 304fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 305fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 306fd4e5da5Sopenharmony_ci HasSubstr("Expected operand to be vector bool: Any")); 307fd4e5da5Sopenharmony_ci} 308fd4e5da5Sopenharmony_ci 309fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanSuccess) { 310fd4e5da5Sopenharmony_ci const std::string body = R"( 311fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %f32_1 312fd4e5da5Sopenharmony_ci%val2 = OpIsNan %bool %f64_0 313fd4e5da5Sopenharmony_ci%val3 = OpIsNan %boolvec2 %f32vec2_12 314fd4e5da5Sopenharmony_ci%val4 = OpIsNan %boolvec3 %f32vec3_123 315fd4e5da5Sopenharmony_ci%val5 = OpIsNan %boolvec4 %f32vec4_1234 316fd4e5da5Sopenharmony_ci)"; 317fd4e5da5Sopenharmony_ci 318fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 319fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 320fd4e5da5Sopenharmony_ci} 321fd4e5da5Sopenharmony_ci 322fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanWrongTypeId) { 323fd4e5da5Sopenharmony_ci const std::string body = R"( 324fd4e5da5Sopenharmony_ci%val1 = OpIsNan %u32 %f32_1 325fd4e5da5Sopenharmony_ci)"; 326fd4e5da5Sopenharmony_ci 327fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 328fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 329fd4e5da5Sopenharmony_ci EXPECT_THAT( 330fd4e5da5Sopenharmony_ci getDiagnosticString(), 331fd4e5da5Sopenharmony_ci HasSubstr("Expected bool scalar or vector type as Result Type: IsNan")); 332fd4e5da5Sopenharmony_ci} 333fd4e5da5Sopenharmony_ci 334fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanOperandNotFloat) { 335fd4e5da5Sopenharmony_ci const std::string body = R"( 336fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %u32_1 337fd4e5da5Sopenharmony_ci)"; 338fd4e5da5Sopenharmony_ci 339fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 340fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 341fd4e5da5Sopenharmony_ci EXPECT_THAT( 342fd4e5da5Sopenharmony_ci getDiagnosticString(), 343fd4e5da5Sopenharmony_ci HasSubstr("Expected operand to be scalar or vector float: IsNan")); 344fd4e5da5Sopenharmony_ci} 345fd4e5da5Sopenharmony_ci 346fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIsNanOperandWrongSize) { 347fd4e5da5Sopenharmony_ci const std::string body = R"( 348fd4e5da5Sopenharmony_ci%val1 = OpIsNan %bool %f32vec2_12 349fd4e5da5Sopenharmony_ci)"; 350fd4e5da5Sopenharmony_ci 351fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 352fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 353fd4e5da5Sopenharmony_ci EXPECT_THAT( 354fd4e5da5Sopenharmony_ci getDiagnosticString(), 355fd4e5da5Sopenharmony_ci HasSubstr( 356fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operand to be equal: " 357fd4e5da5Sopenharmony_ci "IsNan")); 358fd4e5da5Sopenharmony_ci} 359fd4e5da5Sopenharmony_ci 360fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterSuccess) { 361fd4e5da5Sopenharmony_ci const std::string body = R"( 362fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32_0 %f32_1 363fd4e5da5Sopenharmony_ci%val2 = OpLessOrGreater %bool %f64_0 %f64_0 364fd4e5da5Sopenharmony_ci%val3 = OpLessOrGreater %boolvec2 %f32vec2_12 %f32vec2_12 365fd4e5da5Sopenharmony_ci%val4 = OpLessOrGreater %boolvec3 %f32vec3_123 %f32vec3_123 366fd4e5da5Sopenharmony_ci%val5 = OpLessOrGreater %boolvec4 %f32vec4_1234 %f32vec4_1234 367fd4e5da5Sopenharmony_ci)"; 368fd4e5da5Sopenharmony_ci 369fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 370fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 371fd4e5da5Sopenharmony_ci} 372fd4e5da5Sopenharmony_ci 373fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterWrongTypeId) { 374fd4e5da5Sopenharmony_ci const std::string body = R"( 375fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %u32 %f32_1 %f32_1 376fd4e5da5Sopenharmony_ci)"; 377fd4e5da5Sopenharmony_ci 378fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 379fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 380fd4e5da5Sopenharmony_ci EXPECT_THAT( 381fd4e5da5Sopenharmony_ci getDiagnosticString(), 382fd4e5da5Sopenharmony_ci HasSubstr( 383fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: LessOrGreater")); 384fd4e5da5Sopenharmony_ci} 385fd4e5da5Sopenharmony_ci 386fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterLeftOperandNotFloat) { 387fd4e5da5Sopenharmony_ci const std::string body = R"( 388fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %u32_1 %f32_1 389fd4e5da5Sopenharmony_ci)"; 390fd4e5da5Sopenharmony_ci 391fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 392fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 393fd4e5da5Sopenharmony_ci EXPECT_THAT( 394fd4e5da5Sopenharmony_ci getDiagnosticString(), 395fd4e5da5Sopenharmony_ci HasSubstr( 396fd4e5da5Sopenharmony_ci "Expected operands to be scalar or vector float: LessOrGreater")); 397fd4e5da5Sopenharmony_ci} 398fd4e5da5Sopenharmony_ci 399fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterLeftOperandWrongSize) { 400fd4e5da5Sopenharmony_ci const std::string body = R"( 401fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32vec2_12 %f32_1 402fd4e5da5Sopenharmony_ci)"; 403fd4e5da5Sopenharmony_ci 404fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 405fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 406fd4e5da5Sopenharmony_ci EXPECT_THAT( 407fd4e5da5Sopenharmony_ci getDiagnosticString(), 408fd4e5da5Sopenharmony_ci HasSubstr( 409fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operands to be equal: " 410fd4e5da5Sopenharmony_ci "LessOrGreater")); 411fd4e5da5Sopenharmony_ci} 412fd4e5da5Sopenharmony_ci 413fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLessOrGreaterOperandsDifferentType) { 414fd4e5da5Sopenharmony_ci const std::string body = R"( 415fd4e5da5Sopenharmony_ci%val1 = OpLessOrGreater %bool %f32_1 %f64_1 416fd4e5da5Sopenharmony_ci)"; 417fd4e5da5Sopenharmony_ci 418fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 419fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 420fd4e5da5Sopenharmony_ci EXPECT_THAT( 421fd4e5da5Sopenharmony_ci getDiagnosticString(), 422fd4e5da5Sopenharmony_ci HasSubstr("Expected left and right operands to have the same type: " 423fd4e5da5Sopenharmony_ci "LessOrGreater")); 424fd4e5da5Sopenharmony_ci} 425fd4e5da5Sopenharmony_ci 426fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualSuccess) { 427fd4e5da5Sopenharmony_ci const std::string body = R"( 428fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32_0 %f32_1 429fd4e5da5Sopenharmony_ci%val2 = OpFOrdEqual %bool %f64_0 %f64_0 430fd4e5da5Sopenharmony_ci%val3 = OpFOrdEqual %boolvec2 %f32vec2_12 %f32vec2_12 431fd4e5da5Sopenharmony_ci%val4 = OpFOrdEqual %boolvec3 %f32vec3_123 %f32vec3_123 432fd4e5da5Sopenharmony_ci%val5 = OpFOrdEqual %boolvec4 %f32vec4_1234 %f32vec4_1234 433fd4e5da5Sopenharmony_ci)"; 434fd4e5da5Sopenharmony_ci 435fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 436fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 437fd4e5da5Sopenharmony_ci} 438fd4e5da5Sopenharmony_ci 439fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualWrongTypeId) { 440fd4e5da5Sopenharmony_ci const std::string body = R"( 441fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %u32 %f32_1 %f32_1 442fd4e5da5Sopenharmony_ci)"; 443fd4e5da5Sopenharmony_ci 444fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 445fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 446fd4e5da5Sopenharmony_ci EXPECT_THAT( 447fd4e5da5Sopenharmony_ci getDiagnosticString(), 448fd4e5da5Sopenharmony_ci HasSubstr( 449fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: FOrdEqual")); 450fd4e5da5Sopenharmony_ci} 451fd4e5da5Sopenharmony_ci 452fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualLeftOperandNotFloat) { 453fd4e5da5Sopenharmony_ci const std::string body = R"( 454fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %u32_1 %f32_1 455fd4e5da5Sopenharmony_ci)"; 456fd4e5da5Sopenharmony_ci 457fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 458fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 459fd4e5da5Sopenharmony_ci EXPECT_THAT( 460fd4e5da5Sopenharmony_ci getDiagnosticString(), 461fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector float: FOrdEqual")); 462fd4e5da5Sopenharmony_ci} 463fd4e5da5Sopenharmony_ci 464fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualLeftOperandWrongSize) { 465fd4e5da5Sopenharmony_ci const std::string body = R"( 466fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32vec2_12 %f32_1 467fd4e5da5Sopenharmony_ci)"; 468fd4e5da5Sopenharmony_ci 469fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 470fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 471fd4e5da5Sopenharmony_ci EXPECT_THAT( 472fd4e5da5Sopenharmony_ci getDiagnosticString(), 473fd4e5da5Sopenharmony_ci HasSubstr( 474fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operands to be equal: " 475fd4e5da5Sopenharmony_ci "FOrdEqual")); 476fd4e5da5Sopenharmony_ci} 477fd4e5da5Sopenharmony_ci 478fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpFOrdEqualOperandsDifferentType) { 479fd4e5da5Sopenharmony_ci const std::string body = R"( 480fd4e5da5Sopenharmony_ci%val1 = OpFOrdEqual %bool %f32_1 %f64_1 481fd4e5da5Sopenharmony_ci)"; 482fd4e5da5Sopenharmony_ci 483fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 484fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 485fd4e5da5Sopenharmony_ci EXPECT_THAT( 486fd4e5da5Sopenharmony_ci getDiagnosticString(), 487fd4e5da5Sopenharmony_ci HasSubstr("Expected left and right operands to have the same type: " 488fd4e5da5Sopenharmony_ci "FOrdEqual")); 489fd4e5da5Sopenharmony_ci} 490fd4e5da5Sopenharmony_ci 491fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualSuccess) { 492fd4e5da5Sopenharmony_ci const std::string body = R"( 493fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %bool %true %false 494fd4e5da5Sopenharmony_ci%val2 = OpLogicalEqual %boolvec2 %boolvec2_tf %boolvec2_tf 495fd4e5da5Sopenharmony_ci%val3 = OpLogicalEqual %boolvec3 %boolvec3_tft %boolvec3_tft 496fd4e5da5Sopenharmony_ci%val4 = OpLogicalEqual %boolvec4 %boolvec4_tftf %boolvec4_tftf 497fd4e5da5Sopenharmony_ci)"; 498fd4e5da5Sopenharmony_ci 499fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 500fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 501fd4e5da5Sopenharmony_ci} 502fd4e5da5Sopenharmony_ci 503fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongTypeId) { 504fd4e5da5Sopenharmony_ci const std::string body = R"( 505fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %u32 %true %false 506fd4e5da5Sopenharmony_ci)"; 507fd4e5da5Sopenharmony_ci 508fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 509fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 510fd4e5da5Sopenharmony_ci EXPECT_THAT( 511fd4e5da5Sopenharmony_ci getDiagnosticString(), 512fd4e5da5Sopenharmony_ci HasSubstr( 513fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: LogicalEqual")); 514fd4e5da5Sopenharmony_ci} 515fd4e5da5Sopenharmony_ci 516fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongLeftOperand) { 517fd4e5da5Sopenharmony_ci const std::string body = R"( 518fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %bool %boolvec2_tf %false 519fd4e5da5Sopenharmony_ci)"; 520fd4e5da5Sopenharmony_ci 521fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 522fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 523fd4e5da5Sopenharmony_ci EXPECT_THAT( 524fd4e5da5Sopenharmony_ci getDiagnosticString(), 525fd4e5da5Sopenharmony_ci HasSubstr("Expected both operands to be of Result Type: LogicalEqual")); 526fd4e5da5Sopenharmony_ci} 527fd4e5da5Sopenharmony_ci 528fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalEqualWrongRightOperand) { 529fd4e5da5Sopenharmony_ci const std::string body = R"( 530fd4e5da5Sopenharmony_ci%val1 = OpLogicalEqual %boolvec2 %boolvec2_tf %false 531fd4e5da5Sopenharmony_ci)"; 532fd4e5da5Sopenharmony_ci 533fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 534fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 535fd4e5da5Sopenharmony_ci EXPECT_THAT( 536fd4e5da5Sopenharmony_ci getDiagnosticString(), 537fd4e5da5Sopenharmony_ci HasSubstr("Expected both operands to be of Result Type: LogicalEqual")); 538fd4e5da5Sopenharmony_ci} 539fd4e5da5Sopenharmony_ci 540fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotSuccess) { 541fd4e5da5Sopenharmony_ci const std::string body = R"( 542fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %bool %true 543fd4e5da5Sopenharmony_ci%val2 = OpLogicalNot %boolvec2 %boolvec2_tf 544fd4e5da5Sopenharmony_ci%val3 = OpLogicalNot %boolvec3 %boolvec3_tft 545fd4e5da5Sopenharmony_ci%val4 = OpLogicalNot %boolvec4 %boolvec4_tftf 546fd4e5da5Sopenharmony_ci)"; 547fd4e5da5Sopenharmony_ci 548fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 549fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 550fd4e5da5Sopenharmony_ci} 551fd4e5da5Sopenharmony_ci 552fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotWrongTypeId) { 553fd4e5da5Sopenharmony_ci const std::string body = R"( 554fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %u32 %true 555fd4e5da5Sopenharmony_ci)"; 556fd4e5da5Sopenharmony_ci 557fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 558fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 559fd4e5da5Sopenharmony_ci EXPECT_THAT( 560fd4e5da5Sopenharmony_ci getDiagnosticString(), 561fd4e5da5Sopenharmony_ci HasSubstr( 562fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: LogicalNot")); 563fd4e5da5Sopenharmony_ci} 564fd4e5da5Sopenharmony_ci 565fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpLogicalNotWrongOperand) { 566fd4e5da5Sopenharmony_ci const std::string body = R"( 567fd4e5da5Sopenharmony_ci%val1 = OpLogicalNot %bool %boolvec2_tf 568fd4e5da5Sopenharmony_ci)"; 569fd4e5da5Sopenharmony_ci 570fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateKernelCode(body).c_str()); 571fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 572fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 573fd4e5da5Sopenharmony_ci HasSubstr("Expected operand to be of Result Type: LogicalNot")); 574fd4e5da5Sopenharmony_ci} 575fd4e5da5Sopenharmony_ci 576fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectSuccess) { 577fd4e5da5Sopenharmony_ci const std::string body = R"( 578fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32 %true %u32_0 %u32_1 579fd4e5da5Sopenharmony_ci%val2 = OpSelect %f32 %true %f32_0 %f32_1 580fd4e5da5Sopenharmony_ci%val3 = OpSelect %f64 %true %f64_0 %f64_1 581fd4e5da5Sopenharmony_ci%val4 = OpSelect %f32vec2 %boolvec2_tf %f32vec2_01 %f32vec2_12 582fd4e5da5Sopenharmony_ci%val5 = OpSelect %f32vec4 %boolvec4_tftf %f32vec4_0123 %f32vec4_1234 583fd4e5da5Sopenharmony_ci)"; 584fd4e5da5Sopenharmony_ci 585fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 586fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 587fd4e5da5Sopenharmony_ci} 588fd4e5da5Sopenharmony_ci 589fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongTypeId) { 590fd4e5da5Sopenharmony_ci const std::string body = R"( 591fd4e5da5Sopenharmony_ci%val1 = OpSelect %void %true %u32_0 %u32_1 592fd4e5da5Sopenharmony_ci)"; 593fd4e5da5Sopenharmony_ci 594fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 595fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 596fd4e5da5Sopenharmony_ci EXPECT_THAT( 597fd4e5da5Sopenharmony_ci getDiagnosticString(), 598fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type: Select")); 599fd4e5da5Sopenharmony_ci} 600fd4e5da5Sopenharmony_ci 601fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongTypeIdV14) { 602fd4e5da5Sopenharmony_ci // In 1.4, the message changes to allow composites. 603fd4e5da5Sopenharmony_ci const std::string body = R"( 604fd4e5da5Sopenharmony_ci%val1 = OpSelect %void %true %u32_0 %u32_1 605fd4e5da5Sopenharmony_ci)"; 606fd4e5da5Sopenharmony_ci 607fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4); 608fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 609fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 610fd4e5da5Sopenharmony_ci EXPECT_THAT( 611fd4e5da5Sopenharmony_ci getDiagnosticString(), 612fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or composite type as Result Type: Select")); 613fd4e5da5Sopenharmony_ci} 614fd4e5da5Sopenharmony_ci 615fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerNoCapability) { 616fd4e5da5Sopenharmony_ci const std::string body = R"( 617fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function 618fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function 619fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123 620fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234 621fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y 622fd4e5da5Sopenharmony_ci)"; 623fd4e5da5Sopenharmony_ci 624fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 625fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 626fd4e5da5Sopenharmony_ci EXPECT_THAT( 627fd4e5da5Sopenharmony_ci getDiagnosticString(), 628fd4e5da5Sopenharmony_ci HasSubstr( 629fd4e5da5Sopenharmony_ci "Using pointers with OpSelect requires capability VariablePointers " 630fd4e5da5Sopenharmony_ci "or VariablePointersStorageBuffer")); 631fd4e5da5Sopenharmony_ci} 632fd4e5da5Sopenharmony_ci 633fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerWithCapability1) { 634fd4e5da5Sopenharmony_ci const std::string body = R"( 635fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function 636fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function 637fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123 638fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234 639fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y 640fd4e5da5Sopenharmony_ci)"; 641fd4e5da5Sopenharmony_ci 642fd4e5da5Sopenharmony_ci const std::string extra_cap_ext = R"( 643fd4e5da5Sopenharmony_ciOpCapability VariablePointers 644fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_variable_pointers" 645fd4e5da5Sopenharmony_ci)"; 646fd4e5da5Sopenharmony_ci 647fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body, extra_cap_ext).c_str()); 648fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 649fd4e5da5Sopenharmony_ci} 650fd4e5da5Sopenharmony_ci 651fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectPointerWithCapability2) { 652fd4e5da5Sopenharmony_ci const std::string body = R"( 653fd4e5da5Sopenharmony_ci%x = OpVariable %f32vec4ptr Function 654fd4e5da5Sopenharmony_ci%y = OpVariable %f32vec4ptr Function 655fd4e5da5Sopenharmony_ciOpStore %x %f32vec4_0123 656fd4e5da5Sopenharmony_ciOpStore %y %f32vec4_1234 657fd4e5da5Sopenharmony_ci%val1 = OpSelect %f32vec4ptr %true %x %y 658fd4e5da5Sopenharmony_ci)"; 659fd4e5da5Sopenharmony_ci 660fd4e5da5Sopenharmony_ci const std::string extra_cap_ext = R"( 661fd4e5da5Sopenharmony_ciOpCapability VariablePointersStorageBuffer 662fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_variable_pointers" 663fd4e5da5Sopenharmony_ci)"; 664fd4e5da5Sopenharmony_ci 665fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body, extra_cap_ext).c_str()); 666fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 667fd4e5da5Sopenharmony_ci} 668fd4e5da5Sopenharmony_ci 669fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongCondition) { 670fd4e5da5Sopenharmony_ci const std::string body = R"( 671fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32 %u32_1 %u32_0 %u32_1 672fd4e5da5Sopenharmony_ci)"; 673fd4e5da5Sopenharmony_ci 674fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 675fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 676fd4e5da5Sopenharmony_ci EXPECT_THAT( 677fd4e5da5Sopenharmony_ci getDiagnosticString(), 678fd4e5da5Sopenharmony_ci HasSubstr("Expected bool scalar or vector type as condition: Select")); 679fd4e5da5Sopenharmony_ci} 680fd4e5da5Sopenharmony_ci 681fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongConditionDimension) { 682fd4e5da5Sopenharmony_ci const std::string body = R"( 683fd4e5da5Sopenharmony_ci%val1 = OpSelect %u32vec2 %true %u32vec2_01 %u32vec2_12 684fd4e5da5Sopenharmony_ci)"; 685fd4e5da5Sopenharmony_ci 686fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 687fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 688fd4e5da5Sopenharmony_ci EXPECT_THAT( 689fd4e5da5Sopenharmony_ci getDiagnosticString(), 690fd4e5da5Sopenharmony_ci HasSubstr( 691fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the condition to be equal: " 692fd4e5da5Sopenharmony_ci "Select")); 693fd4e5da5Sopenharmony_ci} 694fd4e5da5Sopenharmony_ci 695fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongLeftObject) { 696fd4e5da5Sopenharmony_ci const std::string body = R"( 697fd4e5da5Sopenharmony_ci%val1 = OpSelect %bool %true %u32vec2_01 %u32_1 698fd4e5da5Sopenharmony_ci)"; 699fd4e5da5Sopenharmony_ci 700fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 701fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 702fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 703fd4e5da5Sopenharmony_ci HasSubstr("Expected both objects to be of Result Type: Select")); 704fd4e5da5Sopenharmony_ci} 705fd4e5da5Sopenharmony_ci 706fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectWrongRightObject) { 707fd4e5da5Sopenharmony_ci const std::string body = R"( 708fd4e5da5Sopenharmony_ci%val1 = OpSelect %bool %true %u32_1 %u32vec2_01 709fd4e5da5Sopenharmony_ci)"; 710fd4e5da5Sopenharmony_ci 711fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 712fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 713fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 714fd4e5da5Sopenharmony_ci HasSubstr("Expected both objects to be of Result Type: Select")); 715fd4e5da5Sopenharmony_ci} 716fd4e5da5Sopenharmony_ci 717fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV13Bad) { 718fd4e5da5Sopenharmony_ci const std::string body = R"( 719fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2 720fd4e5da5Sopenharmony_ci)"; 721fd4e5da5Sopenharmony_ci 722fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 723fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 724fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); 725fd4e5da5Sopenharmony_ci EXPECT_THAT( 726fd4e5da5Sopenharmony_ci getDiagnosticString(), 727fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type: Select")); 728fd4e5da5Sopenharmony_ci} 729fd4e5da5Sopenharmony_ci 730fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV13TargetV14Bad) { 731fd4e5da5Sopenharmony_ci const std::string body = R"( 732fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2 733fd4e5da5Sopenharmony_ci)"; 734fd4e5da5Sopenharmony_ci 735fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 736fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 737fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 738fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 739fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type")); 740fd4e5da5Sopenharmony_ci} 741fd4e5da5Sopenharmony_ci 742fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectArrayV14Good) { 743fd4e5da5Sopenharmony_ci const std::string body = R"( 744fd4e5da5Sopenharmony_ci%val1 = OpSelect %arr_u32_2 %true %nul_arr_u32_2 %arr_u32_2_1_2 745fd4e5da5Sopenharmony_ci)"; 746fd4e5da5Sopenharmony_ci 747fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4); 748fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 749fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), Eq("")); 750fd4e5da5Sopenharmony_ci} 751fd4e5da5Sopenharmony_ci 752fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV13Bad) { 753fd4e5da5Sopenharmony_ci const std::string body = R"( 754fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2 755fd4e5da5Sopenharmony_ci)"; 756fd4e5da5Sopenharmony_ci 757fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 758fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 759fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); 760fd4e5da5Sopenharmony_ci EXPECT_THAT( 761fd4e5da5Sopenharmony_ci getDiagnosticString(), 762fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type: Select")); 763fd4e5da5Sopenharmony_ci} 764fd4e5da5Sopenharmony_ci 765fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV13TargetV14Bad) { 766fd4e5da5Sopenharmony_ci const std::string body = R"( 767fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2 768fd4e5da5Sopenharmony_ci)"; 769fd4e5da5Sopenharmony_ci 770fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 771fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 772fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 773fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 774fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type")); 775fd4e5da5Sopenharmony_ci} 776fd4e5da5Sopenharmony_ci 777fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectStructV14Good) { 778fd4e5da5Sopenharmony_ci const std::string body = R"( 779fd4e5da5Sopenharmony_ci%val1 = OpSelect %st_u32_u32 %true %nul_st_u32_u32 %st_u32_u32_1_2 780fd4e5da5Sopenharmony_ci)"; 781fd4e5da5Sopenharmony_ci 782fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4); 783fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 784fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), Eq("")); 785fd4e5da5Sopenharmony_ci} 786fd4e5da5Sopenharmony_ci 787fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV13Bad) { 788fd4e5da5Sopenharmony_ci const std::string body = R"( 789fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12 790fd4e5da5Sopenharmony_ci)"; 791fd4e5da5Sopenharmony_ci 792fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 793fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 794fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); 795fd4e5da5Sopenharmony_ci EXPECT_THAT( 796fd4e5da5Sopenharmony_ci getDiagnosticString(), 797fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type: Select")); 798fd4e5da5Sopenharmony_ci} 799fd4e5da5Sopenharmony_ci 800fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV13TargetV14Bad) { 801fd4e5da5Sopenharmony_ci const std::string body = R"( 802fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12 803fd4e5da5Sopenharmony_ci)"; 804fd4e5da5Sopenharmony_ci 805fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 806fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, 807fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 808fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 809fd4e5da5Sopenharmony_ci HasSubstr("Expected scalar or vector type as Result Type")); 810fd4e5da5Sopenharmony_ci} 811fd4e5da5Sopenharmony_ci 812fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSelectMatrixV14Good) { 813fd4e5da5Sopenharmony_ci const std::string body = R"( 814fd4e5da5Sopenharmony_ci%val1 = OpSelect %mat_f32_2_2 %true %nul_mat_f32_2_2 %mat_f32_2_2_01_12 815fd4e5da5Sopenharmony_ci)"; 816fd4e5da5Sopenharmony_ci 817fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str(), SPV_ENV_UNIVERSAL_1_4); 818fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 819fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), Eq("")); 820fd4e5da5Sopenharmony_ci} 821fd4e5da5Sopenharmony_ci 822fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualSuccess) { 823fd4e5da5Sopenharmony_ci const std::string body = R"( 824fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_0 %s32_1 825fd4e5da5Sopenharmony_ci%val2 = OpIEqual %bool %s64_0 %u64_0 826fd4e5da5Sopenharmony_ci%val3 = OpIEqual %boolvec2 %s32vec2_12 %u32vec2_12 827fd4e5da5Sopenharmony_ci%val4 = OpIEqual %boolvec3 %s32vec3_123 %u32vec3_123 828fd4e5da5Sopenharmony_ci%val5 = OpIEqual %boolvec4 %s32vec4_1234 %u32vec4_1234 829fd4e5da5Sopenharmony_ci)"; 830fd4e5da5Sopenharmony_ci 831fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 832fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 833fd4e5da5Sopenharmony_ci} 834fd4e5da5Sopenharmony_ci 835fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualWrongTypeId) { 836fd4e5da5Sopenharmony_ci const std::string body = R"( 837fd4e5da5Sopenharmony_ci%val1 = OpIEqual %u32 %s32_1 %s32_1 838fd4e5da5Sopenharmony_ci)"; 839fd4e5da5Sopenharmony_ci 840fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 841fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 842fd4e5da5Sopenharmony_ci EXPECT_THAT( 843fd4e5da5Sopenharmony_ci getDiagnosticString(), 844fd4e5da5Sopenharmony_ci HasSubstr("Expected bool scalar or vector type as Result Type: IEqual")); 845fd4e5da5Sopenharmony_ci} 846fd4e5da5Sopenharmony_ci 847fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualLeftOperandNotInt) { 848fd4e5da5Sopenharmony_ci const std::string body = R"( 849fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %f32_1 %s32_1 850fd4e5da5Sopenharmony_ci)"; 851fd4e5da5Sopenharmony_ci 852fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 853fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 854fd4e5da5Sopenharmony_ci EXPECT_THAT( 855fd4e5da5Sopenharmony_ci getDiagnosticString(), 856fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: IEqual")); 857fd4e5da5Sopenharmony_ci} 858fd4e5da5Sopenharmony_ci 859fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualLeftOperandWrongSize) { 860fd4e5da5Sopenharmony_ci const std::string body = R"( 861fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %s32vec2_12 %s32_1 862fd4e5da5Sopenharmony_ci)"; 863fd4e5da5Sopenharmony_ci 864fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 865fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 866fd4e5da5Sopenharmony_ci EXPECT_THAT( 867fd4e5da5Sopenharmony_ci getDiagnosticString(), 868fd4e5da5Sopenharmony_ci HasSubstr( 869fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operands to be equal: " 870fd4e5da5Sopenharmony_ci "IEqual")); 871fd4e5da5Sopenharmony_ci} 872fd4e5da5Sopenharmony_ci 873fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualRightOperandNotInt) { 874fd4e5da5Sopenharmony_ci const std::string body = R"( 875fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_1 %f32_1 876fd4e5da5Sopenharmony_ci)"; 877fd4e5da5Sopenharmony_ci 878fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 879fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 880fd4e5da5Sopenharmony_ci EXPECT_THAT( 881fd4e5da5Sopenharmony_ci getDiagnosticString(), 882fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: IEqual")); 883fd4e5da5Sopenharmony_ci} 884fd4e5da5Sopenharmony_ci 885fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpIEqualDifferentBitWidth) { 886fd4e5da5Sopenharmony_ci const std::string body = R"( 887fd4e5da5Sopenharmony_ci%val1 = OpIEqual %bool %u32_1 %u64_1 888fd4e5da5Sopenharmony_ci)"; 889fd4e5da5Sopenharmony_ci 890fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 891fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 892fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 893fd4e5da5Sopenharmony_ci HasSubstr("Expected both operands to have the same component bit " 894fd4e5da5Sopenharmony_ci "width: IEqual")); 895fd4e5da5Sopenharmony_ci} 896fd4e5da5Sopenharmony_ci 897fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanSuccess) { 898fd4e5da5Sopenharmony_ci const std::string body = R"( 899fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_0 %u32_1 900fd4e5da5Sopenharmony_ci%val2 = OpUGreaterThan %bool %s32_0 %u32_1 901fd4e5da5Sopenharmony_ci%val3 = OpUGreaterThan %bool %u64_0 %u64_0 902fd4e5da5Sopenharmony_ci%val4 = OpUGreaterThan %bool %u64_0 %s64_0 903fd4e5da5Sopenharmony_ci%val5 = OpUGreaterThan %boolvec2 %u32vec2_12 %u32vec2_12 904fd4e5da5Sopenharmony_ci%val6 = OpUGreaterThan %boolvec3 %s32vec3_123 %u32vec3_123 905fd4e5da5Sopenharmony_ci%val7 = OpUGreaterThan %boolvec4 %u32vec4_1234 %u32vec4_1234 906fd4e5da5Sopenharmony_ci)"; 907fd4e5da5Sopenharmony_ci 908fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 909fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 910fd4e5da5Sopenharmony_ci} 911fd4e5da5Sopenharmony_ci 912fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanWrongTypeId) { 913fd4e5da5Sopenharmony_ci const std::string body = R"( 914fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %u32 %u32_1 %u32_1 915fd4e5da5Sopenharmony_ci)"; 916fd4e5da5Sopenharmony_ci 917fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 918fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 919fd4e5da5Sopenharmony_ci EXPECT_THAT( 920fd4e5da5Sopenharmony_ci getDiagnosticString(), 921fd4e5da5Sopenharmony_ci HasSubstr( 922fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: UGreaterThan")); 923fd4e5da5Sopenharmony_ci} 924fd4e5da5Sopenharmony_ci 925fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanLeftOperandNotInt) { 926fd4e5da5Sopenharmony_ci const std::string body = R"( 927fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %f32_1 %u32_1 928fd4e5da5Sopenharmony_ci)"; 929fd4e5da5Sopenharmony_ci 930fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 931fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 932fd4e5da5Sopenharmony_ci EXPECT_THAT( 933fd4e5da5Sopenharmony_ci getDiagnosticString(), 934fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: UGreaterThan")); 935fd4e5da5Sopenharmony_ci} 936fd4e5da5Sopenharmony_ci 937fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanLeftOperandWrongSize) { 938fd4e5da5Sopenharmony_ci const std::string body = R"( 939fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32vec2_12 %u32_1 940fd4e5da5Sopenharmony_ci)"; 941fd4e5da5Sopenharmony_ci 942fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 943fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 944fd4e5da5Sopenharmony_ci EXPECT_THAT( 945fd4e5da5Sopenharmony_ci getDiagnosticString(), 946fd4e5da5Sopenharmony_ci HasSubstr( 947fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operands to be equal: " 948fd4e5da5Sopenharmony_ci "UGreaterThan")); 949fd4e5da5Sopenharmony_ci} 950fd4e5da5Sopenharmony_ci 951fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanRightOperandNotInt) { 952fd4e5da5Sopenharmony_ci const std::string body = R"( 953fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_1 %f32_1 954fd4e5da5Sopenharmony_ci)"; 955fd4e5da5Sopenharmony_ci 956fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 957fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 958fd4e5da5Sopenharmony_ci EXPECT_THAT( 959fd4e5da5Sopenharmony_ci getDiagnosticString(), 960fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: UGreaterThan")); 961fd4e5da5Sopenharmony_ci} 962fd4e5da5Sopenharmony_ci 963fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpUGreaterThanDifferentBitWidth) { 964fd4e5da5Sopenharmony_ci const std::string body = R"( 965fd4e5da5Sopenharmony_ci%val1 = OpUGreaterThan %bool %u32_1 %u64_1 966fd4e5da5Sopenharmony_ci)"; 967fd4e5da5Sopenharmony_ci 968fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 969fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 970fd4e5da5Sopenharmony_ci EXPECT_THAT( 971fd4e5da5Sopenharmony_ci getDiagnosticString(), 972fd4e5da5Sopenharmony_ci HasSubstr("Expected both operands to have the same component bit width: " 973fd4e5da5Sopenharmony_ci "UGreaterThan")); 974fd4e5da5Sopenharmony_ci} 975fd4e5da5Sopenharmony_ci 976fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanSuccess) { 977fd4e5da5Sopenharmony_ci const std::string body = R"( 978fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_0 %s32_1 979fd4e5da5Sopenharmony_ci%val2 = OpSGreaterThan %bool %u32_0 %s32_1 980fd4e5da5Sopenharmony_ci%val3 = OpSGreaterThan %bool %s64_0 %s64_0 981fd4e5da5Sopenharmony_ci%val4 = OpSGreaterThan %bool %s64_0 %u64_0 982fd4e5da5Sopenharmony_ci%val5 = OpSGreaterThan %boolvec2 %s32vec2_12 %s32vec2_12 983fd4e5da5Sopenharmony_ci%val6 = OpSGreaterThan %boolvec3 %s32vec3_123 %u32vec3_123 984fd4e5da5Sopenharmony_ci%val7 = OpSGreaterThan %boolvec4 %s32vec4_1234 %s32vec4_1234 985fd4e5da5Sopenharmony_ci)"; 986fd4e5da5Sopenharmony_ci 987fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 988fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 989fd4e5da5Sopenharmony_ci} 990fd4e5da5Sopenharmony_ci 991fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanWrongTypeId) { 992fd4e5da5Sopenharmony_ci const std::string body = R"( 993fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %s32 %s32_1 %s32_1 994fd4e5da5Sopenharmony_ci)"; 995fd4e5da5Sopenharmony_ci 996fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 997fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 998fd4e5da5Sopenharmony_ci EXPECT_THAT( 999fd4e5da5Sopenharmony_ci getDiagnosticString(), 1000fd4e5da5Sopenharmony_ci HasSubstr( 1001fd4e5da5Sopenharmony_ci "Expected bool scalar or vector type as Result Type: SGreaterThan")); 1002fd4e5da5Sopenharmony_ci} 1003fd4e5da5Sopenharmony_ci 1004fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanLeftOperandNotInt) { 1005fd4e5da5Sopenharmony_ci const std::string body = R"( 1006fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %f32_1 %s32_1 1007fd4e5da5Sopenharmony_ci)"; 1008fd4e5da5Sopenharmony_ci 1009fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 1010fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1011fd4e5da5Sopenharmony_ci EXPECT_THAT( 1012fd4e5da5Sopenharmony_ci getDiagnosticString(), 1013fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: SGreaterThan")); 1014fd4e5da5Sopenharmony_ci} 1015fd4e5da5Sopenharmony_ci 1016fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanLeftOperandWrongSize) { 1017fd4e5da5Sopenharmony_ci const std::string body = R"( 1018fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32vec2_12 %s32_1 1019fd4e5da5Sopenharmony_ci)"; 1020fd4e5da5Sopenharmony_ci 1021fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 1022fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1023fd4e5da5Sopenharmony_ci EXPECT_THAT( 1024fd4e5da5Sopenharmony_ci getDiagnosticString(), 1025fd4e5da5Sopenharmony_ci HasSubstr( 1026fd4e5da5Sopenharmony_ci "Expected vector sizes of Result Type and the operands to be equal: " 1027fd4e5da5Sopenharmony_ci "SGreaterThan")); 1028fd4e5da5Sopenharmony_ci} 1029fd4e5da5Sopenharmony_ci 1030fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanRightOperandNotInt) { 1031fd4e5da5Sopenharmony_ci const std::string body = R"( 1032fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_1 %f32_1 1033fd4e5da5Sopenharmony_ci)"; 1034fd4e5da5Sopenharmony_ci 1035fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 1036fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1037fd4e5da5Sopenharmony_ci EXPECT_THAT( 1038fd4e5da5Sopenharmony_ci getDiagnosticString(), 1039fd4e5da5Sopenharmony_ci HasSubstr("Expected operands to be scalar or vector int: SGreaterThan")); 1040fd4e5da5Sopenharmony_ci} 1041fd4e5da5Sopenharmony_ci 1042fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, OpSGreaterThanDifferentBitWidth) { 1043fd4e5da5Sopenharmony_ci const std::string body = R"( 1044fd4e5da5Sopenharmony_ci%val1 = OpSGreaterThan %bool %s32_1 %s64_1 1045fd4e5da5Sopenharmony_ci)"; 1046fd4e5da5Sopenharmony_ci 1047fd4e5da5Sopenharmony_ci CompileSuccessfully(GenerateShaderCode(body).c_str()); 1048fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); 1049fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1050fd4e5da5Sopenharmony_ci HasSubstr("Expected both operands to have the same component bit " 1051fd4e5da5Sopenharmony_ci "width: SGreaterThan")); 1052fd4e5da5Sopenharmony_ci} 1053fd4e5da5Sopenharmony_ci 1054fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, PSBSelectSuccess) { 1055fd4e5da5Sopenharmony_ci const std::string body = R"( 1056fd4e5da5Sopenharmony_ciOpCapability PhysicalStorageBufferAddresses 1057fd4e5da5Sopenharmony_ciOpCapability Int64 1058fd4e5da5Sopenharmony_ciOpCapability Shader 1059fd4e5da5Sopenharmony_ciOpExtension "SPV_EXT_physical_storage_buffer" 1060fd4e5da5Sopenharmony_ciOpMemoryModel PhysicalStorageBuffer64 GLSL450 1061fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %main "main" 1062fd4e5da5Sopenharmony_ciOpExecutionMode %main OriginUpperLeft 1063fd4e5da5Sopenharmony_ciOpDecorate %val1 AliasedPointer 1064fd4e5da5Sopenharmony_ci%uint64 = OpTypeInt 64 0 1065fd4e5da5Sopenharmony_ci%bool = OpTypeBool 1066fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool 1067fd4e5da5Sopenharmony_ci%ptr = OpTypePointer PhysicalStorageBuffer %uint64 1068fd4e5da5Sopenharmony_ci%pptr_f = OpTypePointer Function %ptr 1069fd4e5da5Sopenharmony_ci%void = OpTypeVoid 1070fd4e5da5Sopenharmony_ci%voidfn = OpTypeFunction %void 1071fd4e5da5Sopenharmony_ci%main = OpFunction %void None %voidfn 1072fd4e5da5Sopenharmony_ci%entry = OpLabel 1073fd4e5da5Sopenharmony_ci%val1 = OpVariable %pptr_f Function 1074fd4e5da5Sopenharmony_ci%val2 = OpLoad %ptr %val1 1075fd4e5da5Sopenharmony_ci%val3 = OpSelect %ptr %true %val2 %val2 1076fd4e5da5Sopenharmony_ciOpReturn 1077fd4e5da5Sopenharmony_ciOpFunctionEnd 1078fd4e5da5Sopenharmony_ci)"; 1079fd4e5da5Sopenharmony_ci 1080fd4e5da5Sopenharmony_ci CompileSuccessfully(body.c_str()); 1081fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); 1082fd4e5da5Sopenharmony_ci} 1083fd4e5da5Sopenharmony_ci 1084fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsScalarCondition) { 1085fd4e5da5Sopenharmony_ci const std::string spirv = R"( 1086fd4e5da5Sopenharmony_ciOpCapability Shader 1087fd4e5da5Sopenharmony_ciOpCapability Linkage 1088fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 1089fd4e5da5Sopenharmony_ci%void = OpTypeVoid 1090fd4e5da5Sopenharmony_ci%bool = OpTypeBool 1091fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 1092fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4 1093fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4 1094fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool 1095fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 1096fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn 1097fd4e5da5Sopenharmony_ci%1 = OpLabel 1098fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %true %int4_0 %int4_0 1099fd4e5da5Sopenharmony_ciOpReturn 1100fd4e5da5Sopenharmony_ciOpFunctionEnd 1101fd4e5da5Sopenharmony_ci)"; 1102fd4e5da5Sopenharmony_ci 1103fd4e5da5Sopenharmony_ci CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); 1104fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_DATA, 1105fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); 1106fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1107fd4e5da5Sopenharmony_ci HasSubstr("Expected vector sizes of Result Type and the " 1108fd4e5da5Sopenharmony_ci "condition to be equal: Select")); 1109fd4e5da5Sopenharmony_ci} 1110fd4e5da5Sopenharmony_ci 1111fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsScalarCondition1p4) { 1112fd4e5da5Sopenharmony_ci const std::string spirv = R"( 1113fd4e5da5Sopenharmony_ciOpCapability Shader 1114fd4e5da5Sopenharmony_ciOpCapability Linkage 1115fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 1116fd4e5da5Sopenharmony_ci%void = OpTypeVoid 1117fd4e5da5Sopenharmony_ci%bool = OpTypeBool 1118fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 1119fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4 1120fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4 1121fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool 1122fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 1123fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn 1124fd4e5da5Sopenharmony_ci%1 = OpLabel 1125fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %true %int4_0 %int4_0 1126fd4e5da5Sopenharmony_ciOpReturn 1127fd4e5da5Sopenharmony_ciOpFunctionEnd 1128fd4e5da5Sopenharmony_ci)"; 1129fd4e5da5Sopenharmony_ci 1130fd4e5da5Sopenharmony_ci CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_4); 1131fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 1132fd4e5da5Sopenharmony_ci} 1133fd4e5da5Sopenharmony_ci 1134fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectVectorsVectorConditionMismatchedDimensions1p4) { 1135fd4e5da5Sopenharmony_ci const std::string spirv = R"( 1136fd4e5da5Sopenharmony_ciOpCapability Shader 1137fd4e5da5Sopenharmony_ciOpCapability Linkage 1138fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450 1139fd4e5da5Sopenharmony_ci%void = OpTypeVoid 1140fd4e5da5Sopenharmony_ci%bool = OpTypeBool 1141fd4e5da5Sopenharmony_ci%bool3 = OpTypeVector %bool 3 1142fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0 1143fd4e5da5Sopenharmony_ci%int4 = OpTypeVector %int 4 1144fd4e5da5Sopenharmony_ci%int4_0 = OpConstantNull %int4 1145fd4e5da5Sopenharmony_ci%bool3_null = OpConstantNull %bool3 1146fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void 1147fd4e5da5Sopenharmony_ci%func = OpFunction %void None %void_fn 1148fd4e5da5Sopenharmony_ci%1 = OpLabel 1149fd4e5da5Sopenharmony_ci%select = OpSelect %int4 %bool3_null %int4_0 %int4_0 1150fd4e5da5Sopenharmony_ciOpReturn 1151fd4e5da5Sopenharmony_ciOpFunctionEnd 1152fd4e5da5Sopenharmony_ci)"; 1153fd4e5da5Sopenharmony_ci 1154fd4e5da5Sopenharmony_ci CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_4); 1155fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_ERROR_INVALID_DATA, 1156fd4e5da5Sopenharmony_ci ValidateInstructions(SPV_ENV_UNIVERSAL_1_4)); 1157fd4e5da5Sopenharmony_ci EXPECT_THAT(getDiagnosticString(), 1158fd4e5da5Sopenharmony_ci HasSubstr("Expected vector sizes of Result Type and the " 1159fd4e5da5Sopenharmony_ci "condition to be equal: Select")); 1160fd4e5da5Sopenharmony_ci} 1161fd4e5da5Sopenharmony_ci 1162fd4e5da5Sopenharmony_ciTEST_F(ValidateLogicals, SelectNVBindlessSamplers) { 1163fd4e5da5Sopenharmony_ci const std::string spirv = R"( 1164fd4e5da5Sopenharmony_ci OpCapability Shader 1165fd4e5da5Sopenharmony_ci OpCapability BindlessTextureNV 1166fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_bindless_texture" 1167fd4e5da5Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 1168fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1169fd4e5da5Sopenharmony_ci OpSamplerImageAddressingModeNV 64 1170fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %main "main" 1171fd4e5da5Sopenharmony_ci OpExecutionMode %main OriginUpperLeft 1172fd4e5da5Sopenharmony_ci OpSource GLSL 450 1173fd4e5da5Sopenharmony_ci OpSourceExtension "GL_NV_bindless_texture" 1174fd4e5da5Sopenharmony_ci OpName %main "main" 1175fd4e5da5Sopenharmony_ci OpName %s2D "s2D" 1176fd4e5da5Sopenharmony_ci OpName %pickhandle "pickhandle" 1177fd4e5da5Sopenharmony_ci OpName %Sampler1 "Sampler1" 1178fd4e5da5Sopenharmony_ci OpName %Sampler2 "Sampler2" 1179fd4e5da5Sopenharmony_ci OpDecorate %pickhandle Flat 1180fd4e5da5Sopenharmony_ci OpDecorate %Sampler1 DescriptorSet 0 1181fd4e5da5Sopenharmony_ci OpDecorate %Sampler1 Binding 0 1182fd4e5da5Sopenharmony_ci OpDecorate %Sampler1 BindlessSamplerNV 1183fd4e5da5Sopenharmony_ci OpDecorate %Sampler2 DescriptorSet 0 1184fd4e5da5Sopenharmony_ci OpDecorate %Sampler2 Binding 1 1185fd4e5da5Sopenharmony_ci OpDecorate %Sampler2 BindlessSamplerNV 1186fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1187fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 1188fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1189fd4e5da5Sopenharmony_ci %7 = OpTypeImage %float 2D 0 0 0 1 Unknown 1190fd4e5da5Sopenharmony_ci %8 = OpTypeSampledImage %7 1191fd4e5da5Sopenharmony_ci%_ptr_Function_8 = OpTypePointer Function %8 1192fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 1193fd4e5da5Sopenharmony_ci%_ptr_Function_int = OpTypePointer Function %int 1194fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 1195fd4e5da5Sopenharmony_ci %bool = OpTypeBool 1196fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_8 = OpTypePointer UniformConstant %8 1197fd4e5da5Sopenharmony_ci %Sampler1 = OpVariable %_ptr_UniformConstant_8 UniformConstant 1198fd4e5da5Sopenharmony_ci %Sampler2 = OpVariable %_ptr_UniformConstant_8 UniformConstant 1199fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 1200fd4e5da5Sopenharmony_ci %5 = OpLabel 1201fd4e5da5Sopenharmony_ci %s2D = OpVariable %_ptr_Function_8 Function 1202fd4e5da5Sopenharmony_ci %pickhandle = OpVariable %_ptr_Function_int Function 1203fd4e5da5Sopenharmony_ci %14 = OpLoad %int %pickhandle 1204fd4e5da5Sopenharmony_ci %17 = OpIEqual %bool %14 %int_0 1205fd4e5da5Sopenharmony_ci %20 = OpLoad %8 %Sampler1 1206fd4e5da5Sopenharmony_ci %22 = OpLoad %8 %Sampler2 1207fd4e5da5Sopenharmony_ci %23 = OpSelect %8 %17 %20 %22 1208fd4e5da5Sopenharmony_ci OpStore %s2D %23 1209fd4e5da5Sopenharmony_ci OpReturn 1210fd4e5da5Sopenharmony_ci OpFunctionEnd 1211fd4e5da5Sopenharmony_ci)"; 1212fd4e5da5Sopenharmony_ci 1213fd4e5da5Sopenharmony_ci CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); 1214fd4e5da5Sopenharmony_ci EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); 1215fd4e5da5Sopenharmony_ci} 1216fd4e5da5Sopenharmony_ci 1217fd4e5da5Sopenharmony_ci} // namespace 1218fd4e5da5Sopenharmony_ci} // namespace val 1219fd4e5da5Sopenharmony_ci} // namespace spvtools 1220