We would need something like CustomFilterRendererState that will contain the size and other parameters in the future. We should pass that to bindProgramBuffers instead of storing it. There are two reasons. 1. Increase readability as separating changeable values from fixed values including shader program. 2. Be easy to reuse CustomFilterRenderer as making progress css shaders animation.
In my port, I'm now (sometimes) passing in a custom projection matrix so that I can avoid rendering to a texture and blending that to the framebuffer (which is needlessly wasteful of bandwidth and is too slow on some machines I target). Is your idea that we could also avoid rebinding the attributes and setting uniforms that have not changed since the last render?