This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
LEFTONE/util/gleasy/shader.c

58 lines
1.4 KiB
C
Raw Permalink Normal View History

#include "./shader.h"
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <GL/glew.h>
#include "util/math/algorithm.h"
gleasy_shader_t gleasy_shader_new(
GLenum type,
const char* header, size_t header_len,
const char* src, size_t src_len) {
assert(header != NULL || header_len == 0);
assert(src != NULL || src_len == 0);
const GLuint shader = glCreateShader(type);
if (shader == 0) {
fprintf(stderr, "failed to create shader\n");
abort();
}
const GLchar* srcs[] = { header, src, };
const GLint lens[] = { header_len, src_len, };
const size_t offset = (header_len == 0? 1: 0);
glShaderSource(shader, 2-offset, srcs+offset, lens+offset);
glCompileShader(shader);
GLint ok;
glGetShaderiv(shader, GL_COMPILE_STATUS, &ok);
if (ok == GL_FALSE) {
char log[1024];
const int loglen =
gleasy_shader_get_log(shader, log, sizeof(log)/sizeof(log[0]));
fprintf(stderr, "failed to compile shader\n%.*s\n", loglen, log);
abort();
}
return shader;
}
size_t gleasy_shader_get_log(
gleasy_shader_t shader, char* dst, size_t maxlen) {
assert(shader != 0);
GLint len;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
if (dst == NULL) return len;
len = MATH_MIN(len, (GLint) maxlen);
if (len == 0) return 0;
glGetShaderInfoLog(shader, len, &len, (GLchar*) dst);
return len;
}