blob: 0253c2d21a0ab0f227ab7834c57f767053840fa9 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +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
Geoff Lang0a73dd82014-11-19 16:18:08 -050010#ifndef LIBANGLE_PROGRAM_H_
11#define LIBANGLE_PROGRAM_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
Geoff Lang2195a6d2014-11-10 15:19:26 -050013#include "common/angleutils.h"
Geoff Lang21329412014-12-02 20:50:30 +000014#include "libANGLE/RefCountObject.h"
15#include "libANGLE/Constants.h"
16#include "libANGLE/ProgramBinary.h"
17#include "libANGLE/export.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include <GLES2/gl2.h>
20
21#include <vector>
22#include <string>
23#include <set>
24
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000025namespace rx
26{
27class Renderer;
28}
daniel@transgaming.come6842292010-04-20 18:52:50 +000029
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030namespace gl
31{
Brandon Jones43a53e22014-08-28 16:23:22 -070032struct Caps;
Jamie Madillde8892b2014-11-11 13:00:22 -050033struct Data;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000034class ResourceManager;
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000035class Shader;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000037extern const char * const g_fakepath;
38
apatrick@chromium.org9a30b092012-06-06 20:21:55 +000039class AttributeBindings
40{
41 public:
42 AttributeBindings();
43 ~AttributeBindings();
44
45 void bindAttributeLocation(GLuint index, const char *name);
46 int getAttributeBinding(const std::string &name) const;
47
48 private:
49 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
50};
51
Geoff Lang8bc361e2014-11-20 16:23:31 -050052class ANGLE_EXPORT InfoLog
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000053{
54 public:
55 InfoLog();
56 ~InfoLog();
57
58 int getLength() const;
59 void getLog(GLsizei bufSize, GLsizei *length, char *infoLog);
60
61 void appendSanitized(const char *message);
62 void append(const char *info, ...);
63 void reset();
64 private:
65 DISALLOW_COPY_AND_ASSIGN(InfoLog);
66 char *mInfoLog;
67};
68
Geoff Lang8bc361e2014-11-20 16:23:31 -050069class ANGLE_EXPORT Program
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000070{
71 public:
Geoff Lang21329412014-12-02 20:50:30 +000072 Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle);
73
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000074 ~Program();
75
76 bool attachShader(Shader *shader);
77 bool detachShader(Shader *shader);
78 int getAttachedShadersCount() const;
79
80 void bindAttributeLocation(GLuint index, const char *name);
81
Jamie Madillde8892b2014-11-11 13:00:22 -050082 Error link(const Data &data);
daniel@transgaming.com716056c2012-07-24 18:38:59 +000083 bool isLinked();
Geoff Lang21329412014-12-02 20:50:30 +000084 Error setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length);
85 ProgramBinary *getProgramBinary() const;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000086
87 int getInfoLogLength() const;
88 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
89 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
90
91 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
92 GLint getActiveAttributeCount();
93 GLint getActiveAttributeMaxLength();
94
95 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
96 GLint getActiveUniformCount();
97 GLint getActiveUniformMaxLength();
98
Geoff Lang21329412014-12-02 20:50:30 +000099 GLint getActiveUniformBlockCount();
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +0000100 GLint getActiveUniformBlockMaxLength();
101
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000102 void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding);
103 GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const;
104
Geoff Lang48dcae72014-02-05 16:28:24 -0500105 void setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode);
106 void getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const;
Geoff Lang1b6edcb2014-02-03 14:27:56 -0500107 GLsizei getTransformFeedbackVaryingCount() const;
108 GLsizei getTransformFeedbackVaryingMaxLength() const;
109 GLenum getTransformFeedbackBufferMode() const;
110
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000111 void addRef();
112 void release();
113 unsigned int getRefCount() const;
114 void flagForDeletion();
115 bool isFlaggedForDeletion() const;
116
Brandon Jones43a53e22014-08-28 16:23:22 -0700117 void validate(const Caps &caps);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000118 bool isValidated() const;
Geoff Lang21329412014-12-02 20:50:30 +0000119
120 GLint getProgramBinaryLength() const;
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000121
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000122 private:
123 DISALLOW_COPY_AND_ASSIGN(Program);
124
125 void unlink(bool destroy = false);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000126 void resetUniformBlockBindings();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000127
Brandon Jones71620962014-08-20 14:04:59 -0700128 Shader *mFragmentShader;
129 Shader *mVertexShader;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000130
131 AttributeBindings mAttributeBindings;
132
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000133 GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
134
Geoff Lang48dcae72014-02-05 16:28:24 -0500135 std::vector<std::string> mTransformFeedbackVaryings;
Geoff Lang21329412014-12-02 20:50:30 +0000136 GLuint mTransformFeedbackBufferMode;
Geoff Lang48dcae72014-02-05 16:28:24 -0500137
Geoff Lang21329412014-12-02 20:50:30 +0000138 BindingPointer<ProgramBinary> mProgramBinary;
daniel@transgaming.com716056c2012-07-24 18:38:59 +0000139 bool mLinked;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000140 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000141
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000142 unsigned int mRefCount;
143
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000144 ResourceManager *mResourceManager;
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000145 rx::Renderer *mRenderer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000146 const GLuint mHandle;
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000147
148 InfoLog mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149};
150}
151
Geoff Lang0a73dd82014-11-19 16:18:08 -0500152#endif // LIBANGLE_PROGRAM_H_