#version 310 es precision mediump float; layout(location = 0) out float FragColor; layout(location = 0) flat in int index; const float LUT[16] = float[]( 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0); void main() { // Try reading LUTs, both in branches and not branch. FragColor = LUT[index]; if (index < 10) FragColor += LUT[index ^ 1]; else FragColor += LUT[index & 1]; // Not declared as a LUT, but can be promoted to one. vec4 foo[4] = vec4[](vec4(0.0), vec4(1.0), vec4(8.0), vec4(5.0)); if (index > 30) { FragColor += foo[index & 3].y; } else { FragColor += foo[index & 1].x; } // Not declared as a LUT, but this cannot be promoted, because we have a partial write. vec4 foobar[4] = vec4[](vec4(0.0), vec4(1.0), vec4(8.0), vec4(5.0)); if (index > 30) { foobar[1].z = 20.0; } FragColor += foobar[index & 3].z; // Not declared as a LUT, but this cannot be promoted, because we have two complete writes. vec4 baz[4] = vec4[](vec4(0.0), vec4(1.0), vec4(8.0), vec4(5.0)); baz = vec4[](vec4(20.0), vec4(30.0), vec4(50.0), vec4(60.0)); FragColor += baz[index & 3].z; }