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