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