blob: 5209f2579dc80a6b7c6b2bbcef6bb2d64ca1a57a [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 <string>
18#include <vector>
19
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000020#include "common/RefCountObject.h"
21#include "angletypes.h"
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000022#include "libGLESv2/mathutil.h"
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000023#include "libGLESv2/Uniform.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000024#include "libGLESv2/Shader.h"
25#include "Context.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000026
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000027namespace rx
28{
29class ShaderExecutable;
30class Renderer;
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +000031struct TranslatedAttribute;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000032}
daniel@transgaming.coma9c71422012-11-28 20:58:45 +000033
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000034namespace gl
35{
36class FragmentShader;
37class VertexShader;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000038class InfoLog;
39class AttributeBindings;
40struct Varying;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000041
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000042// Struct used for correlating uniforms/elements of uniform arrays to handles
43struct UniformLocation
44{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000045 UniformLocation()
46 {
47 }
48
daniel@transgaming.comdb019952012-12-20 21:13:32 +000049 UniformLocation(const std::string &name, unsigned int element, unsigned int index);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000050
51 std::string name;
52 unsigned int element;
53 unsigned int index;
54};
55
56// 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 +000057class ProgramBinary : public RefCountObject
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000058{
59 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +000060 explicit ProgramBinary(rx::Renderer *renderer);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000061 ~ProgramBinary();
62
daniel@transgaming.com95892412012-11-28 20:59:09 +000063 rx::ShaderExecutable *getPixelExecutable();
64 rx::ShaderExecutable *getVertexExecutable();
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000065 rx::ShaderExecutable *getGeometryExecutable();
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000066
67 GLuint getAttributeLocation(const char *name);
68 int getSemanticIndex(int attributeIndex);
69
70 GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
71 TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
72 GLint getUsedSamplerRange(SamplerType type);
daniel@transgaming.com087e5782012-09-17 21:28:47 +000073 bool usesPointSize() const;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000074 bool usesPointSpriteEmulation() const;
75 bool usesGeometryShader() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000076
77 GLint getUniformLocation(std::string name);
78 bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
79 bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
80 bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
81 bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
82 bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
83 bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
84 bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
85 bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
86 bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
87 bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
88 bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
89
90 bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
91 bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
92
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000093 void dirtyAllUniforms();
94 void applyUniforms();
95
apatrick@chromium.org90080e32012-07-09 22:15:33 +000096 bool load(InfoLog &infoLog, const void *binary, GLsizei length);
97 bool save(void* binary, GLsizei bufSize, GLsizei *length);
98 GLint getLength();
99
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000100 bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000101 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
102
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000103 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
104 GLint getActiveAttributeCount() const;
105 GLint getActiveAttributeMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000106
shannon.woods@transgaming.com4f4215f2013-02-28 23:14:58 +0000107 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
108 GLint getActiveUniformCount() const;
109 GLint getActiveUniformMaxLength() const;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000110
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000111 void validate(InfoLog &infoLog);
112 bool validateSamplers(InfoLog *infoLog);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000113 bool isValidated() const;
114
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000115 unsigned int getSerial() const;
116
shannon.woods@transgaming.com0b600142013-02-28 23:15:04 +0000117 void sortAttributesByLayout(rx::TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
118
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000119 static std::string decorateAttribute(const std::string &name); // Prepend an underscore
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000120
121 private:
122 DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
123
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000124 int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader);
shannon.woods@transgaming.com5bcf7df2013-01-25 21:55:33 +0000125 bool linkVaryings(InfoLog &infoLog, int registers, const Varying *packing[][4],
126 std::string& pixelHLSL, std::string& vertexHLSL,
127 FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000128
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000129 bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000130
daniel@transgaming.com68aaf932012-12-20 21:13:16 +0000131 bool linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms);
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000132 bool defineUniform(GLenum shader, const sh::Uniform &constant, InfoLog &infoLog);
daniel@transgaming.comb6e55102012-12-20 21:08:14 +0000133
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000134 std::string generateGeometryShaderHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
135 std::string generatePointSpriteHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
136
daniel@transgaming.com77fbf972012-11-28 21:02:55 +0000137 rx::Renderer *const mRenderer;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000138
daniel@transgaming.com4f0f65e2012-11-28 21:00:00 +0000139 rx::ShaderExecutable *mPixelExecutable;
140 rx::ShaderExecutable *mVertexExecutable;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +0000141 rx::ShaderExecutable *mGeometryExecutable;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000142
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000143 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
144 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
145
146 struct Sampler
147 {
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000148 Sampler();
149
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000150 bool active;
151 GLint logicalTextureUnit;
152 TextureType textureType;
153 };
154
155 Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
shannon.woods@transgaming.com233fe952013-01-25 21:51:57 +0000156 Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000157 GLuint mUsedVertexSamplerRange;
158 GLuint mUsedPixelSamplerRange;
daniel@transgaming.com087e5782012-09-17 21:28:47 +0000159 bool mUsesPointSize;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000160
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000161 UniformArray mUniforms;
162 typedef std::vector<UniformLocation> UniformIndex;
163 UniformIndex mUniformIndex;
164
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000165 bool mValidated;
daniel@transgaming.come87ca002012-07-24 18:30:43 +0000166
167 const unsigned int mSerial;
168
169 static unsigned int issueSerial();
170 static unsigned int mCurrentSerial;
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +0000171};
172}
173
174#endif // LIBGLESV2_PROGRAM_BINARY_H_