ProgramStore.java revision 623c54dd1605d802bb6bfdd0d266a191d4f2d88c
122534176fb5c1257130ef4ee589739ca42766a32Jason Sams/*
222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Copyright (C) 2008 The Android Open Source Project
322534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
522534176fb5c1257130ef4ee589739ca42766a32Jason Sams * you may not use this file except in compliance with the License.
622534176fb5c1257130ef4ee589739ca42766a32Jason Sams * You may obtain a copy of the License at
722534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
822534176fb5c1257130ef4ee589739ca42766a32Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
922534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
1022534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Unless required by applicable law or agreed to in writing, software
1122534176fb5c1257130ef4ee589739ca42766a32Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1322534176fb5c1257130ef4ee589739ca42766a32Jason Sams * See the License for the specific language governing permissions and
1422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * limitations under the License.
1522534176fb5c1257130ef4ee589739ca42766a32Jason Sams */
1622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1722534176fb5c1257130ef4ee589739ca42766a32Jason Samspackage android.renderscript;
1822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2022534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Config;
2122534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Log;
2222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2322534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2422534176fb5c1257130ef4ee589739ca42766a32Jason Sams/**
25623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk * ProgarmStore contains a set of parameters that control how
26623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk * the graphics hardware handles writes to the framebuffer.
27623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *
28623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk * It could be used to:
29623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *   - enable/diable depth testing
30623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *   - specify wheather depth writes are performed
31623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *   - setup various blending modes for use in effects like
32623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *     transparency
33623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *   - define write masks for color components written into the
34623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk *     framebuffer
3522534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
3622534176fb5c1257130ef4ee589739ca42766a32Jason Sams **/
3722534176fb5c1257130ef4ee589739ca42766a32Jason Samspublic class ProgramStore extends BaseObj {
38623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
39623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Specifies the function used to determine whether a fragment
40623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * will be drawn during the depth testing stage in the rendering
41623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * pipeline by comparing its value with that already in the depth
42623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * buffer. DepthFunc is only valid when depth buffer is present
43623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * and depth testing is enabled
44623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    */
45b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public enum DepthFunc {
46623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk
47623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
48623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Always drawn
49623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
5022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ALWAYS (0),
51623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
52623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is less than that in the
53623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * depth buffer
54623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
5522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        LESS (1),
56623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
57623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is less or equal to that in
58623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * the depth buffer
59623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
60b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        LESS_OR_EQUAL (2),
61623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
62623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is greater than that in the
63623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * depth buffer
64623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
6522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        GREATER (3),
66623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
67623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is greater or equal to that
68623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * in the depth buffer
69623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
70b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        GREATER_OR_EQUAL (4),
71623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
72623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is equal to that in the
73623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * depth buffer
74623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
7522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        EQUAL (5),
76623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
77623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Drawn if the incoming depth value is not equal to that in the
78623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * depth buffer
79623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        NOT_EQUAL (6);
8122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
8222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        int mID;
8322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        DepthFunc(int id) {
8422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mID = id;
8522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
8622534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
8722534176fb5c1257130ef4ee589739ca42766a32Jason Sams
88623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
89623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Specifies the functions used to combine incoming pixels with
90623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * those already in the frame buffer.
91623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
92623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * BlendSrcFunc describes how the coefficient used to scale the
93623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * source pixels during the blending operation is computed
94623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
95623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    */
9622534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public enum BlendSrcFunc {
9722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ZERO (0),
9822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE (1),
9922534176fb5c1257130ef4ee589739ca42766a32Jason Sams        DST_COLOR (2),
10022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE_MINUS_DST_COLOR (3),
10122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        SRC_ALPHA (4),
10222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE_MINUS_SRC_ALPHA (5),
10322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        DST_ALPHA (6),
104eab4c75b09aa81ea093c2b9fbb3dbc2016c9bd6eJason Sams        ONE_MINUS_DST_ALPHA (7),
10522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        SRC_ALPHA_SATURATE (8);
10622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
10722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        int mID;
10822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        BlendSrcFunc(int id) {
10922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mID = id;
11022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
11122534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
11222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
113623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
114623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Specifies the functions used to combine incoming pixels with
115623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * those already in the frame buffer.
116623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
117623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * BlendDstFunc describes how the coefficient used to scale the
118623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * pixels already in the framebuffer is computed during the
119623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * blending operation
120623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
121623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    */
12222534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public enum BlendDstFunc {
12322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ZERO (0),
12422534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE (1),
12522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        SRC_COLOR (2),
12622534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE_MINUS_SRC_COLOR (3),
12722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        SRC_ALPHA (4),
12822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        ONE_MINUS_SRC_ALPHA (5),
12922534176fb5c1257130ef4ee589739ca42766a32Jason Sams        DST_ALPHA (6),
130eab4c75b09aa81ea093c2b9fbb3dbc2016c9bd6eJason Sams        ONE_MINUS_DST_ALPHA (7);
13122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
13222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        int mID;
13322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        BlendDstFunc(int id) {
13422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mID = id;
13522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
13622534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
13722534176fb5c1257130ef4ee589739ca42766a32Jason Sams
13822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
13922534176fb5c1257130ef4ee589739ca42766a32Jason Sams    ProgramStore(int id, RenderScript rs) {
1400de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
14122534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
143623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
144623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Returns a pre-defined program store object with the following
145623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * characteristics:
146623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels are drawn if their depth value is less than
147623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    the stored value in the depth buffer. If the pixel is
148623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    drawn, its value is also stored in the depth buffer
149623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels override the value stored in the color
150623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    buffer if it passes the depth test
151623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
152623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  @param rs
153623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    **/
154d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk    public static ProgramStore BLEND_NONE_DEPTH_TEST(RenderScript rs) {
155d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        if(rs.mProgramStore_BLEND_NONE_DEPTH_TEST == null) {
15632e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
15732e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
15832e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
159b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDitherEnabled(false);
160b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDepthMaskEnabled(true);
161d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk            rs.mProgramStore_BLEND_NONE_DEPTH_TEST = builder.create();
16232e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        }
163d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        return rs.mProgramStore_BLEND_NONE_DEPTH_TEST;
16432e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk    }
165623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
166623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Returns a pre-defined program store object with the following
167623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * characteristics:
168623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels always pass the depth test and their value
169623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    is not stored in the depth buffer
170623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels override the value stored in the color
171623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    buffer
172623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
173623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  @param rs
174623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    **/
175b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public static ProgramStore BLEND_NONE_DEPTH_NONE(RenderScript rs) {
176d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH == null) {
17732e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
17832e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
17932e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
180b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDitherEnabled(false);
181b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDepthMaskEnabled(false);
182d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk            rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH = builder.create();
18332e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        }
184d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        return rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
18532e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk    }
186623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
187623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Returns a pre-defined program store object with the following
188623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * characteristics:
189623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels are drawn if their depth value is less than
190623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    the stored value in the depth buffer. If the pixel is
191623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    drawn, its value is also stored in the depth buffer
192623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - if the incoming (Source) pixel passes depth test, its value
193623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    is combined with the stored color (Dest) using the
194623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    following formula
195623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  Final.RGB = Source.RGB * Source.A + Dest.RGB * (1 - Source.A)
196623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
197623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  @param rs
198623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    **/
199d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk    public static ProgramStore BLEND_ALPHA_DEPTH_TEST(RenderScript rs) {
200d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        if(rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST == null) {
20132e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
20232e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
20332e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDitherEnabled(false);
205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDepthMaskEnabled(true);
206d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk            rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST = builder.create();
20732e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        }
208d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        return rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST;
20932e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk    }
210623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
211623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Returns a pre-defined program store object with the following
212623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * characteristics:
213623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixels always pass the depth test and their value
214623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    is not stored in the depth buffer
215623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  - incoming pixel's value is combined with the stored color
216623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *    (Dest) using the following formula
217623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  Final.RGB = Source.RGB * Source.A + Dest.RGB * (1 - Source.A)
218623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *
219623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    *  @param rs
220623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    **/
221b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public static ProgramStore BLEND_ALPHA_DEPTH_NONE(RenderScript rs) {
222d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH == null) {
22332e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
22432e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
22532e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDitherEnabled(false);
227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            builder.setDepthMaskEnabled(false);
228d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk            rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH = builder.create();
22932e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        }
230d36f248eaf06c569010649902df653da1a9e2accAlex Sakhartchouk        return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
23132e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk    }
23222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
233623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    /**
234623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * Builder class for ProgramStore object. If the builder is left
235623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * empty, the equivalent of BLEND_NONE_DEPTH_NONE would be
236623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    * returned
237623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    */
23822534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public static class Builder {
23922534176fb5c1257130ef4ee589739ca42766a32Jason Sams        RenderScript mRS;
24022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        DepthFunc mDepthFunc;
24122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mDepthMask;
24222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mColorMaskR;
24322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mColorMaskG;
24422534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mColorMaskB;
24522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mColorMaskA;
24622534176fb5c1257130ef4ee589739ca42766a32Jason Sams        BlendSrcFunc mBlendSrc;
24722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        BlendDstFunc mBlendDst;
24822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        boolean mDither;
24922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
25032e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        public Builder(RenderScript rs) {
25132e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mRS = rs;
25232e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mDepthFunc = DepthFunc.ALWAYS;
25332e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mDepthMask = false;
25432e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mColorMaskR = true;
25532e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mColorMaskG = true;
25632e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mColorMaskB = true;
25732e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mColorMaskA = true;
25832e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mBlendSrc = BlendSrcFunc.ONE;
25932e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk            mBlendDst = BlendDstFunc.ZERO;
26022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
26122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
262623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
263623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Specifies the depth testing behavior
264623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
265623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param func function used for depth testing
266623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
267623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @return this
268623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
269288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma        public Builder setDepthFunc(DepthFunc func) {
27022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mDepthFunc = func;
271288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma            return this;
27222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
27322534176fb5c1257130ef4ee589739ca42766a32Jason Sams
274623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
275623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Enables writes into the depth buffer
276623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
277623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param enable specifies whether depth writes are
278623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *         enabled or disabled
279623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
280623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @return this
281623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
282b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder setDepthMaskEnabled(boolean enable) {
28322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mDepthMask = enable;
284288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma            return this;
28522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
28622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
287623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
288623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Enables writes into the color buffer
289623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
290623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param r specifies whether red channel is written
291623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param g specifies whether green channel is written
292623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param b specifies whether blue channel is written
293623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param a specifies whether alpha channel is written
294623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
295623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @return this
296623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
297b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder setColorMaskEnabled(boolean r, boolean g, boolean b, boolean a) {
29822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mColorMaskR = r;
29922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mColorMaskG = g;
30022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mColorMaskB = b;
30122534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mColorMaskA = a;
302288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma            return this;
30322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
30422534176fb5c1257130ef4ee589739ca42766a32Jason Sams
305623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
306623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Specifies how incoming pixels are combined with the pixels
307623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * stored in the framebuffer
308623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
309623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param src specifies how the source blending factor is
310623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *            computed
311623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param dst specifies how the destination blending factor is
312623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *            computed
313623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
314623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @return this
315623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
316288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma        public Builder setBlendFunc(BlendSrcFunc src, BlendDstFunc dst) {
31722534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mBlendSrc = src;
31822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mBlendDst = dst;
319288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma            return this;
32022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
32122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
322623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
323623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Enables dithering
324623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
325623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @param enable specifies whether dithering is enabled or
326623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *               disabled
327623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        *
328623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * @return this
329623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder setDitherEnabled(boolean enable) {
33122534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mDither = enable;
332288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma            return this;
33322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
33422534176fb5c1257130ef4ee589739ca42766a32Jason Sams
33522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        static synchronized ProgramStore internalCreate(RenderScript rs, Builder b) {
33606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            rs.nProgramStoreBegin(0, 0);
33754db59c3594e887a412a24713fc3daa1c2404593Jason Sams            rs.nProgramStoreDepthFunc(b.mDepthFunc.mID);
33854db59c3594e887a412a24713fc3daa1c2404593Jason Sams            rs.nProgramStoreDepthMask(b.mDepthMask);
33954db59c3594e887a412a24713fc3daa1c2404593Jason Sams            rs.nProgramStoreColorMask(b.mColorMaskR,
34022534176fb5c1257130ef4ee589739ca42766a32Jason Sams                                              b.mColorMaskG,
34122534176fb5c1257130ef4ee589739ca42766a32Jason Sams                                              b.mColorMaskB,
34222534176fb5c1257130ef4ee589739ca42766a32Jason Sams                                              b.mColorMaskA);
34354db59c3594e887a412a24713fc3daa1c2404593Jason Sams            rs.nProgramStoreBlendFunc(b.mBlendSrc.mID, b.mBlendDst.mID);
34454db59c3594e887a412a24713fc3daa1c2404593Jason Sams            rs.nProgramStoreDither(b.mDither);
34522534176fb5c1257130ef4ee589739ca42766a32Jason Sams
34654db59c3594e887a412a24713fc3daa1c2404593Jason Sams            int id = rs.nProgramStoreCreate();
34722534176fb5c1257130ef4ee589739ca42766a32Jason Sams            return new ProgramStore(id, rs);
34822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
34922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
350623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        /**
351623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        * Creates a program store from the current state of the builder
352623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk        */
35322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public ProgramStore create() {
354771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
35522534176fb5c1257130ef4ee589739ca42766a32Jason Sams            return internalCreate(mRS, this);
35622534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
35722534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
35822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
35922534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
36022534176fb5c1257130ef4ee589739ca42766a32Jason Sams
36122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
36222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
36322534176fb5c1257130ef4ee589739ca42766a32Jason Sams
364