FullscreenBlur.java revision 6f31c36a3dbe5e61644ec39c4fcad0284d50e4f1
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
38006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation sRenderTargetBlur0Color;
39006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation sRenderTargetBlur0Depth;
40006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation sRenderTargetBlur1Color;
41006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation sRenderTargetBlur1Depth;
42006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation sRenderTargetBlur2Color;
43006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static Allocation 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
52006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // This is only used when full screen blur is enabled
53006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // Basically, it's the offscreen render targets
54006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    static void createRenderTargets(RenderScriptGL rs, int w, int h) {
55006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        Type.Builder b = new Type.Builder(rs, Element.RGBA_8888(rs));
565121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        Type renderType = b.setX(w/8).setY(h/8).create();
57ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        int usage = Allocation.USAGE_GRAPHICS_TEXTURE | Allocation.USAGE_GRAPHICS_RENDER_TARGET;
58ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur0Color = Allocation.createTyped(rs, renderType, usage);
59ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur1Color = Allocation.createTyped(rs, renderType, usage);
60ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur2Color = Allocation.createTyped(rs, renderType, usage);
61ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
62ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        b = new Type.Builder(rs, Element.createPixel(rs, Element.DataType.UNSIGNED_16,
63ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                     Element.DataKind.PIXEL_DEPTH));
645121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        renderType = b.setX(w/8).setY(h/8).create();
65ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        usage = Allocation.USAGE_GRAPHICS_RENDER_TARGET;
66ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur0Depth = Allocation.createTyped(rs, renderType, usage);
67ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur1Depth = Allocation.createTyped(rs, renderType, usage);
68ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        sRenderTargetBlur2Depth = Allocation.createTyped(rs, renderType, usage);
69006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
70006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
71ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    static void addOffsets(Renderable quad, float advance) {
72ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset0", - advance * 2.5f));
73ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset1", - advance * 0.5f));
74ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset2", advance * 1.5f));
75ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad.appendSourceParams(new Float4Param("blurOffset3", advance * 3.5f));
76ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
77006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
786f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    static RenderPass addPass(Scene scene, Camera cam, Allocation color, Allocation depth) {
79ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderPass pass = new RenderPass();
80ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setColorTarget(color);
81ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setDepthTarget(depth);
82ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setShouldClearColor(false);
83ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        pass.setShouldClearDepth(false);
846f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        pass.setCamera(cam);
85ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        scene.appendRenderPass(pass);
86ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        return pass;
87ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
88006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
896f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    static void addBlurPasses(Scene scene, RenderScriptGL rs, Camera cam) {
90ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
91ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ArrayList<RenderableBase> allDraw = scene.getRenderables();
92ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        int numDraw = allDraw.size();
93006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
94ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramRaster cullNone = ProgramRaster.CULL_NONE(rs);
95ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore blendAdd = SceneManager.BLEND_ADD_DEPTH_NONE(rs);
96ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore blendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(rs);
97006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
98ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, blendAdd, cullNone);
99ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, blendNone, cullNone);
100ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, blendNone, cullNone);
101ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, blendNone, cullNone);
102006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
103ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Renders the scene off screen
1046f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass blurSourcePass = addPass(scene, cam,
105ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                            sRenderTargetBlur0Color,
106ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                            sRenderTargetBlur0Depth);
107006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
108006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setShouldClearColor(true);
109006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setClearDepth(1.0f);
110006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        blurSourcePass.setShouldClearDepth(true);
111006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
112684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            blurSourcePass.appendRenderable((Renderable)allDraw.get(i));
113006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        }
114ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
115ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Pass for selecting bright colors
1166f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass selectColorPass = addPass(scene, cam,
117ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                             sRenderTargetBlur2Color,
118ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                             sRenderTargetBlur2Depth);
119f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadS", selectCol);
1206f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur0Color)));
121684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        selectColorPass.appendRenderable(quad);
122be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Horizontal blur
1246f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass horizontalBlurPass = addPass(scene, cam,
125ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                sRenderTargetBlur1Color,
126ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                                sRenderTargetBlur1Depth);
127ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad = sceneManager.getRenderableQuad("ScreenAlignedQuadH", hBlur);
1286f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur2Color)));
129ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        addOffsets(quad, 1.0f / (float)sRenderTargetBlur0Color.getType().getX());
130684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        horizontalBlurPass.appendRenderable(quad);
131be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
132ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        // Vertical Blur
1336f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass verticalBlurPass = addPass(scene, cam,
134ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              sRenderTargetBlur2Color,
135ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              sRenderTargetBlur2Depth);
136ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        quad = sceneManager.getRenderableQuad("ScreenAlignedQuadV", vBlur);
1376f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur1Color)));
138ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        addOffsets(quad, 1.0f / (float)sRenderTargetBlur0Color.getType().getY());
139684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        verticalBlurPass.appendRenderable(quad);
140006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
141006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
142ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    // Additively renders the blurred colors on top of the scene
1436f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    static void addCompositePass(Scene scene, RenderScriptGL rs, Camera cam) {
144ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
145006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture,
146ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              SceneManager.BLEND_ADD_DEPTH_NONE(rs),
147ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk                                              ProgramRaster.CULL_NONE(rs));
148ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
1496f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        RenderPass compositePass = addPass(scene, cam, null, null);
1506f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadComposite", drawTex);
1516f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(sRenderTargetBlur2Color)));
152684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        compositePass.appendRenderable(quad);
153006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
154006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
1555121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static private FragmentShader getShader(Resources res, RenderScriptGL rs,
1565121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk                                            int resID, Type constants) {
1575121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(rs);
1585121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        fb.setShader(res, resID);
1595121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D, "color");
1605121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        if (constants != null) {
1615121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk            fb.setObjectConst(constants);
1625121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        }
1635121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        FragmentShader prog = fb.create();
164d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        prog.getProgram().bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
1655121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        return prog;
1665121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    }
1675121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk
1685121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk    static void initShaders(Resources res, RenderScriptGL rs) {
1694bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_BlurOffsets blurConst = new ScriptField_BlurOffsets(rs, 1);
1705121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        VertexShader.Builder vb = new VertexShader.Builder(rs);
1714bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        vb.addInput(ScriptField_VertexShaderInputs.createElement(rs));
172006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        vb.setShader(res, R.raw.blur_vertex);
173006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        mPV_Blur = vb.create();
174006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
1755121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_Texture = getShader(res, rs, R.raw.texture, null);
176d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        mPF_Texture.getProgram().bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(rs), 0);
1775121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_BlurH = getShader(res, rs, R.raw.blur_h, blurConst.getAllocation().getType());
1785121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_BlurV = getShader(res, rs, R.raw.blur_v, blurConst.getAllocation().getType());
1795121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk        mPF_SelectColor = getShader(res, rs, R.raw.select_color, null);
180006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    }
181006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
182006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk}
183006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
184006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
185006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
186006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
187006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
188