1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-08 23:23:38 +00:00
lovr/src/graphics/shader.c
2016-08-09 23:28:17 -07:00

61 lines
1.4 KiB
C

#include "shader.h"
#include "../util.h"
#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);
}
glDetachShader(shader, vertexShader);
glDeleteShader(vertexShader);
glDetachShader(shader, fragmentShader);
glDeleteShader(fragmentShader);
return shader;
}
void lovrShaderDestroy(Shader* shader) {
glDeleteProgram(shader->id);
free(shader);
}