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