blob: d90bcaf382eda8033184dfeafc8b89ad791dcfed [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 Guy5cbbce52010-06-27 22:59:20 -0700151 /**
152 * Name of the transform uniform.
153 */
154 int transform;
155
156protected:
157 void getAttribsAndUniforms();
158};
159
160/**
161 * Program used to draw textured vertices. In addition to everything that the
162 * DrawColorProgram supports, the following two attributes must be specified:
163 * sampler2D sampler, the texture sampler
164 * vec2 texCoords, the texture coordinates of the vertex
165 */
166class DrawTextureProgram: public DrawColorProgram {
167public:
168 DrawTextureProgram();
169
Romain Guy0b9db912010-07-09 18:53:25 -0700170 /**
Romain Guy6926c722010-07-12 20:20:03 -0700171 * Binds this program to the GL context.
172 */
173 virtual void use();
174
175 /**
176 * Marks this program as unused. This will not unbind
177 * the program from the GL context.
178 */
179 virtual void remove();
180
181 /**
Romain Guy0b9db912010-07-09 18:53:25 -0700182 * Name of the texture sampler uniform.
183 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700184 int sampler;
Romain Guy0b9db912010-07-09 18:53:25 -0700185
186 /**
187 * Name of the texture coordinates attribute.
188 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700189 int texCoords;
190};
191
192}; // namespace uirenderer
193}; // namespace android
194
195#endif // ANDROID_UI_PROGRAM_H