2016-07-16 02:17:27 +00:00
|
|
|
#include "shader.h"
|
2016-08-08 10:43:51 +00:00
|
|
|
#include "../util.h"
|
2016-07-16 02:17:27 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
GLuint compileShader(GLenum type, const char* source) {
|
|
|
|
GLuint shader = glCreateShader(type);
|
|
|
|
|
|
|
|
glShaderSource(shader, 1, (const GLchar**)&source, NULL);
|
|
|
|
glCompileShader(shader);
|
|
|
|
|
|
|
|
int isShaderCompiled;
|
|
|
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &isShaderCompiled);
|
|
|
|
if(!isShaderCompiled) {
|
|
|
|
int logLength;
|
|
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
|
|
|
|
|
|
|
|
char* log = (char*) malloc(logLength);
|
|
|
|
glGetShaderInfoLog(shader, logLength, &logLength, log);
|
|
|
|
error(log);
|
|
|
|
}
|
|
|
|
|
|
|
|
return shader;
|
|
|
|
}
|
|
|
|
|
|
|
|
GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader) {
|
|
|
|
GLuint shader = glCreateProgram();
|
|
|
|
|
|
|
|
if (vertexShader) {
|
|
|
|
glAttachShader(shader, vertexShader);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fragmentShader) {
|
|
|
|
glAttachShader(shader, fragmentShader);
|
|
|
|
}
|
|
|
|
|
|
|
|
glLinkProgram(shader);
|
|
|
|
|
|
|
|
int isShaderLinked;
|
|
|
|
glGetProgramiv(shader, GL_LINK_STATUS, (int*)&isShaderLinked);
|
|
|
|
if(!isShaderLinked) {
|
|
|
|
int logLength;
|
|
|
|
glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &logLength);
|
|
|
|
|
|
|
|
char* log = (char*) malloc(logLength);
|
|
|
|
glGetProgramInfoLog(shader, logLength, &logLength, log);
|
|
|
|
error(log);
|
|
|
|
}
|
|
|
|
|
2016-08-08 20:23:40 +00:00
|
|
|
glDetachShader(shader, vertexShader);
|
2016-07-16 02:17:27 +00:00
|
|
|
glDeleteShader(vertexShader);
|
2016-08-08 20:23:40 +00:00
|
|
|
glDetachShader(shader, fragmentShader);
|
2016-07-16 02:17:27 +00:00
|
|
|
glDeleteShader(fragmentShader);
|
|
|
|
|
|
|
|
return shader;
|
|
|
|
}
|
2016-08-03 04:24:18 +00:00
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrShaderDestroy(Shader* shader) {
|
|
|
|
glDeleteProgram(shader->id);
|
|
|
|
free(shader);
|
|
|
|
}
|