gfx/angle/src/libGLESv2/ProgramBinary.h

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:b6b9670fdddc
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_BINARY_H_
11 #define LIBGLESV2_PROGRAM_BINARY_H_
12
13 #define GL_APICALL
14 #include <GLES2/gl2.h>
15 #include <GLES2/gl2ext.h>
16
17 #include <string>
18 #include <vector>
19
20 #include "common/RefCountObject.h"
21 #include "angletypes.h"
22 #include "libGLESv2/mathutil.h"
23 #include "libGLESv2/Uniform.h"
24 #include "libGLESv2/Shader.h"
25 #include "libGLESv2/Constants.h"
26
27 namespace rx
28 {
29 class ShaderExecutable;
30 class Renderer;
31 struct TranslatedAttribute;
32 }
33
34 namespace gl
35 {
36 class FragmentShader;
37 class VertexShader;
38 class InfoLog;
39 class AttributeBindings;
40 struct Varying;
41
42 // Struct used for correlating uniforms/elements of uniform arrays to handles
43 struct UniformLocation
44 {
45 UniformLocation()
46 {
47 }
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 // This is the result of linking a program. It is the state that would be passed to ProgramBinary.
57 class ProgramBinary : public RefCountObject
58 {
59 public:
60 explicit ProgramBinary(rx::Renderer *renderer);
61 ~ProgramBinary();
62
63 rx::ShaderExecutable *getPixelExecutable();
64 rx::ShaderExecutable *getVertexExecutable();
65 rx::ShaderExecutable *getGeometryExecutable();
66
67 GLuint getAttributeLocation(const char *name);
68 int getSemanticIndex(int attributeIndex);
69
70 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
71 TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
72 GLint getUsedSamplerRange(SamplerType type);
73 bool usesPointSize() const;
74 bool usesPointSpriteEmulation() const;
75 bool usesGeometryShader() const;
76
77 GLint getUniformLocation(std::string name);
78 bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
79 bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
80 bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
81 bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
82 bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
83 bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
84 bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
85 bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
86 bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
87 bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
88 bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
89
90 bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
91 bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
92
93 void dirtyAllUniforms();
94 void applyUniforms();
95
96 bool load(InfoLog &infoLog, const void *binary, GLsizei length);
97 bool save(void* binary, GLsizei bufSize, GLsizei *length);
98 GLint getLength();
99
100 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
101 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
102
103 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
104 GLint getActiveAttributeCount() const;
105 GLint getActiveAttributeMaxLength() const;
106
107 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
108 GLint getActiveUniformCount() const;
109 GLint getActiveUniformMaxLength() const;
110
111 void validate(InfoLog &infoLog);
112 bool validateSamplers(InfoLog *infoLog);
113 bool isValidated() const;
114
115 unsigned int getSerial() const;
116
117 void sortAttributesByLayout(rx::TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
118
119 static std::string decorateAttribute(const std::string &name); // Prepend an underscore
120
121 private:
122 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
123
124 int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader);
125 bool linkVaryings(InfoLog &infoLog, int registers, const Varying *packing[][4],
126 std::string& pixelHLSL, std::string& vertexHLSL,
127 FragmentShader *fragmentShader, VertexShader *vertexShader);
128
129 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
130
131 bool linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms);
132 bool defineUniform(GLenum shader, const sh::Uniform &constant, InfoLog &infoLog);
133
134 std::string generateGeometryShaderHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
135 std::string generatePointSpriteHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
136
137 rx::Renderer *const mRenderer;
138
139 rx::ShaderExecutable *mPixelExecutable;
140 rx::ShaderExecutable *mVertexExecutable;
141 rx::ShaderExecutable *mGeometryExecutable;
142
143 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
144 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
145
146 struct Sampler
147 {
148 Sampler();
149
150 bool active;
151 GLint logicalTextureUnit;
152 TextureType textureType;
153 };
154
155 Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
156 Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
157 GLuint mUsedVertexSamplerRange;
158 GLuint mUsedPixelSamplerRange;
159 bool mUsesPointSize;
160
161 UniformArray mUniforms;
162 typedef std::vector<UniformLocation> UniformIndex;
163 UniformIndex mUniformIndex;
164
165 bool mValidated;
166
167 const unsigned int mSerial;
168
169 static unsigned int issueSerial();
170 static unsigned int mCurrentSerial;
171 };
172 }
173
174 #endif // LIBGLESV2_PROGRAM_BINARY_H_

mercurial