In the post Rendering UI transitions on mobile, I mentioned a problem with my transition shader on Adreno 330 GPUs. The solution was pretty easy. I’ve just unrolled the for-loop (and reduced the number of taps, but this is another story). Here is the new code for main() in the fragment shader which works on Adreno perfectly:
void main(void)
{
float T = u_TransitionValue;
float S0 = 1.0;
float S1 = u_PixelSize;
float S2 = 1.0;
// 2 segments, 1/2 each
float Half = 0.5;
float PixelSize = ( T < Half ) ? mix( S0, S1, T / Half ) : mix( S1, S2, (T-Half) / Half );
vec2 D = PixelSize * u_Resolution.zw;
vec2 UV = v_TexCoord.xy;
// 5-tap Poisson disk coefficients
vec2 Disk[5];
Disk[0] = vec2( 0.1134811, 0.6604039) * D + UV;
Disk[1] = vec2(-0.4988798, 0.2663419) * D + UV;
Disk[2] = vec2(-0.4542479, -0.4338912) * D + UV;
Disk[3] = vec2( 0.7253948, -0.1434357) * D + UV;
Disk[4] = vec2( 0.09679408, -0.9359848) * D + UV;
vec4 C0 = texture( Texture0, UV );
C0 += texture( Texture0, Disk[0] );
C0 += texture( Texture0, Disk[1] );
C0 += texture( Texture0, Disk[2] );
C0 += texture( Texture0, Disk[3] );
C0 += texture( Texture0, Disk[4] );
C0 /= 6.0;
vec4 C1 = texture( Texture1, UV );
C1 += texture( Texture1, Disk[0] );
C1 += texture( Texture1, Disk[1] );
C1 += texture( Texture1, Disk[2] );
C1 += texture( Texture1, Disk[3] );
C1 += texture( Texture1, Disk[4] );
C1 /= 6.0;
out_FragColor = mix( C0, C1, T );
}
Btw, you can checkout how this transition looks like on GLSL.io.