blob: 764cb0583b24add6ac2fe2c3e649e60a6f9d85f4 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_HWUI_PROGRAM_H
#define ANDROID_HWUI_PROGRAM_H
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <utils/KeyedVector.h>
#include "Matrix.h"
namespace android {
namespace uirenderer {
/**
* A program holds a vertex and a fragment shader. It offers several utility
* methods to query attributes and uniforms.
*/
class Program {
public:
/**
* Creates a new program with the specified vertex and fragment
* shaders sources.
*/
Program(const char* vertex, const char* fragment);
virtual ~Program();
/**
* Binds this program to the GL context.
*/
virtual void use();
/**
* Marks this program as unused. This will not unbind
* the program from the GL context.
*/
virtual void remove();
/**
* Returns the OpenGL name of the specified attribute.
*/
int getAttrib(const char* name);
/**
* Returns the OpenGL name of the specified uniform.
*/
int getUniform(const char* name);
/**
* Indicates whether this program is currently in use with
* the GL context.
*/
inline bool isInUse() const {
return mUse;
}
/**
* Indicates whether this program was correctly compiled and linked.
*/
inline bool isInitialized() const {
return mInitialized;
}
/**
* Binds the program with the specified projection, modelView and
* transform matrices.
*/
void set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
const mat4& transformMatrix, bool offset = false);
/**
* Sets the color associated with this shader.
*/
void setColor(const float r, const float g, const float b, const float a);
/**
* Name of the position attribute.
*/
int position;
/**
* Name of the transform uniform.
*/
int transform;
protected:
/**
* Adds an attribute with the specified name.
*
* @return The OpenGL name of the attribute.
*/
int addAttrib(const char* name);
/**
* Adds a uniform with the specified name.
*
* @return The OpenGL name of the uniform.
*/
int addUniform(const char* name);
private:
/**
* Compiles the specified shader of the specified type.
*
* @return The name of the compiled shader.
*/
GLuint buildShader(const char* source, GLenum type);
// Name of the OpenGL program
GLuint id;
// Name of the shaders
GLuint vertexShader;
GLuint fragmentShader;
// Keeps track of attributes and uniforms slots
KeyedVector<const char*, int> attributes;
KeyedVector<const char*, int> uniforms;
bool mUse;
bool mInitialized;
}; // class Program
}; // namespace uirenderer
}; // namespace android
#endif // ANDROID_HWUI_PROGRAM_H