1 case mismatch_number_of_declarations 2 version 310 es 3 desc "Shader io block mismatch: different number of declarations" 4 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 5 expect link_fail 6 vertex "" 7 #version 310 es 8 ${VERTEX_DECLARATIONS} 9 out IOBlockName 10 { 11 mediump float variable1; 12 }; 13 14 void main() 15 { 16 variable1 = float(gl_VertexID); 17 ${VERTEX_OUTPUT} 18 } 19 "" 20 fragment "" 21 #version 310 es 22 precision mediump float; 23 ${FRAGMENT_DECLARATIONS} 24 in IOBlockName 25 { 26 mediump float variable1; 27 mediump float variable2; 28 }; 29 30 void main() 31 { 32 ${FRAG_COLOR} = vec4(variable1 + variable2); 33 } 34 "" 35 end 36 37 case mismatch_order 38 version 310 es 39 desc "Shader io block mismatch: different member declaration order" 40 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 41 expect link_fail 42 vertex "" 43 #version 310 es 44 ${VERTEX_DECLARATIONS} 45 out IOBlockName 46 { 47 mediump float variable1; 48 mediump float variable2; 49 }; 50 51 void main() 52 { 53 variable1 = float(gl_VertexID); 54 ${VERTEX_OUTPUT} 55 } 56 "" 57 fragment "" 58 #version 310 es 59 precision mediump float; 60 ${FRAGMENT_DECLARATIONS} 61 in IOBlockName 62 { 63 mediump float variable2; 64 mediump float variable1; 65 }; 66 67 void main() 68 { 69 ${FRAG_COLOR} = vec4(variable1 + variable2); 70 } 71 "" 72 end 73 74 case mismatch_type 75 version 310 es 76 desc "Shader io block mismatch: different member type" 77 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 78 expect link_fail 79 vertex "" 80 #version 310 es 81 ${VERTEX_DECLARATIONS} 82 out IOBlockName 83 { 84 mediump vec2 variable; 85 }; 86 87 void main() 88 { 89 variable.x = float(gl_VertexID); 90 variable.y = float(gl_InstanceID); 91 ${VERTEX_OUTPUT} 92 } 93 "" 94 fragment "" 95 #version 310 es 96 precision mediump float; 97 ${FRAGMENT_DECLARATIONS} 98 in IOBlockName 99 { 100 mediump float variable; 101 }; 102 103 void main() 104 { 105 ${FRAG_COLOR} = vec4(variable); 106 } 107 "" 108 end 109 110 case mismatch_member_name 111 version 310 es 112 desc "Shader io block mismatch: different member name" 113 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 114 expect link_fail 115 vertex "" 116 #version 310 es 117 ${VERTEX_DECLARATIONS} 118 out IOBlockName 119 { 120 mediump float variable1; 121 }; 122 123 void main() 124 { 125 variable1 = float(gl_VertexID); 126 ${VERTEX_OUTPUT} 127 } 128 "" 129 fragment "" 130 #version 310 es 131 precision mediump float; 132 ${FRAGMENT_DECLARATIONS} 133 in IOBlockName 134 { 135 mediump float variable2; 136 }; 137 138 void main() 139 { 140 ${FRAG_COLOR} = vec4(variable2); 141 } 142 "" 143 end 144 145 case mismatch_member_array_size 146 version 310 es 147 desc "Shader io block mismatch: different member array size" 148 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 149 expect link_fail 150 vertex "" 151 #version 310 es 152 ${VERTEX_DECLARATIONS} 153 out IOBlockName 154 { 155 mediump float variable[1]; 156 }; 157 158 void main() 159 { 160 variable[0] = float(gl_VertexID); 161 ${VERTEX_OUTPUT} 162 } 163 "" 164 fragment "" 165 #version 310 es 166 precision mediump float; 167 ${FRAGMENT_DECLARATIONS} 168 in IOBlockName 169 { 170 mediump float variable[2]; 171 }; 172 173 void main() 174 { 175 ${FRAG_COLOR} = vec4(variable[0] + variable[1]); 176 } 177 "" 178 end 179 180 case with_and_without_instance_name 181 version 310 es 182 desc "Shader io block: with and without instance name" 183 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 184 values 185 { 186 input float in0 = 1.0; 187 output float out0 = 1.0; 188 } 189 vertex "" 190 #version 310 es 191 ${VERTEX_DECLARATIONS} 192 out IOBlockName 193 { 194 mediump float variable; 195 } instanceName; 196 197 void main() 198 { 199 instanceName.variable = in0; 200 ${VERTEX_OUTPUT} 201 } 202 "" 203 fragment "" 204 #version 310 es 205 precision mediump float; 206 ${FRAGMENT_DECLARATIONS} 207 in IOBlockName 208 { 209 mediump float variable; 210 }; 211 212 void main() 213 { 214 out0 = variable; 215 ${FRAGMENT_OUTPUT} 216 } 217 "" 218 end 219 220 case mismatch_block_array_size 221 version 310 es 222 desc "Shader io block mismatch: different array size" 223 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 224 expect link_fail 225 vertex "" 226 #version 310 es 227 ${VERTEX_DECLARATIONS} 228 out IOBlockName 229 { 230 mediump float variable; 231 } instanceName[1]; 232 233 void main() 234 { 235 instanceName[0].variable = float(gl_VertexID); 236 ${VERTEX_OUTPUT} 237 } 238 "" 239 fragment "" 240 #version 310 es 241 precision mediump float; 242 ${FRAGMENT_DECLARATIONS} 243 in IOBlockName 244 { 245 mediump float variable; 246 } instanceName[2]; 247 248 void main() 249 { 250 ${FRAG_COLOR} = vec4(instanceName[0].variable + instanceName[1].variable); 251 } 252 "" 253 end 254 255 case missing_output_block 256 version 310 es 257 desc "Shader io block mismatch: missing output block" 258 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 259 expect link_fail 260 vertex "" 261 #version 310 es 262 ${VERTEX_DECLARATIONS} 263 void main() 264 { 265 ${VERTEX_OUTPUT} 266 } 267 "" 268 fragment "" 269 #version 310 es 270 precision mediump float; 271 ${FRAGMENT_DECLARATIONS} 272 in IOBlockName 273 { 274 mediump float variable; 275 }; 276 277 void main() 278 { 279 ${FRAG_COLOR} = vec4(variable); 280 } 281 "" 282 end 283 284 case ambiguous_variable_name_1 285 version 310 es 286 desc "Unnamed io block variable and global variable with identical names" 287 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 288 expect compile_or_link_fail 289 vertex "" 290 #version 310 es 291 ${VERTEX_DECLARATIONS} 292 float variable; 293 out IOBlockName 294 { 295 mediump float variable; 296 }; 297 298 void main() 299 { 300 variable = float(gl_VertexID); 301 ${VERTEX_OUTPUT} 302 } 303 "" 304 fragment "" 305 #version 310 es 306 precision mediump float; 307 ${FRAGMENT_DECLARATIONS} 308 in IOBlockName 309 { 310 mediump float variable; 311 }; 312 313 void main() 314 { 315 ${FRAG_COLOR} = vec4(variable); 316 } 317 "" 318 end 319 320 case ambiguous_variable_name_2 321 version 310 es 322 desc "Two unnamed io blocks with variables with identical names" 323 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } 324 expect compile_or_link_fail 325 vertex "" 326 #version 310 es 327 ${VERTEX_DECLARATIONS} 328 out IOBlockNameA 329 { 330 mediump float variable; 331 }; 332 out IOBlockNameB 333 { 334 mediump float variable; 335 }; 336 337 void main() 338 { 339 variable = float(gl_VertexID); 340 ${VERTEX_OUTPUT} 341 } 342 "" 343 fragment "" 344 #version 310 es 345 precision mediump float; 346 ${FRAGMENT_DECLARATIONS} 347 in IOBlockNameA 348 { 349 mediump float variable; 350 }; 351 in IOBlockNameB 352 { 353 mediump float variable; 354 }; 355 356 void main() 357 { 358 ${FRAG_COLOR} = vec4(variable); 359 } 360 "" 361 end 362