Browse Source

Merge pull request #2 from tsoding/remove-glew

Remove GLEW dependency
Alexey Kutepov 4 years ago
parent
commit
1de61011e4
5 changed files with 82 additions and 25 deletions
  1. 2 2
      Makefile
  2. 2 2
      build_msvc.bat
  3. 70 0
      glextloader.c
  4. 8 12
      main.c
  5. 0 9
      setup_glfw.bat

+ 2 - 2
Makefile

@@ -1,6 +1,6 @@
-GL_PKGS=glfw3 glew
+PKGS=glfw3 gl
 CFLAGS=-Wall -Wextra -ggdb
 CFLAGS=-Wall -Wextra -ggdb
 
 
 main: main.c
 main: main.c
-	$(CC) $(CFLAGS) `pkg-config --cflags $(GL_PKGS)` -o main main.c `pkg-config --libs $(GL_PKGS)` -lm
+	$(CC) $(CFLAGS) `pkg-config --cflags $(PKGS)` -o main main.c `pkg-config --libs $(PKGS)` -lm
 
 

+ 2 - 2
build_msvc.bat

@@ -2,7 +2,7 @@
 rem launch this from msvc-enabled console
 rem launch this from msvc-enabled console
 
 
 set CFLAGS=/std:c11 /O2 /FC /W4 /WX /Zl /D_USE_MATH_DEFINES /wd4996 /nologo
 set CFLAGS=/std:c11 /O2 /FC /W4 /WX /Zl /D_USE_MATH_DEFINES /wd4996 /nologo
-set INCLUDES=/I Dependencies\GLFW\include /I Dependencies\GLEW\include
-set LIBS=Dependencies\GLFW\lib\glfw3.lib Dependencies\GLEW\lib\glew32s.lib opengl32.lib User32.lib Gdi32.lib Shell32.lib
+set INCLUDES=/I Dependencies\GLFW\include
+set LIBS=Dependencies\GLFW\lib\glfw3.lib opengl32.lib User32.lib Gdi32.lib Shell32.lib
 
 
 cl.exe %CFLAGS% %INCLUDES% /Fe"main.exe" ./main.c %LIBS% /link /NODEFAULTLIB:libcmt.lib
 cl.exe %CFLAGS% %INCLUDES% /Fe"main.exe" ./main.c %LIBS% /link /NODEFAULTLIB:libcmt.lib

+ 70 - 0
glextloader.c

@@ -0,0 +1,70 @@
+static PFNGLCREATESHADERPROC glCreateShader = NULL;
+static PFNGLSHADERSOURCEPROC glShaderSource = NULL;
+static PFNGLCOMPILESHADERPROC glCompileShader = NULL;
+static PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
+static PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL;
+static PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
+static PFNGLATTACHSHADERPROC glAttachShader = NULL;
+static PFNGLLINKPROGRAMPROC glLinkProgram = NULL;
+static PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL;
+static PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL;
+static PFNGLDELETESHADERPROC glDeleteShader = NULL;
+static PFNGLUSEPROGRAMPROC glUseProgram = NULL;
+static PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
+static PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
+static PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback = NULL;
+static PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL;
+static PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL;
+static PFNGLUNIFORM2FPROC glUniform2f = NULL;
+static PFNGLGENBUFFERSPROC glGenBuffers = NULL;
+static PFNGLBINDBUFFERPROC glBindBuffer = NULL;
+static PFNGLBUFFERDATAPROC glBufferData = NULL;
+static PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL;
+static PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
+static PFNGLUNIFORM1FPROC glUniform1f = NULL;
+static PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL;
+static PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced = NULL;
+
+static void load_gl_extensions(void)
+{
+    // TODO: check for failtures?
+    // Maybe some of the functions are not available
+    glCreateShader            = (PFNGLCREATESHADERPROC) glfwGetProcAddress("glCreateShader");
+    glShaderSource            = (PFNGLSHADERSOURCEPROC) glfwGetProcAddress("glShaderSource");
+    glCompileShader           = (PFNGLCOMPILESHADERPROC) glfwGetProcAddress("glCompileShader");
+    glGetShaderiv             = (PFNGLGETSHADERIVPROC) glfwGetProcAddress("glGetShaderiv");
+    glGetShaderInfoLog        = (PFNGLGETSHADERINFOLOGPROC) glfwGetProcAddress("glGetShaderInfoLog");
+    glAttachShader            = (PFNGLATTACHSHADERPROC) glfwGetProcAddress("glAttachShader");
+    glCreateProgram           = (PFNGLCREATEPROGRAMPROC) glfwGetProcAddress("glCreateProgram");
+    glLinkProgram             = (PFNGLLINKPROGRAMPROC) glfwGetProcAddress("glLinkProgram");
+    glGetProgramiv            = (PFNGLGETPROGRAMIVPROC) glfwGetProcAddress("glGetProgramiv");
+    glGetProgramInfoLog       = (PFNGLGETPROGRAMINFOLOGPROC) glfwGetProcAddress("glGetProgramInfoLog");
+    glDeleteShader            = (PFNGLDELETESHADERPROC) glfwGetProcAddress("glDeleteShader");
+    glUseProgram              = (PFNGLUSEPROGRAMPROC) glfwGetProcAddress("glUseProgram");
+    glGenVertexArrays         = (PFNGLGENVERTEXARRAYSPROC) glfwGetProcAddress("glGenVertexArrays");
+    glBindVertexArray         = (PFNGLBINDVERTEXARRAYPROC) glfwGetProcAddress("glBindVertexArray");
+    glDeleteProgram           = (PFNGLDELETEPROGRAMPROC) glfwGetProcAddress("glDeleteProgram");
+    glGetUniformLocation      = (PFNGLGETUNIFORMLOCATIONPROC) glfwGetProcAddress("glGetUniformLocation");
+    glUniform2f               = (PFNGLUNIFORM2FPROC) glfwGetProcAddress("glUniform2f");
+    glGenBuffers              = (PFNGLGENBUFFERSPROC) glfwGetProcAddress("glGenBuffers");
+    glBindBuffer              = (PFNGLBINDBUFFERPROC) glfwGetProcAddress("glBindBuffer");
+    glBufferData              = (PFNGLBUFFERDATAPROC) glfwGetProcAddress("glBufferData");
+    glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) glfwGetProcAddress("glEnableVertexAttribArray");
+    glVertexAttribPointer     = (PFNGLVERTEXATTRIBPOINTERPROC) glfwGetProcAddress("glVertexAttribPointer");
+    glUniform1f               = (PFNGLUNIFORM1FPROC) glfwGetProcAddress("glUniform1f");
+    glBufferSubData           = (PFNGLBUFFERSUBDATAPROC) glfwGetProcAddress("glBufferSubData");
+
+    if (glfwExtensionSupported("GL_ARB_debug_output")) {
+        fprintf(stderr, "INFO: ARB_debug_output is supported\n");
+        glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) glfwGetProcAddress("glDebugMessageCallback");
+    } else {
+        fprintf(stderr, "WARN: ARB_debug_output is NOT supported\n");
+    }
+
+    if (glfwExtensionSupported("GL_EXT_draw_instanced")) {
+        fprintf(stderr, "INFO: EXT_draw_instanced is supported\n");
+        glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) glfwGetProcAddress("glDrawArraysInstanced");
+    } else {
+        fprintf(stderr, "WARN: EXT_draw_instanced is NOT supported\n");
+    }
+}

+ 8 - 12
main.c

@@ -7,16 +7,13 @@
 #include <errno.h>
 #include <errno.h>
 #include <math.h>
 #include <math.h>
 
 
-#define GLEW_STATIC
-#include <GL/glew.h>
-
-#define GL_GLEXT_PROTOTYPES
 #include <GLFW/glfw3.h>
 #include <GLFW/glfw3.h>
 
 
 #define DEFAULT_SCREEN_WIDTH 1600
 #define DEFAULT_SCREEN_WIDTH 1600
 #define DEFAULT_SCREEN_HEIGHT 900
 #define DEFAULT_SCREEN_HEIGHT 900
 #define MANUAL_TIME_STEP 0.1
 #define MANUAL_TIME_STEP 0.1
 
 
+#include "glextloader.c"
 
 
 char *slurp_file(const char *file_path)
 char *slurp_file(const char *file_path)
 {
 {
@@ -254,18 +251,17 @@ int main()
 
 
     glfwMakeContextCurrent(window);
     glfwMakeContextCurrent(window);
 
 
-    if (GLEW_OK != glewInit()) {
-        fprintf(stderr, "Could not initialize GLEW!\n");
-        exit(1);
-    }
+    load_gl_extensions();
 
 
-    if (!GLEW_EXT_draw_instanced) {
+    if (glDrawArraysInstanced == NULL) {
         fprintf(stderr, "Support for EXT_draw_instanced is required!\n");
         fprintf(stderr, "Support for EXT_draw_instanced is required!\n");
         exit(1);
         exit(1);
     }
     }
 
 
-    glEnable(GL_DEBUG_OUTPUT);
-    glDebugMessageCallback(MessageCallback, 0);
+    if (glDebugMessageCallback != NULL) {
+        glEnable(GL_DEBUG_OUTPUT);
+        glDebugMessageCallback(MessageCallback, 0);
+    }
 
 
     glEnable(GL_BLEND);
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -289,7 +285,7 @@ int main()
             double xpos, ypos;
             double xpos, ypos;
             glfwGetCursorPos(window, &xpos, &ypos);
             glfwGetCursorPos(window, &xpos, &ypos);
             glUniform2f(main_uniforms[MOUSE_UNIFORM], xpos, height - ypos);
             glUniform2f(main_uniforms[MOUSE_UNIFORM], xpos, height - ypos);
-            glDrawArraysInstancedEXT(GL_TRIANGLE_STRIP, 0, 4, 1);
+            glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1);
         }
         }
 
 
         glfwSwapBuffers(window);
         glfwSwapBuffers(window);

+ 0 - 9
setup_glfw.bat

@@ -8,12 +8,3 @@ mkdir Dependencies\GLFW\include\GLFW
 move glfw-3.3.2.bin.WIN64\include\GLFW\glfw3.h Dependencies\GLFW\include\GLFW\glfw3.h
 move glfw-3.3.2.bin.WIN64\include\GLFW\glfw3.h Dependencies\GLFW\include\GLFW\glfw3.h
 del glfw-3.3.2.bin.WIN64.zip
 del glfw-3.3.2.bin.WIN64.zip
 rmdir /s /q glfw-3.3.2.bin.WIN64
 rmdir /s /q glfw-3.3.2.bin.WIN64
-
-curl -fsSL -o glew-2.1.0-win32.zip https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0-win32.zip/download
-tar -xf glew-2.1.0-win32.zip
-mkdir Dependencies\GLEW\lib\
-move glew-2.1.0\lib\Release\x64\glew32s.lib Dependencies\GLEW\lib\glew32s.lib
-mkdir Dependencies\GLEW\include\GL\
-move glew-2.1.0\include\GL\glew.h Dependencies\GLEW\include\GL\glew.h
-del glew-2.1.0-win32.zip
-rmdir /s /q glew-2.1.0