blob: e6eca144358735f5d17d6c9823b5a12b17a7afe7 [file] [log] [blame]
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +00001//
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
apatrick@chromium.org90080e32012-07-09 22:15:33 +000013#define GL_APICALL
daniel@transgaming.com29ab9522012-08-27 16:25:37 +000014#include <GLES2/gl2.h>
15#include <GLES2/gl2ext.h>
apatrick@chromium.org90080e32012-07-09 22:15:33 +000016
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000017#include <d3dcompiler.h>
18#include <string>
19#include <vector>
20
daniel@transgaming.com4a186ed2012-11-28 20:56:15 +000021#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000022#include "libGLESv2/Context.h"
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000023#include "libGLESv2/D3DConstantTable.h"
24#include "libGLESv2/mathutil.h"
25#include "libGLESv2/Shader.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000026
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000027#include "libGLESv2/renderer/ShaderExecutable9.h"
28
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000029namespace gl
30{
31class FragmentShader;
32class VertexShader;
33
34// Helper struct representing a single shader uniform
35struct Uniform
36{
37 Uniform(GLenum type, const std::string &_name, unsigned int arraySize);
38
39 ~Uniform();
40
41 bool isArray();
42
43 const GLenum type;
44 const std::string _name; // Decorated name
45 const std::string name; // Undecorated name
46 const unsigned int arraySize;
47
48 unsigned char *data;
49 bool dirty;
50
51 struct RegisterInfo
52 {
53 RegisterInfo()
54 {
55 float4Index = -1;
56 samplerIndex = -1;
57 boolIndex = -1;
58 registerCount = 0;
59 }
60
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000061 void set(const D3DConstant *constant)
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000062 {
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000063 switch(constant->registerSet)
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000064 {
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000065 case D3DConstant::RS_BOOL: boolIndex = constant->registerIndex; break;
66 case D3DConstant::RS_FLOAT4: float4Index = constant->registerIndex; break;
67 case D3DConstant::RS_SAMPLER: samplerIndex = constant->registerIndex; break;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000068 default: UNREACHABLE();
69 }
70
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000071 ASSERT(registerCount == 0 || registerCount == (int)constant->registerCount);
72 registerCount = constant->registerCount;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000073 }
74
75 int float4Index;
76 int samplerIndex;
77 int boolIndex;
78
79 int registerCount;
80 };
81
82 RegisterInfo ps;
83 RegisterInfo vs;
84};
85
86// Struct used for correlating uniforms/elements of uniform arrays to handles
87struct UniformLocation
88{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000089 UniformLocation()
90 {
91 }
92
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000093 UniformLocation(const std::string &_name, unsigned int element, unsigned int index);
94
95 std::string name;
96 unsigned int element;
97 unsigned int index;
98};
99
100// This is the result of linking a program. It is the state that would be passed to ProgramBinary.
daniel@transgaming.com989c1c82012-07-24 18:40:38 +0000101class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000102{
103 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000104 explicit ProgramBinary(rx::Renderer *renderer);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000105 ~ProgramBinary();
106
daniel@transgaming.com95892412012-11-28 20:59:09 +0000107 rx::ShaderExecutable *getPixelExecutable();
108 rx::ShaderExecutable *getVertexExecutable();
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000109
110 GLuint getAttributeLocation(const char *name);
111 int getSemanticIndex(int attributeIndex);
112
113 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
114 TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
115 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000116 bool usesPointSize() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000117
118 GLint getUniformLocation(std::string name);
119 bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
120 bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
121 bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
122 bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
123 bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
124 bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
125 bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
126 bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
127 bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
128 bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
129 bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
130
131 bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
132 bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
133
134 GLint getDxDepthRangeLocation() const;
135 GLint getDxDepthLocation() const;
136 GLint getDxCoordLocation() const;
137 GLint getDxHalfPixelSizeLocation() const;
138 GLint getDxFrontCCWLocation() const;
139 GLint getDxPointsOrLinesLocation() const;
140
141 void dirtyAllUniforms();
142 void applyUniforms();
143
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000144 bool load(InfoLog &infoLog, const void *binary, GLsizei length);
145 bool save(void* binary, GLsizei bufSize, GLsizei *length);
146 GLint getLength();
147
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000148 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000149 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
150
151 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
152 GLint getActiveAttributeCount();
153 GLint getActiveAttributeMaxLength();
154
155 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
156 GLint getActiveUniformCount();
157 GLint getActiveUniformMaxLength();
158
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000159 void validate(InfoLog &infoLog);
160 bool validateSamplers(InfoLog *infoLog);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000161 bool isValidated() const;
162
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000163 unsigned int getSerial() const;
164
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000165 static std::string decorateAttribute(const std::string &name); // Prepend an underscore
166 static std::string undecorateUniform(const std::string &_name); // Remove leading underscore
167
168 private:
169 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
170
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000171 int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader);
172 bool linkVaryings(InfoLog &infoLog, std::string& pixelHLSL, std::string& vertexHLSL, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000173
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000174 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000175
daniel@transgaming.coma418ef12012-11-28 20:58:22 +0000176 bool linkUniforms(InfoLog &infoLog, D3DConstantTable *vsConstantTable, D3DConstantTable *psConstantTable);
daniel@transgaming.com59d9ab12012-11-28 20:58:14 +0000177 bool defineUniform(InfoLog &infoLog, GLenum shader, const D3DConstant *constant, const std::string &name,
178 D3DConstantTable *vsConstantTable, D3DConstantTable *psConstantTable);
apatrick@chromium.org60dafe82012-09-05 22:26:10 +0000179 bool defineUniform(GLenum shader, const D3DConstant *constant, const std::string &name);
180 Uniform *createUniform( const D3DConstant *constant, const std::string &name);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000181 bool applyUniformnfv(Uniform *targetUniform, const GLfloat *v);
182 bool applyUniform1iv(Uniform *targetUniform, GLsizei count, const GLint *v);
183 bool applyUniform2iv(Uniform *targetUniform, GLsizei count, const GLint *v);
184 bool applyUniform3iv(Uniform *targetUniform, GLsizei count, const GLint *v);
185 bool applyUniform4iv(Uniform *targetUniform, GLsizei count, const GLint *v);
apatrick@chromium.org60dafe82012-09-05 22:26:10 +0000186 void applyUniformniv(Uniform *targetUniform, GLsizei count, const Vector4 *vector);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000187 void applyUniformnbv(Uniform *targetUniform, GLsizei count, int width, const GLboolean *v);
188
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000189 rx::Renderer9 *mRenderer; // D3D9_REPLACE
daniel@transgaming.come4733d72012-10-31 18:07:01 +0000190 IDirect3DDevice9 *mDevice; // D3D9_REPLACE
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000191
daniel@transgaming.com95892412012-11-28 20:59:09 +0000192 rx::ShaderExecutable9 *mPixelExecutable; // D3D9_REPLACE
193 rx::ShaderExecutable9 *mVertexExecutable; // D3D9_REPLACE
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000194
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000195 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
196 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
197
198 struct Sampler
199 {
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000200 Sampler();
201
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000202 bool active;
203 GLint logicalTextureUnit;
204 TextureType textureType;
205 };
206
207 Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
208 Sampler mSamplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF];
209 GLuint mUsedVertexSamplerRange;
210 GLuint mUsedPixelSamplerRange;
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000211 bool mUsesPointSize;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000212
213 typedef std::vector<Uniform*> UniformArray;
214 UniformArray mUniforms;
215 typedef std::vector<UniformLocation> UniformIndex;
216 UniformIndex mUniformIndex;
217
218 GLint mDxDepthRangeLocation;
219 GLint mDxDepthLocation;
220 GLint mDxCoordLocation;
221 GLint mDxHalfPixelSizeLocation;
222 GLint mDxFrontCCWLocation;
223 GLint mDxPointsOrLinesLocation;
224
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000225 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000226
227 const unsigned int mSerial;
228
229 static unsigned int issueSerial();
230 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000231};
232}
233
234#endif // LIBGLESV2_PROGRAM_BINARY_H_