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