KiCad PCB EDA Suite
KIGFX::SHADER Class Reference

Class SHADER provides the access to the OpenGL shaders. More...

#include <shader.h>

Public Member Functions

 SHADER ()
 Constructor. More...
 
virtual ~SHADER ()
 Destructor. More...
 
template<typename... Args>
bool LoadShaderFromStrings (SHADER_TYPE aShaderType, Args &&...aArgs)
 Add a shader and compile the shader sources. More...
 
bool LoadShaderFromFile (SHADER_TYPE aShaderType, const std::string &aShaderSourceName)
 Loads one of the built-in shaders and compiles it. More...
 
bool Link ()
 Link the shaders. More...
 
bool IsLinked () const
 Returns true if shaders are linked correctly. More...
 
void Use ()
 Use the shader. More...
 
void Deactivate ()
 Deactivate the shader and use the default OpenGL program. More...
 
bool IsActive () const
 Returns the current state of the shader. More...
 
void ConfigureGeometryShader (GLuint maxVertices, GLuint geometryInputType, GLuint geometryOutputType)
 Configure the geometry shader - has to be done before linking! More...
 
int AddParameter (const std::string &aParameterName)
 Add a parameter to the parameter queue. More...
 
void SetParameter (int aParameterNumber, float aValue) const
 Set a parameter of the shader. More...
 
void SetParameter (int aParameterNumber, int aValue) const
 
void SetParameter (int aParameterNumber, float f0, float f1, float f2, float f3) const
 
int GetAttribute (const std::string &aAttributeName) const
 Gets an attribute location. More...
 

Static Public Member Functions

static std::string ReadSource (const std::string &aShaderSourceName)
 Read the shader source file. More...
 

Private Member Functions

bool loadShaderFromStringArray (SHADER_TYPE aShaderType, const char **aArray, size_t aSize)
 Compile vertex of fragment shader source code into the program. More...
 
void programInfo (GLuint aProgram)
 Get the shader program information. More...
 
void shaderInfo (GLuint aShader)
 Get the shader information. More...
 

Private Attributes

std::deque< GLuint > shaderNumbers
 Shader number list. More...
 
GLuint programNumber
 Shader program number. More...
 
bool isProgramCreated
 Flag for program creation. More...
 
bool isShaderLinked
 Is the shader linked? More...
 
bool active
 Is any of shaders used? More...
 
GLuint maximumVertices
 The maximum of vertices to be generated. More...
 
GLuint geomInputType
 Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.]. More...
 
GLuint geomOutputType
 Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.]. More...
 
std::deque< GLint > parameterLocation
 Location of the parameter. More...
 

Detailed Description

Class SHADER provides the access to the OpenGL shaders.

The purpose of this class is advanced drawing with OpenGL. One example is using the pixel shader for drawing exact circles or for anti-aliasing. This class supports vertex, geometry and fragment shaders.
Make sure that the hardware supports these features. This can be identified with the "GLEW" library.

Definition at line 74 of file shader.h.

Constructor & Destructor Documentation

SHADER::SHADER ( )

Constructor.

Definition at line 41 of file shader.cpp.

References programNumber.

41  :
42  isProgramCreated( false ),
43  isShaderLinked( false ),
44  active( false ),
45  maximumVertices( 4 ),
46  geomInputType( GL_LINES ),
47  geomOutputType( GL_LINES )
48 
49 {
50  // Do not have uninitialized members:
51  programNumber = 0;
52 }
GLuint geomInputType
Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:231
GLuint geomOutputType
Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:232
bool isShaderLinked
Is the shader linked?
Definition: shader.h:228
GLuint maximumVertices
The maximum of vertices to be generated.
Definition: shader.h:230
bool isProgramCreated
Flag for program creation.
Definition: shader.h:227
GLuint programNumber
Shader program number.
Definition: shader.h:226
bool active
Is any of shaders used?
Definition: shader.h:229
SHADER::~SHADER ( )
virtual

Destructor.

Definition at line 55 of file shader.cpp.

References active, Deactivate(), isProgramCreated, programNumber, and shaderNumbers.

56 {
57  if( active )
58  Deactivate();
59 
60  if( isProgramCreated )
61  {
62  // Delete the shaders and the program
63  for( std::deque<GLuint>::iterator it = shaderNumbers.begin();
64  it != shaderNumbers.end(); ++it )
65  {
66  GLuint shader = *it;
67 
68  if( glIsShader( shader ) )
69  {
70  glDetachShader( programNumber, shader );
71  glDeleteShader( shader );
72  }
73  }
74 
75  glDeleteProgram( programNumber );
76  }
77 }
std::deque< GLuint > shaderNumbers
Shader number list.
Definition: shader.h:225
void Deactivate()
Deactivate the shader and use the default OpenGL program.
Definition: shader.h:139
bool isProgramCreated
Flag for program creation.
Definition: shader.h:227
GLuint programNumber
Shader program number.
Definition: shader.h:226
bool active
Is any of shaders used?
Definition: shader.h:229

Member Function Documentation

int SHADER::AddParameter ( const std::string &  aParameterName)

Add a parameter to the parameter queue.

To communicate with the shader use this function to set up the names for the uniform variables. These are queued in a list and can be assigned with the SetParameter(..) method using the queue position.

Parameters
aParameterNameis the name of the parameter.
Returns
the added parameter location.

Definition at line 125 of file shader.cpp.

References parameterLocation, and programNumber.

Referenced by KIGFX::OPENGL_GAL::beginDrawing().

126 {
127  GLint location = glGetUniformLocation( programNumber, aParameterName.c_str() );
128 
129  if( location >= 0 )
130  parameterLocation.push_back( location );
131  else
132  throw std::runtime_error( "Could not find shader uniform: " + aParameterName );
133 
134  return parameterLocation.size() - 1;
135 }
GLuint programNumber
Shader program number.
Definition: shader.h:226
std::deque< GLint > parameterLocation
Location of the parameter.
Definition: shader.h:233
void SHADER::ConfigureGeometryShader ( GLuint  maxVertices,
GLuint  geometryInputType,
GLuint  geometryOutputType 
)

Configure the geometry shader - has to be done before linking!

Parameters
maxVerticesis the maximum of vertices to be generated.
geometryInputTypeis the input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.]
geometryOutputTypeis the output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.]

Definition at line 88 of file shader.cpp.

References geomInputType, geomOutputType, and maximumVertices.

90 {
91  maximumVertices = maxVertices;
92  geomInputType = geometryInputType;
93  geomOutputType = geometryOutputType;
94 }
GLuint geomInputType
Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:231
GLuint geomOutputType
Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:232
GLuint maximumVertices
The maximum of vertices to be generated.
Definition: shader.h:230
void KIGFX::SHADER::Deactivate ( )
inline

Deactivate the shader and use the default OpenGL program.

Definition at line 139 of file shader.h.

Referenced by KIGFX::OPENGL_GAL::beginDrawing(), KIGFX::GPU_CACHED_MANAGER::EndDrawing(), KIGFX::GPU_NONCACHED_MANAGER::EndDrawing(), and ~SHADER().

140  {
141  glUseProgram( 0 );
142  active = false;
143  }
bool active
Is any of shaders used?
Definition: shader.h:229
int SHADER::GetAttribute ( const std::string &  aAttributeName) const

Gets an attribute location.

Parameters
aAttributeNameis the name of the attribute.
Returns
the location.

Definition at line 161 of file shader.cpp.

References programNumber.

Referenced by KIGFX::GPU_MANAGER::SetShader().

162 {
163  return glGetAttribLocation( programNumber, aAttributeName.c_str() );
164 }
GLuint programNumber
Shader program number.
Definition: shader.h:226
bool KIGFX::SHADER::IsActive ( ) const
inline

Returns the current state of the shader.

Returns
True if any of shaders is enabled.

Definition at line 150 of file shader.h.

References aProgram.

151  {
152  return active;
153  }
bool active
Is any of shaders used?
Definition: shader.h:229
bool KIGFX::SHADER::IsLinked ( ) const
inline

Returns true if shaders are linked correctly.

Definition at line 122 of file shader.h.

Referenced by KIGFX::OPENGL_GAL::init().

123  {
124  return isShaderLinked;
125  }
bool isShaderLinked
Is the shader linked?
Definition: shader.h:228
bool SHADER::Link ( )

Link the shaders.

Returns
true in case of success, false otherwise.

Definition at line 97 of file shader.cpp.

References isShaderLinked, programInfo(), and programNumber.

Referenced by KIGFX::OPENGL_GAL::init().

98 {
99  // Shader linking
100  glLinkProgram( programNumber );
102 
103  // Check the Link state
104  glGetObjectParameterivARB( programNumber, GL_OBJECT_LINK_STATUS_ARB,
105  (GLint*) &isShaderLinked );
106 
107 #ifdef DEBUG
108  if( !isShaderLinked )
109  {
110  int maxLength;
111  glGetProgramiv( programNumber, GL_INFO_LOG_LENGTH, &maxLength );
112  maxLength = maxLength + 1;
113  char* linkInfoLog = new char[maxLength];
114  glGetProgramInfoLog( programNumber, maxLength, &maxLength, linkInfoLog );
115  std::cerr << "Shader linking error:" << std::endl;
116  std::cerr << linkInfoLog;
117  delete[] linkInfoLog;
118  }
119 #endif /* DEBUG */
120 
121  return isShaderLinked;
122 }
void programInfo(GLuint aProgram)
Get the shader program information.
Definition: shader.cpp:167
bool isShaderLinked
Is the shader linked?
Definition: shader.h:228
GLuint programNumber
Shader program number.
Definition: shader.h:226
bool SHADER::LoadShaderFromFile ( SHADER_TYPE  aShaderType,
const std::string &  aShaderSourceName 
)

Loads one of the built-in shaders and compiles it.

Parameters
aShaderSourceNameis the shader source file name.
aShaderTypeis the type of the shader.
Returns
True in case of success, false otherwise.

Definition at line 79 of file shader.cpp.

References LoadShaderFromStrings(), and ReadSource().

80 {
81  // Load shader sources
82  const std::string shaderSource = ReadSource( aShaderSourceName );
83 
84  return LoadShaderFromStrings( aShaderType, shaderSource );
85 }
bool LoadShaderFromStrings(SHADER_TYPE aShaderType, Args &&...aArgs)
Add a shader and compile the shader sources.
Definition: shader.h:97
static std::string ReadSource(const std::string &aShaderSourceName)
Read the shader source file.
Definition: shader.cpp:209
bool SHADER::loadShaderFromStringArray ( SHADER_TYPE  aShaderType,
const char **  aArray,
size_t  aSize 
)
private

Compile vertex of fragment shader source code into the program.

Definition at line 231 of file shader.cpp.

References geomInputType, geomOutputType, isProgramCreated, isShaderLinked, maximumVertices, programInfo(), programNumber, KIGFX::SHADER_TYPE_GEOMETRY, shaderInfo(), and shaderNumbers.

233 {
234  assert( !isShaderLinked );
235 
236  // Create the program
237  if( !isProgramCreated )
238  {
239  programNumber = glCreateProgram();
240  isProgramCreated = true;
241  }
242 
243  // Create a shader
244  GLuint shaderNumber = glCreateShader( aShaderType );
245  shaderNumbers.push_back( shaderNumber );
246 
247  // Get the program info
249 
250  // Attach the sources
251  glShaderSource( shaderNumber, aSize, (const GLchar**) aArray, NULL );
253 
254  // Compile and attach shader to the program
255  glCompileShader( shaderNumber );
256  GLint status;
257  glGetShaderiv( shaderNumber, GL_COMPILE_STATUS, &status );
258 
259  if( status != GL_TRUE )
260  {
261  shaderInfo( shaderNumber );
262 
263  GLint maxLength = 0;
264  glGetShaderiv( shaderNumber, GL_INFO_LOG_LENGTH, &maxLength );
265 
266  // The maxLength includes the NULL character
267  std::vector<GLchar> errorLog( (size_t) maxLength );
268  glGetShaderInfoLog( shaderNumber, maxLength, &maxLength, &errorLog[0] );
269 
270  // Provide the infolog in whatever manor you deem best.
271  // Exit with failure.
272  glDeleteShader( shaderNumber ); // Don't leak the shader.
273 
274  throw std::runtime_error( &errorLog[0] );
275  }
276 
277  glAttachShader( programNumber, shaderNumber );
279 
280  // Special handling for the geometry shader
281  if( aShaderType == SHADER_TYPE_GEOMETRY )
282  {
283  glProgramParameteriEXT( programNumber, GL_GEOMETRY_VERTICES_OUT_EXT, maximumVertices );
284  glProgramParameteriEXT( programNumber, GL_GEOMETRY_INPUT_TYPE_EXT, geomInputType );
285  glProgramParameteriEXT( programNumber, GL_GEOMETRY_OUTPUT_TYPE_EXT, geomOutputType );
286  }
287 
288  return true;
289 }
GLuint geomInputType
Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:231
GLuint geomOutputType
Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].
Definition: shader.h:232
void programInfo(GLuint aProgram)
Get the shader program information.
Definition: shader.cpp:167
bool isShaderLinked
Is the shader linked?
Definition: shader.h:228
GLuint maximumVertices
The maximum of vertices to be generated.
Definition: shader.h:230
std::deque< GLuint > shaderNumbers
Shader number list.
Definition: shader.h:225
void shaderInfo(GLuint aShader)
Get the shader information.
Definition: shader.cpp:188
Geometry shader.
Definition: shader.h:46
bool isProgramCreated
Flag for program creation.
Definition: shader.h:227
GLuint programNumber
Shader program number.
Definition: shader.h:226
template<typename... Args>
bool KIGFX::SHADER::LoadShaderFromStrings ( SHADER_TYPE  aShaderType,
Args &&...  aArgs 
)
inline

Add a shader and compile the shader sources.

Parameters
aArgsis the list of strings (std::string or convertible to const char*) which are concatenated and compiled as a single shader source code.
aShaderTypeis the type of the shader.
Returns
True in case of success, false otherwise.

Definition at line 97 of file shader.h.

References KIGFX::DETAIL::translateStringArg().

Referenced by KIGFX::OPENGL_GAL::init(), and LoadShaderFromFile().

98  {
99  const char* arr[] = { DETAIL::translateStringArg( aArgs )... };
100  return loadShaderFromStringArray( aShaderType, arr, sizeof...(Args) );
101  }
bool loadShaderFromStringArray(SHADER_TYPE aShaderType, const char **aArray, size_t aSize)
Compile vertex of fragment shader source code into the program.
Definition: shader.cpp:231
const char * translateStringArg(const std::string &str)
Definition: shader.h:51
void SHADER::programInfo ( GLuint  aProgram)
private

Get the shader program information.

Parameters
aProgramis the program number.

Definition at line 167 of file shader.cpp.

Referenced by Link(), and loadShaderFromStringArray().

168 {
169  GLint glInfoLogLength = 0;
170  GLint writtenChars = 0;
171 
172  // Get the length of the info string
173  glGetProgramiv( aProgram, GL_INFO_LOG_LENGTH, &glInfoLogLength );
174 
175  // Print the information
176  if( glInfoLogLength > 2 )
177  {
178  GLchar* glInfoLog = new GLchar[glInfoLogLength];
179  glGetProgramInfoLog( aProgram, glInfoLogLength, &writtenChars, glInfoLog );
180 
181  std::cerr << glInfoLog << std::endl;
182 
183  delete[] glInfoLog;
184  }
185 }
int PGM_BASE * aProgram
Definition: pcbnew.cpp:217
std::string SHADER::ReadSource ( const std::string &  aShaderSourceName)
static

Read the shader source file.

Parameters
aShaderSourceNameis the shader source file name.
Returns
the source as string

Definition at line 209 of file shader.cpp.

Referenced by LoadShaderFromFile().

210 {
211  // Open the shader source for reading
212  std::ifstream inputFile( aShaderSourceName.c_str(), std::ifstream::in );
213  std::string shaderSource;
214 
215  if( !inputFile )
216  throw std::runtime_error( "Can't read the shader source: " + aShaderSourceName );
217 
218  std::string shaderSourceLine;
219 
220  // Read all lines from the text file
221  while( getline( inputFile, shaderSourceLine ) )
222  {
223  shaderSource += shaderSourceLine;
224  shaderSource += "\n";
225  }
226 
227  return shaderSource;
228 }
void SHADER::SetParameter ( int  aParameterNumber,
float  aValue 
) const

Set a parameter of the shader.

Parameters
aParameterNumberis the number of the parameter.
aValueis the value of the parameter.

Definition at line 138 of file shader.cpp.

References parameterLocation.

Referenced by KIGFX::OPENGL_GAL::beginDrawing().

139 {
140  assert( (unsigned) parameterNumber < parameterLocation.size() );
141 
142  glUniform1f( parameterLocation[parameterNumber], value );
143 }
std::deque< GLint > parameterLocation
Location of the parameter.
Definition: shader.h:233
void SHADER::SetParameter ( int  aParameterNumber,
int  aValue 
) const

Definition at line 146 of file shader.cpp.

References parameterLocation.

147 {
148  assert( (unsigned) parameterNumber < parameterLocation.size() );
149 
150  glUniform1i( parameterLocation[parameterNumber], value );
151 }
std::deque< GLint > parameterLocation
Location of the parameter.
Definition: shader.h:233
void SHADER::SetParameter ( int  aParameterNumber,
float  f0,
float  f1,
float  f2,
float  f3 
) const

Definition at line 153 of file shader.cpp.

References parameterLocation.

154 {
155  assert( (unsigned)parameterNumber < parameterLocation.size() );
156  float arr[4] = { f0, f1, f2, f3 };
157  glUniform4fv( parameterLocation[parameterNumber], 1, arr );
158 }
std::deque< GLint > parameterLocation
Location of the parameter.
Definition: shader.h:233
void SHADER::shaderInfo ( GLuint  aShader)
private

Get the shader information.

Parameters
aShaderis the shader number.

Definition at line 188 of file shader.cpp.

Referenced by loadShaderFromStringArray().

189 {
190  GLint glInfoLogLength = 0;
191  GLint writtenChars = 0;
192 
193  // Get the length of the info string
194  glGetShaderiv( aShader, GL_INFO_LOG_LENGTH, &glInfoLogLength );
195 
196  // Print the information
197  if( glInfoLogLength > 2 )
198  {
199  GLchar* glInfoLog = new GLchar[glInfoLogLength];
200  glGetShaderInfoLog( aShader, glInfoLogLength, &writtenChars, glInfoLog );
201 
202  std::cerr << glInfoLog << std::endl;
203 
204  delete[] glInfoLog;
205  }
206 }
void KIGFX::SHADER::Use ( )
inline

Use the shader.

Definition at line 130 of file shader.h.

Referenced by KIGFX::OPENGL_GAL::beginDrawing(), KIGFX::GPU_CACHED_MANAGER::EndDrawing(), and KIGFX::GPU_NONCACHED_MANAGER::EndDrawing().

131  {
132  glUseProgram( programNumber );
133  active = true;
134  }
GLuint programNumber
Shader program number.
Definition: shader.h:226
bool active
Is any of shaders used?
Definition: shader.h:229

Member Data Documentation

bool KIGFX::SHADER::active
private

Is any of shaders used?

Definition at line 229 of file shader.h.

Referenced by ~SHADER().

GLuint KIGFX::SHADER::geomInputType
private

Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].

Definition at line 231 of file shader.h.

Referenced by ConfigureGeometryShader(), and loadShaderFromStringArray().

GLuint KIGFX::SHADER::geomOutputType
private

Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.].

Definition at line 232 of file shader.h.

Referenced by ConfigureGeometryShader(), and loadShaderFromStringArray().

bool KIGFX::SHADER::isProgramCreated
private

Flag for program creation.

Definition at line 227 of file shader.h.

Referenced by loadShaderFromStringArray(), and ~SHADER().

bool KIGFX::SHADER::isShaderLinked
private

Is the shader linked?

Definition at line 228 of file shader.h.

Referenced by Link(), and loadShaderFromStringArray().

GLuint KIGFX::SHADER::maximumVertices
private

The maximum of vertices to be generated.

Definition at line 230 of file shader.h.

Referenced by ConfigureGeometryShader(), and loadShaderFromStringArray().

std::deque<GLint> KIGFX::SHADER::parameterLocation
private

Location of the parameter.

Definition at line 233 of file shader.h.

Referenced by AddParameter(), and SetParameter().

GLuint KIGFX::SHADER::programNumber
private

Shader program number.

Definition at line 226 of file shader.h.

Referenced by AddParameter(), GetAttribute(), Link(), loadShaderFromStringArray(), SHADER(), and ~SHADER().

std::deque<GLuint> KIGFX::SHADER::shaderNumbers
private

Shader number list.

Definition at line 225 of file shader.h.

Referenced by loadShaderFromStringArray(), and ~SHADER().


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