|
1 // |
|
2 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. |
|
3 // Use of this source code is governed by a BSD-style license that can be |
|
4 // found in the LICENSE file. |
|
5 // |
|
6 |
|
7 // Program.h: Defines the gl::Program class. Implements GL program objects |
|
8 // and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28. |
|
9 |
|
10 #ifndef LIBGLESV2_PROGRAM_H_ |
|
11 #define LIBGLESV2_PROGRAM_H_ |
|
12 |
|
13 #include <string> |
|
14 #include <set> |
|
15 |
|
16 #include "common/angleutils.h" |
|
17 #include "common/RefCountObject.h" |
|
18 #include "libGLESv2/Constants.h" |
|
19 |
|
20 namespace rx |
|
21 { |
|
22 class Renderer; |
|
23 } |
|
24 |
|
25 namespace gl |
|
26 { |
|
27 class ResourceManager; |
|
28 class FragmentShader; |
|
29 class VertexShader; |
|
30 class ProgramBinary; |
|
31 class Shader; |
|
32 |
|
33 extern const char * const g_fakepath; |
|
34 |
|
35 class AttributeBindings |
|
36 { |
|
37 public: |
|
38 AttributeBindings(); |
|
39 ~AttributeBindings(); |
|
40 |
|
41 void bindAttributeLocation(GLuint index, const char *name); |
|
42 int getAttributeBinding(const std::string &name) const; |
|
43 |
|
44 private: |
|
45 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS]; |
|
46 }; |
|
47 |
|
48 class InfoLog |
|
49 { |
|
50 public: |
|
51 InfoLog(); |
|
52 ~InfoLog(); |
|
53 |
|
54 int getLength() const; |
|
55 void getLog(GLsizei bufSize, GLsizei *length, char *infoLog); |
|
56 |
|
57 void appendSanitized(const char *message); |
|
58 void append(const char *info, ...); |
|
59 void reset(); |
|
60 private: |
|
61 DISALLOW_COPY_AND_ASSIGN(InfoLog); |
|
62 char *mInfoLog; |
|
63 }; |
|
64 |
|
65 class Program |
|
66 { |
|
67 public: |
|
68 Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle); |
|
69 |
|
70 ~Program(); |
|
71 |
|
72 bool attachShader(Shader *shader); |
|
73 bool detachShader(Shader *shader); |
|
74 int getAttachedShadersCount() const; |
|
75 |
|
76 void bindAttributeLocation(GLuint index, const char *name); |
|
77 |
|
78 bool link(); |
|
79 bool isLinked(); |
|
80 bool setProgramBinary(const void *binary, GLsizei length); |
|
81 ProgramBinary *getProgramBinary(); |
|
82 |
|
83 int getInfoLogLength() const; |
|
84 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); |
|
85 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); |
|
86 |
|
87 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); |
|
88 GLint getActiveAttributeCount(); |
|
89 GLint getActiveAttributeMaxLength(); |
|
90 |
|
91 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); |
|
92 GLint getActiveUniformCount(); |
|
93 GLint getActiveUniformMaxLength(); |
|
94 |
|
95 void addRef(); |
|
96 void release(); |
|
97 unsigned int getRefCount() const; |
|
98 void flagForDeletion(); |
|
99 bool isFlaggedForDeletion() const; |
|
100 |
|
101 void validate(); |
|
102 bool isValidated() const; |
|
103 |
|
104 GLint getProgramBinaryLength() const; |
|
105 |
|
106 private: |
|
107 DISALLOW_COPY_AND_ASSIGN(Program); |
|
108 |
|
109 void unlink(bool destroy = false); |
|
110 |
|
111 FragmentShader *mFragmentShader; |
|
112 VertexShader *mVertexShader; |
|
113 |
|
114 AttributeBindings mAttributeBindings; |
|
115 |
|
116 BindingPointer<ProgramBinary> mProgramBinary; |
|
117 bool mLinked; |
|
118 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use |
|
119 |
|
120 unsigned int mRefCount; |
|
121 |
|
122 ResourceManager *mResourceManager; |
|
123 rx::Renderer *mRenderer; |
|
124 const GLuint mHandle; |
|
125 |
|
126 InfoLog mInfoLog; |
|
127 }; |
|
128 } |
|
129 |
|
130 #endif // LIBGLESV2_PROGRAM_H_ |