glh.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /** OpenGL helper functions */
  2. #include "glh.h"
  3. #include "mem.h"
  4. #include "monolog.h"
  5. GLuint glh_shader_make(GLenum type, char * data) {
  6. const GLchar * gldata = (const GLchar *) data;
  7. GLint status;
  8. GLuint shader = glCreateShader(type);
  9. glShaderSource(shader, 1, &gldata, NULL);
  10. glCompileShader(shader);
  11. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  12. if (status == GL_FALSE) {
  13. GLint logsize;
  14. const char *typename = "unknown";
  15. GLchar *log;
  16. glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logsize);
  17. log = mem_alloc(logsize);
  18. glGetShaderInfoLog(shader, logsize, NULL, log);
  19. switch(type) {
  20. case GL_VERTEX_SHADER: typename = "vertex"; break;
  21. case GL_GEOMETRY_SHADER: typename = "geometry"; break;
  22. case GL_FRAGMENT_SHADER: typename = "fragment"; break;
  23. }
  24. LOG_ERROR("Compile failure in %s shader:\n%s\n", typename, log);
  25. mem_free(log);
  26. }
  27. return shader;
  28. }
  29. GLuint gl_program_make(GLuint * shaders, int amount) {
  30. GLint status;
  31. int index;
  32. GLuint program = glCreateProgram();
  33. for(index = 0; index < amount; index++) {
  34. glAttachShader(program, shaders[index]);
  35. }
  36. glLinkProgram(program);
  37. glGetProgramiv(program, GL_LINK_STATUS, &status);
  38. if (status == GL_FALSE) {
  39. GLint logsize;
  40. GLchar *log;
  41. glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logsize);
  42. log = mem_alloc(logsize);
  43. glGetProgramInfoLog(program, logsize, NULL, log);
  44. LOG_ERROR("Linker failure: %s\n", log);
  45. mem_free(log);
  46. }
  47. for(index = 0; index < amount; index++) {
  48. glDetachShader(program, shaders[index]);
  49. }
  50. return program;
  51. }