group if "If Statements" case single_statement values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; if (in0 >= 1.0) out0 = 1.0; ${OUTPUT} } "" end case compound_statement values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; output float out1 = [ 1.0 | 0.0 | 0.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; out1 = 1.0; if (in0 >= 1.0) { out0 = 1.0; out1 = 0.0; } ${OUTPUT} } "" end case sequence_statements values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; output float out1 = [ 1.0 | 0.0 | 0.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; out1 = 1.0; if (in0 >= 1.0) out0 = 1.0, out1 = 0.0; ${OUTPUT} } "" end case sequence_condition values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; output float out1 = [ 1.0 | 0.0 | 0.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; out1 = 1.0; if (false, in0 >= 1.0) out0 = 1.0, out1 = 0.0; ${OUTPUT} } "" end case complex_condition values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; output float out1 = [ 1.0 | 0.0 | 0.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; out1 = 1.0; if (false || (in0 >= 1.0) && (in0 - 2.0*in0 < 0.0)) out0 = 1.0, out1 = 0.0; ${OUTPUT} } "" end case if_else values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 1.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { if (in0 >= 1.0) out0 = 1.0; else out0 = 0.0; ${OUTPUT} } "" end case if_elseif values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 2.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { out0 = 0.0; if (in0 >= 2.0) out0 = 2.0; else if (in0 >= 1.0) out0 = 1.0; ${OUTPUT} } "" end case if_elseif_else values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 2.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { if (in0 >= 2.0) out0 = 2.0; else if (in0 >= 1.0) out0 = 1.0; else out0 = 0.0; ${OUTPUT} } "" end case mixed_if_elseif_else values { input float in0 = [ 0.0 | 1.0 | 2.0 ]; output float out0 = [ 0.0 | 1.0 | 2.0 ]; } both "" precision mediump float; ${DECLARATIONS} void main() { if (in0 >= 2.0) { out0 = 2.0; } else if (in0 >= 1.0) out0 = 2.0, out0 = 1.0; else out0 = 0.0; ${OUTPUT} } "" end case constant_conditional_assignment_to_matrix vertex "" // This variant doesn't provoke the crash seen in the versions below. ${VERTEX_DECLARATIONS} varying mediump float FragVarying; const float in0 = 0.0; void main() { mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0); if (in0 == 1.0) { projectionMatrix[0][0] = 1.0; } FragVarying = 1.0; gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0); } "" fragment "" precision mediump float; varying float FragVarying; void main() { gl_FragColor = vec4(FragVarying, 1.0, 1.0, 1.0); } "" end case input_conditional_assignment_to_matrix values { input float in0 = [ 0.0 ]; } vertex "" ${VERTEX_DECLARATIONS} varying mediump float FragVarying; // Necessary to reproduce. void main() { // Crashes with mat4 as well. Does not crash with vectors. mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0); // Testing a non-constant variable is necessary. if (in0 == 1.0) { // Using the matrix variable appears necessary. projectionMatrix[0][0] = 1.0; } FragVarying = 1.0; // Referencing the matrix is necessary though clearly the compiler // doesn't realize the assignment is useless. gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0); } "" fragment "" precision mediump float; varying float FragVarying; void main() { gl_FragColor = vec4(FragVarying, 1.0, 1.0, 1.0); } "" end case uniform_conditional_assignment_to_matrix values { uniform float uni0 = [ 0.0 ]; } vertex "" ${VERTEX_DECLARATIONS} varying mediump float FragVarying; // Necessary to reproduce. void main() { // Crashes with mat4 as well. Does not crash with vectors. mat2 projectionMatrix = mat2(0.0, 0.0, 0.0, 0.0); // Testing a non-constant variable is necessary. if (uni0 == 1.0) { // Using the matrix variable appears necessary. projectionMatrix[0][0] = 1.0; } FragVarying = 1.0; // Referencing the matrix is necessary though clearly the compiler // doesn't realize the assignment is useless. gl_Position = dEQP_Position + vec4(projectionMatrix[1][0], 0.0, 0.0, 0.0); } "" fragment "" precision mediump float; varying float FragVarying; void main() { gl_FragColor = vec4(FragVarying, 1.0, 1.0, 1.0); } "" end end # if group invalid_if "Invalid If Conditionals" case missing_parenthesis expect compile_fail both "" precision mediump float; void main() { if true ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case unclosed_parenthesis expect compile_fail both "" precision mediump float; void main() { if (true ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case int_condition expect compile_fail both "" precision mediump float; void main() { if (5) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case int_zero_condition expect compile_fail both "" precision mediump float; void main() { if (0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case int_one_condition expect compile_fail both "" precision mediump float; void main() { if (1) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case int_uniform_condition expect compile_fail both "" precision mediump float; precision mediump int; uniform int u0; void main() { if (u0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case float_condition expect compile_fail both "" precision mediump float; void main() { if (5.0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case float_zero_condition expect compile_fail both "" precision mediump float; void main() { if (0.0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case float_one_condition expect compile_fail both "" precision mediump float; void main() { if (1.0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end case sampler_condition expect compile_fail both "" precision mediump float; uniform sampler2D s0; void main() { if (s0) ${POSITION_FRAG_COLOR} = vec4(1.0); } "" end end # invalid_if