| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrGLSL_DEFINED |
| #define GrGLSL_DEFINED |
| |
| #include "gl/GrGLInterface.h" |
| |
| class GrGLShaderVar; |
| |
| // Limited set of GLSL versions we build shaders for. Caller should round |
| // down the GLSL version to one of these enums. |
| enum GrGLSLGeneration { |
| /** |
| * Desktop GLSL 1.10 and ES2 shading lang (based on desktop GLSL 1.20) |
| */ |
| k110_GrGLSLGeneration, |
| /** |
| * Desktop GLSL 1.30 |
| */ |
| k130_GrGLSLGeneration, |
| /** |
| * Dekstop GLSL 1.50 |
| */ |
| k150_GrGLSLGeneration, |
| }; |
| |
| /** |
| * Types of shader-language-specific boxed variables we can create. |
| * (Currently only GrGLShaderVars, but should be applicable to other shader |
| * langauges.) |
| */ |
| enum GrSLType { |
| kFloat_GrSLType, |
| kVec2f_GrSLType, |
| kVec3f_GrSLType, |
| kVec4f_GrSLType, |
| kMat33f_GrSLType, |
| kMat44f_GrSLType, |
| kSampler2D_GrSLType |
| }; |
| |
| /** |
| * Gets the most recent GLSL Generation compatible with the OpenGL context. |
| */ |
| GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, |
| const GrGLInterface* gl); |
| |
| /** |
| * Returns a string to include at the begining of a shader to declare the GLSL |
| * version. |
| */ |
| const char* GrGetGLSLVersionDecl(GrGLBinding binding, |
| GrGLSLGeneration v); |
| |
| /** |
| * Returns a string to include in a variable decleration to set the fp precision |
| * or an emptry string if precision is not required. |
| */ |
| const char* GrGetGLSLVarPrecisionDeclType(GrGLBinding binding); |
| |
| /** |
| * Returns a string to set the default fp precision for an entire shader, or |
| * an emptry string if precision is not required. |
| */ |
| const char* GrGetGLSLShaderPrecisionDecl(GrGLBinding binding); |
| |
| /** |
| * Depending on the GLSL version being emitted there may be an assumed output |
| * variable from the fragment shader for the color. Otherwise, the shader must |
| * declare an output variable for the color. If this function returns true: |
| * * Parameter var's name will be set to nameIfDeclared |
| * * The variable must be declared in the fragment shader |
| * * The variable has to be bound as the color output |
| * (using glBindFragDataLocation) |
| * If the function returns false: |
| * * Parameter var's name will be set to the GLSL built-in color output name. |
| * * Do not declare the variable in the shader. |
| * * Do not use glBindFragDataLocation to bind the variable |
| * In either case var is initialized to represent the color output in the |
| * shader. |
| */ |
| bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen, |
| const char* nameIfDeclared, |
| GrGLShaderVar* var); |
| |
| /** Convert a count of 1..n floats into the corresponding type enum, |
| e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */ |
| GrSLType GrSLFloatVectorType(int count); |
| |
| /** Return the GLSL swizzle operator for a homogenous component of a vector |
| with the given number of coordnates, e.g. 2 -> ".y", 3 -> ".z" */ |
| const char* GrGLSLVectorHomogCoord(int count); |
| |
| /** Return the GLSL swizzle operator for a nonhomogenous components of a vector |
| with the given number of coordnates, e.g. 2 -> ".x", 3 -> ".xy" */ |
| const char* GrGLSLVectorNonhomogCoords(int count); |
| |
| #endif |