blob: ad470d417b63f61455b393cd437523f089242a21 [file] [log] [blame]
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +00001//
Geoff Lang48dcae72014-02-05 16:28:24 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +00003// 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
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000013#include "common/RefCountObject.h"
14#include "angletypes.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000015#include "common/mathutil.h"
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000016#include "libGLESv2/Uniform.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000017#include "libGLESv2/Shader.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Constants.h"
Brandon Jonesc7a41042014-06-23 12:03:25 -070019#include "libGLESv2/renderer/d3d/VertexDataManager.h"
Brandon Jonesd8d72432014-08-22 15:11:23 -070020#include "libGLESv2/renderer/d3d/DynamicHLSL.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000021
Geoff Lang0b7eef72014-06-12 14:10:47 -040022#include "angle_gl.h"
23
24#include <string>
25#include <vector>
26
Jamie Madill3f2e61d2014-09-05 10:38:05 -040027// TODO(jmadill): place this in workarounds library
28#define ANGLE_WORKAROUND_ENABLED 1
29#define ANGLE_WORKAROUND_DISABLED 2
30#define ANGLE_MRT_PERF_WORKAROUND ANGLE_WORKAROUND_ENABLED
31
Jamie Madillbf9cce22014-07-18 10:33:09 -040032namespace sh
33{
34class HLSLBlockEncoder;
35}
36
Geoff Lang0b7eef72014-06-12 14:10:47 -040037#include <GLES3/gl3.h>
38#include <GLES2/gl2.h>
39#include <GLES2/gl2ext.h>
40
41#include <string>
42#include <vector>
43
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000044namespace rx
45{
46class ShaderExecutable;
47class Renderer;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +000048struct TranslatedAttribute;
Jamie Madill8ff21ae2014-02-04 16:04:05 -050049class UniformStorage;
Brandon Jonesc9610c52014-08-25 17:02:59 -070050class ProgramImpl;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000051}
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000052
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000053namespace gl
54{
Brandon Jones43a53e22014-08-28 16:23:22 -070055struct Caps;
Brandon Jones71620962014-08-20 14:04:59 -070056class Shader;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000057class InfoLog;
58class AttributeBindings;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +000059class Buffer;
Geoff Lang04fb89a2014-06-09 15:05:36 -040060class Framebuffer;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000061
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000062// Struct used for correlating uniforms/elements of uniform arrays to handles
Jamie Madill63491ea2013-06-06 11:56:45 -040063struct VariableLocation
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000064{
Jamie Madill63491ea2013-06-06 11:56:45 -040065 VariableLocation()
apatrick@chromium.org90080e32012-07-09 22:15:33 +000066 {
67 }
68
Jamie Madill63491ea2013-06-06 11:56:45 -040069 VariableLocation(const std::string &name, unsigned int element, unsigned int index);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000070
71 std::string name;
72 unsigned int element;
73 unsigned int index;
74};
75
Geoff Lang48dcae72014-02-05 16:28:24 -050076struct LinkedVarying
77{
78 LinkedVarying();
79 LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
80 unsigned int semanticIndex, unsigned int semanticIndexCount);
81
82 // Original GL name
83 std::string name;
84
85 GLenum type;
86 GLsizei size;
87
88 // DirectX semantic information
89 std::string semanticName;
90 unsigned int semanticIndex;
91 unsigned int semanticIndexCount;
92};
93
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000094// 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 +000095class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000096{
97 public:
Brandon Jonesc9610c52014-08-25 17:02:59 -070098 explicit ProgramBinary(rx::ProgramImpl *impl);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000099 ~ProgramBinary();
100
Brandon Jonesc9610c52014-08-25 17:02:59 -0700101 rx::ProgramImpl *getImplementation() { return mProgram; }
102 const rx::ProgramImpl *getImplementation() const { return mProgram; }
103
Geoff Lang04fb89a2014-06-09 15:05:36 -0400104 rx::ShaderExecutable *getPixelExecutableForFramebuffer(const Framebuffer *fbo);
105 rx::ShaderExecutable *getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout);
Jamie Madill834e8b72014-04-11 13:33:58 -0400106 rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]);
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500107 rx::ShaderExecutable *getGeometryExecutable() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000108
109 GLuint getAttributeLocation(const char *name);
110 int getSemanticIndex(int attributeIndex);
111
Brandon Jones43a53e22014-08-28 16:23:22 -0700112 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps);
Geoff Lang76b10c92014-09-05 16:28:14 -0400113 GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000114 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000115 bool usesPointSize() const;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000116 bool usesPointSpriteEmulation() const;
117 bool usesGeometryShader() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000118
119 GLint getUniformLocation(std::string name);
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +0000120 GLuint getUniformIndex(std::string name);
shannonwoods@chromium.org42766252013-05-30 00:07:12 +0000121 GLuint getUniformBlockIndex(std::string name);
Jamie Madill36398922014-05-20 14:51:53 -0400122 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
123 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
124 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
125 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
126 void setUniform1iv(GLint location, GLsizei count, const GLint *v);
127 void setUniform2iv(GLint location, GLsizei count, const GLint *v);
128 void setUniform3iv(GLint location, GLsizei count, const GLint *v);
129 void setUniform4iv(GLint location, GLsizei count, const GLint *v);
130 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
131 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
132 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
133 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
134 void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
135 void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
136 void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
137 void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
138 void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
139 void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
140 void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
141 void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
142 void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000143
Jamie Madill99a1e982014-08-25 15:47:54 -0400144 void getUniformfv(GLint location, GLfloat *params);
145 void getUniformiv(GLint location, GLint *params);
146 void getUniformuiv(GLint location, GLuint *params);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000147
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000148 void dirtyAllUniforms();
Geoff Langc77e8c32014-09-08 16:28:24 -0400149
150 Error applyUniforms();
151 Error applyUniformBuffers(const std::vector<Buffer*> boundBuffers, const Caps &caps);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000152
Geoff Lang900013c2014-07-07 11:32:19 -0400153 bool load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length);
154 bool save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000155 GLint getLength();
156
Brandon Jones71620962014-08-20 14:04:59 -0700157 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, Shader *fragmentShader, Shader *vertexShader,
Brandon Jones43a53e22014-08-28 16:23:22 -0700158 const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode, const Caps &caps);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000159 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
160
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000161 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
162 GLint getActiveAttributeCount() const;
163 GLint getActiveAttributeMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000164
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000165 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
166 GLint getActiveUniformCount() const;
167 GLint getActiveUniformMaxLength() const;
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +0000168 GLint getActiveUniformi(GLuint index, GLenum pname) const;
Jamie Madill36398922014-05-20 14:51:53 -0400169 bool isValidUniformLocation(GLint location) const;
170 LinkedUniform *getUniformByLocation(GLint location) const;
Jamie Madill66d43d22014-07-11 17:02:03 -0400171 LinkedUniform *getUniformByName(const std::string &name) const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000172
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +0000173 void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +0000174 void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000175 GLuint getActiveUniformBlockCount() const;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +0000176 GLuint getActiveUniformBlockMaxLength() const;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +0000177 UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000178
Jamie Madilld1e78c92013-06-20 11:55:50 -0400179 GLint getFragDataLocation(const char *name) const;
180
Geoff Lang48dcae72014-02-05 16:28:24 -0500181 size_t getTransformFeedbackVaryingCount() const;
182 const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
183 GLenum getTransformFeedbackBufferMode() const;
184
Brandon Jones43a53e22014-08-28 16:23:22 -0700185 void validate(InfoLog &infoLog, const Caps &caps);
186 bool validateSamplers(InfoLog *infoLog, const Caps &caps);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000187 bool isValidated() const;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400188 void updateSamplerMapping();
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000189
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000190 unsigned int getSerial() const;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000191 int getShaderVersion() const;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000192
Al Patrick3f2daa82013-08-07 12:58:57 -0700193 void initAttributesByLayout();
Jamie Madill834e8b72014-04-11 13:33:58 -0400194 void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +0000195
Jamie Madill834e8b72014-04-11 13:33:58 -0400196 const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; }
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500197
Brandon Jones22502d52014-08-29 16:58:36 -0700198 static bool linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader);
199
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000200 private:
201 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
202
Jamie Madill66d43d22014-07-11 17:02:03 -0400203 struct Sampler
204 {
205 Sampler();
206
207 bool active;
208 GLint logicalTextureUnit;
Geoff Lang76b10c92014-09-05 16:28:14 -0400209 GLenum textureType;
Jamie Madill66d43d22014-07-11 17:02:03 -0400210 };
211
Geoff Lang04fb89a2014-06-09 15:05:36 -0400212 void reset();
213
Jamie Madilld15250e2014-09-03 09:40:44 -0400214 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, const Shader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000215
Brandon Jones22502d52014-08-29 16:58:36 -0700216 static bool linkValidateVariablesBase(InfoLog &infoLog,
217 const std::string &variableName,
218 const sh::ShaderVariable &vertexVariable,
219 const sh::ShaderVariable &fragmentVariable,
220 bool validatePrecision);
Jamie Madill9d2ffb12013-08-30 13:21:04 -0400221
Brandon Jones22502d52014-08-29 16:58:36 -0700222 static bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform);
223 static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
224 static bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform);
Brandon Jones43a53e22014-08-28 16:23:22 -0700225 bool linkUniforms(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
Jamie Madillbf9cce22014-07-18 10:33:09 -0400226 void defineUniformBase(GLenum shader, const sh::Uniform &uniform, unsigned int uniformRegister);
Jamie Madill42bcf322014-08-25 16:20:46 -0400227 void defineUniform(GLenum shader, const sh::ShaderVariable &uniform, const std::string &fullName, sh::HLSLBlockEncoder *encoder);
Brandon Jones43a53e22014-08-28 16:23:22 -0700228 bool indexSamplerUniform(const LinkedUniform &uniform, InfoLog &infoLog, const Caps &caps);
229 bool indexUniforms(InfoLog &infoLog, const Caps &caps);
Jamie Madill66d43d22014-07-11 17:02:03 -0400230 static bool assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount,
Geoff Lang76b10c92014-09-05 16:28:14 -0400231 std::vector<Sampler> &outSamplers, GLuint *outUsedRange);
Jamie Madillf2575982014-06-25 16:04:54 -0400232 bool areMatchingInterfaceBlocks(InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock, const sh::InterfaceBlock &fragmentInterfaceBlock);
Brandon Jones43a53e22014-08-28 16:23:22 -0700233 bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
Geoff Lang48dcae72014-02-05 16:28:24 -0500234 bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
235 const std::vector<std::string> &transformFeedbackVaryingNames,
236 GLenum transformFeedbackBufferMode,
Brandon Jones43a53e22014-08-28 16:23:22 -0700237 std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
238 const Caps &caps) const;
Jamie Madill42bcf322014-08-25 16:20:46 -0400239 template <typename VarT>
240 void defineUniformBlockMembers(const std::vector<VarT> &fields, const std::string &prefix, int blockIndex,
Jamie Madilla6f267f2014-08-27 11:44:15 -0400241 sh::BlockLayoutEncoder *encoder, std::vector<unsigned int> *blockUniformIndexes,
242 bool inRowMajorLayout);
Brandon Jones43a53e22014-08-28 16:23:22 -0700243 bool defineUniformBlock(InfoLog &infoLog, const Shader &shader, const sh::InterfaceBlock &interfaceBlock, const Caps &caps);
244 bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
Brandon Jones71620962014-08-20 14:04:59 -0700245 void defineOutputVariables(Shader *fragmentShader);
Jamie Madill46131a32013-06-20 11:55:50 -0400246
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000247 template <typename T>
Jamie Madill36398922014-05-20 14:51:53 -0400248 void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000249
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000250 template <int cols, int rows>
Jamie Madill36398922014-05-20 14:51:53 -0400251 void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000252
shannon.woods%transgaming.com@gtempaccount.com4590d892013-04-13 03:41:01 +0000253 template <typename T>
Jamie Madill99a1e982014-08-25 15:47:54 -0400254 void getUniformv(GLint location, T *params, GLenum uniformType);
shannon.woods%transgaming.com@gtempaccount.com4590d892013-04-13 03:41:01 +0000255
Jamie Madillc5a83002014-02-14 16:41:25 -0500256 class VertexExecutable
257 {
258 public:
Geoff Lang04fb89a2014-06-09 15:05:36 -0400259 VertexExecutable(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS],
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400260 const GLenum signature[MAX_VERTEX_ATTRIBS],
Jamie Madillc5a83002014-02-14 16:41:25 -0500261 rx::ShaderExecutable *shaderExecutable);
Jamie Madill8b4f8f82014-03-26 14:01:58 -0400262 ~VertexExecutable();
263
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400264 bool matchesSignature(const GLenum convertedLayout[MAX_VERTEX_ATTRIBS]) const;
Jamie Madillc5a83002014-02-14 16:41:25 -0500265
266 const VertexFormat *inputs() const { return mInputs; }
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400267 const GLenum *signature() const { return mSignature; }
Jamie Madillc5a83002014-02-14 16:41:25 -0500268 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
269
270 private:
Jamie Madill834e8b72014-04-11 13:33:58 -0400271 VertexFormat mInputs[MAX_VERTEX_ATTRIBS];
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400272 GLenum mSignature[MAX_VERTEX_ATTRIBS];
Jamie Madillc5a83002014-02-14 16:41:25 -0500273 rx::ShaderExecutable *mShaderExecutable;
274 };
275
Geoff Lang04fb89a2014-06-09 15:05:36 -0400276 class PixelExecutable
277 {
278 public:
279 PixelExecutable(const std::vector<GLenum> &outputSignature, rx::ShaderExecutable *shaderExecutable);
280 ~PixelExecutable();
281
Jamie Madill3f2e61d2014-09-05 10:38:05 -0400282 bool matchesSignature(const std::vector<GLenum> &signature) const { return mOutputSignature == signature; }
Geoff Lang4ace4232014-06-18 19:12:48 -0400283
Geoff Lang04fb89a2014-06-09 15:05:36 -0400284 const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
285 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
286
287 private:
288 std::vector<GLenum> mOutputSignature;
289 rx::ShaderExecutable *mShaderExecutable;
290 };
291
Brandon Jonesc9610c52014-08-25 17:02:59 -0700292 rx::ProgramImpl *mProgram;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000293
Jamie Madillc5a83002014-02-14 16:41:25 -0500294 std::vector<VertexExecutable *> mVertexExecutables;
Geoff Lang04fb89a2014-06-09 15:05:36 -0400295 std::vector<PixelExecutable *> mPixelExecutables;
296
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000297 rx::ShaderExecutable *mGeometryExecutable;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000298
Jamie Madillf2575982014-06-25 16:04:54 -0400299 sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
300 sh::Attribute mShaderAttributes[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000301 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
Al Patrick3f2daa82013-08-07 12:58:57 -0700302 int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000303
Geoff Lang48dcae72014-02-05 16:28:24 -0500304 GLenum mTransformFeedbackBufferMode;
305 std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings;
306
Geoff Lang76b10c92014-09-05 16:28:14 -0400307 std::vector<Sampler> mSamplersPS;
308 std::vector<Sampler> mSamplersVS;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000309 GLuint mUsedVertexSamplerRange;
310 GLuint mUsedPixelSamplerRange;
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000311 bool mUsesPointSize;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000312 int mShaderVersion;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400313 bool mDirtySamplerMapping;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000314
Jamie Madill834e8b72014-04-11 13:33:58 -0400315 std::vector<LinkedUniform*> mUniforms;
316 std::vector<UniformBlock*> mUniformBlocks;
Jamie Madill5f562732014-02-14 16:41:24 -0500317 std::vector<VariableLocation> mUniformIndex;
318 std::map<int, VariableLocation> mOutputVariables;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000319
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000320 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000321
322 const unsigned int mSerial;
323
324 static unsigned int issueSerial();
325 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000326};
Jamie Madill5f562732014-02-14 16:41:24 -0500327
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000328}
329
330#endif // LIBGLESV2_PROGRAM_BINARY_H_