nuclear@35: #include "opengl.h" elene@22: elene@22: #include elene@22: #include elene@22: #include elene@22: #include elene@22: elene@22: #include "sdr.h" elene@22: elene@22: char* sdr_load(const char* fname) elene@22: { elene@22: if(!fname) { elene@22: return 0; elene@22: } elene@22: elene@22: FILE *fp; elene@22: int ctr = 0; elene@22: elene@22: if(!(fp = fopen(fname, "rb"))) { elene@22: fprintf(stderr, "Failed to open file %s: %s\n", fname, strerror(errno)); elene@22: return 0; elene@22: } elene@22: fseek(fp, 0, SEEK_END); elene@22: ctr = ftell(fp); elene@22: rewind(fp); elene@22: elene@22: char *glsl; elene@22: if(!(glsl = (char*) malloc(ctr + 1))) { elene@22: perror("Failed to allocate memory"); elene@22: return 0; elene@22: } elene@22: fread(glsl, 1, ctr, fp); elene@22: fclose(fp); elene@22: elene@22: glsl[ctr] = 0; elene@22: elene@22: return glsl; elene@22: } elene@22: elene@22: bool sdr_compile(unsigned int sdr) elene@22: { elene@22: int status, loglen; elene@22: char infolog[512]; elene@22: elene@22: glCompileShader(sdr); elene@22: glGetShaderiv(sdr, GL_COMPILE_STATUS, &status); elene@22: glGetShaderInfoLog(sdr, sizeof infolog, &loglen, infolog); elene@22: if(status == GL_FALSE) { elene@22: fprintf(stderr, "Failed to compile shader: %s\n", infolog); elene@22: return false; elene@22: } else if(loglen) { elene@22: fprintf(stderr, "%s\n", infolog); elene@22: } elene@22: return true; elene@22: } elene@22: elene@22: unsigned int sdr_getprog(const char* vfname, const char* ffname) elene@22: { elene@22: char *vsdr_glsl = NULL; elene@22: char *fsdr_glsl = NULL; elene@22: elene@22: GLuint vsdr; GLuint fsdr; elene@22: vsdr = glCreateShader(GL_VERTEX_SHADER); elene@22: fsdr = glCreateShader(GL_FRAGMENT_SHADER); elene@22: elene@22: if(!(vsdr_glsl = sdr_load(vfname))) elene@22: return 0; elene@22: if(!(fsdr_glsl = sdr_load(ffname))) elene@22: return 0; elene@22: elene@22: glShaderSource(vsdr, 1, (const GLchar**)&vsdr_glsl, NULL); elene@22: glShaderSource(fsdr, 1, (const GLchar**)&fsdr_glsl, NULL); elene@22: elene@22: free(vsdr_glsl); elene@22: free(fsdr_glsl); elene@22: elene@22: if(!sdr_compile(vsdr)) { elene@22: fprintf(stderr, "Shader %s failed to compile.\n", vfname); elene@22: return 0; elene@22: } elene@22: if(!sdr_compile(fsdr)) { elene@22: fprintf(stderr, "Shader %s failed to compile.\n", ffname); elene@22: return 0; elene@22: } elene@22: elene@22: unsigned int sprog; elene@22: int status, loglen; elene@22: char infolog[512]; elene@22: elene@22: sprog = glCreateProgram(); elene@22: glAttachShader(sprog, vsdr); elene@22: glAttachShader(sprog, fsdr); elene@22: glLinkProgram(sprog); elene@22: glGetProgramiv(sprog, GL_LINK_STATUS, &status); elene@22: glGetProgramInfoLog(sprog, sizeof infolog, &loglen, infolog); elene@22: if(status == GL_FALSE) { elene@22: fprintf(stderr, "Error while linking shader program:\n%s\n", infolog); elene@22: return 0; elene@22: } else if(loglen) { elene@22: fprintf(stderr, "%s\n", infolog); elene@22: } elene@22: return sprog; elene@22: }