blob: 770ce417f89f141abf3efc007ad9681025db87f5 [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
Jamie Madillf51639a2014-06-25 16:04:57 -040013#include "angle_gl.h"
apatrick@chromium.org90080e32012-07-09 22:15:33 +000014
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000015#include <string>
16#include <vector>
17
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000018#include "common/RefCountObject.h"
19#include "angletypes.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000020#include "common/mathutil.h"
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000021#include "libGLESv2/Uniform.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000022#include "libGLESv2/Shader.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Constants.h"
Brandon Jonesc7a41042014-06-23 12:03:25 -070024#include "libGLESv2/renderer/d3d/VertexDataManager.h"
Geoff Lang04fb89a2014-06-09 15:05:36 -040025#include "libGLESv2/DynamicHLSL.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000026
Jamie Madillbf9cce22014-07-18 10:33:09 -040027namespace sh
28{
29class HLSLBlockEncoder;
30}
31
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000032namespace rx
33{
34class ShaderExecutable;
35class Renderer;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +000036struct TranslatedAttribute;
Jamie Madill8ff21ae2014-02-04 16:04:05 -050037class UniformStorage;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000038}
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000039
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000040namespace gl
41{
42class FragmentShader;
43class VertexShader;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000044class InfoLog;
45class AttributeBindings;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +000046class Buffer;
Geoff Lang04fb89a2014-06-09 15:05:36 -040047class Framebuffer;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000048
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000049// Struct used for correlating uniforms/elements of uniform arrays to handles
Jamie Madill63491ea2013-06-06 11:56:45 -040050struct VariableLocation
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000051{
Jamie Madill63491ea2013-06-06 11:56:45 -040052 VariableLocation()
apatrick@chromium.org90080e32012-07-09 22:15:33 +000053 {
54 }
55
Jamie Madill63491ea2013-06-06 11:56:45 -040056 VariableLocation(const std::string &name, unsigned int element, unsigned int index);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000057
58 std::string name;
59 unsigned int element;
60 unsigned int index;
61};
62
Geoff Lang48dcae72014-02-05 16:28:24 -050063struct LinkedVarying
64{
65 LinkedVarying();
66 LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
67 unsigned int semanticIndex, unsigned int semanticIndexCount);
68
69 // Original GL name
70 std::string name;
71
72 GLenum type;
73 GLsizei size;
74
75 // DirectX semantic information
76 std::string semanticName;
77 unsigned int semanticIndex;
78 unsigned int semanticIndexCount;
79};
80
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000081// 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 +000082class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000083{
84 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +000085 explicit ProgramBinary(rx::Renderer *renderer);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000086 ~ProgramBinary();
87
Geoff Lang04fb89a2014-06-09 15:05:36 -040088 rx::ShaderExecutable *getPixelExecutableForFramebuffer(const Framebuffer *fbo);
89 rx::ShaderExecutable *getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout);
Jamie Madill834e8b72014-04-11 13:33:58 -040090 rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]);
Jamie Madill8ff21ae2014-02-04 16:04:05 -050091 rx::ShaderExecutable *getGeometryExecutable() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000092
93 GLuint getAttributeLocation(const char *name);
94 int getSemanticIndex(int attributeIndex);
95
96 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
97 TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
98 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +000099 bool usesPointSize() const;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000100 bool usesPointSpriteEmulation() const;
101 bool usesGeometryShader() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000102
103 GLint getUniformLocation(std::string name);
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +0000104 GLuint getUniformIndex(std::string name);
shannonwoods@chromium.org42766252013-05-30 00:07:12 +0000105 GLuint getUniformBlockIndex(std::string name);
Jamie Madill36398922014-05-20 14:51:53 -0400106 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
107 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
108 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
109 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
110 void setUniform1iv(GLint location, GLsizei count, const GLint *v);
111 void setUniform2iv(GLint location, GLsizei count, const GLint *v);
112 void setUniform3iv(GLint location, GLsizei count, const GLint *v);
113 void setUniform4iv(GLint location, GLsizei count, const GLint *v);
114 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
115 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
116 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
117 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
118 void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
119 void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
120 void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
121 void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
122 void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
123 void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
124 void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
125 void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
126 void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000127
Jamie Madill99a1e982014-08-25 15:47:54 -0400128 void getUniformfv(GLint location, GLfloat *params);
129 void getUniformiv(GLint location, GLint *params);
130 void getUniformuiv(GLint location, GLuint *params);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000131
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000132 void dirtyAllUniforms();
133 void applyUniforms();
Jamie Madill834e8b72014-04-11 13:33:58 -0400134 bool applyUniformBuffers(const std::vector<Buffer*> boundBuffers);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000135
Geoff Lang900013c2014-07-07 11:32:19 -0400136 bool load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length);
137 bool save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000138 GLint getLength();
139
Geoff Lang48dcae72014-02-05 16:28:24 -0500140 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader,
141 const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000142 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
143
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000144 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
145 GLint getActiveAttributeCount() const;
146 GLint getActiveAttributeMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000147
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000148 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
149 GLint getActiveUniformCount() const;
150 GLint getActiveUniformMaxLength() const;
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +0000151 GLint getActiveUniformi(GLuint index, GLenum pname) const;
Jamie Madill36398922014-05-20 14:51:53 -0400152 bool isValidUniformLocation(GLint location) const;
153 LinkedUniform *getUniformByLocation(GLint location) const;
Jamie Madill66d43d22014-07-11 17:02:03 -0400154 LinkedUniform *getUniformByName(const std::string &name) const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000155
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +0000156 void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +0000157 void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000158 GLuint getActiveUniformBlockCount() const;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +0000159 GLuint getActiveUniformBlockMaxLength() const;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +0000160 UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000161
Jamie Madilld1e78c92013-06-20 11:55:50 -0400162 GLint getFragDataLocation(const char *name) const;
163
Geoff Lang48dcae72014-02-05 16:28:24 -0500164 size_t getTransformFeedbackVaryingCount() const;
165 const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
166 GLenum getTransformFeedbackBufferMode() const;
167
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000168 void validate(InfoLog &infoLog);
169 bool validateSamplers(InfoLog *infoLog);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000170 bool isValidated() const;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400171 void updateSamplerMapping();
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000172
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000173 unsigned int getSerial() const;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000174 int getShaderVersion() const;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000175
Al Patrick3f2daa82013-08-07 12:58:57 -0700176 void initAttributesByLayout();
Jamie Madill834e8b72014-04-11 13:33:58 -0400177 void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +0000178
Jamie Madill834e8b72014-04-11 13:33:58 -0400179 const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; }
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500180 const rx::UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
181 const rx::UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
182
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000183 private:
184 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
185
Jamie Madill66d43d22014-07-11 17:02:03 -0400186 struct Sampler
187 {
188 Sampler();
189
190 bool active;
191 GLint logicalTextureUnit;
192 TextureType textureType;
193 };
194
Geoff Lang04fb89a2014-06-09 15:05:36 -0400195 void reset();
196
Jamie Madill5f562732014-02-14 16:41:24 -0500197 bool linkVaryings(InfoLog &infoLog, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000198 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000199
Jamie Madill42bcf322014-08-25 16:20:46 -0400200 bool linkValidateVariablesBase(InfoLog &infoLog,
201 const std::string &variableName,
202 const sh::ShaderVariable &vertexVariable,
203 const sh::ShaderVariable &fragmentVariable,
204 bool validatePrecision);
Jamie Madill9d2ffb12013-08-30 13:21:04 -0400205
Jamie Madill42bcf322014-08-25 16:20:46 -0400206 bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform);
207 bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
208 bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform);
Jamie Madillbf9cce22014-07-18 10:33:09 -0400209 bool linkUniforms(InfoLog &infoLog, const VertexShader &vertexShader, const FragmentShader &fragmentShader);
210 void defineUniformBase(GLenum shader, const sh::Uniform &uniform, unsigned int uniformRegister);
Jamie Madill42bcf322014-08-25 16:20:46 -0400211 void defineUniform(GLenum shader, const sh::ShaderVariable &uniform, const std::string &fullName, sh::HLSLBlockEncoder *encoder);
Jamie Madill66d43d22014-07-11 17:02:03 -0400212 bool indexSamplerUniform(const LinkedUniform &uniform, InfoLog &infoLog);
213 bool indexUniforms(InfoLog &infoLog);
214 static bool assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount,
215 Sampler *outArray, GLuint *usedRange, unsigned int limit);
Jamie Madillf2575982014-06-25 16:04:54 -0400216 bool areMatchingInterfaceBlocks(InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock, const sh::InterfaceBlock &fragmentInterfaceBlock);
Jamie Madilld4116ff2014-07-11 17:02:01 -0400217 bool linkUniformBlocks(InfoLog &infoLog, const VertexShader &vertexShader, const FragmentShader &fragmentShader);
Geoff Lang48dcae72014-02-05 16:28:24 -0500218 bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
219 const std::vector<std::string> &transformFeedbackVaryingNames,
220 GLenum transformFeedbackBufferMode,
221 std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings) const;
Jamie Madill42bcf322014-08-25 16:20:46 -0400222 template <typename VarT>
223 void defineUniformBlockMembers(const std::vector<VarT> &fields, const std::string &prefix, int blockIndex,
Jamie Madille04a5b72014-07-18 10:33:12 -0400224 sh::BlockLayoutEncoder *encoder, std::vector<unsigned int> *blockUniformIndexes);
Jamie Madilld4116ff2014-07-11 17:02:01 -0400225 bool defineUniformBlock(InfoLog &infoLog, const Shader &shader, const sh::InterfaceBlock &interfaceBlock);
shannonwoods@chromium.org1500f092013-05-30 00:11:20 +0000226 bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex);
Jamie Madill46131a32013-06-20 11:55:50 -0400227 void defineOutputVariables(FragmentShader *fragmentShader);
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500228 void initializeUniformStorage();
Jamie Madill46131a32013-06-20 11:55:50 -0400229
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000230 template <typename T>
Jamie Madill36398922014-05-20 14:51:53 -0400231 void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000232
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000233 template <int cols, int rows>
Jamie Madill36398922014-05-20 14:51:53 -0400234 void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000235
shannon.woods%transgaming.com@gtempaccount.com4590d892013-04-13 03:41:01 +0000236 template <typename T>
Jamie Madill99a1e982014-08-25 15:47:54 -0400237 void getUniformv(GLint location, T *params, GLenum uniformType);
shannon.woods%transgaming.com@gtempaccount.com4590d892013-04-13 03:41:01 +0000238
Jamie Madillc5a83002014-02-14 16:41:25 -0500239 class VertexExecutable
240 {
241 public:
Geoff Lang04fb89a2014-06-09 15:05:36 -0400242 VertexExecutable(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS],
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400243 const GLenum signature[MAX_VERTEX_ATTRIBS],
Jamie Madillc5a83002014-02-14 16:41:25 -0500244 rx::ShaderExecutable *shaderExecutable);
Jamie Madill8b4f8f82014-03-26 14:01:58 -0400245 ~VertexExecutable();
246
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400247 bool matchesSignature(const GLenum convertedLayout[MAX_VERTEX_ATTRIBS]) const;
Jamie Madillc5a83002014-02-14 16:41:25 -0500248
249 const VertexFormat *inputs() const { return mInputs; }
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400250 const GLenum *signature() const { return mSignature; }
Jamie Madillc5a83002014-02-14 16:41:25 -0500251 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
252
253 private:
Jamie Madill834e8b72014-04-11 13:33:58 -0400254 VertexFormat mInputs[MAX_VERTEX_ATTRIBS];
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400255 GLenum mSignature[MAX_VERTEX_ATTRIBS];
Jamie Madillc5a83002014-02-14 16:41:25 -0500256 rx::ShaderExecutable *mShaderExecutable;
257 };
258
Geoff Lang04fb89a2014-06-09 15:05:36 -0400259 class PixelExecutable
260 {
261 public:
262 PixelExecutable(const std::vector<GLenum> &outputSignature, rx::ShaderExecutable *shaderExecutable);
263 ~PixelExecutable();
264
Geoff Lang4ace4232014-06-18 19:12:48 -0400265 // FIXME(geofflang): Work around NVIDIA driver bug by repacking buffers
266 bool matchesSignature(const std::vector<GLenum> &signature) const { return true; /* mOutputSignature == signature; */ }
267
Geoff Lang04fb89a2014-06-09 15:05:36 -0400268 const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
269 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
270
271 private:
272 std::vector<GLenum> mOutputSignature;
273 rx::ShaderExecutable *mShaderExecutable;
274 };
275
daniel@transgaming.com77fbf972012-11-28 21:02:55 +0000276 rx::Renderer *const mRenderer;
Jamie Madill5f562732014-02-14 16:41:24 -0500277 DynamicHLSL *mDynamicHLSL;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000278
Jamie Madillc5a83002014-02-14 16:41:25 -0500279 std::string mVertexHLSL;
280 rx::D3DWorkaroundType mVertexWorkarounds;
281 std::vector<VertexExecutable *> mVertexExecutables;
Geoff Lang04fb89a2014-06-09 15:05:36 -0400282
283 std::string mPixelHLSL;
284 rx::D3DWorkaroundType mPixelWorkarounds;
285 bool mUsesFragDepth;
286 std::vector<PixelShaderOuputVariable> mPixelShaderKey;
287 std::vector<PixelExecutable *> mPixelExecutables;
288
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000289 rx::ShaderExecutable *mGeometryExecutable;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000290
Jamie Madillf2575982014-06-25 16:04:54 -0400291 sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
292 sh::Attribute mShaderAttributes[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000293 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
Al Patrick3f2daa82013-08-07 12:58:57 -0700294 int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000295
Geoff Lang48dcae72014-02-05 16:28:24 -0500296 GLenum mTransformFeedbackBufferMode;
297 std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings;
298
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000299 Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000300 Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000301 GLuint mUsedVertexSamplerRange;
302 GLuint mUsedPixelSamplerRange;
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000303 bool mUsesPointSize;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000304 int mShaderVersion;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400305 bool mDirtySamplerMapping;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000306
Jamie Madill834e8b72014-04-11 13:33:58 -0400307 std::vector<LinkedUniform*> mUniforms;
308 std::vector<UniformBlock*> mUniformBlocks;
Jamie Madill5f562732014-02-14 16:41:24 -0500309 std::vector<VariableLocation> mUniformIndex;
310 std::map<int, VariableLocation> mOutputVariables;
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500311 rx::UniformStorage *mVertexUniformStorage;
312 rx::UniformStorage *mFragmentUniformStorage;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000313
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000314 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000315
316 const unsigned int mSerial;
317
318 static unsigned int issueSerial();
319 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000320};
Jamie Madill5f562732014-02-14 16:41:24 -0500321
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000322}
323
324#endif // LIBGLESV2_PROGRAM_BINARY_H_