blob: 0d36e97f694f77b3807d41477ff6ea20685c7ce3 [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
apatrick@chromium.org90080e32012-07-09 22:15:33 +000013#define GL_APICALL
shannon.woods%transgaming.com@gtempaccount.comf26ddae2013-04-13 03:29:13 +000014#include <GLES3/gl3.h>
15#include <GLES3/gl3ext.h>
daniel@transgaming.com29ab9522012-08-27 16:25:37 +000016#include <GLES2/gl2.h>
17#include <GLES2/gl2ext.h>
apatrick@chromium.org90080e32012-07-09 22:15:33 +000018
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include <string>
20#include <vector>
21
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000022#include "common/RefCountObject.h"
23#include "angletypes.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000024#include "common/mathutil.h"
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000025#include "libGLESv2/Uniform.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000026#include "libGLESv2/Shader.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000027#include "libGLESv2/Constants.h"
Jamie Madillc5a83002014-02-14 16:41:25 -050028#include "libGLESv2/renderer/VertexDataManager.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000029
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000030namespace rx
31{
32class ShaderExecutable;
33class Renderer;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +000034struct TranslatedAttribute;
Jamie Madill8ff21ae2014-02-04 16:04:05 -050035class UniformStorage;
Jamie Madill5f562732014-02-14 16:41:24 -050036class DynamicHLSL;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000037}
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000038
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000039namespace gl
40{
41class FragmentShader;
42class VertexShader;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000043class InfoLog;
44class AttributeBindings;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +000045class Buffer;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000046
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000047// Struct used for correlating uniforms/elements of uniform arrays to handles
Jamie Madill63491ea2013-06-06 11:56:45 -040048struct VariableLocation
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000049{
Jamie Madill63491ea2013-06-06 11:56:45 -040050 VariableLocation()
apatrick@chromium.org90080e32012-07-09 22:15:33 +000051 {
52 }
53
Jamie Madill63491ea2013-06-06 11:56:45 -040054 VariableLocation(const std::string &name, unsigned int element, unsigned int index);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000055
56 std::string name;
57 unsigned int element;
58 unsigned int index;
59};
60
Geoff Lang48dcae72014-02-05 16:28:24 -050061struct LinkedVarying
62{
63 LinkedVarying();
64 LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
65 unsigned int semanticIndex, unsigned int semanticIndexCount);
66
67 // Original GL name
68 std::string name;
69
70 GLenum type;
71 GLsizei size;
72
73 // DirectX semantic information
74 std::string semanticName;
75 unsigned int semanticIndex;
76 unsigned int semanticIndexCount;
77};
78
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000079// 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 +000080class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000081{
82 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +000083 explicit ProgramBinary(rx::Renderer *renderer);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000084 ~ProgramBinary();
85
Jamie Madill8ff21ae2014-02-04 16:04:05 -050086 rx::ShaderExecutable *getPixelExecutable() const;
Jamie Madill834e8b72014-04-11 13:33:58 -040087 rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]);
Jamie Madill8ff21ae2014-02-04 16:04:05 -050088 rx::ShaderExecutable *getGeometryExecutable() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000089
90 GLuint getAttributeLocation(const char *name);
91 int getSemanticIndex(int attributeIndex);
92
93 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
94 TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
95 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +000096 bool usesPointSize() const;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000097 bool usesPointSpriteEmulation() const;
98 bool usesGeometryShader() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000099
100 GLint getUniformLocation(std::string name);
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +0000101 GLuint getUniformIndex(std::string name);
shannonwoods@chromium.org42766252013-05-30 00:07:12 +0000102 GLuint getUniformBlockIndex(std::string name);
Jamie Madill36398922014-05-20 14:51:53 -0400103 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
104 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
105 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
106 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
107 void setUniform1iv(GLint location, GLsizei count, const GLint *v);
108 void setUniform2iv(GLint location, GLsizei count, const GLint *v);
109 void setUniform3iv(GLint location, GLsizei count, const GLint *v);
110 void setUniform4iv(GLint location, GLsizei count, const GLint *v);
111 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
112 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
113 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
114 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
115 void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
116 void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
117 void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
118 void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
119 void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
120 void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
121 void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
122 void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
123 void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000124
125 bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
126 bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +0000127 bool getUniformuiv(GLint location, GLsizei *bufSize, GLuint *params);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000128
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000129 void dirtyAllUniforms();
130 void applyUniforms();
Jamie Madill834e8b72014-04-11 13:33:58 -0400131 bool applyUniformBuffers(const std::vector<Buffer*> boundBuffers);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000132
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000133 bool load(InfoLog &infoLog, const void *binary, GLsizei length);
134 bool save(void* binary, GLsizei bufSize, GLsizei *length);
135 GLint getLength();
136
Geoff Lang48dcae72014-02-05 16:28:24 -0500137 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader,
138 const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000139 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
140
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000141 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
142 GLint getActiveAttributeCount() const;
143 GLint getActiveAttributeMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000144
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000145 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
146 GLint getActiveUniformCount() const;
147 GLint getActiveUniformMaxLength() const;
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +0000148 GLint getActiveUniformi(GLuint index, GLenum pname) const;
Jamie Madill36398922014-05-20 14:51:53 -0400149 bool isValidUniformLocation(GLint location) const;
150 LinkedUniform *getUniformByLocation(GLint location) const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000151
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +0000152 void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +0000153 void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000154 GLuint getActiveUniformBlockCount() const;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +0000155 GLuint getActiveUniformBlockMaxLength() const;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +0000156 UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000157
Jamie Madilld1e78c92013-06-20 11:55:50 -0400158 GLint getFragDataLocation(const char *name) const;
159
Geoff Lang48dcae72014-02-05 16:28:24 -0500160 size_t getTransformFeedbackVaryingCount() const;
161 const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
162 GLenum getTransformFeedbackBufferMode() const;
163
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000164 void validate(InfoLog &infoLog);
165 bool validateSamplers(InfoLog *infoLog);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000166 bool isValidated() const;
167
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000168 unsigned int getSerial() const;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000169 int getShaderVersion() const;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000170
Al Patrick3f2daa82013-08-07 12:58:57 -0700171 void initAttributesByLayout();
Jamie Madill834e8b72014-04-11 13:33:58 -0400172 void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +0000173
Jamie Madill834e8b72014-04-11 13:33:58 -0400174 const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; }
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500175 const rx::UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
176 const rx::UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
177
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000178 private:
179 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
180
Jamie Madill5f562732014-02-14 16:41:24 -0500181 bool linkVaryings(InfoLog &infoLog, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000182 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000183
Jamie Madill07d68852014-05-06 16:31:14 -0400184 typedef std::vector<BlockMemberInfo>::const_iterator BlockInfoItr;
shannonwoods@chromium.org70961b32013-05-30 00:17:48 +0000185
Jamie Madill9d2ffb12013-08-30 13:21:04 -0400186 template <class ShaderVarType>
187 bool linkValidateFields(InfoLog &infoLog, const std::string &varName, const ShaderVarType &vertexVar, const ShaderVarType &fragmentVar);
Jamie Madill834e8b72014-04-11 13:33:58 -0400188 bool linkValidateVariablesBase(InfoLog &infoLog, const std::string &variableName, const ShaderVariable &vertexVariable, const ShaderVariable &fragmentVariable, bool validatePrecision);
Jamie Madill9d2ffb12013-08-30 13:21:04 -0400189
Jamie Madill834e8b72014-04-11 13:33:58 -0400190 bool linkValidateVariables(InfoLog &infoLog, const std::string &uniformName, const Uniform &vertexUniform, const Uniform &fragmentUniform);
191 bool linkValidateVariables(InfoLog &infoLog, const std::string &varyingName, const Varying &vertexVarying, const Varying &fragmentVarying);
192 bool linkValidateVariables(InfoLog &infoLog, const std::string &uniformName, const InterfaceBlockField &vertexUniform, const InterfaceBlockField &fragmentUniform);
193 bool linkUniforms(InfoLog &infoLog, const std::vector<Uniform> &vertexUniforms, const std::vector<Uniform> &fragmentUniforms);
194 bool defineUniform(GLenum shader, const Uniform &constant, InfoLog &infoLog);
195 bool areMatchingInterfaceBlocks(InfoLog &infoLog, const InterfaceBlock &vertexInterfaceBlock, const InterfaceBlock &fragmentInterfaceBlock);
196 bool linkUniformBlocks(InfoLog &infoLog, const std::vector<InterfaceBlock> &vertexUniformBlocks, const std::vector<InterfaceBlock> &fragmentUniformBlocks);
Geoff Lang48dcae72014-02-05 16:28:24 -0500197 bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
198 const std::vector<std::string> &transformFeedbackVaryingNames,
199 GLenum transformFeedbackBufferMode,
200 std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings) const;
Jamie Madill834e8b72014-04-11 13:33:58 -0400201 void defineUniformBlockMembers(const std::vector<InterfaceBlockField> &fields, const std::string &prefix, int blockIndex, BlockInfoItr *blockInfoItr, std::vector<unsigned int> *blockUniformIndexes);
202 bool defineUniformBlock(InfoLog &infoLog, GLenum shader, const InterfaceBlock &interfaceBlock);
shannonwoods@chromium.org1500f092013-05-30 00:11:20 +0000203 bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex);
Jamie Madill46131a32013-06-20 11:55:50 -0400204 void defineOutputVariables(FragmentShader *fragmentShader);
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500205 void initializeUniformStorage();
Jamie Madill46131a32013-06-20 11:55:50 -0400206
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000207 template <typename T>
Jamie Madill36398922014-05-20 14:51:53 -0400208 void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000209
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000210 template <int cols, int rows>
Jamie Madill36398922014-05-20 14:51:53 -0400211 void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
shannon.woods%transgaming.com@gtempaccount.com36c76a92013-04-13 03:39:58 +0000212
shannon.woods%transgaming.com@gtempaccount.com4590d892013-04-13 03:41:01 +0000213 template <typename T>
214 bool getUniformv(GLint location, GLsizei *bufSize, T *params, GLenum uniformType);
215
Nicolas Capens43e8ba82013-07-09 10:35:15 -0400216 static TextureType getTextureType(GLenum samplerType, InfoLog &infoLog);
217
Jamie Madillc5a83002014-02-14 16:41:25 -0500218 class VertexExecutable
219 {
220 public:
221 VertexExecutable(rx::Renderer *const renderer,
Jamie Madill834e8b72014-04-11 13:33:58 -0400222 const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS],
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400223 const GLenum signature[MAX_VERTEX_ATTRIBS],
Jamie Madillc5a83002014-02-14 16:41:25 -0500224 rx::ShaderExecutable *shaderExecutable);
Jamie Madill8b4f8f82014-03-26 14:01:58 -0400225 ~VertexExecutable();
226
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400227 bool matchesSignature(const GLenum convertedLayout[MAX_VERTEX_ATTRIBS]) const;
Jamie Madillc5a83002014-02-14 16:41:25 -0500228
229 const VertexFormat *inputs() const { return mInputs; }
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400230 const GLenum *signature() const { return mSignature; }
Jamie Madillc5a83002014-02-14 16:41:25 -0500231 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
232
233 private:
Jamie Madill834e8b72014-04-11 13:33:58 -0400234 VertexFormat mInputs[MAX_VERTEX_ATTRIBS];
Jamie Madill7a29e4a2014-05-02 10:41:48 -0400235 GLenum mSignature[MAX_VERTEX_ATTRIBS];
Jamie Madillc5a83002014-02-14 16:41:25 -0500236 rx::ShaderExecutable *mShaderExecutable;
237 };
238
daniel@transgaming.com77fbf972012-11-28 21:02:55 +0000239 rx::Renderer *const mRenderer;
Jamie Madill5f562732014-02-14 16:41:24 -0500240 DynamicHLSL *mDynamicHLSL;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000241
Jamie Madillc5a83002014-02-14 16:41:25 -0500242 std::string mVertexHLSL;
243 rx::D3DWorkaroundType mVertexWorkarounds;
244 std::vector<VertexExecutable *> mVertexExecutables;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000245 rx::ShaderExecutable *mGeometryExecutable;
Jamie Madillc5a83002014-02-14 16:41:25 -0500246 rx::ShaderExecutable *mPixelExecutable;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000247
Jamie Madill834e8b72014-04-11 13:33:58 -0400248 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
249 Attribute mShaderAttributes[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000250 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
Al Patrick3f2daa82013-08-07 12:58:57 -0700251 int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000252
Geoff Lang48dcae72014-02-05 16:28:24 -0500253 GLenum mTransformFeedbackBufferMode;
254 std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings;
255
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000256 struct Sampler
257 {
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000258 Sampler();
259
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000260 bool active;
261 GLint logicalTextureUnit;
262 TextureType textureType;
263 };
264
265 Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000266 Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000267 GLuint mUsedVertexSamplerRange;
268 GLuint mUsedPixelSamplerRange;
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000269 bool mUsesPointSize;
shannonwoods@chromium.org83ac5e82013-05-30 00:15:29 +0000270 int mShaderVersion;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000271
Jamie Madill834e8b72014-04-11 13:33:58 -0400272 std::vector<LinkedUniform*> mUniforms;
273 std::vector<UniformBlock*> mUniformBlocks;
Jamie Madill5f562732014-02-14 16:41:24 -0500274 std::vector<VariableLocation> mUniformIndex;
275 std::map<int, VariableLocation> mOutputVariables;
Jamie Madill8ff21ae2014-02-04 16:04:05 -0500276 rx::UniformStorage *mVertexUniformStorage;
277 rx::UniformStorage *mFragmentUniformStorage;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000278
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000279 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000280
281 const unsigned int mSerial;
282
283 static unsigned int issueSerial();
284 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000285};
Jamie Madill5f562732014-02-14 16:41:24 -0500286
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000287}
288
289#endif // LIBGLESV2_PROGRAM_BINARY_H_