1b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk/* 265c80f824711f084c4ece9204f543a7809534294Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project 3b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 4b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * you may not use this file except in compliance with the License. 6b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * You may obtain a copy of the License at 7b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 8b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 10b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * See the License for the specific language governing permissions and 14b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * limitations under the License. 15b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk */ 16b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 17b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpackage android.renderscript; 18b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 19b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 20b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukimport android.util.Log; 21b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 22b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 24a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide 2565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 2611518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>ProgramFragmentFixedFunction is a helper class that provides 27df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * a way to make a simple fragment shader without writing any 2811518acc8c416023d8c2192b441a1767205676d9Robert Ly * GLSL code. This class allows for display of constant color, interpolated 2911518acc8c416023d8c2192b441a1767205676d9Robert Ly * color from the vertex shader, or combinations of the both 3011518acc8c416023d8c2192b441a1767205676d9Robert Ly * blended with results of up to two texture lookups.</p 31b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 32b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk **/ 33b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpublic class ProgramFragmentFixedFunction extends ProgramFragment { 34b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction(int id, RenderScript rs) { 35b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(id, rs); 36b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 37b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 38b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static class InternalBuilder extends BaseProgramBuilder { 3965c80f824711f084c4ece9204f543a7809534294Jason Sams /** 4065c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 4165c80f824711f084c4ece9204f543a7809534294Jason Sams */ 42b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public InternalBuilder(RenderScript rs) { 43b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(rs); 44b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 45b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 4765c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 48df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates ProgramFragmentFixedFunction from the current state 49df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * of the builder 50df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 51df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return ProgramFragmentFixedFunction 52df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 53b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS.validate(); 55b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; 562123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk String[] texNames = new String[mTextureCount]; 57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int idx = 0; 58b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 59b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mInputCount; i++) { 60b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.INPUT.mID; 61e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mInputs[i].getID(mRS); 62b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 63b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mOutputCount; i++) { 64b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.OUTPUT.mID; 65e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mOutputs[i].getID(mRS); 66b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 67b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mConstantCount; i++) { 68b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.CONSTANT.mID; 69e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mConstants[i].getID(mRS); 70b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 71b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mTextureCount; i++) { 72b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; 73b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = mTextureTypes[i].mID; 742123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk texNames[i] = mTextureNames[i]; 75b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 76b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 772123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk int id = mRS.nProgramFragmentCreate(mShader, texNames, tmp); 78b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = new ProgramFragmentFixedFunction(id, mRS); 79b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk initProgram(pf); 80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 81b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 83b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 8465c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 8665c80f824711f084c4ece9204f543a7809534294Jason Sams */ 87b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static class Builder { 8865c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 9065c80f824711f084c4ece9204f543a7809534294Jason Sams */ 91b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static final int MAX_TEXTURE = 2; 92b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mNumTextures; 93b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mPointSpriteEnable; 94b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mVaryingColorEnable; 95b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk String mShader; 96b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RenderScript mRS; 97b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 9965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * EnvMode describes how textures are combined with the existing 101df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * color in the fixed function fragment shader 102df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 103df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 104b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum EnvMode { 10565c80f824711f084c4ece9204f543a7809534294Jason Sams /** 10665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 10765c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 108b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk REPLACE (1), 10965c80f824711f084c4ece9204f543a7809534294Jason Sams /** 11065c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 11165c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 112b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk MODULATE (2), 11365c80f824711f084c4ece9204f543a7809534294Jason Sams /** 11465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 11565c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 116b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk DECAL (3); 117b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 118b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 119b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode(int id) { 120b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 121b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 122b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 123b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 12565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 126df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Format describes the pixel format of textures in the fixed 127df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * function fragment shader and how they are sampled 128df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 129df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 130b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum Format { 13165c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13265c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13365c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 134b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ALPHA (1), 13565c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13765c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 138b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk LUMINANCE_ALPHA (2), 13965c80f824711f084c4ece9204f543a7809534294Jason Sams /** 14065c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 14165c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 142b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGB (3), 14365c80f824711f084c4ece9204f543a7809534294Jason Sams /** 14465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 14565c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 146b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGBA (4); 147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 149b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format(int id) { 150b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 151b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private class Slot { 155b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode env; 156b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format format; 157b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot(EnvMode _env, Format _fmt) { 158b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk env = _env; 159b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk format = _fmt; 160b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 161b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 162b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot[] mSlots; 163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private void buildShaderString() { 165b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader = "//rs_shader_internal\n"; 166b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying lowp vec4 varColor;\n"; 167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying vec2 varTex0;\n"; 168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 169b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "void main() {\n"; 170b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mVaryingColorEnable) { 171b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = varColor;\n"; 172b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = UNI_Color;\n"; 174b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 175b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 176b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mNumTextures != 0) { 177b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mPointSpriteEnable) { 178b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = gl_PointCoord;\n"; 179b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 180b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = varTex0.xy;\n"; 181b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 182b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 183b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < mNumTextures; i ++) { 185b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch(mSlots[i].env) { 186b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case REPLACE: 187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 189b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a = texture2D(UNI_Tex0, t0).a;\n"; 190b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 191b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 195b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb = texture2D(UNI_Tex0, t0).rgb;\n"; 196b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 197b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 198b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 199b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 200b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 201b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 202b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case MODULATE: 203b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a *= texture2D(UNI_Tex0, t0).a;\n"; 206b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 207b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 209b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 210b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 211b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n"; 212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 215b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 216b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 217b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 218b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case DECAL: 219b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col = texture2D(UNI_Tex0, t0);\n"; 220b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 221b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 222b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 223b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 224b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " gl_FragColor = col;\n"; 225b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "}\n"; 226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 22965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated 230df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates a builder for fixed function fragment program 231df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 232f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * @param rs Context to which the program will belong. 233df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 234b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder(RenderScript rs) { 235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS = rs; 236b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots = new Slot[MAX_TEXTURE]; 237b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = false; 238b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 239b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 24165c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 242df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Adds a texture to be fetched as part of the fixed function 243df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment program 244df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 245df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param env specifies how the texture is combined with the 246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param fmt specifies the format of the texture and how its 248df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * components will be used to combine with the 249df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 250df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param slot index of the texture to apply the operations on 251df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 252df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return this 253df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 254b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setTexture(EnvMode env, Format fmt, int slot) 255b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throws IllegalArgumentException { 256b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if((slot < 0) || (slot >= MAX_TEXTURE)) { 257b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throw new IllegalArgumentException("MAX_TEXTURE exceeded."); 258b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 259b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots[slot] = new Slot(env, fmt); 260b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 261b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 262b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2639c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 26465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the texture coordinate passed from the 266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * vertex program is replaced with an openGL internal point 267df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * sprite texture coordinate 268df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 269df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 270b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setPointSpriteTexCoordinateReplacement(boolean enable) { 271b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = enable; 272b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 273b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 274b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 27665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 277df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the varying color passed from the vertex 278df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * program or the constant color set on the fragment program is 279df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * used in the final color calculation in the fixed function 280df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment shader 281df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 282df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 283b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setVaryingColor(boolean enable) { 284b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mVaryingColorEnable = enable; 285b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 286b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 287b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2889c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 28965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 290df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates the fixed function fragment program from the current 291df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * state of the builder. 292df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 293df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 294b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 295b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk InternalBuilder sb = new InternalBuilder(mRS); 296b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures = 0; 297b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < MAX_TEXTURE; i ++) { 298b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if(mSlots[i] != null) { 299b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures ++; 300b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 301b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 302b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk buildShaderString(); 303b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.setShader(mShader); 304b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 305b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type constType = null; 306b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 307b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Element.Builder b = new Element.Builder(mRS); 308b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_4(mRS), "Color"); 309b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type.Builder typeBuilder = new Type.Builder(mRS, b.create()); 310b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk typeBuilder.setX(1); 311b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk constType = typeBuilder.create(); 312b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addConstant(constType); 313b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 314b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i = 0; i < mNumTextures; i ++) { 315b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addTexture(TextureType.TEXTURE_2D); 316b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 317b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 318b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = sb.create(); 319b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.mTextureCount = MAX_TEXTURE; 320b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 321b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Allocation constantData = Allocation.createTyped(mRS,constType); 322b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams FieldPacker fp = new FieldPacker(16); 323b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams Float4 f4 = new Float4(1.f, 1.f, 1.f, 1.f); 324b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams fp.addF32(f4); 325b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams constantData.setFromFieldPacker(0, fp); 326b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.bindConstants(constantData, 0); 327b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 328b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 329b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 331b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} 332b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 333b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 334b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 335b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 336