blob: 652befe1cb30677d6e98237dabb4c4d249d68b38 [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);
42 ~Program();
43
44 /**
45 * Binds this program to the GL context.
46 */
47 void use();
48
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 */
53 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
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 /**
132 * Name of the position attribute.
133 */
134 int position;
Romain Guy5cbbce52010-06-27 22:59:20 -0700135
136 /**
Romain Guy0b9db912010-07-09 18:53:25 -0700137 * Name of the color uniform.
Romain Guy5cbbce52010-06-27 22:59:20 -0700138 */
Romain Guy0b9db912010-07-09 18:53:25 -0700139 int color;
Romain Guy5cbbce52010-06-27 22:59:20 -0700140 /**
141 * Name of the transform uniform.
142 */
143 int transform;
144
145protected:
146 void getAttribsAndUniforms();
147};
148
149/**
150 * Program used to draw textured vertices. In addition to everything that the
151 * DrawColorProgram supports, the following two attributes must be specified:
152 * sampler2D sampler, the texture sampler
153 * vec2 texCoords, the texture coordinates of the vertex
154 */
155class DrawTextureProgram: public DrawColorProgram {
156public:
157 DrawTextureProgram();
158
Romain Guy0b9db912010-07-09 18:53:25 -0700159 /**
160 * Name of the texture sampler uniform.
161 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700162 int sampler;
Romain Guy0b9db912010-07-09 18:53:25 -0700163
164 /**
165 * Name of the texture coordinates attribute.
166 */
Romain Guy5cbbce52010-06-27 22:59:20 -0700167 int texCoords;
168};
169
170}; // namespace uirenderer
171}; // namespace android
172
173#endif // ANDROID_UI_PROGRAM_H