mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
156 lines
3.6 KiB
C
156 lines
3.6 KiB
C
//
|
|
// Book: OpenGL(R) ES 2.0 Programming Guide
|
|
// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner
|
|
// ISBN-10: 0321502795
|
|
// ISBN-13: 9780321502797
|
|
// Publisher: Addison-Wesley Professional
|
|
// URLs: http://safari.informit.com/9780321563835
|
|
// http://www.opengles-book.com
|
|
//
|
|
|
|
// ESShader.c
|
|
//
|
|
// Utility functions for loading shaders and creating program objects.
|
|
//
|
|
|
|
///
|
|
// Includes
|
|
//
|
|
#include "esUtil.h"
|
|
#include <stdlib.h>
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
// Private Functions
|
|
//
|
|
//
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
// Public Functions
|
|
//
|
|
//
|
|
|
|
//
|
|
///
|
|
/// \brief Load a shader, check for compile errors, print error messages to output log
|
|
/// \param type Type of shader (GL_VERTEX_SHADER or GL_FRAGMENT_SHADER)
|
|
/// \param shaderSrc Shader source string
|
|
/// \return A new shader object on success, 0 on failure
|
|
//
|
|
GLuint ESUTIL_API esLoadShader ( GLenum type, const char *shaderSrc )
|
|
{
|
|
GLuint shader;
|
|
GLint compiled;
|
|
|
|
// Create the shader object
|
|
shader = glCreateShader ( type );
|
|
|
|
if ( shader == 0 )
|
|
return 0;
|
|
|
|
// Load the shader source
|
|
glShaderSource ( shader, 1, &shaderSrc, NULL );
|
|
|
|
// Compile the shader
|
|
glCompileShader ( shader );
|
|
|
|
// Check the compile status
|
|
glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );
|
|
|
|
if ( !compiled )
|
|
{
|
|
GLint infoLen = 0;
|
|
|
|
glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
|
|
|
|
if ( infoLen > 1 )
|
|
{
|
|
char* infoLog = malloc (sizeof(char) * infoLen );
|
|
|
|
glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
|
|
esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
|
|
|
|
free ( infoLog );
|
|
}
|
|
|
|
glDeleteShader ( shader );
|
|
return 0;
|
|
}
|
|
|
|
return shader;
|
|
|
|
}
|
|
|
|
|
|
//
|
|
///
|
|
/// \brief Load a vertex and fragment shader, create a program object, link program.
|
|
// Errors output to log.
|
|
/// \param vertShaderSrc Vertex shader source code
|
|
/// \param fragShaderSrc Fragment shader source code
|
|
/// \return A new program object linked with the vertex/fragment shader pair, 0 on failure
|
|
//
|
|
GLuint ESUTIL_API esLoadProgram ( const char *vertShaderSrc, const char *fragShaderSrc )
|
|
{
|
|
GLuint vertexShader;
|
|
GLuint fragmentShader;
|
|
GLuint programObject;
|
|
GLint linked;
|
|
|
|
// Load the vertex/fragment shaders
|
|
vertexShader = esLoadShader ( GL_VERTEX_SHADER, vertShaderSrc );
|
|
if ( vertexShader == 0 )
|
|
return 0;
|
|
|
|
fragmentShader = esLoadShader ( GL_FRAGMENT_SHADER, fragShaderSrc );
|
|
if ( fragmentShader == 0 )
|
|
{
|
|
glDeleteShader( vertexShader );
|
|
return 0;
|
|
}
|
|
|
|
// Create the program object
|
|
programObject = glCreateProgram ( );
|
|
|
|
if ( programObject == 0 )
|
|
return 0;
|
|
|
|
glAttachShader ( programObject, vertexShader );
|
|
glAttachShader ( programObject, fragmentShader );
|
|
|
|
// Link the program
|
|
glLinkProgram ( programObject );
|
|
|
|
// Check the link status
|
|
glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
|
|
|
|
if ( !linked )
|
|
{
|
|
GLint infoLen = 0;
|
|
|
|
glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
|
|
|
|
if ( infoLen > 1 )
|
|
{
|
|
char* infoLog = malloc (sizeof(char) * infoLen );
|
|
|
|
glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
|
|
esLogMessage ( "Error linking program:\n%s\n", infoLog );
|
|
|
|
free ( infoLog );
|
|
}
|
|
|
|
glDeleteProgram ( programObject );
|
|
return 0;
|
|
}
|
|
|
|
// Free up no longer needed shader resources
|
|
glDeleteShader ( vertexShader );
|
|
glDeleteShader ( fragmentShader );
|
|
|
|
return programObject;
|
|
}
|