globjects  2.0.0.4363356ae2ef
Strict OpenGL objects wrapper.
Loading...
Searching...
No Matches
Program.h
Go to the documentation of this file.
1
2#pragma once
3
4
5#include <set>
6#include <unordered_map>
7#include <vector>
8#include <memory>
9
10#include <glm/fwd.hpp>
11
12#include <globjects/globjects_api.h>
13
14#include <globjects/Object.h>
18
19
20namespace globjects
21{
22
23
24class AbstractUniform;
25class ProgramBinary;
26class ProgramPipeline;
27class Shader;
28
29template <typename T>
30class Uniform;
31
32
81class GLOBJECTS_API Program : public Object, public Instantiator<Program>
82{
83 friend class UniformBlock;
84 friend class ProgramBinaryImplementation_GetProgramBinaryARB;
85 friend class ProgramBinaryImplementation_None;
86
87
88public:
90 {
91 None,
92 GetProgramBinaryARB
93 };
94
96
97
98public:
100 Program(std::unique_ptr<ProgramBinary> && binary);
101
102 virtual ~Program();
103
104 void use() const;
105 static void release();
106
107 bool isUsed() const;
108 bool isLinked() const;
109
110 void attach(Shader * shader);
111 template <class ...Shaders>
112 void attach(Shader * shader, Shaders... shaders);
113
114 void detach(Shader * shader);
115
116 const std::set<Shader*> & shaders() const;
117
118 void link() const;
119 void invalidate() const;
120
121 void setBinary(std::unique_ptr<ProgramBinary> && binary);
123
124 static std::unique_ptr<ProgramBinary> obtainBinary(Program * program);
125
126 std::string infoLog() const;
127 gl::GLint get(gl::GLenum pname) const;
128 template <size_t Count>
129 std::array<gl::GLint, Count> get(gl::GLenum pname) const;
130
131 bool isValid() const;
132 void validate();
133
134 void setParameter(gl::GLenum pname, gl::GLint value) const;
135 void setParameter(gl::GLenum pname, gl::GLboolean value) const;
136
137 void getActiveAttrib(gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei * length, gl::GLint * size, gl::GLenum * type, gl::GLchar * name) const;
138
139 gl::GLint getAttributeLocation(const std::string & name) const;
140 gl::GLint getUniformLocation(const std::string & name) const;
141
142 std::vector<gl::GLint> getAttributeLocations(const std::vector<std::string> & names) const;
143 std::vector<gl::GLint> getUniformLocations(const std::vector<std::string> & names) const;
144
145 void bindAttributeLocation(gl::GLuint index, const std::string & name) const;
146 void bindFragDataLocation(gl::GLuint index, const std::string & name) const;
147
148 gl::GLint getFragDataLocation(const std::string & name) const;
149 gl::GLint getFragDataIndex(const std::string & name) const;
150
151 void getInterface(gl::GLenum programInterface, gl::GLenum pname, gl::GLint * params) const;
152 gl::GLuint getResourceIndex(gl::GLenum programInterface, const std::string & name) const;
153 void getResourceName(gl::GLenum programInterface, gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei * length, char * name) const;
154 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;
155 gl::GLint getResourceLocation(gl::GLenum programInterface, const std::string & name) const;
156 gl::GLint getResourceLocationIndex(gl::GLenum programInterface, const std::string & name) const;
157
160 gl::GLint getInterface(gl::GLenum programInterface, gl::GLenum pname) const;
161
162
165 gl::GLint getResource(gl::GLenum programInterface, gl::GLuint index, gl::GLenum prop, gl::GLsizei * length = nullptr) const;
166 std::vector<gl::GLint> getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector<gl::GLenum> & props, gl::GLsizei * length = nullptr) const;
167 void getResource(gl::GLenum programInterface, gl::GLuint index, const std::vector<gl::GLenum> & props, gl::GLsizei bufSize, gl::GLsizei * length, gl::GLint * params) const;
168
169 gl::GLuint getUniformBlockIndex(const std::string& name) const;
170 UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex);
171 const UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex) const;
172 UniformBlock * uniformBlock(const std::string& name);
173 const UniformBlock * uniformBlock(const std::string& name) const;
174 void getActiveUniforms(gl::GLsizei uniformCount, const gl::GLuint * uniformIndices, gl::GLenum pname, gl::GLint * params) const;
175 std::vector<gl::GLint> getActiveUniforms(const std::vector<gl::GLuint> & uniformIndices, gl::GLenum pname) const;
176 std::vector<gl::GLint> getActiveUniforms(const std::vector<gl::GLint> & uniformIndices, gl::GLenum pname) const;
177 gl::GLint getActiveUniform(gl::GLuint uniformIndex, gl::GLenum pname) const;
178 std::string getActiveUniformName(gl::GLuint uniformIndex) const;
179
180 template<typename T>
181 void setUniform(const std::string & name, const T & value);
182 template<typename T>
183 void setUniform(gl::GLint location, const T & value);
184
187 template<typename T>
188 Uniform<T> * getUniform(const std::string & name);
189 template<typename T>
190 const Uniform<T> * getUniform(const std::string & name) const;
191 template<typename T>
192 Uniform<T> * getUniform(gl::GLint location);
193 template<typename T>
194 const Uniform<T> * getUniform(gl::GLint location) const;
195
196 void setShaderStorageBlockBinding(gl::GLuint storageBlockIndex, gl::GLuint storageBlockBinding) const;
197
198 void dispatchCompute(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ);
199 void dispatchCompute(const glm::uvec3 & numGroups);
200 void dispatchComputeGroupSize(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ, gl::GLuint groupSizeX, gl::GLuint groupSizeY, gl::GLuint groupSizeZ);
201 void dispatchComputeGroupSize(const glm::uvec3 & numGroups, const glm::uvec3 & groupSizes);
202
203 virtual gl::GLenum objectType() const override;
204
205 virtual void notifyChanged(const Shader * sender);
206 virtual void notifyChanged(const ProgramBinary * sender);
207
208 void addSubject(ProgramBinary * subject);
209 virtual void removeSubject(ProgramBinary * subject);
210
211 void addSubject(Shader * subject);
212 virtual void removeSubject(Shader * subject);
213
216
217 void changed() const;
218
219
220protected:
221 bool checkLinkStatus() const;
222 void checkDirty() const;
223
225 void updateUniforms() const;
227
228 void addUniform(std::unique_ptr<AbstractUniform> && uniform);
229
230
231protected:
232 static gl::GLuint createProgram();
233
234 template<typename T>
235 void setUniformByIdentity(const LocationIdentity & identity, const T & value);
236 template<typename T>
238 template<typename T>
239 const Uniform<T> * getUniformByIdentity(const LocationIdentity & identity) const;
240
243
244
245protected:
246 std::set<Shader*> m_shaderSubjects;
247 std::set<ProgramBinary*> m_programBinarySubjects;
248 std::set<ProgramPipeline *> m_pipelineListeners;
249 std::set<Shader *> m_shaders;
250 std::unique_ptr<ProgramBinary> m_binary;
251
252 std::unordered_map<LocationIdentity, std::unique_ptr<AbstractUniform>> m_uniforms;
253 std::unordered_map<LocationIdentity, UniformBlock> m_uniformBlocks;
254
255 mutable bool m_linked;
256 mutable bool m_dirty;
257};
258
259
260} // namespace globjects
261
262
263#include <globjects/Program.inl>
CRTP for creating objects similar to std::make_unique.
Definition: Instantiator.h:22
Definition: LocationIdentity.h:18
Superclass of all wrapped OpenGL objects.
Definition: Object.h:28
The ProgramBinary class is used for directly setting binary sources for a Program.
Definition: ProgramBinary.h:29
Wraps an OpenGL program.
Definition: Program.h:82
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:253
void setUniform(gl::GLint location, const T &value)
bool m_linked
Definition: Program.h:255
void getActiveAttrib(gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei *length, gl::GLint *size, gl::GLenum *type, gl::GLchar *name) const
void addUniform(std::unique_ptr< AbstractUniform > &&uniform)
gl::GLint getUniformLocation(const std::string &name) const
std::set< ProgramPipeline * > m_pipelineListeners
Definition: Program.h:248
static void release()
void addSubject(ProgramBinary *subject)
std::array< gl::GLint, Count > get(gl::GLenum pname) const
gl::GLint getFragDataIndex(const std::string &name) const
static gl::GLuint createProgram()
static void hintBinaryImplementation(BinaryImplementation impl)
const UniformBlock * uniformBlock(gl::GLuint uniformBlockIndex) const
void setBinary(std::unique_ptr< ProgramBinary > &&binary)
Uniform< T > * getUniform(const std::string &name)
gl::GLint get(gl::GLenum pname) const
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
std::unique_ptr< ProgramBinary > m_binary
Definition: Program.h:250
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:256
std::vector< gl::GLint > getUniformLocations(const std::vector< std::string > &names) const
std::set< ProgramBinary * > m_programBinarySubjects
Definition: Program.h:247
void setParameter(gl::GLenum pname, gl::GLboolean value) const
void registerListener(ProgramPipeline *listener)
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
const std::set< Shader * > & shaders() const
virtual void notifyChanged(const Shader *sender)
void updateUniformBlockBindings() const
const UniformBlock * getUniformBlockByIdentity(const LocationIdentity &identity) const
gl::GLuint getUniformBlockIndex(const std::string &name) const
void invalidate() const
static std::unique_ptr< ProgramBinary > obtainBinary(Program *program)
virtual void removeSubject(ProgramBinary *subject)
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
void deregisterListener(ProgramPipeline *listener)
void changed() const
gl::GLint getInterface(gl::GLenum programInterface, gl::GLenum pname) const
BinaryImplementation
Definition: Program.h:90
std::vector< gl::GLint > getAttributeLocations(const std::vector< std::string > &names) const
std::set< Shader * > m_shaders
Definition: Program.h:249
gl::GLint getResourceLocation(gl::GLenum programInterface, const std::string &name) const
std::string infoLog() const
void setShaderStorageBlockBinding(gl::GLuint storageBlockIndex, gl::GLuint storageBlockBinding) const
Program(std::unique_ptr< ProgramBinary > &&binary)
void dispatchComputeGroupSize(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ, gl::GLuint groupSizeX, gl::GLuint groupSizeY, gl::GLuint groupSizeZ)
void dispatchCompute(const glm::uvec3 &numGroups)
std::unordered_map< LocationIdentity, std::unique_ptr< AbstractUniform > > m_uniforms
Definition: Program.h:252
Uniform< T > * getUniformByIdentity(const LocationIdentity &identity)
void attach(Shader *shader, Shaders... shaders)
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
ProgramBinary * binary() 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
void addSubject(Shader *subject)
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
std::set< Shader * > m_shaderSubjects
Definition: Program.h:246
std::vector< gl::GLint > getActiveUniforms(const std::vector< gl::GLuint > &uniformIndices, gl::GLenum pname) const
virtual void notifyChanged(const ProgramBinary *sender)
virtual void removeSubject(Shader *subject)
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
Definition: ProgramPipeline.h:23
Encapsulates OpenGL shaders.
Definition: Shader.h:44
Definition: UniformBlock.h:20
Wraps access to typed global GLSL variables.
Definition: Uniform.h:39
Contains all the classes that wrap OpenGL functionality.