blob: 6ca5bd2f8866eb5a8cd07505eeb0416b8f7e94fa [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.comea7c3452012-06-05 19:51:40 +00002// Copyright (c) 2002-2012 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
10#ifndef LIBGLESV2_PROGRAM_H_
11#define LIBGLESV2_PROGRAM_H_
12
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013#include <string>
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +000014#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000015
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000016#include "common/angleutils.h"
17#include "common/RefCountObject.h"
18#include "libGLESv2/Constants.h"
19
20namespace rx
21{
22class Renderer;
23}
daniel@transgaming.come6842292010-04-20 18:52:50 +000024
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025namespace gl
26{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000027class ResourceManager;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028class FragmentShader;
29class VertexShader;
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000030class ProgramBinary;
31class Shader;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000033extern const char * const g_fakepath;
34
apatrick@chromium.org9a30b092012-06-06 20:21:55 +000035class AttributeBindings
36{
37 public:
38 AttributeBindings();
39 ~AttributeBindings();
40
41 void bindAttributeLocation(GLuint index, const char *name);
42 int getAttributeBinding(const std::string &name) const;
43
44 private:
45 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
46};
47
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000048class InfoLog
49{
50 public:
51 InfoLog();
52 ~InfoLog();
53
54 int getLength() const;
55 void getLog(GLsizei bufSize, GLsizei *length, char *infoLog);
56
57 void appendSanitized(const char *message);
58 void append(const char *info, ...);
59 void reset();
60 private:
61 DISALLOW_COPY_AND_ASSIGN(InfoLog);
62 char *mInfoLog;
63};
64
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000065class Program
66{
67 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +000068 Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000069
70 ~Program();
71
72 bool attachShader(Shader *shader);
73 bool detachShader(Shader *shader);
74 int getAttachedShadersCount() const;
75
76 void bindAttributeLocation(GLuint index, const char *name);
77
daniel@transgaming.com4c962bf2012-07-24 18:37:02 +000078 bool link();
daniel@transgaming.com716056c2012-07-24 18:38:59 +000079 bool isLinked();
daniel@transgaming.com4c962bf2012-07-24 18:37:02 +000080 bool setProgramBinary(const void *binary, GLsizei length);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000081 ProgramBinary *getProgramBinary();
82
83 int getInfoLogLength() const;
84 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
85 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
86
87 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
88 GLint getActiveAttributeCount();
89 GLint getActiveAttributeMaxLength();
90
91 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
92 GLint getActiveUniformCount();
93 GLint getActiveUniformMaxLength();
94
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +000095 GLint getActiveUniformBlockCount();
96 GLint getActiveUniformBlockMaxLength();
97
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +000098 void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding);
99 GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const;
100
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000101 void addRef();
102 void release();
103 unsigned int getRefCount() const;
104 void flagForDeletion();
105 bool isFlaggedForDeletion() const;
106
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000107 void validate();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000108 bool isValidated() const;
109
apatrick@chromium.org90080e32012-07-09 22:15:33 +0000110 GLint getProgramBinaryLength() const;
111
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000112 private:
113 DISALLOW_COPY_AND_ASSIGN(Program);
114
115 void unlink(bool destroy = false);
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000116 void resetUniformBlockBindings();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000117
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000118 FragmentShader *mFragmentShader;
119 VertexShader *mVertexShader;
120
121 AttributeBindings mAttributeBindings;
122
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +0000123 GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
124
daniel@transgaming.com989c1c82012-07-24 18:40:38 +0000125 BindingPointer<ProgramBinary> mProgramBinary;
daniel@transgaming.com716056c2012-07-24 18:38:59 +0000126 bool mLinked;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000127 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000128
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000129 unsigned int mRefCount;
130
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000131 ResourceManager *mResourceManager;
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000132 rx::Renderer *mRenderer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000133 const GLuint mHandle;
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000134
135 InfoLog mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136};
137}
138
139#endif // LIBGLESV2_PROGRAM_H_