1 //
2 // Copyright (c) 2002-2010 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 <d3dx9.h>
14 #include <string>
15 #include <vector>
16 #include <set>
17 
18 #include "libGLESv2/Shader.h"
19 #include "libGLESv2/Context.h"
20 
21 namespace gl
22 {
23 class ResourceManager;
24 class FragmentShader;
25 class VertexShader;
26 
27 // Helper struct representing a single shader uniform
28 struct Uniform
29 {
30     Uniform(GLenum type, const std::string &name, unsigned int arraySize);
31 
32     ~Uniform();
33 
34     const GLenum type;
35     const std::string name;
36     const unsigned int arraySize;
37 
38     unsigned char *data;
39     bool dirty;
40 
41     D3DXHANDLE vsHandle;
42     D3DXHANDLE psHandle;
43     bool handlesSet;
44 };
45 
46 // Struct used for correlating uniforms/elements of uniform arrays to handles
47 struct UniformLocation
48 {
49     UniformLocation(const std::string &name, unsigned int element, unsigned int index);
50 
51     std::string name;
52     unsigned int element;
53     unsigned int index;
54 };
55 
56 class Program
57 {
58   public:
59     Program(ResourceManager *manager, GLuint handle);
60 
61     ~Program();
62 
63     bool attachShader(Shader *shader);
64     bool detachShader(Shader *shader);
65     int getAttachedShadersCount() const;
66 
67     IDirect3DPixelShader9 *getPixelShader();
68     IDirect3DVertexShader9 *getVertexShader();
69 
70     void bindAttributeLocation(GLuint index, const char *name);
71     GLuint getAttributeLocation(const char *name);
72     int getSemanticIndex(int attributeIndex);
73 
74     void dirtyAllSamplers();
75 
76     GLint getSamplerMapping(unsigned int samplerIndex);
77     SamplerType getSamplerType(unsigned int samplerIndex);
78     bool isSamplerDirty(unsigned int samplerIndex) const;
79     void setSamplerDirty(unsigned int samplerIndex, bool dirty);
80 
81     GLint getUniformLocation(const char *name, bool decorated);
82     bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
83     bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
84     bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
85     bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
86     bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
87     bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
88     bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
89     bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
90     bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
91     bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
92     bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
93 
94     bool getUniformfv(GLint location, GLfloat *params);
95     bool getUniformiv(GLint location, GLint *params);
96 
97     GLint getDxDepthRangeLocation() const;
98     GLint getDxDepthLocation() const;
99     GLint getDxViewportLocation() const;
100     GLint getDxHalfPixelSizeLocation() const;
101     GLint getDxFrontCCWLocation() const;
102     GLint getDxPointsOrLinesLocation() const;
103 
104     void dirtyAllUniforms();
105     void applyUniforms();
106 
107     void link();
108     bool isLinked();
109     int getInfoLogLength() const;
110     void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
111     void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
112 
113     void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
114     GLint getActiveAttributeCount();
115     GLint getActiveAttributeMaxLength();
116 
117     void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
118     GLint getActiveUniformCount();
119     GLint getActiveUniformMaxLength();
120 
121     void addRef();
122     void release();
123     unsigned int getRefCount() const;
124     void flagForDeletion();
125     bool isFlaggedForDeletion() const;
126 
127     void validate();
128     bool validateSamplers() const;
129     bool isValidated() const;
130 
131     unsigned int getSerial() const;
132 
133   private:
134     DISALLOW_COPY_AND_ASSIGN(Program);
135 
136     ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
137     void unlink(bool destroy = false);
138 
139     int packVaryings(const Varying *packing[][4]);
140     bool linkVaryings();
141 
142     bool linkAttributes();
143     int getAttributeBinding(const std::string &name);
144 
145     bool linkUniforms(ID3DXConstantTable *constantTable);
146     bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
147     bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
148     Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
149     bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
150     bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
151     bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
152     bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
153     bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
154     bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
155     bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
156     bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
157     bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
158     bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
159     bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
160     bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
161     bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
162     bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
163     bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
164 
165     void getConstantHandles(Uniform *targetUniform, D3DXHANDLE *constantPS, D3DXHANDLE *constantVS);
166 
167     void appendToInfoLog(const char *info, ...);
168     void resetInfoLog();
169 
170     static std::string decorate(const std::string &string);     // Prepend an underscore
171     static std::string undecorate(const std::string &string);   // Remove leading underscore
172 
173     static unsigned int issueSerial();
174 
175     FragmentShader *mFragmentShader;
176     VertexShader *mVertexShader;
177 
178     std::string mPixelHLSL;
179     std::string mVertexHLSL;
180 
181     IDirect3DPixelShader9 *mPixelExecutable;
182     IDirect3DVertexShader9 *mVertexExecutable;
183     ID3DXConstantTable *mConstantTablePS;
184     ID3DXConstantTable *mConstantTableVS;
185 
186     std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
187     Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
188     int mSemanticIndex[MAX_VERTEX_ATTRIBS];
189 
190     struct Sampler
191     {
192         bool active;
193         GLint logicalTextureUnit;
194         SamplerType type;
195         bool dirty;
196     };
197 
198     Sampler mSamplers[MAX_TEXTURE_IMAGE_UNITS];
199 
200     typedef std::vector<Uniform*> UniformArray;
201     UniformArray mUniforms;
202     typedef std::vector<UniformLocation> UniformIndex;
203     UniformIndex mUniformIndex;
204 
205     GLint mDxDepthRangeLocation;
206     GLint mDxDepthLocation;
207     GLint mDxViewportLocation;
208     GLint mDxHalfPixelSizeLocation;
209     GLint mDxFrontCCWLocation;
210     GLint mDxPointsOrLinesLocation;
211 
212     bool mLinked;
213     bool mDeleteStatus;   // Flag to indicate that the program can be deleted when no longer in use
214     char *mInfoLog;
215     bool mValidated;
216 
217     unsigned int mRefCount;
218 
219     const unsigned int mSerial;
220 
221     static unsigned int mCurrentSerial;
222 
223     ResourceManager *mResourceManager;
224     const GLuint mHandle;
225 };
226 }
227 
228 #endif   // LIBGLESV2_PROGRAM_H_
229