globjects  1.0.0.000000000000
Strict OpenGL objects wrapper.
Program.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <set>
5#include <unordered_map>
6#include <vector>
7
8#include <glm/fwd.hpp>
9
13
14#include <globjects/globjects_api.h>
15
16#include <globjects/Object.h>
19
20
21namespace globjects
22{
23
24
25class AbstractUniform;
26class ProgramBinary;
27class Shader;
28
29template <typename T>
30class Uniform;
31
78class GLOBJECTS_API Program : public Object, protected ChangeListener, public Changeable
79{
80 friend class UniformBlock;
81 friend class ProgramBinaryImplementation_GetProgramBinaryARB;
82 friend class ProgramBinaryImplementation_None;
83
84public:
86 {
87 GetProgramBinaryARB
88 , None
89 };
90
92
93public:
96
97 virtual void accept(ObjectVisitor & visitor) override;
98
99 void use() const;
100 static void release();
101
102 bool isUsed() const;
103 bool isLinked() const;
104
105 void attach(Shader * shader);
106 template <class ...Shaders>
107 void attach(Shader * shader, Shaders... shaders);
108
109 void detach(Shader * shader);
110
111 std::set<Shader*> shaders() const;
112
113 void link() const;
114 void invalidate() const;
115
116 void setBinary(ProgramBinary * binary);
118
119 std::string infoLog() const;
120 gl::GLint get(gl::GLenum pname) const;
121
122 bool isValid() const;
123 void validate();
124
125 void setParameter(gl::GLenum pname, gl::GLint value) const;
126 void setParameter(gl::GLenum pname, gl::GLboolean value) const;
127
128 void getActiveAttrib(gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei * length, gl::GLint * size, gl::GLenum * type, gl::GLchar * name) const;
129
130 gl::GLint getAttributeLocation(const std::string & name) const;
131 gl::GLint getUniformLocation(const std::string & name) const;
132
133 std::vector<gl::GLint> getAttributeLocations(const std::vector<std::string> & names) const;
134 std::vector<gl::GLint> getUniformLocations(const std::vector<std::string> & names) const;
135
136 void bindAttributeLocation(gl::GLuint index, const std::string & name) const;
137 void bindFragDataLocation(gl::GLuint index, const std::string & name) const;
138
139 gl::GLint getFragDataLocation(const std::string & name) const;
140 gl::GLint getFragDataIndex(const std::string & name) const;
141
142 void getInterface(gl::GLenum programInterface, gl::GLenum pname, gl::GLint * params) const;
143 gl::GLuint getResourceIndex(gl::GLenum programInterface, const std::string & name) const;
144 void getResourceName(gl::GLenum programInterface, gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei * length, char * name) const;
145 void getResource(gl::GLenum programInterface, gl::GLuint index, gl::GLsizei propCount, const gl::GLenum * props, gl::GLsizei bufSize, gl::GLsizei * length, gl::GLint * params) const;
146 gl::GLint getResourceLocation(gl::GLenum programInterface, const std::string & name) const;
147 gl::GLint getResourceLocationIndex(gl::GLenum programInterface, const std::string & name) const;
148
151 gl::GLint getInterface(gl::GLenum programInterface, gl::GLenum pname) const;
152
153
156 gl::GLint getResource(gl::GLenum programInterface, gl::GLuint index, gl::GLenum prop, gl::GLsizei * length = nullptr) const;
157 std::vector<gl::GLint> getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector<gl::GLenum> & props, gl::GLsizei * length = nullptr) const;
158 void getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector<gl::GLenum> & props, gl::GLsizei bufSize, gl::GLsizei * length, gl::GLint * params) const;
159
160 gl::GLuint getUniformBlockIndex(const std::string& name) const;
161 UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex);
162 const UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex) const;
163 UniformBlock * uniformBlock(const std::string& name);
164 const UniformBlock * uniformBlock(const std::string& name) const;
165 void getActiveUniforms(gl::GLsizei uniformCount, const gl::GLuint * uniformIndices, gl::GLenum pname, gl::GLint * params) const;
166 std::vector<gl::GLint> getActiveUniforms(const std::vector<gl::GLuint> & uniformIndices, gl::GLenum pname) const;
167 std::vector<gl::GLint> getActiveUniforms(const std::vector<gl::GLint> & uniformIndices, gl::GLenum pname) const;
168 gl::GLint getActiveUniform(gl::GLuint uniformIndex, gl::GLenum pname) const;
169 std::string getActiveUniformName(gl::GLuint uniformIndex) const;
170
171 template<typename T>
172 void setUniform(const std::string & name, const T & value);
173 template<typename T>
174 void setUniform(gl::GLint location, const T & value);
175
178 template<typename T>
179 Uniform<T> * getUniform(const std::string & name);
180 template<typename T>
181 const Uniform<T> * getUniform(const std::string & name) const;
182 template<typename T>
183 Uniform<T> * getUniform(gl::GLint location);
184 template<typename T>
185 const Uniform<T> * getUniform(gl::GLint location) const;
186
193
194 void setShaderStorageBlockBinding(gl::GLuint storageBlockIndex, gl::GLuint storageBlockBinding) const;
195
196 void dispatchCompute(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ);
197 void dispatchCompute(const glm::uvec3 & numGroups);
198 void dispatchComputeGroupSize(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ, gl::GLuint groupSizeX, gl::GLuint groupSizeY, gl::GLuint groupSizeZ);
199 void dispatchComputeGroupSize(const glm::uvec3 & numGroups, const glm::uvec3 & groupSizes);
200
201 virtual gl::GLenum objectType() const override;
202
203protected:
204 virtual ~Program();
205
206 bool checkLinkStatus() const;
207 void checkDirty() const;
208
210 void updateUniforms() const;
212
213 // ChangeListener Interface
214
215 virtual void notifyChanged(const Changeable * sender) override;
216
217protected:
218 static gl::GLuint createProgram();
219
220 template<typename T>
221 void setUniformByIdentity(const LocationIdentity & identity, const T & value);
222 template<typename T>
224 template<typename T>
225 const Uniform<T> * getUniformByIdentity(const LocationIdentity & identity) const;
226
229
230protected:
231 std::set<ref_ptr<Shader>> m_shaders;
233
234 std::unordered_map<LocationIdentity, ref_ptr<AbstractUniform>> m_uniforms;
235 std::unordered_map<LocationIdentity, UniformBlock> m_uniformBlocks;
236
237 mutable bool m_linked;
238 mutable bool m_dirty;
239};
240
241
242} // namespace globjects
243
244
245#include <globjects/Program.inl>
Abstract base class for templated Uniforms.
Definition: AbstractUniform.h:35
Allows listening to any Changeable.
Definition: ChangeListener.h:23
Superclass of all objects that want others to signal that they have changed.
Definition: Changeable.h:23
Definition: LocationIdentity.h:17
Superclass of all wrapped OpenGL objects.
Definition: Object.h:27
Implements a Visitor Pattern to iterate over all tracked globjects objects.
Definition: ObjectVisitor.h:30
The ProgramBinary class is used for directly setting binary sources for a Program.
Definition: ProgramBinary.h:28
Wraps an OpenGL program.
Definition: Program.h:79
void getResourceName(gl::GLenum programInterface, gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei *length, char *name) const
std::unordered_map< LocationIdentity, UniformBlock > m_uniformBlocks
Definition: Program.h:235
void setUniform(gl::GLint location, const T &value)
bool m_linked
Definition: Program.h:237
void getActiveAttrib(gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei *length, gl::GLint *size, gl::GLenum *type, gl::GLchar *name) const
gl::GLint getUniformLocation(const std::string &name) const
static void release()
gl::GLint getFragDataIndex(const std::string &name) const
static gl::GLuint createProgram()
static void hintBinaryImplementation(BinaryImplementation impl)
const UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex) const
Uniform< T > * getUniform(const std::string &name)
gl::GLint get(gl::GLenum pname) const
ref_ptr< ProgramBinary > m_binary
Definition: Program.h:232
gl::GLuint getResourceIndex(gl::GLenum programInterface, const std::string &name) const
void getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector< gl::GLenum > &props, gl::GLsizei bufSize, gl::GLsizei *length, gl::GLint *params) const
gl::GLint getAttributeLocation(const std::string &name) const
void dispatchCompute(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ)
gl::GLint getActiveUniform(gl::GLuint uniformIndex, gl::GLenum pname) const
gl::GLint getResource(gl::GLenum programInterface, gl::GLuint index, gl::GLenum prop, gl::GLsizei *length=nullptr) const
UniformBlock * uniformBlock(const std::string &name)
bool m_dirty
Definition: Program.h:238
std::vector< gl::GLint > getUniformLocations(const std::vector< std::string > &names) const
virtual void notifyChanged(const Changeable *sender) override
std::set< Shader * > shaders() const
ProgramBinary * getBinary() const
void setParameter(gl::GLenum pname, gl::GLboolean value) const
std::vector< gl::GLint > getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector< gl::GLenum > &props, gl::GLsizei *length=nullptr) const
gl::GLint getFragDataLocation(const std::string &name) const
void detach(Shader *shader)
void use() const
void updateUniformBlockBindings() const
const UniformBlock * getUniformBlockByIdentity(const LocationIdentity &identity) const
gl::GLuint getUniformBlockIndex(const std::string &name) const
void invalidate() const
std::string getActiveUniformName(gl::GLuint uniformIndex) const
std::vector< gl::GLint > getActiveUniforms(const std::vector< gl::GLint > &uniformIndices, gl::GLenum pname) const
void updateUniforms() const
Uniform< T > * getUniform(gl::GLint location)
bool compileAttachedShaders() const
void setUniform(const std::string &name, const T &value)
void attach(Shader *shader)
const UniformBlock * uniformBlock(const std::string &name) const
virtual void accept(ObjectVisitor &visitor) override
gl::GLint getInterface(gl::GLenum programInterface, gl::GLenum pname) const
BinaryImplementation
Definition: Program.h:86
std::vector< gl::GLint > getAttributeLocations(const std::vector< std::string > &names) const
gl::GLint getResourceLocation(gl::GLenum programInterface, const std::string &name) const
std::string infoLog() const
void setShaderStorageBlockBinding(gl::GLuint storageBlockIndex, gl::GLuint storageBlockBinding) const
void dispatchComputeGroupSize(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ, gl::GLuint groupSizeX, gl::GLuint groupSizeY, gl::GLuint groupSizeZ)
Program(ProgramBinary *binary)
void dispatchCompute(const glm::uvec3 &numGroups)
Uniform< T > * getUniformByIdentity(const LocationIdentity &identity)
void attach(Shader *shader, Shaders... shaders)
void setBinary(ProgramBinary *binary)
void dispatchComputeGroupSize(const glm::uvec3 &numGroups, const glm::uvec3 &groupSizes)
void getInterface(gl::GLenum programInterface, gl::GLenum pname, gl::GLint *params) const
void setUniformByIdentity(const LocationIdentity &identity, const T &value)
void link() const
UniformBlock * getUniformBlockByIdentity(const LocationIdentity &identity)
void bindAttributeLocation(gl::GLuint index, const std::string &name) const
bool isValid() const
virtual gl::GLenum objectType() const override
bool isUsed() const
void bindFragDataLocation(gl::GLuint index, const std::string &name) const
std::set< ref_ptr< Shader > > m_shaders
Definition: Program.h:231
void getActiveUniforms(gl::GLsizei uniformCount, const gl::GLuint *uniformIndices, gl::GLenum pname, gl::GLint *params) const
gl::GLint getResourceLocationIndex(gl::GLenum programInterface, const std::string &name) const
void getResource(gl::GLenum programInterface, gl::GLuint index, gl::GLsizei propCount, const gl::GLenum *props, gl::GLsizei bufSize, gl::GLsizei *length, gl::GLint *params) const
const Uniform< T > * getUniform(gl::GLint location) const
void setParameter(gl::GLenum pname, gl::GLint value) const
bool isLinked() const
bool checkLinkStatus() const
void addUniform(AbstractUniform *uniform)
std::vector< gl::GLint > getActiveUniforms(const std::vector< gl::GLuint > &uniformIndices, gl::GLenum pname) const
std::unordered_map< LocationIdentity, ref_ptr< AbstractUniform > > m_uniforms
Definition: Program.h:234
UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex)
const Uniform< T > * getUniformByIdentity(const LocationIdentity &identity) const
void checkDirty() const
const Uniform< T > * getUniform(const std::string &name) const
Encapsulates OpenGL shaders.
Definition: Shader.h:41
Definition: UniformBlock.h:17
Wraps access to typed global GLSL variables.
Definition: Uniform.h:37
The ref_ptr class provides the interface for a reference pointer.
Definition: ref_ptr.h:33
Contains all the classes that wrap OpenGL functionality.