14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 21b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved. 34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Program.h: Defines the gl::Program class. Implements GL program objects 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28. 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#ifndef LIBGLESV2_PROGRAM_H_ 114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#define LIBGLESV2_PROGRAM_H_ 124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 13486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "common/angleutils.h" 14486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "common/RefCountObject.h" 15486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Constants.h" 1653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods#include "libGLESv2/ProgramBinary.h" 17486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com 180b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <GLES2/gl2.h> 190b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang 200b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <vector> 210b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <string> 220b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <set> 230b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang 24486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comnamespace rx 25486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com{ 26486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Renderer; 27486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com} 28e6842296d00cda4d731782f1e7f22006ea277c4fdaniel@transgaming.com 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace gl 304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 3143a53e2434f4fe042bee061fc369a93314b710deBrandon Jonesstruct Caps; 32da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comclass ResourceManager; 33486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Shader; 344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 35253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgextern const char * const g_fakepath; 36253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 379a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.orgclass AttributeBindings 389a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org{ 399a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org public: 409a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org AttributeBindings(); 419a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org ~AttributeBindings(); 429a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 439a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org void bindAttributeLocation(GLuint index, const char *name); 449a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org int getAttributeBinding(const std::string &name) const; 459a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 469a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org private: 479a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS]; 489a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org}; 499a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 50253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgclass InfoLog 51253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 52253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org public: 53253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org InfoLog(); 54253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org ~InfoLog(); 55253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 56253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org int getLength() const; 57253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void getLog(GLsizei bufSize, GLsizei *length, char *infoLog); 58253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 59253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void appendSanitized(const char *message); 60253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void append(const char *info, ...); 61253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void reset(); 62253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org private: 63253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org DISALLOW_COPY_AND_ASSIGN(InfoLog); 64253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org char *mInfoLog; 65253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org}; 66253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 67e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgclass Program 68e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 69e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org public: 7070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle); 71e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 72e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org ~Program(); 73e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 74e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool attachShader(Shader *shader); 75e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool detachShader(Shader *shader); 76e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org int getAttachedShadersCount() const; 77e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 78e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void bindAttributeLocation(GLuint index, const char *name); 79e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 8043a53e2434f4fe042bee061fc369a93314b710deBrandon Jones bool link(const Caps &caps); 81716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com bool isLinked(); 82900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang bool setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length); 8348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang ProgramBinary *getProgramBinary() const; 84e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 85e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org int getInfoLogLength() const; 86e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 87e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); 88e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 89e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); 90e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveAttributeCount(); 91e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveAttributeMaxLength(); 92e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 93e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); 94e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveUniformCount(); 95e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveUniformMaxLength(); 96e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 97e684b58a3d326fceb649ef5304a293dbfd643dbashannonwoods@chromium.org GLint getActiveUniformBlockCount(); 98e684b58a3d326fceb649ef5304a293dbfd643dbashannonwoods@chromium.org GLint getActiveUniformBlockMaxLength(); 99e684b58a3d326fceb649ef5304a293dbfd643dbashannonwoods@chromium.org 10070eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding); 10170eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const; 10270eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org 10348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang void setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode); 10448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang void getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const; 1051b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang GLsizei getTransformFeedbackVaryingCount() const; 1061b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang GLsizei getTransformFeedbackVaryingMaxLength() const; 1071b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang GLenum getTransformFeedbackBufferMode() const; 1081b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang 109e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void addRef(); 110e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void release(); 111e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org unsigned int getRefCount() const; 112e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void flagForDeletion(); 113e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool isFlaggedForDeletion() const; 114e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 11543a53e2434f4fe042bee061fc369a93314b710deBrandon Jones void validate(const Caps &caps); 116e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool isValidated() const; 117e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 11890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org GLint getProgramBinaryLength() const; 11990080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org 120e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org private: 121e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org DISALLOW_COPY_AND_ASSIGN(Program); 122e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 123e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void unlink(bool destroy = false); 12470eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org void resetUniformBlockBindings(); 125e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 1267162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones Shader *mFragmentShader; 1277162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones Shader *mVertexShader; 128e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 129e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org AttributeBindings mAttributeBindings; 130e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 13170eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS]; 13270eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org 13348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang std::vector<std::string> mTransformFeedbackVaryings; 13448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang GLuint mTransformFeedbackBufferMode; 13548dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang 136989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com BindingPointer<ProgramBinary> mProgramBinary; 137716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com bool mLinked; 138e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use 1394fa08339e2f67491a1ed8af0862776c0e07b4a50daniel@transgaming.com 140da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com unsigned int mRefCount; 141da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 142da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ResourceManager *mResourceManager; 14370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com rx::Renderer *mRenderer; 144da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com const GLuint mHandle; 145253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 146253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org InfoLog mInfoLog; 1474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}; 1484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#endif // LIBGLESV2_PROGRAM_H_ 151