glextloader.c 5.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. static PFNGLCREATESHADERPROC glCreateShader = NULL;
  2. static PFNGLSHADERSOURCEPROC glShaderSource = NULL;
  3. static PFNGLCOMPILESHADERPROC glCompileShader = NULL;
  4. static PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
  5. static PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL;
  6. static PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
  7. static PFNGLATTACHSHADERPROC glAttachShader = NULL;
  8. static PFNGLLINKPROGRAMPROC glLinkProgram = NULL;
  9. static PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL;
  10. static PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL;
  11. static PFNGLDELETESHADERPROC glDeleteShader = NULL;
  12. static PFNGLUSEPROGRAMPROC glUseProgram = NULL;
  13. static PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
  14. static PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
  15. static PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback = NULL;
  16. static PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL;
  17. static PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL;
  18. static PFNGLUNIFORM2FPROC glUniform2f = NULL;
  19. static PFNGLGENBUFFERSPROC glGenBuffers = NULL;
  20. static PFNGLBINDBUFFERPROC glBindBuffer = NULL;
  21. static PFNGLBUFFERDATAPROC glBufferData = NULL;
  22. static PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL;
  23. static PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
  24. static PFNGLUNIFORM1FPROC glUniform1f = NULL;
  25. static PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL;
  26. static PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced = NULL;
  27. static PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
  28. static PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
  29. static PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
  30. static PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
  31. static PFNGLUNIFORM1IPROC glUniform1i = NULL;
  32. static PFNGLDRAWBUFFERSPROC glDrawBuffers = NULL;
  33. static PFNGLUNIFORM4FPROC glUniform4f = NULL;
  34. // TODO: there is something fishy with Windows gl.h header
  35. // Let's try to ship our own gl.h just like glext.h
  36. #ifdef _WIN32
  37. static PFNGLACTIVETEXTUREPROC glActiveTexture = NULL;
  38. #endif // _WIN32
  39. static void load_gl_extensions(void)
  40. {
  41. // TODO: check for failtures?
  42. // Maybe some of the functions are not available
  43. glCreateShader = (PFNGLCREATESHADERPROC) glfwGetProcAddress("glCreateShader");
  44. glShaderSource = (PFNGLSHADERSOURCEPROC) glfwGetProcAddress("glShaderSource");
  45. glCompileShader = (PFNGLCOMPILESHADERPROC) glfwGetProcAddress("glCompileShader");
  46. glGetShaderiv = (PFNGLGETSHADERIVPROC) glfwGetProcAddress("glGetShaderiv");
  47. glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) glfwGetProcAddress("glGetShaderInfoLog");
  48. glAttachShader = (PFNGLATTACHSHADERPROC) glfwGetProcAddress("glAttachShader");
  49. glCreateProgram = (PFNGLCREATEPROGRAMPROC) glfwGetProcAddress("glCreateProgram");
  50. glLinkProgram = (PFNGLLINKPROGRAMPROC) glfwGetProcAddress("glLinkProgram");
  51. glGetProgramiv = (PFNGLGETPROGRAMIVPROC) glfwGetProcAddress("glGetProgramiv");
  52. glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) glfwGetProcAddress("glGetProgramInfoLog");
  53. glDeleteShader = (PFNGLDELETESHADERPROC) glfwGetProcAddress("glDeleteShader");
  54. glUseProgram = (PFNGLUSEPROGRAMPROC) glfwGetProcAddress("glUseProgram");
  55. glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) glfwGetProcAddress("glGenVertexArrays");
  56. glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) glfwGetProcAddress("glBindVertexArray");
  57. glDeleteProgram = (PFNGLDELETEPROGRAMPROC) glfwGetProcAddress("glDeleteProgram");
  58. glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) glfwGetProcAddress("glGetUniformLocation");
  59. glUniform2f = (PFNGLUNIFORM2FPROC) glfwGetProcAddress("glUniform2f");
  60. glGenBuffers = (PFNGLGENBUFFERSPROC) glfwGetProcAddress("glGenBuffers");
  61. glBindBuffer = (PFNGLBINDBUFFERPROC) glfwGetProcAddress("glBindBuffer");
  62. glBufferData = (PFNGLBUFFERDATAPROC) glfwGetProcAddress("glBufferData");
  63. glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) glfwGetProcAddress("glEnableVertexAttribArray");
  64. glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) glfwGetProcAddress("glVertexAttribPointer");
  65. glUniform1f = (PFNGLUNIFORM1FPROC) glfwGetProcAddress("glUniform1f");
  66. glBufferSubData = (PFNGLBUFFERSUBDATAPROC) glfwGetProcAddress("glBufferSubData");
  67. glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) glfwGetProcAddress("glGenFramebuffers");
  68. glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) glfwGetProcAddress("glBindFramebuffer");
  69. glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) glfwGetProcAddress("glFramebufferTexture2D");
  70. glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) glfwGetProcAddress("glCheckFramebufferStatus");
  71. glUniform1i = (PFNGLUNIFORM1IPROC) glfwGetProcAddress("glUniform1i");
  72. glDrawBuffers = (PFNGLDRAWBUFFERSPROC) glfwGetProcAddress("glDrawBuffers");
  73. glUniform4f = (PFNGLUNIFORM4FPROC) glfwGetProcAddress("glUniform4f");
  74. #ifdef _WIN32
  75. glActiveTexture = (PFNGLACTIVETEXTUREPROC) glfwGetProcAddress("glActiveTexture");
  76. #endif // _WIN32
  77. if (glfwExtensionSupported("GL_ARB_debug_output")) {
  78. fprintf(stderr, "INFO: ARB_debug_output is supported\n");
  79. glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) glfwGetProcAddress("glDebugMessageCallback");
  80. } else {
  81. fprintf(stderr, "WARN: ARB_debug_output is NOT supported\n");
  82. }
  83. if (glfwExtensionSupported("GL_EXT_draw_instanced")) {
  84. fprintf(stderr, "INFO: EXT_draw_instanced is supported\n");
  85. glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) glfwGetProcAddress("glDrawArraysInstanced");
  86. } else {
  87. fprintf(stderr, "WARN: EXT_draw_instanced is NOT supported\n");
  88. }
  89. }