cocos2dx3.2でbox blur。と、ピクセルごとのデータの取得

gaussian blurは重いしlerp blurは質が悪いので速度も質も間くらいのbox blurを試してみた。
シェーダで以下のコードを書いてみたところ、

int rad = 4, diam = rad * 2 + 1;
float area = float(diam * diam);
float dist = 1.0 / 512.0;
vec4 sum = vec4(0.0);

for(int x = -rad; x <= rad; x++){
    for(int y = -rad; y <= rad; y++){
        float tmpx = v_texCoord.x + float(x) * dist;
        float tmpy = v_texCoord.y + float(y) * dist;
        sum += texture2D(u_texture, vec2(tmpx, tmpy)) / area;
    }
}
gl_FragColor = sum;

この段階で、android実機で16fps前後。
まだ2passにしてないし、distは毎回掛けないでループごとに足した方が良さそうだし、
areaは逆数にして掛けた方がたぶん速くなる、何よりbox blurなんだからウェイトは
ループの外に出して一回にできるよね、と思って以下に修正したところ

int rad = 4, diam = rad * 2 + 1;
float area = float(diam * diam);
float dist = 1.0 / 512.0;
vec4 sum = vec4(0.0);

for(int x = -rad; x <= rad; x++){
    for(int y = -rad; y <= rad; y++){
        float tmpx = v_texCoord.x + float(x) * dist;
        float tmpy = v_texCoord.y + float(y) * dist;
        sum += texture2D(u_texture, vec2(tmpx, tmpy)); //←これを
    }
}
gl_FragColor = sum / area; //←こう

android実機で6fps前後。何故か遅くなる。
最適化的なものの機嫌を損ねてるのか?(そもそも最適化なんてされてるのか?)
GPUってCPUの常識が通用しないものなのか? よく分からず。
ウェイトを外に出せないとbox blurのメリットがなくなってしまう。ぐぬぬ

ということで、一旦box blurは中断して、stack blurをやってみることにした。
stack blurGPUと相性悪いはずなので、画像からピクセルごとのデータを持ってきて、
CPU側でにゃんにゃんすればよろしかろう、GPUの恩恵には与れないけど、
そもそもシェーダを何度も掛けるような処理では、GPUで稼いだ分を
テクスチャバッファの切り替えで失ってる気がしないでもない。
今日は時間がないので、取り合えずピクセルごとのデータとってくるところまでやる。
というわけで、できたのがこれ。
https://gist.github.com/t-takasaka/aa7a50528c36355129c7

まだ何もしてないが、android実機で30fps前後。
いきなり雲行きが怪しい・・・・・・