globjects  2.0.0.4363356ae2ef
Strict OpenGL objects wrapper.
Loading...
Searching...
No Matches

Wraps an OpenGL program. More...

#include <globjects/include/globjects/Program.h>

Inheritance diagram for globjects::Program:
globjects::Object globjects::Instantiator< Program >

Public Types

enum class  BinaryImplementation { None , GetProgramBinaryARB }
 
- Public Types inherited from globjects::Object
enum class  NameImplementation { Legacy , DebugKHR }
 

Public Member Functions

 Program ()
 
 Program (std::unique_ptr< ProgramBinary > &&binary)
 
virtual ~Program ()
 
void use () const
 
bool isUsed () const
 
bool isLinked () const
 
void attach (Shader *shader)
 
template<class ... Shaders>
void attach (Shader *shader, Shaders... shaders)
 
void detach (Shader *shader)
 
const std::set< Shader * > & shaders () const
 
void link () const
 
void invalidate () const
 
void setBinary (std::unique_ptr< ProgramBinary > &&binary)
 
ProgramBinarybinary () const
 
std::string infoLog () const
 
gl::GLint get (gl::GLenum pname) const
 
template<size_t Count>
std::array< gl::GLint, Count > get (gl::GLenum pname) const
 
bool isValid () const
 
void validate ()
 
void setParameter (gl::GLenum pname, gl::GLint value) const
 
void setParameter (gl::GLenum pname, gl::GLboolean value) const
 
void getActiveAttrib (gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei *length, gl::GLint *size, gl::GLenum *type, gl::GLchar *name) const
 
gl::GLint getAttributeLocation (const std::string &name) const
 
gl::GLint getUniformLocation (const std::string &name) const
 
std::vector< gl::GLint > getAttributeLocations (const std::vector< std::string > &names) const
 
std::vector< gl::GLint > getUniformLocations (const std::vector< std::string > &names) const
 
void bindAttributeLocation (gl::GLuint index, const std::string &name) const
 
void bindFragDataLocation (gl::GLuint index, const std::string &name) const
 
gl::GLint getFragDataLocation (const std::string &name) const
 
gl::GLint getFragDataIndex (const std::string &name) const
 
void getInterface (gl::GLenum programInterface, gl::GLenum pname, gl::GLint *params) const
 
gl::GLuint getResourceIndex (gl::GLenum programInterface, const std::string &name) const
 
void getResourceName (gl::GLenum programInterface, gl::GLuint index, gl::GLsizei bufSize, gl::GLsizei *length, char *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
 
gl::GLint getResourceLocation (gl::GLenum programInterface, const std::string &name) const
 
gl::GLint getResourceLocationIndex (gl::GLenum programInterface, const std::string &name) const
 
gl::GLint getInterface (gl::GLenum programInterface, gl::GLenum pname) const
 
gl::GLint getResource (gl::GLenum programInterface, gl::GLuint index, gl::GLenum prop, gl::GLsizei *length=nullptr) const
 
std::vector< gl::GLint > getResource (gl::GLenum programInterface, gl::GLuint index, const std::vector< gl::GLenum > &props, gl::GLsizei *length=nullptr) 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::GLuint getUniformBlockIndex (const std::string &name) const
 
UniformBlockuniformBlock (gl::GLuint uniformBlockIndex)
 
const UniformBlockuniformBlock (gl::GLuint uniformBlockIndex) const
 
UniformBlockuniformBlock (const std::string &name)
 
const UniformBlockuniformBlock (const std::string &name) const
 
void getActiveUniforms (gl::GLsizei uniformCount, const gl::GLuint *uniformIndices, gl::GLenum pname, gl::GLint *params) const
 
std::vector< gl::GLint > getActiveUniforms (const std::vector< gl::GLuint > &uniformIndices, gl::GLenum pname) const
 
std::vector< gl::GLint > getActiveUniforms (const std::vector< gl::GLint > &uniformIndices, gl::GLenum pname) const
 
gl::GLint getActiveUniform (gl::GLuint uniformIndex, gl::GLenum pname) const
 
std::string getActiveUniformName (gl::GLuint uniformIndex) const
 
template<typename T >
void setUniform (const std::string &name, const T &value)
 
template<typename T >
void setUniform (gl::GLint location, const T &value)
 
template<typename T >
Uniform< T > * getUniform (const std::string &name)
 
template<typename T >
const Uniform< T > * getUniform (const std::string &name) const
 
template<typename T >
Uniform< T > * getUniform (gl::GLint location)
 
template<typename T >
const Uniform< T > * getUniform (gl::GLint location) const
 
void setShaderStorageBlockBinding (gl::GLuint storageBlockIndex, gl::GLuint storageBlockBinding) const
 
void dispatchCompute (gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ)
 
void dispatchCompute (const glm::uvec3 &numGroups)
 
void dispatchComputeGroupSize (gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ, gl::GLuint groupSizeX, gl::GLuint groupSizeY, gl::GLuint groupSizeZ)
 
void dispatchComputeGroupSize (const glm::uvec3 &numGroups, const glm::uvec3 &groupSizes)
 
virtual gl::GLenum objectType () const override
 
virtual void notifyChanged (const Shader *sender)
 
virtual void notifyChanged (const ProgramBinary *sender)
 
void addSubject (ProgramBinary *subject)
 
virtual void removeSubject (ProgramBinary *subject)
 
void addSubject (Shader *subject)
 
virtual void removeSubject (Shader *subject)
 
void registerListener (ProgramPipeline *listener)
 
void deregisterListener (ProgramPipeline *listener)
 
void changed () const
 
- Public Member Functions inherited from globjects::Object
gl::GLuint id () const
 
std::string name () const
 
void setName (const std::string &name)
 
bool hasName () const
 
bool isDefault () const
 
virtual gl::GLenum objectType () const =0
 
void detach ()
 

Static Public Member Functions

static void hintBinaryImplementation (BinaryImplementation impl)
 
static void release ()
 
static std::unique_ptr< ProgramBinaryobtainBinary (Program *program)
 
- Static Public Member Functions inherited from globjects::Object
static void hintNameImplementation (NameImplementation impl)
 
- Static Public Member Functions inherited from globjects::Instantiator< Program >
static std::unique_ptr< Programcreate (Args &&... args)
 
static std::unique_ptr< ProgramfromId (gl::GLuint id, Args &&... args)
 

Protected Member Functions

bool checkLinkStatus () const
 
void checkDirty () const
 
bool compileAttachedShaders () const
 
void updateUniforms () const
 
void updateUniformBlockBindings () const
 
void addUniform (std::unique_ptr< AbstractUniform > &&uniform)
 
template<typename T >
void setUniformByIdentity (const LocationIdentity &identity, const T &value)
 
template<typename T >
Uniform< T > * getUniformByIdentity (const LocationIdentity &identity)
 
template<typename T >
const Uniform< T > * getUniformByIdentity (const LocationIdentity &identity) const
 
UniformBlockgetUniformBlockByIdentity (const LocationIdentity &identity)
 
const UniformBlockgetUniformBlockByIdentity (const LocationIdentity &identity) const
 
- Protected Member Functions inherited from globjects::Object
 Object (std::unique_ptr< IDResource > &&resource)
 
virtual ~Object ()
 

Static Protected Member Functions

static gl::GLuint createProgram ()
 

Protected Attributes

std::set< Shader * > m_shaderSubjects
 
std::set< ProgramBinary * > m_programBinarySubjects
 
std::set< ProgramPipeline * > m_pipelineListeners
 
std::set< Shader * > m_shaders
 
std::unique_ptr< ProgramBinarym_binary
 
std::unordered_map< LocationIdentity, std::unique_ptr< AbstractUniform > > m_uniforms
 
std::unordered_map< LocationIdentity, UniformBlockm_uniformBlocks
 
bool m_linked
 
bool m_dirty
 
- Protected Attributes inherited from globjects::Object
std::unique_ptr< IDResourcem_resource
 
void * m_objectLabelState
 

Friends

class UniformBlock
 
class ProgramBinaryImplementation_GetProgramBinaryARB
 
class ProgramBinaryImplementation_None
 

Detailed Description

Wraps an OpenGL program.

Therefor it suclasses Object. Programs get attached a set of shaders with attach(). It inherits ChangeListener to react to changes to attached shaders. To use a program for rendering, call use(). During use() the program ensure that all attached shaders are compiled and linked. After that, the program is registered in OpenGL to be used during the upcoming rendering pileline calls.

Shaders can be detached using detach() and queried with shaders().

To use a program as a compute program, dispatchCompute() can be used to start the kernel.

Example code for setting up a program and use it for rendering

[TODO]: Adjust examples

Program * program = new Program();
program->attach(
Shader::fromString(gl::GL_VERTEX_SHADER, "...")
, Shader::fromString(gl::GL_FRAGMENT_SHADER, "...")
, ...);
program->use();
// draw calls
program->release();
Wraps an OpenGL program.
Definition: Program.h:82
static void release()
void use() const
void attach(Shader *shader)

Example code for using a program as compute program [TODO]: Adjust examples

Program * program = new Program();
program->attach(Shader::fromString(gl::GL_COMPUTE_SHADER, "..."));
program->dispatchCompute(128, 1, 1);
program->release();
void dispatchCompute(gl::GLuint numGroupsX, gl::GLuint numGroupsY, gl::GLuint numGroupsZ)
See also
http://www.opengl.org/wiki/Program_Object
Shader

Member Enumeration Documentation

◆ BinaryImplementation

Enumerator
None 
GetProgramBinaryARB 

Constructor & Destructor Documentation

◆ Program() [1/2]

globjects::Program::Program ( )

◆ Program() [2/2]

globjects::Program::Program ( std::unique_ptr< ProgramBinary > &&  binary)

◆ ~Program()

virtual globjects::Program::~Program ( )
virtual

Member Function Documentation

◆ hintBinaryImplementation()

static void globjects::Program::hintBinaryImplementation ( BinaryImplementation  impl)
static

◆ use()

void globjects::Program::use ( ) const

◆ release()

static void globjects::Program::release ( )
static

◆ isUsed()

bool globjects::Program::isUsed ( ) const

◆ isLinked()

bool globjects::Program::isLinked ( ) const

◆ attach() [1/2]

void globjects::Program::attach ( Shader shader)

◆ attach() [2/2]

template<class ... Shaders>
void globjects::Program::attach ( Shader shader,
Shaders...  shaders 
)

◆ detach()

void globjects::Program::detach ( Shader shader)

◆ shaders()

const std::set< Shader * > & globjects::Program::shaders ( ) const

◆ link()

void globjects::Program::link ( ) const

◆ invalidate()

void globjects::Program::invalidate ( ) const

◆ setBinary()

void globjects::Program::setBinary ( std::unique_ptr< ProgramBinary > &&  binary)

◆ binary()

ProgramBinary * globjects::Program::binary ( ) const

◆ obtainBinary()

static std::unique_ptr< ProgramBinary > globjects::Program::obtainBinary ( Program program)
static

◆ infoLog()

std::string globjects::Program::infoLog ( ) const

◆ get() [1/2]

gl::GLint globjects::Program::get ( gl::GLenum  pname) const

◆ get() [2/2]

template<size_t Count>
std::array< gl::GLint, Count > globjects::Program::get ( gl::GLenum  pname) const

◆ isValid()

bool globjects::Program::isValid ( ) const

◆ validate()

void globjects::Program::validate ( )

◆ setParameter() [1/2]

void globjects::Program::setParameter ( gl::GLenum  pname,
gl::GLint  value 
) const

◆ setParameter() [2/2]

void globjects::Program::setParameter ( gl::GLenum  pname,
gl::GLboolean  value 
) const

◆ getActiveAttrib()

void globjects::Program::getActiveAttrib ( gl::GLuint  index,
gl::GLsizei  bufSize,
gl::GLsizei *  length,
gl::GLint *  size,
gl::GLenum *  type,
gl::GLchar *  name 
) const

◆ getAttributeLocation()

gl::GLint globjects::Program::getAttributeLocation ( const std::string &  name) const

◆ getUniformLocation()

gl::GLint globjects::Program::getUniformLocation ( const std::string &  name) const

◆ getAttributeLocations()

std::vector< gl::GLint > globjects::Program::getAttributeLocations ( const std::vector< std::string > &  names) const

◆ getUniformLocations()

std::vector< gl::GLint > globjects::Program::getUniformLocations ( const std::vector< std::string > &  names) const

◆ bindAttributeLocation()

void globjects::Program::bindAttributeLocation ( gl::GLuint  index,
const std::string &  name 
) const

◆ bindFragDataLocation()

void globjects::Program::bindFragDataLocation ( gl::GLuint  index,
const std::string &  name 
) const

◆ getFragDataLocation()

gl::GLint globjects::Program::getFragDataLocation ( const std::string &  name) const

◆ getFragDataIndex()

gl::GLint globjects::Program::getFragDataIndex ( const std::string &  name) const

◆ getInterface() [1/2]

void globjects::Program::getInterface ( gl::GLenum  programInterface,
gl::GLenum  pname,
gl::GLint *  params 
) const

◆ getResourceIndex()

gl::GLuint globjects::Program::getResourceIndex ( gl::GLenum  programInterface,
const std::string &  name 
) const

◆ getResourceName()

void globjects::Program::getResourceName ( gl::GLenum  programInterface,
gl::GLuint  index,
gl::GLsizei  bufSize,
gl::GLsizei *  length,
char *  name 
) const

◆ getResource() [1/4]

void globjects::Program::getResource ( gl::GLenum  programInterface,
gl::GLuint  index,
gl::GLsizei  propCount,
const gl::GLenum *  props,
gl::GLsizei  bufSize,
gl::GLsizei *  length,
gl::GLint *  params 
) const

◆ getResourceLocation()

gl::GLint globjects::Program::getResourceLocation ( gl::GLenum  programInterface,
const std::string &  name 
) const

◆ getResourceLocationIndex()

gl::GLint globjects::Program::getResourceLocationIndex ( gl::GLenum  programInterface,
const std::string &  name 
) const

◆ getInterface() [2/2]

gl::GLint globjects::Program::getInterface ( gl::GLenum  programInterface,
gl::GLenum  pname 
) const

Convenience methods for getInterface()

◆ getResource() [2/4]

gl::GLint globjects::Program::getResource ( gl::GLenum  programInterface,
gl::GLuint  index,
gl::GLenum  prop,
gl::GLsizei *  length = nullptr 
) const

Convenience methods for getResource()

◆ getResource() [3/4]

std::vector< gl::GLint > globjects::Program::getResource ( gl::GLenum  programInterface,
gl::GLuint  index,
const std::vector< gl::GLenum > &  props,
gl::GLsizei *  length = nullptr 
) const

◆ getResource() [4/4]

void globjects::Program::getResource ( gl::GLenum  programInterface,
gl::GLuint  index,
const std::vector< gl::GLenum > &  props,
gl::GLsizei  bufSize,
gl::GLsizei *  length,
gl::GLint *  params 
) const

◆ getUniformBlockIndex()

gl::GLuint globjects::Program::getUniformBlockIndex ( const std::string &  name) const

◆ uniformBlock() [1/4]

UniformBlock * globjects::Program::uniformBlock ( gl::GLuint  uniformBlockIndex)

◆ uniformBlock() [2/4]

const UniformBlock * globjects::Program::uniformBlock ( gl::GLuint  uniformBlockIndex) const

◆ uniformBlock() [3/4]

UniformBlock * globjects::Program::uniformBlock ( const std::string &  name)

◆ uniformBlock() [4/4]

const UniformBlock * globjects::Program::uniformBlock ( const std::string &  name) const

◆ getActiveUniforms() [1/3]

void globjects::Program::getActiveUniforms ( gl::GLsizei  uniformCount,
const gl::GLuint *  uniformIndices,
gl::GLenum  pname,
gl::GLint *  params 
) const

◆ getActiveUniforms() [2/3]

std::vector< gl::GLint > globjects::Program::getActiveUniforms ( const std::vector< gl::GLuint > &  uniformIndices,
gl::GLenum  pname 
) const

◆ getActiveUniforms() [3/3]

std::vector< gl::GLint > globjects::Program::getActiveUniforms ( const std::vector< gl::GLint > &  uniformIndices,
gl::GLenum  pname 
) const

◆ getActiveUniform()

gl::GLint globjects::Program::getActiveUniform ( gl::GLuint  uniformIndex,
gl::GLenum  pname 
) const

◆ getActiveUniformName()

std::string globjects::Program::getActiveUniformName ( gl::GLuint  uniformIndex) const

◆ setUniform() [1/2]

template<typename T >
void globjects::Program::setUniform ( const std::string &  name,
const T &  value 
)

◆ setUniform() [2/2]

template<typename T >
void globjects::Program::setUniform ( gl::GLint  location,
const T &  value 
)

◆ getUniform() [1/4]

template<typename T >
Uniform< T > * globjects::Program::getUniform ( const std::string &  name)

Retrieves the existing or creates a new typed uniform, named <name>.

◆ getUniform() [2/4]

template<typename T >
const Uniform< T > * globjects::Program::getUniform ( const std::string &  name) const

◆ getUniform() [3/4]

template<typename T >
Uniform< T > * globjects::Program::getUniform ( gl::GLint  location)

◆ getUniform() [4/4]

template<typename T >
const Uniform< T > * globjects::Program::getUniform ( gl::GLint  location) const

◆ setShaderStorageBlockBinding()

void globjects::Program::setShaderStorageBlockBinding ( gl::GLuint  storageBlockIndex,
gl::GLuint  storageBlockBinding 
) const

◆ dispatchCompute() [1/2]

void globjects::Program::dispatchCompute ( gl::GLuint  numGroupsX,
gl::GLuint  numGroupsY,
gl::GLuint  numGroupsZ 
)

◆ dispatchCompute() [2/2]

void globjects::Program::dispatchCompute ( const glm::uvec3 &  numGroups)

◆ dispatchComputeGroupSize() [1/2]

void globjects::Program::dispatchComputeGroupSize ( gl::GLuint  numGroupsX,
gl::GLuint  numGroupsY,
gl::GLuint  numGroupsZ,
gl::GLuint  groupSizeX,
gl::GLuint  groupSizeY,
gl::GLuint  groupSizeZ 
)

◆ dispatchComputeGroupSize() [2/2]

void globjects::Program::dispatchComputeGroupSize ( const glm::uvec3 &  numGroups,
const glm::uvec3 &  groupSizes 
)

◆ objectType()

virtual gl::GLenum globjects::Program::objectType ( ) const
overridevirtual

Implements globjects::Object.

◆ notifyChanged() [1/2]

virtual void globjects::Program::notifyChanged ( const Shader sender)
virtual

◆ notifyChanged() [2/2]

virtual void globjects::Program::notifyChanged ( const ProgramBinary sender)
virtual

◆ addSubject() [1/2]

void globjects::Program::addSubject ( ProgramBinary subject)

◆ removeSubject() [1/2]

virtual void globjects::Program::removeSubject ( ProgramBinary subject)
virtual

◆ addSubject() [2/2]

void globjects::Program::addSubject ( Shader subject)

◆ removeSubject() [2/2]

virtual void globjects::Program::removeSubject ( Shader subject)
virtual

◆ registerListener()

void globjects::Program::registerListener ( ProgramPipeline listener)

◆ deregisterListener()

void globjects::Program::deregisterListener ( ProgramPipeline listener)

◆ changed()

void globjects::Program::changed ( ) const

◆ checkLinkStatus()

bool globjects::Program::checkLinkStatus ( ) const
protected

◆ checkDirty()

void globjects::Program::checkDirty ( ) const
protected

◆ compileAttachedShaders()

bool globjects::Program::compileAttachedShaders ( ) const
protected

◆ updateUniforms()

void globjects::Program::updateUniforms ( ) const
protected

◆ updateUniformBlockBindings()

void globjects::Program::updateUniformBlockBindings ( ) const
protected

◆ addUniform()

void globjects::Program::addUniform ( std::unique_ptr< AbstractUniform > &&  uniform)
protected

◆ createProgram()

static gl::GLuint globjects::Program::createProgram ( )
staticprotected

◆ setUniformByIdentity()

template<typename T >
void globjects::Program::setUniformByIdentity ( const LocationIdentity identity,
const T &  value 
)
protected

◆ getUniformByIdentity() [1/2]

template<typename T >
Uniform< T > * globjects::Program::getUniformByIdentity ( const LocationIdentity identity)
protected

◆ getUniformByIdentity() [2/2]

template<typename T >
const Uniform< T > * globjects::Program::getUniformByIdentity ( const LocationIdentity identity) const
protected

◆ getUniformBlockByIdentity() [1/2]

UniformBlock * globjects::Program::getUniformBlockByIdentity ( const LocationIdentity identity)
protected

◆ getUniformBlockByIdentity() [2/2]

const UniformBlock * globjects::Program::getUniformBlockByIdentity ( const LocationIdentity identity) const
protected

Friends And Related Function Documentation

◆ UniformBlock

friend class UniformBlock
friend

◆ ProgramBinaryImplementation_GetProgramBinaryARB

friend class ProgramBinaryImplementation_GetProgramBinaryARB
friend

◆ ProgramBinaryImplementation_None

friend class ProgramBinaryImplementation_None
friend

Member Data Documentation

◆ m_shaderSubjects

std::set<Shader*> globjects::Program::m_shaderSubjects
protected

◆ m_programBinarySubjects

std::set<ProgramBinary*> globjects::Program::m_programBinarySubjects
protected

◆ m_pipelineListeners

std::set<ProgramPipeline *> globjects::Program::m_pipelineListeners
protected

◆ m_shaders

std::set<Shader *> globjects::Program::m_shaders
protected

◆ m_binary

std::unique_ptr<ProgramBinary> globjects::Program::m_binary
protected

◆ m_uniforms

std::unordered_map<LocationIdentity, std::unique_ptr<AbstractUniform> > globjects::Program::m_uniforms
protected

◆ m_uniformBlocks

std::unordered_map<LocationIdentity, UniformBlock> globjects::Program::m_uniformBlocks
protected

◆ m_linked

bool globjects::Program::m_linked
mutableprotected

◆ m_dirty

bool globjects::Program::m_dirty
mutableprotected

The documentation for this class was generated from the following file: