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/** 2465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 2511518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>ProgramFragmentFixedFunction is a helper class that provides 26df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * a way to make a simple fragment shader without writing any 2711518acc8c416023d8c2192b441a1767205676d9Robert Ly * GLSL code. This class allows for display of constant color, interpolated 2811518acc8c416023d8c2192b441a1767205676d9Robert Ly * color from the vertex shader, or combinations of the both 2911518acc8c416023d8c2192b441a1767205676d9Robert Ly * blended with results of up to two texture lookups.</p 30b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 31b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk **/ 32b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpublic class ProgramFragmentFixedFunction extends ProgramFragment { 33b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction(int id, RenderScript rs) { 34b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(id, rs); 35b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 36b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 37b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static class InternalBuilder extends BaseProgramBuilder { 3865c80f824711f084c4ece9204f543a7809534294Jason Sams /** 3965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 4065c80f824711f084c4ece9204f543a7809534294Jason Sams */ 41b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public InternalBuilder(RenderScript rs) { 42b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(rs); 43b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 44b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 4665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 47df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates ProgramFragmentFixedFunction from the current state 48df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * of the builder 49df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 50df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return ProgramFragmentFixedFunction 51df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 52b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 53b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS.validate(); 54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; 552123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk String[] texNames = new String[mTextureCount]; 56b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int idx = 0; 57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 58b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mInputCount; i++) { 59b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.INPUT.mID; 60e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mInputs[i].getID(mRS); 61b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 62b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mOutputCount; i++) { 63b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.OUTPUT.mID; 64e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mOutputs[i].getID(mRS); 65b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 66b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mConstantCount; i++) { 67b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.CONSTANT.mID; 68e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mConstants[i].getID(mRS); 69b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 70b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mTextureCount; i++) { 71b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; 72b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = mTextureTypes[i].mID; 732123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk texNames[i] = mTextureNames[i]; 74b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 75b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 762123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk int id = mRS.nProgramFragmentCreate(mShader, texNames, tmp); 77b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = new ProgramFragmentFixedFunction(id, mRS); 78b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk initProgram(pf); 79b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 81b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 8365c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 8565c80f824711f084c4ece9204f543a7809534294Jason Sams */ 86b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static class Builder { 8765c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8865c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 8965c80f824711f084c4ece9204f543a7809534294Jason Sams */ 90b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static final int MAX_TEXTURE = 2; 91b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mNumTextures; 92b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mPointSpriteEnable; 93b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mVaryingColorEnable; 94b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk String mShader; 95b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RenderScript mRS; 96b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 9865c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 99df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * EnvMode describes how textures are combined with the existing 100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * color in the fixed function fragment shader 101df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 102df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 103b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum EnvMode { 10465c80f824711f084c4ece9204f543a7809534294Jason Sams /** 10565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 10665c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 107b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk REPLACE (1), 10865c80f824711f084c4ece9204f543a7809534294Jason Sams /** 10965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 11065c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 111b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk MODULATE (2), 11265c80f824711f084c4ece9204f543a7809534294Jason Sams /** 11365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 11465c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 115b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk DECAL (3); 116b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 117b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 118b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode(int id) { 119b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 120b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 121b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 122b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 12465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 125df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Format describes the pixel format of textures in the fixed 126df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * function fragment shader and how they are sampled 127df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 128df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 129b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum Format { 13065c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13165c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13265c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 133b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ALPHA (1), 13465c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13665c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 137b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk LUMINANCE_ALPHA (2), 13865c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 14065c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 141b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGB (3), 14265c80f824711f084c4ece9204f543a7809534294Jason Sams /** 14365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 14465c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 145b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGBA (4); 146b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format(int id) { 149b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 150b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 151b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private class Slot { 154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode env; 155b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format format; 156b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot(EnvMode _env, Format _fmt) { 157b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk env = _env; 158b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk format = _fmt; 159b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 160b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 161b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot[] mSlots; 162b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private void buildShaderString() { 164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader = "//rs_shader_internal\n"; 165b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying lowp vec4 varColor;\n"; 166b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying vec2 varTex0;\n"; 167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "void main() {\n"; 169b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mVaryingColorEnable) { 170b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = varColor;\n"; 171b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 172b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = UNI_Color;\n"; 173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 174b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 175b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mNumTextures != 0) { 176b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mPointSpriteEnable) { 177b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = gl_PointCoord;\n"; 178b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 179b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = varTex0.xy;\n"; 180b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 181b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 182b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 183b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < mNumTextures; i ++) { 184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch(mSlots[i].env) { 185b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case REPLACE: 186b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a = texture2D(UNI_Tex0, t0).a;\n"; 189b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 190b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 191b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb = texture2D(UNI_Tex0, t0).rgb;\n"; 195b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 196b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 197b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 198b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 199b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 200b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 201b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case MODULATE: 202b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 203b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a *= texture2D(UNI_Tex0, t0).a;\n"; 205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 206b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 207b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 209b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 210b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n"; 211b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 215b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 216b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 217b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case DECAL: 218b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col = texture2D(UNI_Tex0, t0);\n"; 219b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 220b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 221b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 222b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 223b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " gl_FragColor = col;\n"; 224b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "}\n"; 225b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2279c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 22865c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated 229df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates a builder for fixed function fragment program 230df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 231f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * @param rs Context to which the program will belong. 232df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 233b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder(RenderScript rs) { 234b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS = rs; 235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots = new Slot[MAX_TEXTURE]; 236b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = false; 237b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 238b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2399c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 24065c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 241df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Adds a texture to be fetched as part of the fixed function 242df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment program 243df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 244df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param env specifies how the texture is combined with the 245df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param fmt specifies the format of the texture and how its 247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * components will be used to combine with the 248df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 249df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param slot index of the texture to apply the operations on 250df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 251df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return this 252df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 253b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setTexture(EnvMode env, Format fmt, int slot) 254b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throws IllegalArgumentException { 255b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if((slot < 0) || (slot >= MAX_TEXTURE)) { 256b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throw new IllegalArgumentException("MAX_TEXTURE exceeded."); 257b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 258b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots[slot] = new Slot(env, fmt); 259b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 260b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 261b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2629c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 26365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 264df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the texture coordinate passed from the 265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * vertex program is replaced with an openGL internal point 266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * sprite texture coordinate 267df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 268df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 269b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setPointSpriteTexCoordinateReplacement(boolean enable) { 270b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = enable; 271b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 272b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 273b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2749c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 27565c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 276df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the varying color passed from the vertex 277df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * program or the constant color set on the fragment program is 278df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * used in the final color calculation in the fixed function 279df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment shader 280df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 281df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 282b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setVaryingColor(boolean enable) { 283b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mVaryingColorEnable = enable; 284b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 285b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 286b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2879c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 28865c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 289df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates the fixed function fragment program from the current 290df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * state of the builder. 291df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 292df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 293b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 294b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk InternalBuilder sb = new InternalBuilder(mRS); 295b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures = 0; 296b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < MAX_TEXTURE; i ++) { 297b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if(mSlots[i] != null) { 298b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures ++; 299b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 300b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 301b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk buildShaderString(); 302b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.setShader(mShader); 303b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 304b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type constType = null; 305b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 306b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Element.Builder b = new Element.Builder(mRS); 307b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_4(mRS), "Color"); 308b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type.Builder typeBuilder = new Type.Builder(mRS, b.create()); 309b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk typeBuilder.setX(1); 310b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk constType = typeBuilder.create(); 311b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addConstant(constType); 312b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 313b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i = 0; i < mNumTextures; i ++) { 314b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addTexture(TextureType.TEXTURE_2D); 315b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 316b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 317b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = sb.create(); 318b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.mTextureCount = MAX_TEXTURE; 319b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 320b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Allocation constantData = Allocation.createTyped(mRS,constType); 321b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams FieldPacker fp = new FieldPacker(16); 322b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams Float4 f4 = new Float4(1.f, 1.f, 1.f, 1.f); 323b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams fp.addF32(f4); 324b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams constantData.setFromFieldPacker(0, fp); 325b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.bindConstants(constantData, 0); 326b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 327b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 328b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 329b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} 331b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 332b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 333b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 334b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 335