165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifndef ANDROID_FILTERFW_CORE_SHADER_PROGRAM_H 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ANDROID_FILTERFW_CORE_SHADER_PROGRAM_H 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <vector> 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <map> 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string> 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2.h> 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2ext.h> 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <EGL/egl.h> 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "core/gl_env.h" 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "core/value.h" 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android { 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw { 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLFrame; 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLFrameBufferHandle; 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLTextureHandle; 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass Quad; 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass VertexFrame; 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntypedef GLint ProgramVar; 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// A ShaderProgram is a Program object that holds a GLSL shader implementation. 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// It provides functionality for compiling, linking, and executing the shader. 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// On top of that, it provides access to the shaders source code, uniforms, 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// attributes, and other properties. 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// By default a ShaderProgram provides its own vertex shader. However, a custom 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// vertex shader may be passed and used instead. 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// When implementing a vertex shader, the following attribute names have special 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// meaning: 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// - a_position: The vertex position 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// - a_texcoord: The texture cooridnates 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// The shader program will bind these attributes to the correct values, if they 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// are present in the vertex shader source code. 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// When implementing the fragment shader, the following variable names must be 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// defined: 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// - tex_sampler_<n>: The n'th input texture. For instance, use tex_sampler_0 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// for the first input texture. Must be a uniform sampler2D. 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// - v_texcoord: The current texture coordinate. 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// If more input textures are given than the shader can handle, this will result 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// in an error. 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass ShaderProgram { 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public: 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // General Functionality /////////////////////////////////////////////////// 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Create a new shader program with the given fragment shader source code. 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // A default vertex shader is used, which renders the input texture to a 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // rectangular region of the output texture. You can modify the input and 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // output regions by using the SetSourceRegion(...) and SetTargetRegion(...) 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // (and related) functions below. 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // This program will not be executable until you have compiled and linked 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // it. 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Note, that the ShaderProgram does NOT take ownership of the GLEnv. The 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // caller must make sure the GLEnv stays valid as long as the GLFrame is 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // alive. 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn explicit ShaderProgram(GLEnv* gl_env, const std::string& fragment_shader); 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Create a new shader program with the given fragment and vertex shader 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // source code. This program will not be executable until you have compiled 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // and linked it. 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Note, that the ShaderProgram does NOT take ownership of the GLEnv. The 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // caller must make sure the GLEnv stays valid as long as the GLFrame is 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // alive. 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ShaderProgram(GLEnv* gl_env, 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string& vertex_shader, 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string& fragment_shader); 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Destructor. 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ~ShaderProgram(); 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Process the given input frames and write the result to the output frame. 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns false if there was an error processing. 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Process(const std::vector<const GLFrame*>& inputs, GLFrame* output); 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Same as above, but pass GL interfaces rather than frame objects. Use this 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // only if you are not working on Frame objects, but rather directly on GL 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // textures and FBOs. 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Process(const std::vector<const GLTextureHandle*>& input, 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLFrameBufferHandle* output); 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Compile and link the shader source code. Returns true if compilation 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // and linkage was successful. Compilation and linking error messages are 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // written to the error log. 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool CompileAndLink(); 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if this Program has been compiled and linked successfully. 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool IsExecutable() const { 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return program_ != 0; 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if the shader program variable is valid. 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool IsVarValid(ProgramVar var); 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Special ShaderPrograms ////////////////////////////////////////////////// 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // A (compiled) shader program which assigns the sampled pixels from the 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // input to the output. Note that transformations may be applied to achieve 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // effects such as cropping, scaling or rotation. 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The caller takes ownership of the result! 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static ShaderProgram* CreateIdentity(GLEnv* env); 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Geometry //////////////////////////////////////////////////////////////// 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // These functions modify the source and target regions used during 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // rasterization. Note, that these functions will ONLY take effect if 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the default vertex shader is used, or your custom vertex shader defines 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the a_position and a_texcoord attributes. 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the program to read from a subregion of the input frame, given by 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the origin (x, y) and dimensions (width, height). Values are considered 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // normalized between 0.0 and 1.0. If this region exceeds the input frame 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // dimensions the results are undefined. 13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetSourceRect(float x, float y, float width, float height) ; 13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the program to read from a subregion of the input frame, given by 13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the passed Quad. Values are considered normalized between 0.0 and 1.0. 13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The Quad points are expected to be in the order top-left, top-right, 14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // bottom-left, bottom-right. 14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If this region exceeds the input frame dimensions the results are 14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // undefined. 14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetSourceRegion(const Quad& quad); 14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the program to write to a subregion of the output frame, given by 14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the origin (x, y) and dimensions (width, height). Values are considered 14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // normalized between 0.0 and 1.0. If this region exceeds the output frame 14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // dimensions the image will be clipped. 14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetTargetRect(float x, float y, float width, float height); 15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the program to write to a subregion of the output frame, given by 15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the passed Quad. Values are considered normalized between 0.0 and 1.0. 15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The Quad points are expected to be in the order top-left, top-right, 15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // bottom-left, bottom-right. 15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If this region exceeds the output frame dimensions the image will be 15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // clipped. 15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetTargetRegion(const Quad& quad); 15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Uniform Variable access ///////////////////////////////////////////////// 16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Note: In order to get and set uniforms, the program must have been 16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // successfully compiled and linked. Otherwise, the getters will return an 16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // invalid ProgramVar variable (check with IsVarValid()). 16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // When setting values, the value type must be match the type of the uniform 16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // in the shader. For instance, a vector of 3 elements cannot be assigned to 16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // a vec2. Similarly, an integer value cannot be assigned to a float value. 16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Such a type mismatch will result in failure to set the value (which will 16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // remain untouched). Check the return value of the setters to determine 16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // success. 16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the maximum number of uniforms supported by this implementation. 17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static int MaxUniformCount(); 17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns a handle to the uniform with the given name, or invalid if no 17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // such uniform variable exists in the shader. 17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ProgramVar GetUniform(const std::string& name) const; 17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given integer value. Returns true 17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, int value); 18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given float value. Returns true 18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, float value); 18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given values. Returns true 18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, const int* values, int count); 18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given values. Returns true 19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, const float* values, int count); 19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given vector value. Returns true 19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, const std::vector<int>& values); 19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the specified uniform value to the given vector value. Returns true 19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // if the assignment was successful. 19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(ProgramVar var, const std::vector<float>& values); 20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Generic variable setter, which in the case of GL programs always attempts 20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to set the value of a uniform variable with the given name. Only values 20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // of type float, float array (or vector), and int are supported. 20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetUniformValue(const std::string& name, const Value& value); 20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Generic variable getter, which in the case of GL programs always attempts 20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to get the value of a uniform variable with the given name. 20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Value GetUniformValue(const std::string& name); 20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the default name of the input texture uniform variable for the 21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // given input index. 21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static std::string InputTextureUniformName(int index); 21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attribute access //////////////////////////////////////////////////////// 21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Note: In order to get and set attributes, the program must have been 21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // successfully compiled and linked. Otherwise, the getters will return an 21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // invalid ProgramVar variable (check with IsVarValid()). Constant attribute 21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // values must be floats. Attribute pointers must be associated with a 21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // specific type, which can be any of the following: 22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FLOAT, 22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_FIXED, GL_HALF_FLOAT_OES. 22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // When storing vertex data, it is recommended to use VertexFrames when 22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // possible as these will be kept in GPU memory, and no copying of vertex 22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // attributes between system and GPU memory needs to take place. 22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the maximum number of attributes supported by this 22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // implementation. 22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static int MaxAttributeCount(); 22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns a handle to the attribute with the given name, or invalid if no 23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // such attribute exists in the vertex shader. 23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ProgramVar GetAttribute(const std::string& name) const; 23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set an attribute value that will be constant for each vertex. Returns 23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // true if the assignment was successful. 23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetConstAttributeValue(ProgramVar var, float value); 23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set an attribute vector value that will be constant for each vertex. 23965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if the assignment was successful. 24065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetConstAttributeValue(ProgramVar var, const std::vector<float>& value); 24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 24265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set attribute values that differ across vertexes, using a VertexFrame. 24365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // This is the recommended method of specifying vertex data, that does not 24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // change from iteration to iteration. The parameters are as follows: 24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // var: The shader variable to bind the values to. 24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // data: The vertex frame which holds the vertex data. This may be a 24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // superset of the data required for this particular vertex. Use the 24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // offset and stride to select the correct data portion. 24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // type: The type of the data values. This may differ from the type of the 25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // shader variables. See the normalize flag on how values are 25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // converted. 25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // components: The number of components per value. Valid values are 1-4. 25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // stride: The delta of one element to the next in bytes. 25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // offset: The offset of the first element. 25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // normalize: True, if not float values should be normalized to the range 25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // 0-1, when converted to a float. 25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true, if the assignment was successful. 25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetAttributeValues(ProgramVar var, 25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const VertexFrame* data, 26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLenum type, 26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components, 26265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int stride, 26365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int offset, 26465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool normalize); 26565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 26665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set attribute values that differ across vertexes, using a data buffer. 26765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // This is the recommended method of specifying vertex data, if your data 26865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // changes often. Note that this data may need to be copied to GPU memory 26965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // for each render pass. Please see above for a description of the 27065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // parameters. 27165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Note: The data passed here MUST be valid until all executions of this 27265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Program instance have been completed! 27365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetAttributeValues(ProgramVar var, 27465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const uint8_t* data, 27565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLenum type, 27665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components, 27765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int stride, 27865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int offset, 27965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool normalize); 28065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 28165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Convenience method for setting vertex values using a vector of floats. 28265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The components parameter specifies how many elements per variable should 28365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // be assigned (The variable must be able to fit the number of components). 28465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // It must be a value between 1 and 4. 28565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // While this method is not as flexible as the methods above, this can be 28665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // used when more advanced methods are not necessary. Note, that if your 28765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // vertex data does not change, it is recommended to use a VertexFrame. 28865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetAttributeValues(ProgramVar var, 28965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::vector<float>& data, 29065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components); 29165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 29265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Same as above, but using a float pointer instead of vector. Pass the 29365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // total number of elements in total. 29465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetAttributeValues(ProgramVar var, 29565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const float* data, 29665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int total, 29765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components); 29865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 29965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // By default, rendering only uses the first 4 vertices. You should only 30065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // adjust this value if you are providing your own vertex attributes with 30165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // a count unequal to 4. Adjust this value before calling Process(). 30265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetVertexCount(int count); 30365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 30465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the default name of the attribute used to hold the texture 30565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // coordinates. Use this when you need to access the texture coordinate 30665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // attribute of the shader's default vertex shader. 30765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static const std::string& TexCoordAttributeName() { 30865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static std::string s_texcoord("a_texcoord"); 30965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return s_texcoord; 31065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 31165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 31265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the default name of the attribute used to hold the output 31365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // coordinates. Use this when you need to access the output coordinate 31465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // attribute of the shader's default vertex shader. 31565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static const std::string& PositionAttributeName() { 31665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static std::string s_position("a_position"); 31765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return s_position; 31865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 31965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 32065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Rendering /////////////////////////////////////////////////////////////// 32165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the draw mode, which can be any of GL_POINTS, GL_LINES, 32265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, 32365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_TRIANGLE_FAN. The default is GL_TRIANGLE_STRIP. 32465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Warning: Do NOT change this if you are not specifying your own vertex 32565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // data with SetAttributeValues(...). 32665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetDrawMode(GLenum mode); 32765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 32865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If you are doing your own drawing you should call this before beginning 32965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to draw. This will activate the program, push all used attributes, and 33065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // clear the frame if requested. You do not need to call this if you are 33165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // not doing your own GL drawing! 33265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool BeginDraw(); 33365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 33465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Render a single frame with the given input textures. You may override 33565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // this, if you need custom rendering behavior. However, you must take 33665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // care of the following things when overriding: 33765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // - Use the correct program (e.g. by calling UseProgram()). 33865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // - Bind the given textures 33965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // - Bind vertex attributes 34065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // - Draw 34165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool RenderFrame(const std::vector<GLuint>& textures, 34265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::vector<GLenum>& targets); 34365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 34465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Pass true to clear the output frame before rendering. The color used 34565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to clear is set in SetClearColor(). 34665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetClearsOutput(bool clears); 34765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 34865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the color used to clear the output frame before rendering. You 34965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // must activate clearing by calling SetClearsOutput(true). 35065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetClearColor(float red, float green, float blue, float alpha); 35165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 35265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the number of tiles to split rendering into. Higher tile numbers 35365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // will affect performance negatively, but will allow other GPU threads 35465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to render more frequently. Defaults to 1, 1. 35565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetTileCounts(int x_count, int y_count); 35665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 35765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Enable or Disable Blending 35865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set to true to enable, false to disable. 35965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetBlendEnabled(bool enable) { 36065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn blending_ = enable; 36165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 36265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 36365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Specify pixel arithmetic for blending 36465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The values of sfactor and dfactor can be: 36565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, 36665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, 36765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA_SATURATE 36865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Default values for blending are set to: 36965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // sfactor = GL_SRC_ALPHA 37065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // dfactor = GL_ONE_MINUS_SRC_ALPHA 37165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetBlendFunc(int sfactor, int dfactor) { 37265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn sfactor_ = sfactor; 37365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn dfactor_ = dfactor; 37465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 37565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 37665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Accessing the Compiled Program ////////////////////////////////////////// 37765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Use the compiled and linked program for rendering. You should not need 37865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to call this, unless you are implementing your own rendering method. 37965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool UseProgram(); 38065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 38165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Other Properties //////////////////////////////////////////////////////// 38265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the maximum number of varyings supported by this implementation. 38365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static int MaxVaryingCount(); 38465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 38565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the maximum number of texture units supported by this 38665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // implementation. 38765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static int MaxTextureUnits(); 38865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 38965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Lower level functionality /////////////////////////////////////////////// 39065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Compile the shader with the given source. The shader_type must be either 39165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // GL_VERTEX_SHADER or GL_FRAGMENT_SHADER. 39265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static GLuint CompileShader(GLenum shader_type, const char* source); 39365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 39465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Link the compiled shader objects and return the resulting program. 39565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static GLuint LinkProgram(GLuint* shaders, GLuint count); 39665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 39765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the lowest texture unit that will be used to bind textures. 39865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint BaseTextureUnit() const { 39965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return base_texture_unit_; 40065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 40165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 40265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Sets the lowest texture unit that will be used to bind textures. The 40365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // default value is GL_TEXTURE0. 40465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetBaseTextureUnit(GLuint texture_unit) { 40565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn base_texture_unit_ = texture_unit; 40665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 40765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 40865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private: 40965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Structure to store vertex attribute data. 41065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn struct VertexAttrib { 41165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool is_const; 41265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int index; 41365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool normalized; 41465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int stride; 41565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components; 41665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int offset; 41765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLenum type; 41865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint vbo; 41965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const void* values; 42065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float* owned_data; 42165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 42265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn VertexAttrib(); 42365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn }; 42465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn typedef std::map<ProgramVar, VertexAttrib> VertexAttribMap; 42565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 42665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn struct RGBAColor { 42765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float red; 42865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float green; 42965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float blue; 43065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float alpha; 43165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 43265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn RGBAColor() : red(0), green(0), blue(0), alpha(1) { 43365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 43465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn }; 43565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 43665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Scans for all uniforms in the shader and creates index -> id map. 43765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void ScanUniforms(); 43865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 43965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the index of the given uniform. The caller must make sure 44065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // that the variable id passed is valid. 44165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint IndexOfUniform(ProgramVar var); 44265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 44365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Binds the given input textures. 44465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool BindInputTextures(const std::vector<GLuint>& textures, 44565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::vector<GLenum>& targets); 44665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 44765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Sets the default source and target coordinates. 44865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void SetDefaultCoords(); 44965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 45065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Pushes the specified coordinates to the shader attribute. 45165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool PushCoords(ProgramVar attr, float* coords); 45265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 45365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Pushes the source coordinates. 45465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool PushSourceCoords(float* coords); 45565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 45665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Pushes the target coordinates. 45765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool PushTargetCoords(float* coords); 45865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 45965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Performs (simple) GL drawing. 46065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Draw(); 46165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 46265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Performs tiled GL drawing. 46365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool DrawTiled(); 46465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 46565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Yields to other GPU threads. 46665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void Yield(); 46765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 46865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Helper method to assert that the variable value passed has the correct 46965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // total size. 47065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckValueCount(const std::string& var_type, 47165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string& var_name, 47265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int expected_count, 47365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components, 47465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int value_size); 47565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 47665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Helper method to assert that the variable value passed has a size, that 47765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // is compatible with the type size (must be divisible). 47865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckValueMult(const std::string& var_type, 47965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string& var_name, 48065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int components, 48165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int value_size); 48265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 48365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Checks that the variable is valid. Logs an error and returns false if 48465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // not. 48565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckVarValid(ProgramVar var); 48665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 48765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if the uniform specified by var is an active uniform in the 48865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // program. 48965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool CheckUniformValid(ProgramVar var); 49065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 49165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Store an attribute to use when rendering. 49265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool StoreAttribute(VertexAttrib attrib); 49365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 49465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Push all assigned attributes before rendering. 49565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool PushAttributes(); 49665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 49765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Pop all assigned attributes after rendering. 49865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool PopAttributes(); 49965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 50065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The shader source code 50165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::string fragment_shader_source_; 50265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::string vertex_shader_source_; 50365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 50465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The compiled shaders and linked program 50565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint fragment_shader_; 50665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint vertex_shader_; 50765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint program_; 50865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 50965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The GL environment this shader lives in. 51065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLEnv* gl_env_; 51165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 51265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The lowest texture unit this program will use 51365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLuint base_texture_unit_; 51465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 51565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The current source and target coordinates to render from/to. 51665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float* source_coords_; 51765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn float* target_coords_; 51865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 51965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // True, if the program has control over both source and target coordinates. 52065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool manage_coordinates_; 52165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 52265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The number of tiles to split rendering into. 52365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int tile_x_count_; 52465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int tile_y_count_; 52565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 52665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // List of attribute data that we need to set before rendering 52765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn VertexAttribMap attrib_values_; 52865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 52965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The number of vertices to render 53065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int vertex_count_; 53165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 53265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The draw mode used during rendering 53365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLenum draw_mode_; 53465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 53565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // True, iff the output frame is cleared before rendering 53665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool clears_; 53765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 53865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The color used to clear the output frame. 53965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn RGBAColor clear_color_; 54065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 54165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set to true to enable blending. 54265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool blending_; 54365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int sfactor_; 54465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int dfactor_; 54565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 54665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Map from uniform ids to indices 54765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::map<ProgramVar, GLuint> uniform_indices_; 54865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}; 54965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 55065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw 55165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android 55265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 55365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif // ANDROID_FILTERFW_CORE_SHADER_PROGRAM_H 554