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
21namespace gl
22{
23class ResourceManager;
24class FragmentShader;
25class VertexShader;
26
27// Helper struct representing a single shader uniform
28struct 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
47struct 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
56class 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