Program.h revision c0ac193b9415680f0a69e20a3f5f22d16f8053be
1/*
2 * Copyright (C) 2010 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#ifndef ANDROID_UI_PROGRAM_H
18#define ANDROID_UI_PROGRAM_H
19
20#include <GLES2/gl2.h>
21#include <GLES2/gl2ext.h>
22
23#include <utils/KeyedVector.h>
24#include <utils/RefBase.h>
25
26#include "Matrix.h"
27
28namespace android {
29namespace uirenderer {
30
31/**
32 * A program holds a vertex and a fragment shader. It offers several utility
33 * methods to query attributes and uniforms.
34 */
35class Program: public LightRefBase<Program> {
36public:
37    /**
38     * Creates a new program with the specified vertex and fragment
39     * shaders sources.
40     */
41    Program(const char* vertex, const char* fragment);
42    virtual ~Program();
43
44    /**
45     * Binds this program to the GL context.
46     */
47    virtual void use();
48
49    /**
50     * Marks this program as unused. This will not unbind
51     * the program from the GL context.
52     */
53    virtual void remove();
54
55    /**
56     * Indicates whether this program is currently in use with
57     * the GL context.
58     */
59    inline bool isInUse() const {
60        return mUse;
61    }
62
63protected:
64    /**
65     * Adds an attribute with the specified name.
66     *
67     * @return The OpenGL name of the attribute.
68     */
69    int addAttrib(const char* name);
70    /**
71     * Returns the OpenGL name of the specified attribute.
72     */
73    int getAttrib(const char* name);
74
75    /**
76     * Adds a uniform with the specified name.
77     *
78     * @return The OpenGL name of the uniform.
79     */
80    int addUniform(const char* name);
81    /**
82     * Returns the OpenGL name of the specified uniform.
83     */
84    int getUniform(const char* name);
85
86private:
87    /**
88     * Compiles the specified shader of the specified type.
89     *
90     * @return The name of the compiled shader.
91     */
92    GLuint buildShader(const char* source, GLenum type);
93
94    // Name of the OpenGL program
95    GLuint id;
96
97    // Name of the shaders
98    GLuint vertexShader;
99    GLuint fragmentShader;
100
101    // Keeps track of attributes and uniforms slots
102    KeyedVector<const char*, int> attributes;
103    KeyedVector<const char*, int> uniforms;
104
105    bool mUse;
106}; // class Program
107
108/**
109 * Program used to draw vertices with a simple color. The shaders must
110 * specify the following attributes:
111 *      vec4 position, position of the vertex
112 *      vec4 color, RGBA color of the vertex
113 *
114 * And the following uniforms:
115 *      mat4 projection, the projection matrix
116 *      mat4 modelView, the modelView matrix
117 *      mat4 transform, an extra transformation matrix
118 */
119class DrawColorProgram: public Program {
120public:
121    DrawColorProgram();
122    DrawColorProgram(const char* vertex, const char* fragment);
123
124    /**
125     * Binds the program with the specified projection, modelView and
126     * transform matrices.
127     */
128    void set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
129             const mat4& transformMatrix);
130
131    /**
132     * Binds this program to the GL context.
133     */
134    virtual void use();
135
136    /**
137     * Marks this program as unused. This will not unbind
138     * the program from the GL context.
139     */
140    virtual void remove();
141
142    /**
143     * Name of the position attribute.
144     */
145    int position;
146
147    /**
148     * Name of the color uniform.
149     */
150    int color;
151
152    /**
153     * Name of the transform uniform.
154     */
155    int transform;
156
157protected:
158    void getAttribsAndUniforms();
159};
160
161/**
162 * Program used to draw textured vertices. In addition to everything that the
163 * DrawColorProgram supports, the following two attributes must be specified:
164 *      sampler2D sampler, the texture sampler
165 *      vec2 texCoords, the texture coordinates of the vertex
166 */
167class DrawTextureProgram: public DrawColorProgram {
168public:
169    DrawTextureProgram();
170
171    /**
172     * Binds this program to the GL context.
173     */
174    virtual void use();
175
176    /**
177     * Marks this program as unused. This will not unbind
178     * the program from the GL context.
179     */
180    virtual void remove();
181
182    /**
183     * Name of the texture sampler uniform.
184     */
185    int sampler;
186
187    /**
188     * Name of the texture coordinates attribute.
189     */
190    int texCoords;
191};
192
193/**
194 * Program used to draw linear gradients. In addition to everything that the
195 * DrawColorProgram supports, the following two attributes must be specified:
196 *      vec2 gradient, the vector describing the linear gradient
197 *      float gradientLength, the invert of the magnitude of the gradient vector
198 *      sampler2D sampler, the texture sampler
199 */
200class DrawLinearGradientProgram: public DrawColorProgram {
201public:
202    DrawLinearGradientProgram();
203
204    /**
205     * Binds this program to the GL context.
206     */
207    virtual void use();
208
209    /**
210     * Marks this program as unused. This will not unbind
211     * the program from the GL context.
212     */
213    virtual void remove();
214
215    /**
216     * Name of the matrix used to compute the screen space coordinates
217     * of the vertices.
218     */
219    int screenSpace;
220
221    /**
222     * Name of the linear gradient start point.
223     */
224    int start;
225
226    /**
227     * Name of the linear gradient vector.
228     */
229    int gradient;
230
231    /**
232     * Name of the inverse of linear gradient vector's magnitude.
233     */
234    int gradientLength;
235
236    /**
237     * Name of the texture sampler uniform.
238     */
239    int sampler;
240};
241
242}; // namespace uirenderer
243}; // namespace android
244
245#endif // ANDROID_UI_PROGRAM_H
246