Program.java revision 67f2e442a31b8395e3c1951f8e91139ec7f2be99
10011bcf57ff711a221a3a4c73f2a79125111647dJason Sams/* 20011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Copyright (C) 2008 The Android Open Source Project 30011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 40011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 50011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * you may not use this file except in compliance with the License. 60011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * You may obtain a copy of the License at 70011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 80011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * http://www.apache.org/licenses/LICENSE-2.0 90011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 100011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Unless required by applicable law or agreed to in writing, software 110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * See the License for the specific language governing permissions and 140011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * limitations under the License. 150011bcf57ff711a221a3a4c73f2a79125111647dJason Sams */ 160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 170011bcf57ff711a221a3a4c73f2a79125111647dJason Samspackage android.renderscript; 180011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 190011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 20a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchoukimport java.io.IOException; 21a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchoukimport java.io.InputStream; 22a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchoukimport java.io.UnsupportedEncodingException; 23a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk 24a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchoukimport android.content.res.Resources; 250011bcf57ff711a221a3a4c73f2a79125111647dJason Samsimport android.util.Config; 260011bcf57ff711a221a3a4c73f2a79125111647dJason Samsimport android.util.Log; 270011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 280011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 290011bcf57ff711a221a3a4c73f2a79125111647dJason Sams/** 300011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * @hide 310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 320011bcf57ff711a221a3a4c73f2a79125111647dJason Sams **/ 330011bcf57ff711a221a3a4c73f2a79125111647dJason Samspublic class Program extends BaseObj { 340011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_INPUT = 8; 350011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_OUTPUT = 8; 360011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_CONSTANT = 8; 377e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams public static final int MAX_TEXTURE = 8; 380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 3967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk public enum TextureType { 4067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TEXTURE_2D (0), 4167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TEXTURE_CUBE (1); 4267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 4367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int mID; 4467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TextureType(int id) { 4567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mID = id; 4667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 4767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 4867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 4967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk enum ProgramParam { 5067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk INPUT (0), 5167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk OUTPUT (1), 5267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk CONSTANT (2), 5367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TEXTURE_TYPE (3); 5467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 5567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int mID; 5667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk ProgramParam(int id) { 5767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mID = id; 5867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 5967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk }; 6067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 610011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mInputs[]; 620011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mOutputs[]; 630011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mConstants[]; 6467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TextureType mTextures[]; 657e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams int mTextureCount; 660011bcf57ff711a221a3a4c73f2a79125111647dJason Sams String mShader; 670011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 680011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Program(int id, RenderScript rs) { 690de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 710011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void bindConstants(Allocation a, int slot) { 73c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams if (slot < 0 || slot >= mConstants.length) { 74c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new IllegalArgumentException("Slot ID out of range."); 75c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams } 76c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams if (a != null && 77c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams a.getType().getID() != mConstants[slot].getID()) { 78c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new IllegalArgumentException("Allocation type does not match slot type."); 79c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams } 8067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int id = a != null ? a.getID() : 0; 8167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mRS.nProgramBindConstants(getID(), slot, id); 820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 830011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 8468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindTexture(Allocation va, int slot) 8568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 8668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 8767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if ((slot < 0) || (slot >= mTextureCount)) { 8868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 8968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 9067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if (va != null && va.getType().getFaces() && 9167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mTextures[slot] != TextureType.TEXTURE_CUBE) { 9267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk throw new IllegalArgumentException("Cannot bind cubemap to 2d texture slot"); 9367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 9468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 9567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int id = va != null ? va.getID() : 0; 9667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mRS.nProgramBindTexture(getID(), slot, id); 9768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 9868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 9968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindSampler(Sampler vs, int slot) 10068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 10168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 10267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if ((slot < 0) || (slot >= mTextureCount)) { 10368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 10468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 10568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 10667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int id = vs != null ? vs.getID() : 0; 10767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mRS.nProgramBindSampler(getID(), slot, id); 10868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 10968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 11068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 1110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static class BaseProgramBuilder { 1120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams RenderScript mRS; 1130011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mInputs[]; 1140011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mOutputs[]; 1150011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mConstants[]; 1160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mTextures[]; 11767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk TextureType mTextureTypes[]; 1180011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mInputCount; 1190011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mOutputCount; 1200011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mConstantCount; 1210011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mTextureCount; 1220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams String mShader; 1230011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1240011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1250011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected BaseProgramBuilder(RenderScript rs) { 1260011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS = rs; 1270011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs = new Element[MAX_INPUT]; 1280011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs = new Element[MAX_OUTPUT]; 1290011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstants = new Type[MAX_CONSTANT]; 1300011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputCount = 0; 1310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputCount = 0; 1320011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstantCount = 0; 1337e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = 0; 13467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mTextureTypes = new TextureType[MAX_TEXTURE]; 1350011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1360011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 137288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setShader(String s) { 1380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mShader = s; 139288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 1400011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 142a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk public BaseProgramBuilder setShader(Resources resources, int resourceID) { 143a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk byte[] str; 144a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk int strLength; 145a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk InputStream is = resources.openRawResource(resourceID); 146a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk try { 147a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk try { 148a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk str = new byte[1024]; 149a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk strLength = 0; 150a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk while(true) { 151a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk int bytesLeft = str.length - strLength; 152a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk if (bytesLeft == 0) { 153a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk byte[] buf2 = new byte[str.length * 2]; 154a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk System.arraycopy(str, 0, buf2, 0, str.length); 155a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk str = buf2; 156a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk bytesLeft = str.length - strLength; 157a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 158a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk int bytesRead = is.read(str, strLength, bytesLeft); 159a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk if (bytesRead <= 0) { 160a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk break; 161a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 162a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk strLength += bytesRead; 163a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 164a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } finally { 165a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk is.close(); 166a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 167a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } catch(IOException e) { 168a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk throw new Resources.NotFoundException(); 169a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 170a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk 171a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk try { 172a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk mShader = new String(str, 0, strLength, "UTF-8"); 173a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } catch (UnsupportedEncodingException e) { 174a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk Log.e("Renderscript shader creation", "Could not decode shader string"); 175a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 176a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk 177a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk return this; 178a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk } 179a41174ecb03331d770614ecc6351cbc890874c28Alex Sakhartchouk 1800011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addInput(Element e) throws IllegalStateException { 1810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mInputCount >= MAX_INPUT) { 183c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Max input count exceeded."); 184c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams } 185c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams if (e.isComplex()) { 186c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Complex elements not allowed."); 1870011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs[mInputCount++] = e; 1890011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1900011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1910011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addOutput(Element e) throws IllegalStateException { 1920011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1930011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mOutputCount >= MAX_OUTPUT) { 194c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Max output count exceeded."); 195c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams } 196c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams if (e.isComplex()) { 197c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Complex elements not allowed."); 1980011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1990011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs[mOutputCount++] = e; 2000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2010011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 202b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk void resetConstant() { 203b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk mConstantCount = 0; 204b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk for(int i = 0; i < MAX_CONSTANT; i ++) { 205b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk mConstants[i] = null; 206b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk } 207b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk } 208b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk 209ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public int addConstant(Type t) throws IllegalStateException { 2100011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 2110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mConstantCount >= MAX_CONSTANT) { 212c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Max input count exceeded."); 213c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams } 214c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams if (t.getElement().isComplex()) { 215c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams throw new RSIllegalArgumentException("Complex elements not allowed."); 2160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 217ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams mConstants[mConstantCount] = t; 218ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mConstantCount++; 2190011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2200011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 221288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setTextureCount(int count) throws IllegalArgumentException { 2220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 223b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk if(count >= MAX_TEXTURE) { 2247e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams throw new IllegalArgumentException("Max texture count exceeded."); 2250011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2267e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = count; 22767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk for (int i = 0; i < mTextureCount; i ++) { 22867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mTextureTypes[i] = TextureType.TEXTURE_2D; 22967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 23067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk return this; 23167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 23267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 23367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk public BaseProgramBuilder addTexture(TextureType texType) throws IllegalArgumentException { 23467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if(mTextureCount >= MAX_TEXTURE) { 23567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk throw new IllegalArgumentException("Max texture count exceeded."); 23667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 23767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk mTextureTypes[mTextureCount ++] = texType; 238288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 2390011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2400011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 2410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected void initProgram(Program p) { 2420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mInputs = new Element[mInputCount]; 2430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount); 2440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mOutputs = new Element[mOutputCount]; 2450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount); 2460011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mConstants = new Type[mConstantCount]; 2470011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount); 2487e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams p.mTextureCount = mTextureCount; 24967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk p.mTextures = new TextureType[mTextureCount]; 25067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk System.arraycopy(mTextureTypes, 0, p.mTextures, 0, mTextureCount); 2510011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2520011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 2530011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 2540011bcf57ff711a221a3a4c73f2a79125111647dJason Sams} 2550011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 2560011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 257