1006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk/*
2006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk *
4006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * you may not use this file except in compliance with the License.
6006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * You may obtain a copy of the License at
7006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk *
8006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk *
10006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * See the License for the specific language governing permissions and
14006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * limitations under the License.
15006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk */
16006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
17006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
18d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp;
19006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
20be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.ArrayList;
21be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
22d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukimport com.android.scenegraph.*;
23be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
24006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.content.res.Resources;
25006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.Bitmap;
26006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.BitmapFactory;
27006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.os.AsyncTask;
28006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.*;
29006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
30006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Element.Builder;
31006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Font.Style;
32006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Program.TextureType;
33006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc;
34006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.util.Log;
35006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
36b6e9dad7823fd5458f381530c09bd71fcfcef98fAlex Sakhartchoukclass FullscreenBlur {
37006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
38e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur0Color;
39e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur0Depth;
40e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur1Color;
41e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur1Depth;
42e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur2Color;
43e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static TextureRenderTarget sRenderTargetBlur2Depth;
44006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
455121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static FragmentShader mPF_BlurH;
465121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static FragmentShader mPF_BlurV;
475121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static FragmentShader mPF_SelectColor;
485121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static FragmentShader mPF_Texture;
495121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static VertexShader mPV_Paint;
505121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static VertexShader mPV_Blur;
51006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
52e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static int targetWidth;
53e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static int targetHeight;
54e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk
55006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // This is only used when full screen blur is enabled
56006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // Basically, it's the offscreen render targets
57006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static void createRenderTargets(RenderScriptGL rs, int w, int h) {
58e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        targetWidth = w/8;
59e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        targetHeight = h/8;
60006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        Type.Builder b = new Type.Builder(rs, Element.RGBA_8888(rs));
61e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        Type renderType = b.setX(targetWidth).setY(targetHeight).create();
62ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        int usage = Allocation.USAGE_GRAPHICS_TEXTURE | Allocation.USAGE_GRAPHICS_RENDER_TARGET;
63e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur0Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
64e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur1Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
65e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur2Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
66ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
67ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        b = new Type.Builder(rs, Element.createPixel(rs, Element.DataType.UNSIGNED_16,
68ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                     Element.DataKind.PIXEL_DEPTH));
69e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        renderType = b.setX(targetWidth).setY(targetHeight).create();
70ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        usage = Allocation.USAGE_GRAPHICS_RENDER_TARGET;
71e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur0Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
72e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur1Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
73e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        sRenderTargetBlur2Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage));
74006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
75006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
76ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    static void addOffsets(Renderable quad, float advance) {
77ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset0", - advance * 2.5f));
78ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset1", - advance * 0.5f));
79ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset2", advance * 1.5f));
80ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset3", advance * 3.5f));
81ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
82006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
83e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    static RenderPass addPass(Scene scene, Camera cam, TextureRenderTarget color, TextureRenderTarget depth) {
84ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderPass pass = new RenderPass();
85ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setColorTarget(color);
86ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setDepthTarget(depth);
87ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setShouldClearColor(false);
88ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setShouldClearDepth(false);
896f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        pass.setCamera(cam);
90ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        scene.appendRenderPass(pass);
91ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        return pass;
92ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
93006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
946f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    static void addBlurPasses(Scene scene, RenderScriptGL rs, Camera cam) {
95ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
96ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ArrayList<RenderableBase> allDraw = scene.getRenderables();
97ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        int numDraw = allDraw.size();
98006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
99ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramRaster cullNone = ProgramRaster.CULL_NONE(rs);
100ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore blendAdd = SceneManager.BLEND_ADD_DEPTH_NONE(rs);
101ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore blendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(rs);
102006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
103ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, blendAdd, cullNone);
104ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, blendNone, cullNone);
105ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, blendNone, cullNone);
106ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, blendNone, cullNone);
107006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
108ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Renders the scene off screen
1096f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass blurSourcePass = addPass(scene, cam,
110ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                            sRenderTargetBlur0Color,
111ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                            sRenderTargetBlur0Depth);
112006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
113006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setShouldClearColor(true);
114006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setClearDepth(1.0f);
115006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setShouldClearDepth(true);
116006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
117684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            blurSourcePass.appendRenderable((Renderable)allDraw.get(i));
118006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        }
119ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
120ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Pass for selecting bright colors
1216f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass selectColorPass = addPass(scene, cam,
122ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                             sRenderTargetBlur2Color,
123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                             sRenderTargetBlur2Depth);
124f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadS", selectCol);
125e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur0Color));
126684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        selectColorPass.appendRenderable(quad);
127be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
128ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Horizontal blur
1296f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass horizontalBlurPass = addPass(scene, cam,
130ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                sRenderTargetBlur1Color,
131ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                sRenderTargetBlur1Depth);
132ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad = sceneManager.getRenderableQuad("ScreenAlignedQuadH", hBlur);
133e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur2Color));
134e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        addOffsets(quad, 1.0f / (float)targetWidth);
135684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        horizontalBlurPass.appendRenderable(quad);
136be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
137ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Vertical Blur
1386f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass verticalBlurPass = addPass(scene, cam,
139ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              sRenderTargetBlur2Color,
140ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              sRenderTargetBlur2Depth);
141ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad = sceneManager.getRenderableQuad("ScreenAlignedQuadV", vBlur);
142e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur1Color));
143e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        addOffsets(quad, 1.0f / (float)targetHeight);
144684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        verticalBlurPass.appendRenderable(quad);
145006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
146006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
147ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    // Additively renders the blurred colors on top of the scene
1486f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    static void addCompositePass(Scene scene, RenderScriptGL rs, Camera cam) {
149ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
150006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture,
151ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              SceneManager.BLEND_ADD_DEPTH_NONE(rs),
152ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              ProgramRaster.CULL_NONE(rs));
153ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
1546f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass compositePass = addPass(scene, cam, null, null);
1556f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadComposite", drawTex);
156e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur2Color));
157684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        compositePass.appendRenderable(quad);
158006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
159006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
1605121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static private FragmentShader getShader(Resources res, RenderScriptGL rs,
1615121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk                                            int resID, Type constants) {
1625121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(rs);
1635121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        fb.setShader(res, resID);
1645121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D, "color");
1655121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        if (constants != null) {
1665121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk            fb.setObjectConst(constants);
1675121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        }
1685121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        FragmentShader prog = fb.create();
169d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        prog.getProgram().bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
1705121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        return prog;
1715121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    }
1725121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk
1735121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static void initShaders(Resources res, RenderScriptGL rs) {
1744bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_BlurOffsets blurConst = new ScriptField_BlurOffsets(rs, 1);
1755121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        VertexShader.Builder vb = new VertexShader.Builder(rs);
1764bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        vb.addInput(ScriptField_VertexShaderInputs.createElement(rs));
177006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        vb.setShader(res, R.raw.blur_vertex);
178006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        mPV_Blur = vb.create();
179006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
1805121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_Texture = getShader(res, rs, R.raw.texture, null);
181d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        mPF_Texture.getProgram().bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(rs), 0);
1825121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_BlurH = getShader(res, rs, R.raw.blur_h, blurConst.getAllocation().getType());
1835121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_BlurV = getShader(res, rs, R.raw.blur_v, blurConst.getAllocation().getType());
1845121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_SelectColor = getShader(res, rs, R.raw.select_color, null);
185006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
186006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
187006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk}
188006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
189006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
190006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
191006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
192006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
193