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