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 
17 /**
18  * @hide
19  * <p>The RenderScript vertex program, also known as a vertex shader, describes a stage in
20  * the graphics pipeline responsible for manipulating geometric data in a user-defined way.
21  * The object is constructed by providing the RenderScript system with the following data:</p>
22  * <ul>
23  *   <li>Element describing its varying inputs or attributes</li>
24  *   <li>GLSL shader string that defines the body of the program</li>
25  *   <li>a Type that describes the layout of an Allocation containing constant or uniform inputs</li>
26  * </ul>
27  *
28  * <p>Once the program is created, you bind it to the graphics context, RenderScriptGL, and it will be used for
29  * all subsequent draw calls until you bind a new program. If the program has constant inputs,
30  * the user needs to bind an allocation containing those inputs. The allocation's type must match
31  * the one provided during creation. The RenderScript library then does all the necessary plumbing
32  * to send those constants to the graphics hardware. Varying inputs to the shader, such as position, normal,
33  * and texture coordinates are matched by name between the input Element and the Mesh object being drawn.
34  * The signatures don't have to be exact or in any strict order. As long as the input name in the shader
35  * matches a channel name and size available on the mesh, the runtime takes care of connecting the
36  * two. Unlike OpenGL, there is no need to link the vertex and fragment programs.</p>
37  *
38  **/
39 package android.renderscript;
40 
41 import android.compat.annotation.UnsupportedAppUsage;
42 
43 
44 /**
45  * @hide
46  * @deprecated in API 16
47  * ProgramVertex, also know as a vertex shader, describes a
48  * stage in the graphics pipeline responsible for manipulating
49  * geometric data in a user-defined way.
50  *
51  **/
52 public class ProgramVertex extends Program {
53 
ProgramVertex(long id, RenderScript rs)54     ProgramVertex(long id, RenderScript rs) {
55         super(id, rs);
56     }
57 
58     /**
59      * @deprecated in API 16
60      * @return number of input attribute elements
61      */
getInputCount()62     public int getInputCount() {
63         return mInputs != null ? mInputs.length : 0;
64     }
65 
66     /**
67      * @deprecated in API 16
68      * @param slot location of the input to return
69      * @return input attribute element
70      */
getInput(int slot)71     public Element getInput(int slot) {
72         if (slot < 0 || slot >= mInputs.length) {
73             throw new IllegalArgumentException("Slot ID out of range.");
74         }
75         return mInputs[slot];
76     }
77 
78     /**
79      * @hide
80      * @deprecated in API 16
81      * Builder class for creating ProgramVertex objects.
82      * The builder starts empty and the user must minimally provide
83      * the GLSL shader code, and the varying inputs. Constant, or
84      * uniform parameters to the shader may optionally be provided as
85      * well.
86      *
87      **/
88     public static class Builder extends BaseProgramBuilder {
89         /**
90          * @deprecated in API 16
91          * Create a builder object.
92          *
93          * @param rs Context to which the program will belong.
94          */
95         @UnsupportedAppUsage
Builder(RenderScript rs)96         public Builder(RenderScript rs) {
97             super(rs);
98         }
99 
100         /**
101          * @deprecated in API 16
102          * Add varying inputs to the program
103          *
104          * @param e element describing the layout of the varying input
105          *          structure
106          * @return  self
107          */
108         @UnsupportedAppUsage
addInput(Element e)109         public Builder addInput(Element e) throws IllegalStateException {
110             // Should check for consistant and non-conflicting names...
111             if(mInputCount >= MAX_INPUT) {
112                 throw new RSIllegalArgumentException("Max input count exceeded.");
113             }
114             if (e.isComplex()) {
115                 throw new RSIllegalArgumentException("Complex elements not allowed.");
116             }
117             mInputs[mInputCount++] = e;
118             return this;
119         }
120 
121         /**
122          * @deprecated in API 16
123          * Creates ProgramVertex from the current state of the builder
124          *
125          * @return  ProgramVertex
126          */
127         @UnsupportedAppUsage
create()128         public ProgramVertex create() {
129             mRS.validate();
130             long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
131             String[] texNames = new String[mTextureCount];
132             int idx = 0;
133 
134             for (int i=0; i < mInputCount; i++) {
135                 tmp[idx++] = ProgramParam.INPUT.mID;
136                 tmp[idx++] = mInputs[i].getID(mRS);
137             }
138             for (int i=0; i < mOutputCount; i++) {
139                 tmp[idx++] = ProgramParam.OUTPUT.mID;
140                 tmp[idx++] = mOutputs[i].getID(mRS);
141             }
142             for (int i=0; i < mConstantCount; i++) {
143                 tmp[idx++] = ProgramParam.CONSTANT.mID;
144                 tmp[idx++] = mConstants[i].getID(mRS);
145             }
146             for (int i=0; i < mTextureCount; i++) {
147                 tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
148                 tmp[idx++] = mTextureTypes[i].mID;
149                 texNames[i] = mTextureNames[i];
150             }
151 
152             long id = mRS.nProgramVertexCreate(mShader, texNames, tmp);
153             ProgramVertex pv = new ProgramVertex(id, mRS);
154             initProgram(pv);
155             return pv;
156         }
157     }
158 
159 }
160