| // |
| // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // Program.h: Defines the gl::Program class. Implements GL program objects |
| // and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28. |
| |
| #ifndef LIBGLESV2_PROGRAM_BINARY_H_ |
| #define LIBGLESV2_PROGRAM_BINARY_H_ |
| |
| #define GL_APICALL |
| #include <GLES2/gl2.h> |
| #include <GLES2/gl2ext.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "libGLESv2/Program.h" |
| #include "libGLESv2/Context.h" |
| #include "libGLESv2/mathutil.h" |
| #include "libGLESv2/Shader.h" |
| #include "libGLESv2/Uniform.h" |
| |
| #include "libGLESv2/renderer/ShaderExecutable.h" |
| |
| namespace gl |
| { |
| class FragmentShader; |
| class VertexShader; |
| |
| // Struct used for correlating uniforms/elements of uniform arrays to handles |
| struct UniformLocation |
| { |
| UniformLocation() |
| { |
| } |
| |
| UniformLocation(const std::string &name, unsigned int element, unsigned int index); |
| |
| std::string name; |
| unsigned int element; |
| unsigned int index; |
| }; |
| |
| // This is the result of linking a program. It is the state that would be passed to ProgramBinary. |
| class ProgramBinary : public RefCountObject |
| { |
| public: |
| explicit ProgramBinary(rx::Renderer *renderer); |
| ~ProgramBinary(); |
| |
| rx::ShaderExecutable *getPixelExecutable(); |
| rx::ShaderExecutable *getVertexExecutable(); |
| |
| GLuint getAttributeLocation(const char *name); |
| int getSemanticIndex(int attributeIndex); |
| |
| GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex); |
| TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex); |
| GLint getUsedSamplerRange(SamplerType type); |
| bool usesPointSize() const; |
| |
| GLint getUniformLocation(std::string name); |
| bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v); |
| bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v); |
| bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v); |
| bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v); |
| bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value); |
| bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value); |
| bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value); |
| bool setUniform1iv(GLint location, GLsizei count, const GLint *v); |
| bool setUniform2iv(GLint location, GLsizei count, const GLint *v); |
| bool setUniform3iv(GLint location, GLsizei count, const GLint *v); |
| bool setUniform4iv(GLint location, GLsizei count, const GLint *v); |
| |
| bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params); |
| bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params); |
| |
| void dirtyAllUniforms(); |
| void applyUniforms(); |
| |
| bool load(InfoLog &infoLog, const void *binary, GLsizei length); |
| bool save(void* binary, GLsizei bufSize, GLsizei *length); |
| GLint getLength(); |
| |
| bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader); |
| void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); |
| |
| void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); |
| GLint getActiveAttributeCount(); |
| GLint getActiveAttributeMaxLength(); |
| |
| void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); |
| GLint getActiveUniformCount(); |
| GLint getActiveUniformMaxLength(); |
| |
| void validate(InfoLog &infoLog); |
| bool validateSamplers(InfoLog *infoLog); |
| bool isValidated() const; |
| |
| unsigned int getSerial() const; |
| |
| static std::string decorateAttribute(const std::string &name); // Prepend an underscore |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ProgramBinary); |
| |
| int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader); |
| bool linkVaryings(InfoLog &infoLog, std::string& pixelHLSL, std::string& vertexHLSL, FragmentShader *fragmentShader, VertexShader *vertexShader); |
| |
| bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader); |
| |
| bool linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms); |
| bool defineUniform(GLenum shader, const sh::Uniform &constant, InfoLog &infoLog); |
| |
| rx::Renderer *const mRenderer; |
| |
| rx::ShaderExecutable *mPixelExecutable; |
| rx::ShaderExecutable *mVertexExecutable; |
| |
| Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS]; |
| int mSemanticIndex[MAX_VERTEX_ATTRIBS]; |
| |
| struct Sampler |
| { |
| Sampler(); |
| |
| bool active; |
| GLint logicalTextureUnit; |
| TextureType textureType; |
| }; |
| |
| Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS]; |
| Sampler mSamplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF]; |
| GLuint mUsedVertexSamplerRange; |
| GLuint mUsedPixelSamplerRange; |
| bool mUsesPointSize; |
| |
| UniformArray mUniforms; |
| typedef std::vector<UniformLocation> UniformIndex; |
| UniformIndex mUniformIndex; |
| |
| bool mValidated; |
| |
| const unsigned int mSerial; |
| |
| static unsigned int issueSerial(); |
| static unsigned int mCurrentSerial; |
| }; |
| } |
| |
| #endif // LIBGLESV2_PROGRAM_BINARY_H_ |