1e5c31af7Sopenharmony_ci# ------------------------------------------------- 2e5c31af7Sopenharmony_ci# drawElements Quality Program OpenGL ES 3.2 Module 3e5c31af7Sopenharmony_ci# ------------------------------------------------- 4e5c31af7Sopenharmony_ci# 5e5c31af7Sopenharmony_ci# Copyright 2016 The Android Open Source Project 6e5c31af7Sopenharmony_ci# 7e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci# You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci# 11e5c31af7Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci# 13e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci# limitations under the License. 18e5c31af7Sopenharmony_ci 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_cigroup varying "Varying linkage" 21e5c31af7Sopenharmony_ci group rules "Rules" 22e5c31af7Sopenharmony_ci case input_type_mismatch 23e5c31af7Sopenharmony_ci version 450 24e5c31af7Sopenharmony_ci desc "Geometry shader input type mismatch" 25e5c31af7Sopenharmony_ci expect link_fail 26e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 27e5c31af7Sopenharmony_ci vertex "" 28e5c31af7Sopenharmony_ci #version 450 29e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 30e5c31af7Sopenharmony_ci out mediump float geo_in; 31e5c31af7Sopenharmony_ci void main() 32e5c31af7Sopenharmony_ci { 33e5c31af7Sopenharmony_ci geo_in = 1.0; 34e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 35e5c31af7Sopenharmony_ci } 36e5c31af7Sopenharmony_ci "" 37e5c31af7Sopenharmony_ci geometry "" 38e5c31af7Sopenharmony_ci #version 450 39e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 40e5c31af7Sopenharmony_ci in mediump vec2 geo_in[]; 41e5c31af7Sopenharmony_ci out mediump float geo_out; 42e5c31af7Sopenharmony_ci void main() 43e5c31af7Sopenharmony_ci { 44e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 45e5c31af7Sopenharmony_ci { 46e5c31af7Sopenharmony_ci geo_out = geo_in[ndx].x + geo_in[ndx].y; 47e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 48e5c31af7Sopenharmony_ci EmitVertex(); 49e5c31af7Sopenharmony_ci } 50e5c31af7Sopenharmony_ci } 51e5c31af7Sopenharmony_ci "" 52e5c31af7Sopenharmony_ci fragment "" 53e5c31af7Sopenharmony_ci #version 450 54e5c31af7Sopenharmony_ci precision mediump float; 55e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 56e5c31af7Sopenharmony_ci in mediump float geo_out; 57e5c31af7Sopenharmony_ci void main() 58e5c31af7Sopenharmony_ci { 59e5c31af7Sopenharmony_ci out0 = geo_out; 60e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 61e5c31af7Sopenharmony_ci } 62e5c31af7Sopenharmony_ci "" 63e5c31af7Sopenharmony_ci end 64e5c31af7Sopenharmony_ci 65e5c31af7Sopenharmony_ci case input_different_precision 66e5c31af7Sopenharmony_ci version 450 67e5c31af7Sopenharmony_ci desc "Geometry shader input precision mismatch" 68e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 69e5c31af7Sopenharmony_ci vertex "" 70e5c31af7Sopenharmony_ci #version 450 71e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 72e5c31af7Sopenharmony_ci out highp float geo_in; 73e5c31af7Sopenharmony_ci void main() 74e5c31af7Sopenharmony_ci { 75e5c31af7Sopenharmony_ci geo_in = 1.0; 76e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 77e5c31af7Sopenharmony_ci } 78e5c31af7Sopenharmony_ci "" 79e5c31af7Sopenharmony_ci geometry "" 80e5c31af7Sopenharmony_ci #version 450 81e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 82e5c31af7Sopenharmony_ci in lowp float geo_in[]; 83e5c31af7Sopenharmony_ci out mediump float geo_out; 84e5c31af7Sopenharmony_ci void main() 85e5c31af7Sopenharmony_ci { 86e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 87e5c31af7Sopenharmony_ci { 88e5c31af7Sopenharmony_ci geo_out = geo_in[ndx]; 89e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 90e5c31af7Sopenharmony_ci EmitVertex(); 91e5c31af7Sopenharmony_ci } 92e5c31af7Sopenharmony_ci } 93e5c31af7Sopenharmony_ci "" 94e5c31af7Sopenharmony_ci fragment "" 95e5c31af7Sopenharmony_ci #version 450 96e5c31af7Sopenharmony_ci precision mediump float; 97e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 98e5c31af7Sopenharmony_ci in mediump float geo_out; 99e5c31af7Sopenharmony_ci void main() 100e5c31af7Sopenharmony_ci { 101e5c31af7Sopenharmony_ci out0 = geo_out; 102e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 103e5c31af7Sopenharmony_ci } 104e5c31af7Sopenharmony_ci "" 105e5c31af7Sopenharmony_ci end 106e5c31af7Sopenharmony_ci 107e5c31af7Sopenharmony_ci case output_different_precision 108e5c31af7Sopenharmony_ci version 450 109e5c31af7Sopenharmony_ci desc "Geometry shader output precision mismatch" 110e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 111e5c31af7Sopenharmony_ci vertex "" 112e5c31af7Sopenharmony_ci #version 450 113e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 114e5c31af7Sopenharmony_ci void main() 115e5c31af7Sopenharmony_ci { 116e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 117e5c31af7Sopenharmony_ci } 118e5c31af7Sopenharmony_ci "" 119e5c31af7Sopenharmony_ci geometry "" 120e5c31af7Sopenharmony_ci #version 450 121e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 122e5c31af7Sopenharmony_ci out highp float geo_out; 123e5c31af7Sopenharmony_ci void main() 124e5c31af7Sopenharmony_ci { 125e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 126e5c31af7Sopenharmony_ci { 127e5c31af7Sopenharmony_ci geo_out = 1.0; 128e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 129e5c31af7Sopenharmony_ci EmitVertex(); 130e5c31af7Sopenharmony_ci } 131e5c31af7Sopenharmony_ci } 132e5c31af7Sopenharmony_ci "" 133e5c31af7Sopenharmony_ci fragment "" 134e5c31af7Sopenharmony_ci #version 450 135e5c31af7Sopenharmony_ci precision mediump float; 136e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 137e5c31af7Sopenharmony_ci in lowp float geo_out; 138e5c31af7Sopenharmony_ci void main() 139e5c31af7Sopenharmony_ci { 140e5c31af7Sopenharmony_ci out0 = geo_out; 141e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 142e5c31af7Sopenharmony_ci } 143e5c31af7Sopenharmony_ci "" 144e5c31af7Sopenharmony_ci end 145e5c31af7Sopenharmony_ci 146e5c31af7Sopenharmony_ci case input_superfluous_declaration 147e5c31af7Sopenharmony_ci version 450 148e5c31af7Sopenharmony_ci desc "Geometry shader has no input for an output" 149e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 150e5c31af7Sopenharmony_ci vertex "" 151e5c31af7Sopenharmony_ci #version 450 152e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 153e5c31af7Sopenharmony_ci out mediump float geo_in; 154e5c31af7Sopenharmony_ci void main() 155e5c31af7Sopenharmony_ci { 156e5c31af7Sopenharmony_ci geo_in = 1.0; 157e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 158e5c31af7Sopenharmony_ci } 159e5c31af7Sopenharmony_ci "" 160e5c31af7Sopenharmony_ci geometry "" 161e5c31af7Sopenharmony_ci #version 450 162e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 163e5c31af7Sopenharmony_ci out mediump float geo_out; 164e5c31af7Sopenharmony_ci void main() 165e5c31af7Sopenharmony_ci { 166e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 167e5c31af7Sopenharmony_ci { 168e5c31af7Sopenharmony_ci geo_out = 1.0; 169e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 170e5c31af7Sopenharmony_ci EmitVertex(); 171e5c31af7Sopenharmony_ci } 172e5c31af7Sopenharmony_ci } 173e5c31af7Sopenharmony_ci "" 174e5c31af7Sopenharmony_ci fragment "" 175e5c31af7Sopenharmony_ci #version 450 176e5c31af7Sopenharmony_ci precision mediump float; 177e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 178e5c31af7Sopenharmony_ci in mediump float geo_out; 179e5c31af7Sopenharmony_ci void main() 180e5c31af7Sopenharmony_ci { 181e5c31af7Sopenharmony_ci out0 = geo_out; 182e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 183e5c31af7Sopenharmony_ci } 184e5c31af7Sopenharmony_ci "" 185e5c31af7Sopenharmony_ci end 186e5c31af7Sopenharmony_ci 187e5c31af7Sopenharmony_ci case output_superfluous_declaration 188e5c31af7Sopenharmony_ci version 450 189e5c31af7Sopenharmony_ci desc "Geometry shader has output without an matching input" 190e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 191e5c31af7Sopenharmony_ci vertex "" 192e5c31af7Sopenharmony_ci #version 450 193e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 194e5c31af7Sopenharmony_ci void main() 195e5c31af7Sopenharmony_ci { 196e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 197e5c31af7Sopenharmony_ci } 198e5c31af7Sopenharmony_ci "" 199e5c31af7Sopenharmony_ci geometry "" 200e5c31af7Sopenharmony_ci #version 450 201e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 202e5c31af7Sopenharmony_ci out mediump float geo_out; 203e5c31af7Sopenharmony_ci void main() 204e5c31af7Sopenharmony_ci { 205e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 206e5c31af7Sopenharmony_ci { 207e5c31af7Sopenharmony_ci geo_out = 1.0; 208e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 209e5c31af7Sopenharmony_ci EmitVertex(); 210e5c31af7Sopenharmony_ci } 211e5c31af7Sopenharmony_ci } 212e5c31af7Sopenharmony_ci "" 213e5c31af7Sopenharmony_ci fragment "" 214e5c31af7Sopenharmony_ci #version 450 215e5c31af7Sopenharmony_ci precision mediump float; 216e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 217e5c31af7Sopenharmony_ci void main() 218e5c31af7Sopenharmony_ci { 219e5c31af7Sopenharmony_ci out0 = 1.0; 220e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 221e5c31af7Sopenharmony_ci } 222e5c31af7Sopenharmony_ci "" 223e5c31af7Sopenharmony_ci end 224e5c31af7Sopenharmony_ci 225e5c31af7Sopenharmony_ci case input_array_explicit_size 226e5c31af7Sopenharmony_ci version 450 227e5c31af7Sopenharmony_ci desc "Geometry shader input is explicitly sized array" 228e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 229e5c31af7Sopenharmony_ci vertex "" 230e5c31af7Sopenharmony_ci #version 450 231e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 232e5c31af7Sopenharmony_ci out mediump float geo_in; 233e5c31af7Sopenharmony_ci void main() 234e5c31af7Sopenharmony_ci { 235e5c31af7Sopenharmony_ci geo_in = 1.0; 236e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 237e5c31af7Sopenharmony_ci } 238e5c31af7Sopenharmony_ci "" 239e5c31af7Sopenharmony_ci geometry "" 240e5c31af7Sopenharmony_ci #version 450 241e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 242e5c31af7Sopenharmony_ci in mediump float geo_in[3]; 243e5c31af7Sopenharmony_ci out mediump float geo_out; 244e5c31af7Sopenharmony_ci void main() 245e5c31af7Sopenharmony_ci { 246e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 247e5c31af7Sopenharmony_ci { 248e5c31af7Sopenharmony_ci geo_out = geo_in[ndx]; 249e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 250e5c31af7Sopenharmony_ci EmitVertex(); 251e5c31af7Sopenharmony_ci } 252e5c31af7Sopenharmony_ci } 253e5c31af7Sopenharmony_ci "" 254e5c31af7Sopenharmony_ci fragment "" 255e5c31af7Sopenharmony_ci #version 450 256e5c31af7Sopenharmony_ci precision mediump float; 257e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 258e5c31af7Sopenharmony_ci in mediump float geo_out; 259e5c31af7Sopenharmony_ci void main() 260e5c31af7Sopenharmony_ci { 261e5c31af7Sopenharmony_ci out0 = geo_out; 262e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 263e5c31af7Sopenharmony_ci } 264e5c31af7Sopenharmony_ci "" 265e5c31af7Sopenharmony_ci end 266e5c31af7Sopenharmony_ci 267e5c31af7Sopenharmony_ci case input_non_array 268e5c31af7Sopenharmony_ci version 450 269e5c31af7Sopenharmony_ci desc "Geometry shader has no input for an output" 270e5c31af7Sopenharmony_ci expect compile_or_link_fail 271e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 272e5c31af7Sopenharmony_ci vertex "" 273e5c31af7Sopenharmony_ci #version 450 274e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 275e5c31af7Sopenharmony_ci out mediump float geo_in; 276e5c31af7Sopenharmony_ci void main() 277e5c31af7Sopenharmony_ci { 278e5c31af7Sopenharmony_ci geo_in = 1.0; 279e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 280e5c31af7Sopenharmony_ci } 281e5c31af7Sopenharmony_ci "" 282e5c31af7Sopenharmony_ci geometry "" 283e5c31af7Sopenharmony_ci #version 450 284e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 285e5c31af7Sopenharmony_ci in mediump float geo_in; 286e5c31af7Sopenharmony_ci out mediump float geo_out; 287e5c31af7Sopenharmony_ci void main() 288e5c31af7Sopenharmony_ci { 289e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 290e5c31af7Sopenharmony_ci { 291e5c31af7Sopenharmony_ci geo_out = geo_in; 292e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 293e5c31af7Sopenharmony_ci EmitVertex(); 294e5c31af7Sopenharmony_ci } 295e5c31af7Sopenharmony_ci } 296e5c31af7Sopenharmony_ci "" 297e5c31af7Sopenharmony_ci fragment "" 298e5c31af7Sopenharmony_ci #version 450 299e5c31af7Sopenharmony_ci precision mediump float; 300e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 301e5c31af7Sopenharmony_ci in mediump float geo_out; 302e5c31af7Sopenharmony_ci void main() 303e5c31af7Sopenharmony_ci { 304e5c31af7Sopenharmony_ci out0 = geo_out; 305e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 306e5c31af7Sopenharmony_ci } 307e5c31af7Sopenharmony_ci "" 308e5c31af7Sopenharmony_ci end 309e5c31af7Sopenharmony_ci 310e5c31af7Sopenharmony_ci case input_array_size_mismatch 311e5c31af7Sopenharmony_ci version 450 312e5c31af7Sopenharmony_ci desc "Geometry shader input is explicitly sized array, but size does not match input primitive" 313e5c31af7Sopenharmony_ci expect compile_or_link_fail 314e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 315e5c31af7Sopenharmony_ci vertex "" 316e5c31af7Sopenharmony_ci #version 450 317e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 318e5c31af7Sopenharmony_ci out mediump float geo_in; 319e5c31af7Sopenharmony_ci void main() 320e5c31af7Sopenharmony_ci { 321e5c31af7Sopenharmony_ci geo_in = 1.0; 322e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 323e5c31af7Sopenharmony_ci } 324e5c31af7Sopenharmony_ci "" 325e5c31af7Sopenharmony_ci geometry "" 326e5c31af7Sopenharmony_ci #version 450 327e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 328e5c31af7Sopenharmony_ci in mediump float geo_in[4]; 329e5c31af7Sopenharmony_ci out mediump float geo_out; 330e5c31af7Sopenharmony_ci void main() 331e5c31af7Sopenharmony_ci { 332e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 333e5c31af7Sopenharmony_ci { 334e5c31af7Sopenharmony_ci geo_out = geo_in[ndx+1]; 335e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 336e5c31af7Sopenharmony_ci EmitVertex(); 337e5c31af7Sopenharmony_ci } 338e5c31af7Sopenharmony_ci } 339e5c31af7Sopenharmony_ci "" 340e5c31af7Sopenharmony_ci fragment "" 341e5c31af7Sopenharmony_ci #version 450 342e5c31af7Sopenharmony_ci precision mediump float; 343e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 344e5c31af7Sopenharmony_ci in mediump float geo_out; 345e5c31af7Sopenharmony_ci void main() 346e5c31af7Sopenharmony_ci { 347e5c31af7Sopenharmony_ci out0 = geo_out; 348e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 349e5c31af7Sopenharmony_ci } 350e5c31af7Sopenharmony_ci "" 351e5c31af7Sopenharmony_ci end 352e5c31af7Sopenharmony_ci 353e5c31af7Sopenharmony_ci case input_block 354e5c31af7Sopenharmony_ci version 450 355e5c31af7Sopenharmony_ci desc "Geometry shader input block" 356e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 357e5c31af7Sopenharmony_ci vertex "" 358e5c31af7Sopenharmony_ci #version 450 359e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 360e5c31af7Sopenharmony_ci out IOBlockName 361e5c31af7Sopenharmony_ci { 362e5c31af7Sopenharmony_ci mediump float var; 363e5c31af7Sopenharmony_ci } outputInstanceName; 364e5c31af7Sopenharmony_ci void main() 365e5c31af7Sopenharmony_ci { 366e5c31af7Sopenharmony_ci outputInstanceName.var = 1.0; 367e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 368e5c31af7Sopenharmony_ci } 369e5c31af7Sopenharmony_ci "" 370e5c31af7Sopenharmony_ci geometry "" 371e5c31af7Sopenharmony_ci #version 450 372e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 373e5c31af7Sopenharmony_ci in IOBlockName 374e5c31af7Sopenharmony_ci { 375e5c31af7Sopenharmony_ci mediump float var; 376e5c31af7Sopenharmony_ci } inputInstanceName[]; 377e5c31af7Sopenharmony_ci out mediump float geo_out; 378e5c31af7Sopenharmony_ci void main() 379e5c31af7Sopenharmony_ci { 380e5c31af7Sopenharmony_ci geo_out = inputInstanceName[0].var; 381e5c31af7Sopenharmony_ci gl_Position = gl_in[0].gl_Position; 382e5c31af7Sopenharmony_ci EmitVertex(); 383e5c31af7Sopenharmony_ci geo_out = inputInstanceName[1].var; 384e5c31af7Sopenharmony_ci gl_Position = gl_in[1].gl_Position; 385e5c31af7Sopenharmony_ci EmitVertex(); 386e5c31af7Sopenharmony_ci geo_out = inputInstanceName[2].var; 387e5c31af7Sopenharmony_ci gl_Position = gl_in[2].gl_Position; 388e5c31af7Sopenharmony_ci EmitVertex(); 389e5c31af7Sopenharmony_ci } 390e5c31af7Sopenharmony_ci "" 391e5c31af7Sopenharmony_ci fragment "" 392e5c31af7Sopenharmony_ci #version 450 393e5c31af7Sopenharmony_ci precision mediump float; 394e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 395e5c31af7Sopenharmony_ci in mediump float geo_out; 396e5c31af7Sopenharmony_ci void main() 397e5c31af7Sopenharmony_ci { 398e5c31af7Sopenharmony_ci out0 = geo_out; 399e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 400e5c31af7Sopenharmony_ci } 401e5c31af7Sopenharmony_ci "" 402e5c31af7Sopenharmony_ci end 403e5c31af7Sopenharmony_ci 404e5c31af7Sopenharmony_ci case input_block_explicit_size 405e5c31af7Sopenharmony_ci version 450 406e5c31af7Sopenharmony_ci desc "Geometry shader input block with explicit size" 407e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 408e5c31af7Sopenharmony_ci vertex "" 409e5c31af7Sopenharmony_ci #version 450 410e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 411e5c31af7Sopenharmony_ci out IOBlockName 412e5c31af7Sopenharmony_ci { 413e5c31af7Sopenharmony_ci mediump float var; 414e5c31af7Sopenharmony_ci } outputInstanceName; 415e5c31af7Sopenharmony_ci void main() 416e5c31af7Sopenharmony_ci { 417e5c31af7Sopenharmony_ci outputInstanceName.var = 1.0; 418e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 419e5c31af7Sopenharmony_ci } 420e5c31af7Sopenharmony_ci "" 421e5c31af7Sopenharmony_ci geometry "" 422e5c31af7Sopenharmony_ci #version 450 423e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 424e5c31af7Sopenharmony_ci in IOBlockName 425e5c31af7Sopenharmony_ci { 426e5c31af7Sopenharmony_ci mediump float var; 427e5c31af7Sopenharmony_ci } inputInstanceName[3]; 428e5c31af7Sopenharmony_ci out mediump float geo_out; 429e5c31af7Sopenharmony_ci void main() 430e5c31af7Sopenharmony_ci { 431e5c31af7Sopenharmony_ci geo_out = inputInstanceName[0].var; 432e5c31af7Sopenharmony_ci gl_Position = gl_in[0].gl_Position; 433e5c31af7Sopenharmony_ci EmitVertex(); 434e5c31af7Sopenharmony_ci geo_out = inputInstanceName[1].var; 435e5c31af7Sopenharmony_ci gl_Position = gl_in[1].gl_Position; 436e5c31af7Sopenharmony_ci EmitVertex(); 437e5c31af7Sopenharmony_ci geo_out = inputInstanceName[2].var; 438e5c31af7Sopenharmony_ci gl_Position = gl_in[2].gl_Position; 439e5c31af7Sopenharmony_ci EmitVertex(); 440e5c31af7Sopenharmony_ci } 441e5c31af7Sopenharmony_ci "" 442e5c31af7Sopenharmony_ci fragment "" 443e5c31af7Sopenharmony_ci #version 450 444e5c31af7Sopenharmony_ci precision mediump float; 445e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 446e5c31af7Sopenharmony_ci in mediump float geo_out; 447e5c31af7Sopenharmony_ci void main() 448e5c31af7Sopenharmony_ci { 449e5c31af7Sopenharmony_ci out0 = geo_out; 450e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 451e5c31af7Sopenharmony_ci } 452e5c31af7Sopenharmony_ci "" 453e5c31af7Sopenharmony_ci end 454e5c31af7Sopenharmony_ci 455e5c31af7Sopenharmony_ci case input_block_non_array 456e5c31af7Sopenharmony_ci version 450 457e5c31af7Sopenharmony_ci desc "Geometry shader input block is non an array" 458e5c31af7Sopenharmony_ci expect compile_or_link_fail 459e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 460e5c31af7Sopenharmony_ci vertex "" 461e5c31af7Sopenharmony_ci #version 450 462e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 463e5c31af7Sopenharmony_ci out IOBlockName 464e5c31af7Sopenharmony_ci { 465e5c31af7Sopenharmony_ci mediump float var; 466e5c31af7Sopenharmony_ci } outputInstanceName; 467e5c31af7Sopenharmony_ci void main() 468e5c31af7Sopenharmony_ci { 469e5c31af7Sopenharmony_ci outputInstanceName.var = 1.0; 470e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 471e5c31af7Sopenharmony_ci } 472e5c31af7Sopenharmony_ci "" 473e5c31af7Sopenharmony_ci geometry "" 474e5c31af7Sopenharmony_ci #version 450 475e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 476e5c31af7Sopenharmony_ci in IOBlockName 477e5c31af7Sopenharmony_ci { 478e5c31af7Sopenharmony_ci mediump float var; 479e5c31af7Sopenharmony_ci } inputInstanceName; 480e5c31af7Sopenharmony_ci out mediump float geo_out; 481e5c31af7Sopenharmony_ci void main() 482e5c31af7Sopenharmony_ci { 483e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 484e5c31af7Sopenharmony_ci { 485e5c31af7Sopenharmony_ci geo_out = inputInstanceName.var; 486e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 487e5c31af7Sopenharmony_ci EmitVertex(); 488e5c31af7Sopenharmony_ci } 489e5c31af7Sopenharmony_ci } 490e5c31af7Sopenharmony_ci "" 491e5c31af7Sopenharmony_ci fragment "" 492e5c31af7Sopenharmony_ci #version 450 493e5c31af7Sopenharmony_ci precision mediump float; 494e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 495e5c31af7Sopenharmony_ci in mediump float geo_out; 496e5c31af7Sopenharmony_ci void main() 497e5c31af7Sopenharmony_ci { 498e5c31af7Sopenharmony_ci out0 = geo_out; 499e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 500e5c31af7Sopenharmony_ci } 501e5c31af7Sopenharmony_ci "" 502e5c31af7Sopenharmony_ci end 503e5c31af7Sopenharmony_ci 504e5c31af7Sopenharmony_ci case input_block_array_size_mismatch 505e5c31af7Sopenharmony_ci version 450 506e5c31af7Sopenharmony_ci desc "Geometry shader input block invalid array size" 507e5c31af7Sopenharmony_ci expect compile_or_link_fail 508e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 509e5c31af7Sopenharmony_ci vertex "" 510e5c31af7Sopenharmony_ci #version 450 511e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 512e5c31af7Sopenharmony_ci out IOBlockName 513e5c31af7Sopenharmony_ci { 514e5c31af7Sopenharmony_ci mediump float var; 515e5c31af7Sopenharmony_ci } outputInstanceName; 516e5c31af7Sopenharmony_ci void main() 517e5c31af7Sopenharmony_ci { 518e5c31af7Sopenharmony_ci outputInstanceName.var = 1.0; 519e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 520e5c31af7Sopenharmony_ci } 521e5c31af7Sopenharmony_ci "" 522e5c31af7Sopenharmony_ci geometry "" 523e5c31af7Sopenharmony_ci #version 450 524e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 525e5c31af7Sopenharmony_ci in IOBlockName 526e5c31af7Sopenharmony_ci { 527e5c31af7Sopenharmony_ci mediump float var; 528e5c31af7Sopenharmony_ci } inputInstanceName[4]; 529e5c31af7Sopenharmony_ci out mediump float geo_out; 530e5c31af7Sopenharmony_ci void main() 531e5c31af7Sopenharmony_ci { 532e5c31af7Sopenharmony_ci geo_out = inputInstanceName[0].var; 533e5c31af7Sopenharmony_ci gl_Position = gl_in[0].gl_Position; 534e5c31af7Sopenharmony_ci EmitVertex(); 535e5c31af7Sopenharmony_ci geo_out = inputInstanceName[1].var; 536e5c31af7Sopenharmony_ci gl_Position = gl_in[1].gl_Position; 537e5c31af7Sopenharmony_ci EmitVertex(); 538e5c31af7Sopenharmony_ci geo_out = inputInstanceName[2].var + inputInstanceName[3].var; 539e5c31af7Sopenharmony_ci gl_Position = gl_in[2].gl_Position; 540e5c31af7Sopenharmony_ci EmitVertex(); 541e5c31af7Sopenharmony_ci } 542e5c31af7Sopenharmony_ci "" 543e5c31af7Sopenharmony_ci fragment "" 544e5c31af7Sopenharmony_ci #version 450 545e5c31af7Sopenharmony_ci precision mediump float; 546e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 547e5c31af7Sopenharmony_ci in mediump float geo_out; 548e5c31af7Sopenharmony_ci void main() 549e5c31af7Sopenharmony_ci { 550e5c31af7Sopenharmony_ci out0 = geo_out; 551e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 552e5c31af7Sopenharmony_ci } 553e5c31af7Sopenharmony_ci "" 554e5c31af7Sopenharmony_ci end 555e5c31af7Sopenharmony_ci 556e5c31af7Sopenharmony_ci case output_block 557e5c31af7Sopenharmony_ci version 450 558e5c31af7Sopenharmony_ci desc "Geometry shader output block" 559e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 560e5c31af7Sopenharmony_ci vertex "" 561e5c31af7Sopenharmony_ci #version 450 562e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 563e5c31af7Sopenharmony_ci void main() 564e5c31af7Sopenharmony_ci { 565e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 566e5c31af7Sopenharmony_ci } 567e5c31af7Sopenharmony_ci "" 568e5c31af7Sopenharmony_ci geometry "" 569e5c31af7Sopenharmony_ci #version 450 570e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 571e5c31af7Sopenharmony_ci out IOBlockName 572e5c31af7Sopenharmony_ci { 573e5c31af7Sopenharmony_ci mediump float var; 574e5c31af7Sopenharmony_ci } outputInstanceName; 575e5c31af7Sopenharmony_ci void main() 576e5c31af7Sopenharmony_ci { 577e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 578e5c31af7Sopenharmony_ci { 579e5c31af7Sopenharmony_ci outputInstanceName.var = 1.0; 580e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 581e5c31af7Sopenharmony_ci EmitVertex(); 582e5c31af7Sopenharmony_ci } 583e5c31af7Sopenharmony_ci } 584e5c31af7Sopenharmony_ci "" 585e5c31af7Sopenharmony_ci fragment "" 586e5c31af7Sopenharmony_ci #version 450 587e5c31af7Sopenharmony_ci precision mediump float; 588e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 589e5c31af7Sopenharmony_ci in IOBlockName 590e5c31af7Sopenharmony_ci { 591e5c31af7Sopenharmony_ci mediump float var; 592e5c31af7Sopenharmony_ci } inputInstanceName; 593e5c31af7Sopenharmony_ci void main() 594e5c31af7Sopenharmony_ci { 595e5c31af7Sopenharmony_ci out0 = inputInstanceName.var; 596e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 597e5c31af7Sopenharmony_ci } 598e5c31af7Sopenharmony_ci "" 599e5c31af7Sopenharmony_ci end 600e5c31af7Sopenharmony_ci 601e5c31af7Sopenharmony_ci case output_block_array 602e5c31af7Sopenharmony_ci version 450 603e5c31af7Sopenharmony_ci desc "Geometry shader output block array" 604e5c31af7Sopenharmony_ci values { output float out0 = 1.0; } 605e5c31af7Sopenharmony_ci vertex "" 606e5c31af7Sopenharmony_ci #version 450 607e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 608e5c31af7Sopenharmony_ci void main() 609e5c31af7Sopenharmony_ci { 610e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 611e5c31af7Sopenharmony_ci } 612e5c31af7Sopenharmony_ci "" 613e5c31af7Sopenharmony_ci geometry "" 614e5c31af7Sopenharmony_ci #version 450 615e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 616e5c31af7Sopenharmony_ci out IOBlockName 617e5c31af7Sopenharmony_ci { 618e5c31af7Sopenharmony_ci mediump float var; 619e5c31af7Sopenharmony_ci } outputInstanceName[2]; 620e5c31af7Sopenharmony_ci void main() 621e5c31af7Sopenharmony_ci { 622e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 623e5c31af7Sopenharmony_ci { 624e5c31af7Sopenharmony_ci outputInstanceName[0].var = 2.0; 625e5c31af7Sopenharmony_ci outputInstanceName[1].var = 1.0; 626e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 627e5c31af7Sopenharmony_ci EmitVertex(); 628e5c31af7Sopenharmony_ci } 629e5c31af7Sopenharmony_ci } 630e5c31af7Sopenharmony_ci "" 631e5c31af7Sopenharmony_ci fragment "" 632e5c31af7Sopenharmony_ci #version 450 633e5c31af7Sopenharmony_ci precision mediump float; 634e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 635e5c31af7Sopenharmony_ci in IOBlockName 636e5c31af7Sopenharmony_ci { 637e5c31af7Sopenharmony_ci mediump float var; 638e5c31af7Sopenharmony_ci } inputInstanceName[2]; 639e5c31af7Sopenharmony_ci void main() 640e5c31af7Sopenharmony_ci { 641e5c31af7Sopenharmony_ci out0 = inputInstanceName[0].var - inputInstanceName[1].var; 642e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 643e5c31af7Sopenharmony_ci } 644e5c31af7Sopenharmony_ci "" 645e5c31af7Sopenharmony_ci end 646e5c31af7Sopenharmony_ci 647e5c31af7Sopenharmony_ci case unspecified_input_primitive_type 648e5c31af7Sopenharmony_ci version 450 649e5c31af7Sopenharmony_ci desc "Geometry shader input type unspecified" 650e5c31af7Sopenharmony_ci expect compile_or_link_fail 651e5c31af7Sopenharmony_ci vertex "" 652e5c31af7Sopenharmony_ci #version 450 653e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 654e5c31af7Sopenharmony_ci void main() 655e5c31af7Sopenharmony_ci { 656e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 657e5c31af7Sopenharmony_ci } 658e5c31af7Sopenharmony_ci "" 659e5c31af7Sopenharmony_ci geometry "" 660e5c31af7Sopenharmony_ci #version 450 661e5c31af7Sopenharmony_ci layout (triangle_strip, max_vertices=3) out; 662e5c31af7Sopenharmony_ci void main() 663e5c31af7Sopenharmony_ci { 664e5c31af7Sopenharmony_ci gl_Position = vec4(0.0, 0.0, 0.0, 1.0); 665e5c31af7Sopenharmony_ci EmitVertex(); 666e5c31af7Sopenharmony_ci gl_Position = vec4(0.0, 1.0, 0.0, 1.0); 667e5c31af7Sopenharmony_ci EmitVertex(); 668e5c31af7Sopenharmony_ci gl_Position = vec4(1.0, 1.0, 0.0, 1.0); 669e5c31af7Sopenharmony_ci EmitVertex(); 670e5c31af7Sopenharmony_ci } 671e5c31af7Sopenharmony_ci "" 672e5c31af7Sopenharmony_ci fragment "" 673e5c31af7Sopenharmony_ci #version 450 674e5c31af7Sopenharmony_ci precision mediump float; 675e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 676e5c31af7Sopenharmony_ci void main() 677e5c31af7Sopenharmony_ci { 678e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 679e5c31af7Sopenharmony_ci } 680e5c31af7Sopenharmony_ci "" 681e5c31af7Sopenharmony_ci end 682e5c31af7Sopenharmony_ci 683e5c31af7Sopenharmony_ci case unspecified_output_primitive_type 684e5c31af7Sopenharmony_ci version 450 685e5c31af7Sopenharmony_ci desc "Geometry shader output type unspecified" 686e5c31af7Sopenharmony_ci expect compile_or_link_fail 687e5c31af7Sopenharmony_ci vertex "" 688e5c31af7Sopenharmony_ci #version 450 689e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 690e5c31af7Sopenharmony_ci void main() 691e5c31af7Sopenharmony_ci { 692e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 693e5c31af7Sopenharmony_ci } 694e5c31af7Sopenharmony_ci "" 695e5c31af7Sopenharmony_ci geometry "" 696e5c31af7Sopenharmony_ci #version 450 697e5c31af7Sopenharmony_ci layout (triangles) in; 698e5c31af7Sopenharmony_ci layout (max_vertices=3) out; 699e5c31af7Sopenharmony_ci void main() 700e5c31af7Sopenharmony_ci { 701e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 702e5c31af7Sopenharmony_ci { 703e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 704e5c31af7Sopenharmony_ci EmitVertex(); 705e5c31af7Sopenharmony_ci } 706e5c31af7Sopenharmony_ci } 707e5c31af7Sopenharmony_ci "" 708e5c31af7Sopenharmony_ci fragment "" 709e5c31af7Sopenharmony_ci #version 450 710e5c31af7Sopenharmony_ci precision mediump float; 711e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 712e5c31af7Sopenharmony_ci void main() 713e5c31af7Sopenharmony_ci { 714e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 715e5c31af7Sopenharmony_ci } 716e5c31af7Sopenharmony_ci "" 717e5c31af7Sopenharmony_ci end 718e5c31af7Sopenharmony_ci 719e5c31af7Sopenharmony_ci case unspecified_output_primitive_num_vertices 720e5c31af7Sopenharmony_ci version 450 721e5c31af7Sopenharmony_ci desc "Geometry shader output type unspecified" 722e5c31af7Sopenharmony_ci expect compile_or_link_fail 723e5c31af7Sopenharmony_ci vertex "" 724e5c31af7Sopenharmony_ci #version 450 725e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 726e5c31af7Sopenharmony_ci void main() 727e5c31af7Sopenharmony_ci { 728e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 729e5c31af7Sopenharmony_ci } 730e5c31af7Sopenharmony_ci "" 731e5c31af7Sopenharmony_ci geometry "" 732e5c31af7Sopenharmony_ci #version 450 733e5c31af7Sopenharmony_ci layout (triangles) in; 734e5c31af7Sopenharmony_ci layout (triangle_strip) out; 735e5c31af7Sopenharmony_ci void main() 736e5c31af7Sopenharmony_ci { 737e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 738e5c31af7Sopenharmony_ci { 739e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 740e5c31af7Sopenharmony_ci EmitVertex(); 741e5c31af7Sopenharmony_ci } 742e5c31af7Sopenharmony_ci } 743e5c31af7Sopenharmony_ci "" 744e5c31af7Sopenharmony_ci fragment "" 745e5c31af7Sopenharmony_ci #version 450 746e5c31af7Sopenharmony_ci precision mediump float; 747e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 748e5c31af7Sopenharmony_ci void main() 749e5c31af7Sopenharmony_ci { 750e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 751e5c31af7Sopenharmony_ci } 752e5c31af7Sopenharmony_ci "" 753e5c31af7Sopenharmony_ci end 754e5c31af7Sopenharmony_ci 755e5c31af7Sopenharmony_ci # access_more_than_available_input_vertices 756e5c31af7Sopenharmony_ci case access_more_than_available_input_vertices 757e5c31af7Sopenharmony_ci version 450 758e5c31af7Sopenharmony_ci desc "Geometry shader input block with explicit size" 759e5c31af7Sopenharmony_ci expect compile_or_link_fail 760e5c31af7Sopenharmony_ci vertex "" 761e5c31af7Sopenharmony_ci #version 450 762e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 763e5c31af7Sopenharmony_ci void main() 764e5c31af7Sopenharmony_ci { 765e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 766e5c31af7Sopenharmony_ci } 767e5c31af7Sopenharmony_ci "" 768e5c31af7Sopenharmony_ci geometry "" 769e5c31af7Sopenharmony_ci #version 450 770e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 771e5c31af7Sopenharmony_ci void main() 772e5c31af7Sopenharmony_ci { 773e5c31af7Sopenharmony_ci gl_Position = gl_in[0].gl_Position; 774e5c31af7Sopenharmony_ci EmitVertex(); 775e5c31af7Sopenharmony_ci gl_Position = gl_in[1].gl_Position; 776e5c31af7Sopenharmony_ci EmitVertex(); 777e5c31af7Sopenharmony_ci gl_Position = gl_in[4].gl_Position; // access more than available 778e5c31af7Sopenharmony_ci EmitVertex(); 779e5c31af7Sopenharmony_ci } 780e5c31af7Sopenharmony_ci "" 781e5c31af7Sopenharmony_ci fragment "" 782e5c31af7Sopenharmony_ci #version 450 783e5c31af7Sopenharmony_ci precision mediump float; 784e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 785e5c31af7Sopenharmony_ci void main() 786e5c31af7Sopenharmony_ci { 787e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 788e5c31af7Sopenharmony_ci } 789e5c31af7Sopenharmony_ci "" 790e5c31af7Sopenharmony_ci end 791e5c31af7Sopenharmony_ci end 792e5c31af7Sopenharmony_ci 793e5c31af7Sopenharmony_ci import "linkage_geometry_varying_types.test" 794e5c31af7Sopenharmony_ci 795e5c31af7Sopenharmony_ci group qualifiers "Varying qualifiers" 796e5c31af7Sopenharmony_ci case smooth 797e5c31af7Sopenharmony_ci version 450 798e5c31af7Sopenharmony_ci desc "varying with smooth interpolation" 799e5c31af7Sopenharmony_ci values 800e5c31af7Sopenharmony_ci { 801e5c31af7Sopenharmony_ci input float in0 = 1.0; 802e5c31af7Sopenharmony_ci output float out0 = 1.0; 803e5c31af7Sopenharmony_ci } 804e5c31af7Sopenharmony_ci vertex "" 805e5c31af7Sopenharmony_ci #version 450 806e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 807e5c31af7Sopenharmony_ci smooth out mediump float vtx_var; 808e5c31af7Sopenharmony_ci void main() 809e5c31af7Sopenharmony_ci { 810e5c31af7Sopenharmony_ci vtx_var = in0; 811e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 812e5c31af7Sopenharmony_ci } 813e5c31af7Sopenharmony_ci "" 814e5c31af7Sopenharmony_ci geometry "" 815e5c31af7Sopenharmony_ci #version 450 816e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 817e5c31af7Sopenharmony_ci smooth in mediump float vtx_var[]; 818e5c31af7Sopenharmony_ci smooth out mediump float geo_var; 819e5c31af7Sopenharmony_ci void main() 820e5c31af7Sopenharmony_ci { 821e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 822e5c31af7Sopenharmony_ci { 823e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 824e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 825e5c31af7Sopenharmony_ci EmitVertex(); 826e5c31af7Sopenharmony_ci } 827e5c31af7Sopenharmony_ci } 828e5c31af7Sopenharmony_ci "" 829e5c31af7Sopenharmony_ci fragment "" 830e5c31af7Sopenharmony_ci #version 450 831e5c31af7Sopenharmony_ci precision mediump float; 832e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 833e5c31af7Sopenharmony_ci smooth in float geo_var; 834e5c31af7Sopenharmony_ci void main() 835e5c31af7Sopenharmony_ci { 836e5c31af7Sopenharmony_ci out0 = geo_var; 837e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 838e5c31af7Sopenharmony_ci } 839e5c31af7Sopenharmony_ci "" 840e5c31af7Sopenharmony_ci end 841e5c31af7Sopenharmony_ci 842e5c31af7Sopenharmony_ci case flat 843e5c31af7Sopenharmony_ci version 450 844e5c31af7Sopenharmony_ci desc "varying with flat interpolation" 845e5c31af7Sopenharmony_ci values 846e5c31af7Sopenharmony_ci { 847e5c31af7Sopenharmony_ci input float in0 = 1.0; 848e5c31af7Sopenharmony_ci output float out0 = 1.0; 849e5c31af7Sopenharmony_ci } 850e5c31af7Sopenharmony_ci vertex "" 851e5c31af7Sopenharmony_ci #version 450 852e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 853e5c31af7Sopenharmony_ci flat out mediump float vtx_var; 854e5c31af7Sopenharmony_ci void main() 855e5c31af7Sopenharmony_ci { 856e5c31af7Sopenharmony_ci vtx_var = in0; 857e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 858e5c31af7Sopenharmony_ci } 859e5c31af7Sopenharmony_ci "" 860e5c31af7Sopenharmony_ci geometry "" 861e5c31af7Sopenharmony_ci #version 450 862e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 863e5c31af7Sopenharmony_ci flat in mediump float vtx_var[]; 864e5c31af7Sopenharmony_ci flat out mediump float geo_var; 865e5c31af7Sopenharmony_ci void main() 866e5c31af7Sopenharmony_ci { 867e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 868e5c31af7Sopenharmony_ci { 869e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 870e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 871e5c31af7Sopenharmony_ci EmitVertex(); 872e5c31af7Sopenharmony_ci } 873e5c31af7Sopenharmony_ci } 874e5c31af7Sopenharmony_ci "" 875e5c31af7Sopenharmony_ci fragment "" 876e5c31af7Sopenharmony_ci #version 450 877e5c31af7Sopenharmony_ci precision mediump float; 878e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 879e5c31af7Sopenharmony_ci flat in float geo_var; 880e5c31af7Sopenharmony_ci void main() 881e5c31af7Sopenharmony_ci { 882e5c31af7Sopenharmony_ci out0 = geo_var; 883e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 884e5c31af7Sopenharmony_ci } 885e5c31af7Sopenharmony_ci "" 886e5c31af7Sopenharmony_ci end 887e5c31af7Sopenharmony_ci 888e5c31af7Sopenharmony_ci case centroid 889e5c31af7Sopenharmony_ci version 450 890e5c31af7Sopenharmony_ci desc "varying declared with centroid qualifier" 891e5c31af7Sopenharmony_ci values 892e5c31af7Sopenharmony_ci { 893e5c31af7Sopenharmony_ci input float in0 = 1.0; 894e5c31af7Sopenharmony_ci output float out0 = 1.0; 895e5c31af7Sopenharmony_ci } 896e5c31af7Sopenharmony_ci vertex "" 897e5c31af7Sopenharmony_ci #version 450 898e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 899e5c31af7Sopenharmony_ci centroid out mediump float vtx_var; 900e5c31af7Sopenharmony_ci void main() 901e5c31af7Sopenharmony_ci { 902e5c31af7Sopenharmony_ci vtx_var = in0; 903e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 904e5c31af7Sopenharmony_ci } 905e5c31af7Sopenharmony_ci "" 906e5c31af7Sopenharmony_ci geometry "" 907e5c31af7Sopenharmony_ci #version 450 908e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 909e5c31af7Sopenharmony_ci centroid in mediump float vtx_var[]; 910e5c31af7Sopenharmony_ci centroid out mediump float geo_var; 911e5c31af7Sopenharmony_ci void main() 912e5c31af7Sopenharmony_ci { 913e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 914e5c31af7Sopenharmony_ci { 915e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 916e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 917e5c31af7Sopenharmony_ci EmitVertex(); 918e5c31af7Sopenharmony_ci } 919e5c31af7Sopenharmony_ci } 920e5c31af7Sopenharmony_ci "" 921e5c31af7Sopenharmony_ci fragment "" 922e5c31af7Sopenharmony_ci #version 450 923e5c31af7Sopenharmony_ci precision mediump float; 924e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 925e5c31af7Sopenharmony_ci centroid in float geo_var; 926e5c31af7Sopenharmony_ci void main() 927e5c31af7Sopenharmony_ci { 928e5c31af7Sopenharmony_ci out0 = geo_var; 929e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 930e5c31af7Sopenharmony_ci } 931e5c31af7Sopenharmony_ci "" 932e5c31af7Sopenharmony_ci end 933e5c31af7Sopenharmony_ci 934e5c31af7Sopenharmony_ci case sample 935e5c31af7Sopenharmony_ci version 450 936e5c31af7Sopenharmony_ci desc "varying declared with sample qualifier" 937e5c31af7Sopenharmony_ci values 938e5c31af7Sopenharmony_ci { 939e5c31af7Sopenharmony_ci input float in0 = 1.0; 940e5c31af7Sopenharmony_ci output float out0 = 1.0; 941e5c31af7Sopenharmony_ci } 942e5c31af7Sopenharmony_ci vertex "" 943e5c31af7Sopenharmony_ci #version 450 944e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 945e5c31af7Sopenharmony_ci sample out mediump float vtx_var; 946e5c31af7Sopenharmony_ci void main() 947e5c31af7Sopenharmony_ci { 948e5c31af7Sopenharmony_ci vtx_var = in0; 949e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 950e5c31af7Sopenharmony_ci } 951e5c31af7Sopenharmony_ci "" 952e5c31af7Sopenharmony_ci geometry "" 953e5c31af7Sopenharmony_ci #version 450 954e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 955e5c31af7Sopenharmony_ci sample in mediump float vtx_var[]; 956e5c31af7Sopenharmony_ci sample out mediump float geo_var; 957e5c31af7Sopenharmony_ci void main() 958e5c31af7Sopenharmony_ci { 959e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 960e5c31af7Sopenharmony_ci { 961e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 962e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 963e5c31af7Sopenharmony_ci EmitVertex(); 964e5c31af7Sopenharmony_ci } 965e5c31af7Sopenharmony_ci } 966e5c31af7Sopenharmony_ci "" 967e5c31af7Sopenharmony_ci fragment "" 968e5c31af7Sopenharmony_ci #version 450 969e5c31af7Sopenharmony_ci precision mediump float; 970e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 971e5c31af7Sopenharmony_ci sample in float geo_var; 972e5c31af7Sopenharmony_ci void main() 973e5c31af7Sopenharmony_ci { 974e5c31af7Sopenharmony_ci out0 = geo_var; 975e5c31af7Sopenharmony_ci ${FRAGMENT_OUTPUT} 976e5c31af7Sopenharmony_ci } 977e5c31af7Sopenharmony_ci "" 978e5c31af7Sopenharmony_ci end 979e5c31af7Sopenharmony_ci end 980e5c31af7Sopenharmony_ciend 981e5c31af7Sopenharmony_ci 982e5c31af7Sopenharmony_cigroup uniform "Uniform linkage" 983e5c31af7Sopenharmony_ci group rules "Rules" 984e5c31af7Sopenharmony_ci 985e5c31af7Sopenharmony_ci case type_mismatch_1 986e5c31af7Sopenharmony_ci version 450 987e5c31af7Sopenharmony_ci desc "uniforms declared with different types" 988e5c31af7Sopenharmony_ci expect link_fail 989e5c31af7Sopenharmony_ci vertex "" 990e5c31af7Sopenharmony_ci #version 450 991e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 992e5c31af7Sopenharmony_ci uniform mediump float u_var; 993e5c31af7Sopenharmony_ci out mediump float vtx_var; 994e5c31af7Sopenharmony_ci void main() 995e5c31af7Sopenharmony_ci { 996e5c31af7Sopenharmony_ci vtx_var = u_var; 997e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 998e5c31af7Sopenharmony_ci } 999e5c31af7Sopenharmony_ci "" 1000e5c31af7Sopenharmony_ci geometry "" 1001e5c31af7Sopenharmony_ci #version 450 1002e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 1003e5c31af7Sopenharmony_ci uniform mediump vec4 u_var; 1004e5c31af7Sopenharmony_ci in mediump float vtx_var[]; 1005e5c31af7Sopenharmony_ci out mediump float geo_var; 1006e5c31af7Sopenharmony_ci void main() 1007e5c31af7Sopenharmony_ci { 1008e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 1009e5c31af7Sopenharmony_ci { 1010e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 1011e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position + u_var; 1012e5c31af7Sopenharmony_ci EmitVertex(); 1013e5c31af7Sopenharmony_ci } 1014e5c31af7Sopenharmony_ci } 1015e5c31af7Sopenharmony_ci "" 1016e5c31af7Sopenharmony_ci fragment "" 1017e5c31af7Sopenharmony_ci #version 450 1018e5c31af7Sopenharmony_ci precision mediump float; 1019e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 1020e5c31af7Sopenharmony_ci in float geo_var; 1021e5c31af7Sopenharmony_ci void main() 1022e5c31af7Sopenharmony_ci { 1023e5c31af7Sopenharmony_ci ${FRAG_COLOR} = vec4(geo_var); 1024e5c31af7Sopenharmony_ci } 1025e5c31af7Sopenharmony_ci "" 1026e5c31af7Sopenharmony_ci end 1027e5c31af7Sopenharmony_ci 1028e5c31af7Sopenharmony_ci case type_mismatch_2 1029e5c31af7Sopenharmony_ci version 450 1030e5c31af7Sopenharmony_ci desc "uniforms declared with different types" 1031e5c31af7Sopenharmony_ci expect link_fail 1032e5c31af7Sopenharmony_ci require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0 1033e5c31af7Sopenharmony_ci vertex "" 1034e5c31af7Sopenharmony_ci #version 450 1035e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 1036e5c31af7Sopenharmony_ci layout(binding=0) uniform atomic_uint u_var; 1037e5c31af7Sopenharmony_ci out mediump float vtx_var; 1038e5c31af7Sopenharmony_ci void main() 1039e5c31af7Sopenharmony_ci { 1040e5c31af7Sopenharmony_ci uint result = atomicCounterIncrement(u_var); 1041e5c31af7Sopenharmony_ci vtx_var = float(result); 1042e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 1043e5c31af7Sopenharmony_ci } 1044e5c31af7Sopenharmony_ci "" 1045e5c31af7Sopenharmony_ci geometry "" 1046e5c31af7Sopenharmony_ci #version 450 1047e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 1048e5c31af7Sopenharmony_ci uniform mediump vec4 u_var; 1049e5c31af7Sopenharmony_ci in mediump float vtx_var[]; 1050e5c31af7Sopenharmony_ci out mediump float geo_var; 1051e5c31af7Sopenharmony_ci void main() 1052e5c31af7Sopenharmony_ci { 1053e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 1054e5c31af7Sopenharmony_ci { 1055e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 1056e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position + u_var; 1057e5c31af7Sopenharmony_ci EmitVertex(); 1058e5c31af7Sopenharmony_ci } 1059e5c31af7Sopenharmony_ci } 1060e5c31af7Sopenharmony_ci "" 1061e5c31af7Sopenharmony_ci fragment "" 1062e5c31af7Sopenharmony_ci #version 450 1063e5c31af7Sopenharmony_ci precision mediump float; 1064e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 1065e5c31af7Sopenharmony_ci in float geo_var; 1066e5c31af7Sopenharmony_ci void main() 1067e5c31af7Sopenharmony_ci { 1068e5c31af7Sopenharmony_ci ${FRAG_COLOR} = vec4(geo_var); 1069e5c31af7Sopenharmony_ci } 1070e5c31af7Sopenharmony_ci "" 1071e5c31af7Sopenharmony_ci end 1072e5c31af7Sopenharmony_ci 1073e5c31af7Sopenharmony_ci case type_mismatch_3 1074e5c31af7Sopenharmony_ci version 450 1075e5c31af7Sopenharmony_ci desc "uniforms declared with different types" 1076e5c31af7Sopenharmony_ci expect link_fail 1077e5c31af7Sopenharmony_ci require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0 1078e5c31af7Sopenharmony_ci vertex "" 1079e5c31af7Sopenharmony_ci #version 450 1080e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 1081e5c31af7Sopenharmony_ci layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var; 1082e5c31af7Sopenharmony_ci out mediump float vtx_var; 1083e5c31af7Sopenharmony_ci void main() 1084e5c31af7Sopenharmony_ci { 1085e5c31af7Sopenharmony_ci int result = imageSize(u_var).x; 1086e5c31af7Sopenharmony_ci vtx_var = float(result); 1087e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 1088e5c31af7Sopenharmony_ci } 1089e5c31af7Sopenharmony_ci "" 1090e5c31af7Sopenharmony_ci geometry "" 1091e5c31af7Sopenharmony_ci #version 450 1092e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 1093e5c31af7Sopenharmony_ci uniform mediump vec4 u_var; 1094e5c31af7Sopenharmony_ci in mediump float vtx_var[]; 1095e5c31af7Sopenharmony_ci out mediump float geo_var; 1096e5c31af7Sopenharmony_ci void main() 1097e5c31af7Sopenharmony_ci { 1098e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 1099e5c31af7Sopenharmony_ci { 1100e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx]; 1101e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position + u_var; 1102e5c31af7Sopenharmony_ci EmitVertex(); 1103e5c31af7Sopenharmony_ci } 1104e5c31af7Sopenharmony_ci } 1105e5c31af7Sopenharmony_ci "" 1106e5c31af7Sopenharmony_ci fragment "" 1107e5c31af7Sopenharmony_ci #version 450 1108e5c31af7Sopenharmony_ci precision mediump float; 1109e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 1110e5c31af7Sopenharmony_ci in float geo_var; 1111e5c31af7Sopenharmony_ci void main() 1112e5c31af7Sopenharmony_ci { 1113e5c31af7Sopenharmony_ci ${FRAG_COLOR} = vec4(geo_var); 1114e5c31af7Sopenharmony_ci } 1115e5c31af7Sopenharmony_ci "" 1116e5c31af7Sopenharmony_ci end 1117e5c31af7Sopenharmony_ci 1118e5c31af7Sopenharmony_ci case struct_partial_usage 1119e5c31af7Sopenharmony_ci version 450 1120e5c31af7Sopenharmony_ci desc "uniforms struct used partially in different stages" 1121e5c31af7Sopenharmony_ci values 1122e5c31af7Sopenharmony_ci { 1123e5c31af7Sopenharmony_ci uniform float val.vtxValue = 1.0; 1124e5c31af7Sopenharmony_ci uniform float val.geoValue = 1.0; 1125e5c31af7Sopenharmony_ci uniform float val.frgValue = 1.0; 1126e5c31af7Sopenharmony_ci } 1127e5c31af7Sopenharmony_ci vertex "" 1128e5c31af7Sopenharmony_ci #version 450 1129e5c31af7Sopenharmony_ci ${VERTEX_DECLARATIONS} 1130e5c31af7Sopenharmony_ci struct S 1131e5c31af7Sopenharmony_ci { 1132e5c31af7Sopenharmony_ci mediump float vtxValue; 1133e5c31af7Sopenharmony_ci mediump float geoValue; 1134e5c31af7Sopenharmony_ci mediump float frgValue; 1135e5c31af7Sopenharmony_ci }; 1136e5c31af7Sopenharmony_ci uniform S val; 1137e5c31af7Sopenharmony_ci out mediump float vtx_var; 1138e5c31af7Sopenharmony_ci void main() 1139e5c31af7Sopenharmony_ci { 1140e5c31af7Sopenharmony_ci vtx_var = val.vtxValue; 1141e5c31af7Sopenharmony_ci ${VERTEX_OUTPUT} 1142e5c31af7Sopenharmony_ci } 1143e5c31af7Sopenharmony_ci "" 1144e5c31af7Sopenharmony_ci geometry "" 1145e5c31af7Sopenharmony_ci #version 450 1146e5c31af7Sopenharmony_ci ${GEOMETRY_DECLARATIONS} 1147e5c31af7Sopenharmony_ci struct S 1148e5c31af7Sopenharmony_ci { 1149e5c31af7Sopenharmony_ci mediump float vtxValue; 1150e5c31af7Sopenharmony_ci mediump float geoValue; 1151e5c31af7Sopenharmony_ci mediump float frgValue; 1152e5c31af7Sopenharmony_ci }; 1153e5c31af7Sopenharmony_ci uniform S val; 1154e5c31af7Sopenharmony_ci in mediump float vtx_var[]; 1155e5c31af7Sopenharmony_ci out mediump float geo_var; 1156e5c31af7Sopenharmony_ci void main() 1157e5c31af7Sopenharmony_ci { 1158e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < gl_in.length(); ++ndx) 1159e5c31af7Sopenharmony_ci { 1160e5c31af7Sopenharmony_ci geo_var = vtx_var[ndx] + val.geoValue; 1161e5c31af7Sopenharmony_ci gl_Position = gl_in[ndx].gl_Position; 1162e5c31af7Sopenharmony_ci EmitVertex(); 1163e5c31af7Sopenharmony_ci } 1164e5c31af7Sopenharmony_ci } 1165e5c31af7Sopenharmony_ci "" 1166e5c31af7Sopenharmony_ci fragment "" 1167e5c31af7Sopenharmony_ci #version 450 1168e5c31af7Sopenharmony_ci precision mediump float; 1169e5c31af7Sopenharmony_ci ${FRAGMENT_DECLARATIONS} 1170e5c31af7Sopenharmony_ci struct S 1171e5c31af7Sopenharmony_ci { 1172e5c31af7Sopenharmony_ci mediump float vtxValue; 1173e5c31af7Sopenharmony_ci mediump float geoValue; 1174e5c31af7Sopenharmony_ci mediump float frgValue; 1175e5c31af7Sopenharmony_ci }; 1176e5c31af7Sopenharmony_ci uniform S val; 1177e5c31af7Sopenharmony_ci in float geo_var; 1178e5c31af7Sopenharmony_ci void main() 1179e5c31af7Sopenharmony_ci { 1180e5c31af7Sopenharmony_ci ${FRAG_COLOR} = vec4(geo_var + val.frgValue); 1181e5c31af7Sopenharmony_ci } 1182e5c31af7Sopenharmony_ci "" 1183e5c31af7Sopenharmony_ci end 1184e5c31af7Sopenharmony_ci end 1185e5c31af7Sopenharmony_ci 1186e5c31af7Sopenharmony_ci import "linkage_geometry_uniform_types.test" 1187e5c31af7Sopenharmony_ciend 1188