Program.java revision a0c2eb27b408660b02fa248943166d6c7e447908
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.renderscript;
18
19
20import java.io.IOException;
21import java.io.InputStream;
22import java.io.UnsupportedEncodingException;
23
24import android.content.res.Resources;
25import android.util.Log;
26
27
28/** @deprecated renderscript is deprecated in J
29 *
30 * Program is a base class for all the objects that modify
31 * various stages of the graphics pipeline
32 *
33 **/
34public class Program extends BaseObj {
35    static final int MAX_INPUT = 8;
36    static final int MAX_OUTPUT = 8;
37    static final int MAX_CONSTANT = 8;
38    static final int MAX_TEXTURE = 8;
39
40    /** @deprecated renderscript is deprecated in J
41     *
42     * TextureType specifies what textures are attached to Program
43     * objects
44     *
45     **/
46    public enum TextureType {
47        /** @deprecated renderscript is deprecated in J
48        */
49        TEXTURE_2D (0),
50        /** @deprecated renderscript is deprecated in J
51        */
52        TEXTURE_CUBE (1);
53
54        int mID;
55        TextureType(int id) {
56            mID = id;
57        }
58    }
59
60    enum ProgramParam {
61        INPUT (0),
62        OUTPUT (1),
63        CONSTANT (2),
64        TEXTURE_TYPE (3);
65
66        int mID;
67        ProgramParam(int id) {
68            mID = id;
69        }
70    };
71
72    Element mInputs[];
73    Element mOutputs[];
74    Type mConstants[];
75    TextureType mTextures[];
76    String mTextureNames[];
77    int mTextureCount;
78    String mShader;
79
80    Program(int id, RenderScript rs) {
81        super(id, rs);
82    }
83
84    /** @hide renderscript is deprecated in J
85     * Program object can have zero or more constant allocations
86     * associated with it. This method returns the total count.
87     * @return number of constant input types
88     */
89    public int getConstantCount() {
90        return mConstants != null ? mConstants.length : 0;
91    }
92
93    /** @hide renderscript is deprecated in J
94     * Returns the type of the constant buffer used in the program
95     * object. It could be used to query internal elements or create
96     * an allocation to store constant data.
97     * @param slot index of the constant input type to return
98     * @return constant input type
99     */
100    public Type getConstant(int slot) {
101        if (slot < 0 || slot >= mConstants.length) {
102            throw new IllegalArgumentException("Slot ID out of range.");
103        }
104        return mConstants[slot];
105    }
106
107    /** @hide renderscript is deprecated in J
108     * Returns the number of textures used in this program object
109     * @return number of texture inputs
110     */
111    public int getTextureCount() {
112        return mTextureCount;
113    }
114
115    /** @hide renderscript is deprecated in J
116     * Returns the type of texture at a given slot. e.g. 2D or Cube
117     * @param slot index of the texture input
118     * @return texture input type
119     */
120    public TextureType getTextureType(int slot) {
121        if ((slot < 0) || (slot >= mTextureCount)) {
122            throw new IllegalArgumentException("Slot ID out of range.");
123        }
124        return mTextures[slot];
125    }
126
127    /** @hide renderscript is deprecated in J
128     * Returns the name of the texture input at a given slot. e.g.
129     * tex0, diffuse, spec
130     * @param slot index of the texture input
131     * @return texture input name
132     */
133    public String getTextureName(int slot) {
134        if ((slot < 0) || (slot >= mTextureCount)) {
135            throw new IllegalArgumentException("Slot ID out of range.");
136        }
137        return mTextureNames[slot];
138    }
139
140    /** @deprecated renderscript is deprecated in J
141     * Binds a constant buffer to be used as uniform inputs to the
142     * program
143     *
144     * @param a allocation containing uniform data
145     * @param slot index within the program's list of constant
146     *             buffer allocations
147     */
148    public void bindConstants(Allocation a, int slot) {
149        if (slot < 0 || slot >= mConstants.length) {
150            throw new IllegalArgumentException("Slot ID out of range.");
151        }
152        if (a != null &&
153            a.getType().getID(mRS) != mConstants[slot].getID(mRS)) {
154            throw new IllegalArgumentException("Allocation type does not match slot type.");
155        }
156        int id = a != null ? a.getID(mRS) : 0;
157        mRS.nProgramBindConstants(getID(mRS), slot, id);
158    }
159
160    /** @deprecated renderscript is deprecated in J
161     * Binds a texture to be used in the program
162     *
163     * @param va allocation containing texture data
164     * @param slot index within the program's list of textures
165     *
166     */
167    public void bindTexture(Allocation va, int slot)
168        throws IllegalArgumentException {
169        mRS.validate();
170        if ((slot < 0) || (slot >= mTextureCount)) {
171            throw new IllegalArgumentException("Slot ID out of range.");
172        }
173        if (va != null && va.getType().hasFaces() &&
174            mTextures[slot] != TextureType.TEXTURE_CUBE) {
175            throw new IllegalArgumentException("Cannot bind cubemap to 2d texture slot");
176        }
177
178        int id = va != null ? va.getID(mRS) : 0;
179        mRS.nProgramBindTexture(getID(mRS), slot, id);
180    }
181
182    /** @deprecated renderscript is deprecated in J
183     * Binds an object that describes how a texture at the
184     * corresponding location is sampled
185     *
186     * @param vs sampler for a corresponding texture
187     * @param slot index within the program's list of textures to
188     *             use the sampler on
189     *
190     */
191    public void bindSampler(Sampler vs, int slot)
192        throws IllegalArgumentException {
193        mRS.validate();
194        if ((slot < 0) || (slot >= mTextureCount)) {
195            throw new IllegalArgumentException("Slot ID out of range.");
196        }
197
198        int id = vs != null ? vs.getID(mRS) : 0;
199        mRS.nProgramBindSampler(getID(mRS), slot, id);
200    }
201
202
203    public static class BaseProgramBuilder {
204        RenderScript mRS;
205        Element mInputs[];
206        Element mOutputs[];
207        Type mConstants[];
208        Type mTextures[];
209        TextureType mTextureTypes[];
210        String mTextureNames[];
211        int mInputCount;
212        int mOutputCount;
213        int mConstantCount;
214        int mTextureCount;
215        String mShader;
216
217        /** @deprecated renderscript is deprecated in J
218        */
219        protected BaseProgramBuilder(RenderScript rs) {
220            mRS = rs;
221            mInputs = new Element[MAX_INPUT];
222            mOutputs = new Element[MAX_OUTPUT];
223            mConstants = new Type[MAX_CONSTANT];
224            mInputCount = 0;
225            mOutputCount = 0;
226            mConstantCount = 0;
227            mTextureCount = 0;
228            mTextureTypes = new TextureType[MAX_TEXTURE];
229            mTextureNames = new String[MAX_TEXTURE];
230        }
231
232        /** @deprecated renderscript is deprecated in J
233         * Sets the GLSL shader code to be used in the program
234         *
235         * @param s GLSL shader string
236         * @return  self
237         */
238        public BaseProgramBuilder setShader(String s) {
239            mShader = s;
240            return this;
241        }
242
243        /** @deprecated renderscript is deprecated in J
244         * Sets the GLSL shader code to be used in the program
245         *
246         * @param resources application resources
247         * @param resourceID id of the file containing GLSL shader code
248         *
249         * @return  self
250         */
251        public BaseProgramBuilder setShader(Resources resources, int resourceID) {
252            byte[] str;
253            int strLength;
254            InputStream is = resources.openRawResource(resourceID);
255            try {
256                try {
257                    str = new byte[1024];
258                    strLength = 0;
259                    while(true) {
260                        int bytesLeft = str.length - strLength;
261                        if (bytesLeft == 0) {
262                            byte[] buf2 = new byte[str.length * 2];
263                            System.arraycopy(str, 0, buf2, 0, str.length);
264                            str = buf2;
265                            bytesLeft = str.length - strLength;
266                        }
267                        int bytesRead = is.read(str, strLength, bytesLeft);
268                        if (bytesRead <= 0) {
269                            break;
270                        }
271                        strLength += bytesRead;
272                    }
273                } finally {
274                    is.close();
275                }
276            } catch(IOException e) {
277                throw new Resources.NotFoundException();
278            }
279
280            try {
281                mShader = new String(str, 0, strLength, "UTF-8");
282            } catch (UnsupportedEncodingException e) {
283                Log.e("Renderscript shader creation", "Could not decode shader string");
284            }
285
286            return this;
287        }
288
289        /** @deprecated renderscript is deprecated in J
290         * Queries the index of the last added constant buffer type
291         *
292         */
293        public int getCurrentConstantIndex() {
294            return mConstantCount - 1;
295        }
296
297        /** @deprecated renderscript is deprecated in J
298         * Queries the index of the last added texture type
299         *
300         */
301        public int getCurrentTextureIndex() {
302            return mTextureCount - 1;
303        }
304
305        /** @deprecated renderscript is deprecated in J
306         * Adds constant (uniform) inputs to the program
307         *
308         * @param t Type that describes the layout of the Allocation
309         *          object to be used as constant inputs to the Program
310         * @return  self
311         */
312        public BaseProgramBuilder addConstant(Type t) throws IllegalStateException {
313            // Should check for consistant and non-conflicting names...
314            if(mConstantCount >= MAX_CONSTANT) {
315                throw new RSIllegalArgumentException("Max input count exceeded.");
316            }
317            if (t.getElement().isComplex()) {
318                throw new RSIllegalArgumentException("Complex elements not allowed.");
319            }
320            mConstants[mConstantCount] = t;
321            mConstantCount++;
322            return this;
323        }
324
325        /** @deprecated renderscript is deprecated in J
326         * Adds a texture input to the Program
327         *
328         * @param texType describes that the texture to append it (2D,
329         *                Cubemap, etc.)
330         * @return  self
331         */
332        public BaseProgramBuilder addTexture(TextureType texType) throws IllegalArgumentException {
333            addTexture(texType, "Tex" + mTextureCount);
334            return this;
335        }
336
337        /** @hide renderscript is deprecated in J
338         * Adds a texture input to the Program
339         *
340         * @param texType describes that the texture to append it (2D,
341         *                Cubemap, etc.)
342         * @param texName what the texture should be called in the
343         *                shader
344         * @return  self
345         */
346        public BaseProgramBuilder addTexture(TextureType texType, String texName)
347            throws IllegalArgumentException {
348            if(mTextureCount >= MAX_TEXTURE) {
349                throw new IllegalArgumentException("Max texture count exceeded.");
350            }
351            mTextureTypes[mTextureCount] = texType;
352            mTextureNames[mTextureCount] = texName;
353            mTextureCount ++;
354            return this;
355        }
356
357        /** @deprecated renderscript is deprecated in J
358        */
359        protected void initProgram(Program p) {
360            p.mInputs = new Element[mInputCount];
361            System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount);
362            p.mOutputs = new Element[mOutputCount];
363            System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
364            p.mConstants = new Type[mConstantCount];
365            System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
366            p.mTextureCount = mTextureCount;
367            p.mTextures = new TextureType[mTextureCount];
368            System.arraycopy(mTextureTypes, 0, p.mTextures, 0, mTextureCount);
369            p.mTextureNames = new String[mTextureCount];
370            System.arraycopy(mTextureNames, 0, p.mTextureNames, 0, mTextureCount);
371        }
372    }
373
374}
375
376
377