14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2ea7c345f59d243c4881ebd6d6d9c01c537d1ba29daniel@transgaming.com// Copyright (c) 2002-2012 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 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#include <string> 14b4ff1f8f6ffcf796b5e12b55b851d8e0362afcc3daniel@transgaming.com#include <set> 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 16486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "common/angleutils.h" 17486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "common/RefCountObject.h" 18486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Constants.h" 19486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com 20486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comnamespace rx 21486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com{ 22486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Renderer; 23486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com} 24e6842296d00cda4d731782f1e7f22006ea277c4fdaniel@transgaming.com 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace gl 264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 27da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comclass ResourceManager; 284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass FragmentShader; 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass VertexShader; 30486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass ProgramBinary; 31486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Shader; 324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 33253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgextern const char * const g_fakepath; 34253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 359a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.orgclass AttributeBindings 369a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org{ 379a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org public: 389a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org AttributeBindings(); 399a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org ~AttributeBindings(); 409a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 419a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org void bindAttributeLocation(GLuint index, const char *name); 429a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org int getAttributeBinding(const std::string &name) const; 439a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 449a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org private: 459a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS]; 469a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org}; 479a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 48253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgclass InfoLog 49253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 50253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org public: 51253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org InfoLog(); 52253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org ~InfoLog(); 53253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 54253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org int getLength() const; 55253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void getLog(GLsizei bufSize, GLsizei *length, char *infoLog); 56253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 57253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void appendSanitized(const char *message); 58253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void append(const char *info, ...); 59253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void reset(); 60253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org private: 61253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org DISALLOW_COPY_AND_ASSIGN(InfoLog); 62253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org char *mInfoLog; 63253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org}; 64253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 65e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgclass Program 66e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 67e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org public: 6870062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle); 69e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 70e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org ~Program(); 71e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 72e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool attachShader(Shader *shader); 73e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool detachShader(Shader *shader); 74e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org int getAttachedShadersCount() const; 75e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 76e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void bindAttributeLocation(GLuint index, const char *name); 77e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 784c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.com bool link(); 79716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com bool isLinked(); 804c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.com bool setProgramBinary(const void *binary, GLsizei length); 81e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org ProgramBinary *getProgramBinary(); 82e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 83e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org int getInfoLogLength() const; 84e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 85e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); 86e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 87e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); 88e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveAttributeCount(); 89e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveAttributeMaxLength(); 90e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 91e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); 92e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveUniformCount(); 93e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org GLint getActiveUniformMaxLength(); 94e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 95e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void addRef(); 96e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void release(); 97e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org unsigned int getRefCount() const; 98e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void flagForDeletion(); 99e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool isFlaggedForDeletion() const; 100e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 101253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org void validate(); 102e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool isValidated() const; 103e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 10490080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org GLint getProgramBinaryLength() const; 10590080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org 106e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org private: 107e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org DISALLOW_COPY_AND_ASSIGN(Program); 108e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 109e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org void unlink(bool destroy = false); 110e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 111e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org FragmentShader *mFragmentShader; 112e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org VertexShader *mVertexShader; 113e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 114e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org AttributeBindings mAttributeBindings; 115e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 116989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com BindingPointer<ProgramBinary> mProgramBinary; 117716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com bool mLinked; 118e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use 1194fa08339e2f67491a1ed8af0862776c0e07b4a50daniel@transgaming.com 120da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com unsigned int mRefCount; 121da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 122da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ResourceManager *mResourceManager; 12370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com rx::Renderer *mRenderer; 124da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com const GLuint mHandle; 125253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 126253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org InfoLog mInfoLog; 1274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}; 1284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#endif // LIBGLESV2_PROGRAM_H_ 131