blob: 3142d66c6df56867f775fe87e73c19a7a1a543b2 [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 Madillbf9cce22014-07-18 10:33:09 -040027namespace sh
28{
29class HLSLBlockEncoder;
30}
31
Geoff Lang0b7eef72014-06-12 14:10:47 -040032#include <GLES3/gl3.h>
33#include <GLES2/gl2.h>
34#include <GLES2/gl2ext.h>
35
36#include <string>
37#include <vector>
38
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000039namespace rx
40{
41class ShaderExecutable;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +000042struct TranslatedAttribute;
Jamie Madill8ff21ae2014-02-04 16:04:05 -050043class UniformStorage;
Brandon Jonesc9610c52014-08-25 17:02:59 -070044class ProgramImpl;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000045}
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000046
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000047namespace gl
48{
Brandon Jones43a53e22014-08-28 16:23:22 -070049struct Caps;
Brandon Jones71620962014-08-20 14:04:59 -070050class Shader;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000051class InfoLog;
52class AttributeBindings;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +000053class Buffer;
Geoff Lang04fb89a2014-06-09 15:05:36 -040054class Framebuffer;
Jamie Madillde8892b2014-11-11 13:00:22 -050055struct Data;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000056
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000057// Struct used for correlating uniforms/elements of uniform arrays to handles
Jamie Madill63491ea2013-06-06 11:56:45 -040058struct VariableLocation
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000059{
Jamie Madill63491ea2013-06-06 11:56:45 -040060 VariableLocation()
apatrick@chromium.org90080e32012-07-09 22:15:33 +000061 {
62 }
63
Jamie Madill63491ea2013-06-06 11:56:45 -040064 VariableLocation(const std::string &name, unsigned int element, unsigned int index);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000065
66 std::string name;
67 unsigned int element;
68 unsigned int index;
69};
70
Geoff Lang48dcae72014-02-05 16:28:24 -050071struct LinkedVarying
72{
73 LinkedVarying();
74 LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
75 unsigned int semanticIndex, unsigned int semanticIndexCount);
76
77 // Original GL name
78 std::string name;
79
80 GLenum type;
81 GLsizei size;
82
83 // DirectX semantic information
84 std::string semanticName;
85 unsigned int semanticIndex;
86 unsigned int semanticIndexCount;
87};
88
Geoff Langb543aff2014-09-30 14:52:54 -040089struct LinkResult
90{
91 bool linkSuccess;
92 Error error;
93
94 LinkResult(bool linkSuccess, const Error &error);
95};
96
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000097// 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 +000098class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000099{
100 public:
Brandon Jonesc9610c52014-08-25 17:02:59 -0700101 explicit ProgramBinary(rx::ProgramImpl *impl);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000102 ~ProgramBinary();
103
Brandon Jonesc9610c52014-08-25 17:02:59 -0700104 rx::ProgramImpl *getImplementation() { return mProgram; }
105 const rx::ProgramImpl *getImplementation() const { return mProgram; }
106
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000107 GLuint getAttributeLocation(const char *name);
108 int getSemanticIndex(int attributeIndex);
109
Brandon Jones43a53e22014-08-28 16:23:22 -0700110 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps);
Geoff Lang76b10c92014-09-05 16:28:14 -0400111 GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000112 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000113 bool usesPointSize() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000114
115 GLint getUniformLocation(std::string name);
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +0000116 GLuint getUniformIndex(std::string name);
shannonwoods@chromium.org42766252013-05-30 00:07:12 +0000117 GLuint getUniformBlockIndex(std::string name);
Jamie Madill36398922014-05-20 14:51:53 -0400118 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
119 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
120 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
121 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
122 void setUniform1iv(GLint location, GLsizei count, const GLint *v);
123 void setUniform2iv(GLint location, GLsizei count, const GLint *v);
124 void setUniform3iv(GLint location, GLsizei count, const GLint *v);
125 void setUniform4iv(GLint location, GLsizei count, const GLint *v);
126 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
127 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
128 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
129 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
130 void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
131 void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
132 void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
133 void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
134 void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
135 void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
136 void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
137 void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
138 void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000139
Jamie Madill99a1e982014-08-25 15:47:54 -0400140 void getUniformfv(GLint location, GLfloat *params);
141 void getUniformiv(GLint location, GLint *params);
142 void getUniformuiv(GLint location, GLuint *params);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000143
Geoff Langc77e8c32014-09-08 16:28:24 -0400144 Error applyUniforms();
145 Error applyUniformBuffers(const std::vector<Buffer*> boundBuffers, const Caps &caps);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000146
Geoff Langb543aff2014-09-30 14:52:54 -0400147 LinkResult load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length);
148 Error save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000149 GLint getLength();
150
Jamie Madillde8892b2014-11-11 13:00:22 -0500151 LinkResult link(const Data &data, InfoLog &infoLog, const AttributeBindings &attributeBindings,
152 Shader *fragmentShader, Shader *vertexShader,
153 const std::vector<std::string> &transformFeedbackVaryings,
154 GLenum transformFeedbackBufferMode);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000155
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000156 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
157 GLint getActiveAttributeCount() const;
158 GLint getActiveAttributeMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000159
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000160 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
161 GLint getActiveUniformCount() const;
162 GLint getActiveUniformMaxLength() const;
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +0000163 GLint getActiveUniformi(GLuint index, GLenum pname) const;
Jamie Madill36398922014-05-20 14:51:53 -0400164 bool isValidUniformLocation(GLint location) const;
165 LinkedUniform *getUniformByLocation(GLint location) const;
Jamie Madill66d43d22014-07-11 17:02:03 -0400166 LinkedUniform *getUniformByName(const std::string &name) const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000167
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +0000168 void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +0000169 void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000170 GLuint getActiveUniformBlockCount() const;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +0000171 GLuint getActiveUniformBlockMaxLength() const;
shannonwoods@chromium.org1bddfb92013-05-30 00:11:29 +0000172 UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000173
Jamie Madilld1e78c92013-06-20 11:55:50 -0400174 GLint getFragDataLocation(const char *name) const;
175
Geoff Lang48dcae72014-02-05 16:28:24 -0500176 size_t getTransformFeedbackVaryingCount() const;
177 const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
178 GLenum getTransformFeedbackBufferMode() const;
179
Brandon Jones43a53e22014-08-28 16:23:22 -0700180 void validate(InfoLog &infoLog, const Caps &caps);
181 bool validateSamplers(InfoLog *infoLog, const Caps &caps);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000182 bool isValidated() const;
Jamie Madilld4cfa572014-07-08 10:00:32 -0400183 void updateSamplerMapping();
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000184
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000185 unsigned int getSerial() const;
186
Al Patrick3f2daa82013-08-07 12:58:57 -0700187 void initAttributesByLayout();
Jamie Madill834e8b72014-04-11 13:33:58 -0400188 void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +0000189
Brandon Jones22502d52014-08-29 16:58:36 -0700190 static bool linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader);
Brandon Jones1a8a7e32014-10-01 12:49:30 -0700191 static bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform);
192 static bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform);
Brandon Jones22502d52014-08-29 16:58:36 -0700193
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000194 private:
195 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
196
Geoff Lang04fb89a2014-06-09 15:05:36 -0400197 void reset();
198
Jamie Madilld15250e2014-09-03 09:40:44 -0400199 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, const Shader *vertexShader);
Brandon Jones1a8a7e32014-10-01 12:49:30 -0700200 bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
201 bool areMatchingInterfaceBlocks(gl::InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock,
202 const sh::InterfaceBlock &fragmentInterfaceBlock);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000203
Brandon Jones22502d52014-08-29 16:58:36 -0700204 static bool linkValidateVariablesBase(InfoLog &infoLog,
205 const std::string &variableName,
206 const sh::ShaderVariable &vertexVariable,
207 const sh::ShaderVariable &fragmentVariable,
208 bool validatePrecision);
Jamie Madill9d2ffb12013-08-30 13:21:04 -0400209
Brandon Jones22502d52014-08-29 16:58:36 -0700210 static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
Geoff Lang48dcae72014-02-05 16:28:24 -0500211 bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
212 const std::vector<std::string> &transformFeedbackVaryingNames,
213 GLenum transformFeedbackBufferMode,
Brandon Jones43a53e22014-08-28 16:23:22 -0700214 std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
215 const Caps &caps) const;
Brandon Jones43a53e22014-08-28 16:23:22 -0700216 bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
Brandon Jones71620962014-08-20 14:04:59 -0700217 void defineOutputVariables(Shader *fragmentShader);
Jamie Madill46131a32013-06-20 11:55:50 -0400218
Brandon Jonesc9610c52014-08-25 17:02:59 -0700219 rx::ProgramImpl *mProgram;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000220
Jamie Madillf2575982014-06-25 16:04:54 -0400221 sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000222 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
Al Patrick3f2daa82013-08-07 12:58:57 -0700223 int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000224
Jamie Madill5f562732014-02-14 16:41:24 -0500225 std::map<int, VariableLocation> mOutputVariables;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000226
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000227 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000228
229 const unsigned int mSerial;
230
231 static unsigned int issueSerial();
232 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000233};
Jamie Madill5f562732014-02-14 16:41:24 -0500234
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000235}
236
237#endif // LIBGLESV2_PROGRAM_BINARY_H_