blob: 18a8e925460bd4de748a5921f17e4b93d64e5ed4 [file] [log] [blame]
Romain Guy5cbbce52010-06-27 22:59:20 -07001/*
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
Romain Guy0b9db912010-07-09 18:53:25 -070026#include "Matrix.h"
27
Romain Guy5cbbce52010-06-27 22:59:20 -070028namespace 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);
Romain Guy6926c722010-07-12 20:20:03 -070042 virtual ~Program();
Romain Guy5cbbce52010-06-27 22:59:20 -070043
44 /**
45 * Binds this program to the GL context.
46 */
Romain Guy6926c722010-07-12 20:20:03 -070047 virtual void use();
Romain Guy5cbbce52010-06-27 22:59:20 -070048
Romain Guy260e1022010-07-12 14:41:06 -070049 /**
50 * Marks this program as unused. This will not unbind
51 * the program from the GL context.
52 */
Romain Guy6926c722010-07-12 20:20:03 -070053 virtual void remove();
Romain Guy260e1022010-07-12 14:41:06 -070054
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
Romain Guy5cbbce52010-06-27 22:59:20 -070063protected:
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;
Romain Guy260e1022010-07-12 14:41:06 -0700104
105 bool mUse;
Romain Guy5cbbce52010-06-27 22:59:20 -0700106}; // 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 */
Romain Guy260e1022010-07-12 14:41:06 -0700128 void set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
Romain Guy0b9db912010-07-09 18:53:25 -0700129 const mat4& transformMatrix);
Romain Guy5cbbce52010-06-27 22:59:20 -0700130
131 /**
Romain Guy6926c722010-07-12 20:20:03 -0700132 * 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 /**
Romain Guy5cbbce52010-06-27 22:59:20 -0700143 * Name of the position attribute.
144 */
145 int position;
Romain Guy5cbbce52010-06-27 22:59:20 -0700146
147 /**
Romain Guy0b9db912010-07-09 18:53:25 -0700148 * Name of the color uniform.
Romain Guy5cbbce52010-06-27 22:59:20 -0700149 */
Romain Guy0b9db912010-07-09 18:53:25 -0700150 int color;
Romain Guyf9764a42010-07-16 23:13:33 -0700151
Romain Guy5cbbce52010-06-27 22:59:20 -0700152 /**
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
Romain Guy0b9db912010-07-09 18:53:25 -0700171 /**
Romain Guy6926c722010-07-12 20:20:03 -0700172 * 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 /**
Romain Guy0b9db912010-07-09 18:53:25 -0700183 * Name of the texture sampler uniform.
184 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700185 int sampler;
Romain Guy0b9db912010-07-09 18:53:25 -0700186
187 /**
188 * Name of the texture coordinates attribute.
189 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700190 int texCoords;
191};
192
Romain Guyf9764a42010-07-16 23:13:33 -0700193/**
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 /**
Romain Guyc0ac1932010-07-19 18:43:02 -0700216 * 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 /**
Romain Guyf9764a42010-07-16 23:13:33 -0700227 * 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
Romain Guy5cbbce52010-06-27 22:59:20 -0700242}; // namespace uirenderer
243}; // namespace android
244
245#endif // ANDROID_UI_PROGRAM_H