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 209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 21a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide 2265c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 2311518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>ProgramFragmentFixedFunction is a helper class that provides 24df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * a way to make a simple fragment shader without writing any 2511518acc8c416023d8c2192b441a1767205676d9Robert Ly * GLSL code. This class allows for display of constant color, interpolated 2611518acc8c416023d8c2192b441a1767205676d9Robert Ly * color from the vertex shader, or combinations of the both 2711518acc8c416023d8c2192b441a1767205676d9Robert Ly * blended with results of up to two texture lookups.</p 28b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 29b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk **/ 30b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpublic class ProgramFragmentFixedFunction extends ProgramFragment { 31460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray ProgramFragmentFixedFunction(long id, RenderScript rs) { 32b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(id, rs); 33b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 34b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 35b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static class InternalBuilder extends BaseProgramBuilder { 3665c80f824711f084c4ece9204f543a7809534294Jason Sams /** 3765c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 3865c80f824711f084c4ece9204f543a7809534294Jason Sams */ 39b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public InternalBuilder(RenderScript rs) { 40b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(rs); 41b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 42b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 4465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 45df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates ProgramFragmentFixedFunction from the current state 46df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * of the builder 47df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 48df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return ProgramFragmentFixedFunction 49df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 50b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 51b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS.validate(); 529807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; 532123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk String[] texNames = new String[mTextureCount]; 54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int idx = 0; 55b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 56b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mInputCount; i++) { 57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.INPUT.mID; 589807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat tmp[idx++] = mInputs[i].getID(mRS); 59b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 60b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mOutputCount; i++) { 61b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.OUTPUT.mID; 629807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat tmp[idx++] = mOutputs[i].getID(mRS); 63b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 64b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mConstantCount; i++) { 65b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.CONSTANT.mID; 669807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat tmp[idx++] = mConstants[i].getID(mRS); 67b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 68b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mTextureCount; i++) { 69b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; 709807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat tmp[idx++] = mTextureTypes[i].mID; 712123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk texNames[i] = mTextureNames[i]; 72b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 73b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 74460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = mRS.nProgramFragmentCreate(mShader, texNames, tmp); 75b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = new ProgramFragmentFixedFunction(id, mRS); 76b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk initProgram(pf); 77b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 78b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 79b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 8165c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8265c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 8365c80f824711f084c4ece9204f543a7809534294Jason Sams */ 84b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static class Builder { 8565c80f824711f084c4ece9204f543a7809534294Jason Sams /** 8665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 8765c80f824711f084c4ece9204f543a7809534294Jason Sams */ 88b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static final int MAX_TEXTURE = 2; 89b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mNumTextures; 90b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mPointSpriteEnable; 91b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mVaryingColorEnable; 92b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk String mShader; 93b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RenderScript mRS; 94b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 9665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 97df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * EnvMode describes how textures are combined with the existing 98df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * color in the fixed function fragment shader 99df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 100df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 101b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum EnvMode { 10265c80f824711f084c4ece9204f543a7809534294Jason Sams /** 10365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 10465c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 105b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk REPLACE (1), 10665c80f824711f084c4ece9204f543a7809534294Jason Sams /** 10765c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 10865c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 109b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk MODULATE (2), 11065c80f824711f084c4ece9204f543a7809534294Jason Sams /** 11165c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 11265c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 113b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk DECAL (3); 114b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 115b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 116b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode(int id) { 117b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 118b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 119b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 120b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 12265c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 123df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Format describes the pixel format of textures in the fixed 124df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * function fragment shader and how they are sampled 125df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 126df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 127b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public enum Format { 12865c80f824711f084c4ece9204f543a7809534294Jason Sams /** 12965c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13065c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 131b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ALPHA (1), 13265c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13465c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 135b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk LUMINANCE_ALPHA (2), 13665c80f824711f084c4ece9204f543a7809534294Jason Sams /** 13765c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 13865c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 139b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGB (3), 14065c80f824711f084c4ece9204f543a7809534294Jason Sams /** 14165c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 14265c80f824711f084c4ece9204f543a7809534294Jason Sams **/ 143b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RGBA (4); 144b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 145b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int mID; 146b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format(int id) { 147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mID = id; 148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 149b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 150b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 151b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private class Slot { 152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk EnvMode env; 153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Format format; 154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot(EnvMode _env, Format _fmt) { 155b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk env = _env; 156b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk format = _fmt; 157b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 158b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 159b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Slot[] mSlots; 160b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 161b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private void buildShaderString() { 162b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader = "//rs_shader_internal\n"; 163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying lowp vec4 varColor;\n"; 164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying vec2 varTex0;\n"; 165b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 166b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "void main() {\n"; 167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mVaryingColorEnable) { 168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = varColor;\n"; 169b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 170b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " lowp vec4 col = UNI_Color;\n"; 171b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 172b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mNumTextures != 0) { 174b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mPointSpriteEnable) { 175b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = gl_PointCoord;\n"; 176b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 177b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " vec2 t0 = varTex0.xy;\n"; 178b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 179b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 180b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 181b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < mNumTextures; i ++) { 182b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch(mSlots[i].env) { 183b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case REPLACE: 184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 185b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 186b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a = texture2D(UNI_Tex0, t0).a;\n"; 187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 189b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 190b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 191b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb = texture2D(UNI_Tex0, t0).rgb;\n"; 193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 195b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n"; 196b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 197b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 198b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 199b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case MODULATE: 200b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk switch (mSlots[i].format) { 201b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case ALPHA: 202b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.a *= texture2D(UNI_Tex0, t0).a;\n"; 203b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case LUMINANCE_ALPHA: 205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 206b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 207b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGB: 208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n"; 209b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 210b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case RGBA: 211b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n"; 212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 215b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk case DECAL: 216b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " col = texture2D(UNI_Tex0, t0);\n"; 217b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk break; 218b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 219b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 220b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 221b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " gl_FragColor = col;\n"; 222b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "}\n"; 223b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 224b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2259c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 22665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated 227df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates a builder for fixed function fragment program 228df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 229f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * @param rs Context to which the program will belong. 230df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 231b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder(RenderScript rs) { 232b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS = rs; 233b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots = new Slot[MAX_TEXTURE]; 234b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = false; 235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 236b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 23865c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 239df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Adds a texture to be fetched as part of the fixed function 240df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment program 241df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 242df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param env specifies how the texture is combined with the 243df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 244df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param fmt specifies the format of the texture and how its 245df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * components will be used to combine with the 246df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * current color 247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param slot index of the texture to apply the operations on 248df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 249df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return this 250df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 251b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setTexture(EnvMode env, Format fmt, int slot) 252b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throws IllegalArgumentException { 253b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if((slot < 0) || (slot >= MAX_TEXTURE)) { 254b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throw new IllegalArgumentException("MAX_TEXTURE exceeded."); 255b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 256b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mSlots[slot] = new Slot(env, fmt); 257b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 258b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 259b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 26165c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 262df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the texture coordinate passed from the 263df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * vertex program is replaced with an openGL internal point 264df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * sprite texture coordinate 265df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 266df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 267b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setPointSpriteTexCoordinateReplacement(boolean enable) { 268b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mPointSpriteEnable = enable; 269b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 270b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 271b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 27365c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 274df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether the varying color passed from the vertex 275df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * program or the constant color set on the fragment program is 276df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * used in the final color calculation in the fixed function 277df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * fragment shader 278df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 279df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 280b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setVaryingColor(boolean enable) { 281b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mVaryingColorEnable = enable; 282b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 283b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 284b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 28665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16 287df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates the fixed function fragment program from the current 288df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * state of the builder. 289df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 290df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 291b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramFragmentFixedFunction create() { 292b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk InternalBuilder sb = new InternalBuilder(mRS); 293b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures = 0; 294b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < MAX_TEXTURE; i ++) { 295b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if(mSlots[i] != null) { 296b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mNumTextures ++; 297b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 298b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 299b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk buildShaderString(); 300b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.setShader(mShader); 301b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 302b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type constType = null; 303b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 304b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Element.Builder b = new Element.Builder(mRS); 305b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_4(mRS), "Color"); 306b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type.Builder typeBuilder = new Type.Builder(mRS, b.create()); 307b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk typeBuilder.setX(1); 308b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk constType = typeBuilder.create(); 309b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addConstant(constType); 310b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 311b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i = 0; i < mNumTextures; i ++) { 312b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addTexture(TextureType.TEXTURE_2D); 313b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 314b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 315b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramFragmentFixedFunction pf = sb.create(); 316b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.mTextureCount = MAX_TEXTURE; 317b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (!mVaryingColorEnable) { 318b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Allocation constantData = Allocation.createTyped(mRS,constType); 319b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams FieldPacker fp = new FieldPacker(16); 320b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams Float4 f4 = new Float4(1.f, 1.f, 1.f, 1.f); 321b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams fp.addF32(f4); 322b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams constantData.setFromFieldPacker(0, fp); 323b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk pf.bindConstants(constantData, 0); 324b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 325b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pf; 326b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 327b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 328b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} 329b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 331b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 332b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 333