blob: 9f7f07b3bc3662d1ae6c331c7e30054bee706314 [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 <d3dx9.h>
14#include <string>
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +000015#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
daniel@transgaming.com85423182010-04-22 13:35:27 +000017#include "libGLESv2/Shader.h"
daniel@transgaming.come6842292010-04-20 18:52:50 +000018#include "libGLESv2/Context.h"
19
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020namespace gl
21{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000022class ResourceManager;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023class FragmentShader;
24class VertexShader;
25
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000026extern const char * const g_fakepath;
27
apatrick@chromium.org9a30b092012-06-06 20:21:55 +000028class AttributeBindings
29{
30 public:
31 AttributeBindings();
32 ~AttributeBindings();
33
34 void bindAttributeLocation(GLuint index, const char *name);
35 int getAttributeBinding(const std::string &name) const;
36
37 private:
38 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
39};
40
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000041class InfoLog
42{
43 public:
44 InfoLog();
45 ~InfoLog();
46
47 int getLength() const;
48 void getLog(GLsizei bufSize, GLsizei *length, char *infoLog);
49
50 void appendSanitized(const char *message);
51 void append(const char *info, ...);
52 void reset();
53 private:
54 DISALLOW_COPY_AND_ASSIGN(InfoLog);
55 char *mInfoLog;
56};
57
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000058class Program
59{
60 public:
61 Program(ResourceManager *manager, GLuint handle);
62
63 ~Program();
64
65 bool attachShader(Shader *shader);
66 bool detachShader(Shader *shader);
67 int getAttachedShadersCount() const;
68
69 void bindAttributeLocation(GLuint index, const char *name);
70
daniel@transgaming.com4c962bf2012-07-24 18:37:02 +000071 bool link();
daniel@transgaming.com716056c2012-07-24 18:38:59 +000072 bool isLinked();
daniel@transgaming.com4c962bf2012-07-24 18:37:02 +000073 bool setProgramBinary(const void *binary, GLsizei length);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000074 ProgramBinary *getProgramBinary();
75
76 int getInfoLogLength() const;
77 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
78 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
79
80 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
81 GLint getActiveAttributeCount();
82 GLint getActiveAttributeMaxLength();
83
84 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
85 GLint getActiveUniformCount();
86 GLint getActiveUniformMaxLength();
87
88 void addRef();
89 void release();
90 unsigned int getRefCount() const;
91 void flagForDeletion();
92 bool isFlaggedForDeletion() const;
93
apatrick@chromium.org253b8d22012-06-22 19:27:21 +000094 void validate();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000095 bool isValidated() const;
96
apatrick@chromium.org90080e32012-07-09 22:15:33 +000097 GLint getProgramBinaryLength() const;
98
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +000099 private:
100 DISALLOW_COPY_AND_ASSIGN(Program);
101
102 void unlink(bool destroy = false);
103
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000104 FragmentShader *mFragmentShader;
105 VertexShader *mVertexShader;
106
107 AttributeBindings mAttributeBindings;
108
daniel@transgaming.com989c1c82012-07-24 18:40:38 +0000109 BindingPointer<ProgramBinary> mProgramBinary;
daniel@transgaming.com716056c2012-07-24 18:38:59 +0000110 bool mLinked;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +0000111 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.com4fa08332010-05-11 02:29:27 +0000112
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000113 unsigned int mRefCount;
114
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000115 ResourceManager *mResourceManager;
116 const GLuint mHandle;
apatrick@chromium.org253b8d22012-06-22 19:27:21 +0000117
118 InfoLog mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000119};
120}
121
122#endif // LIBGLESV2_PROGRAM_H_