WIP on configurable OpenGL loader. (#2001, #2002)

This commit is contained in:
Jérémie Dumas 2018-08-04 10:09:56 -04:00 committed by omar
parent af50ebe7b6
commit e476b7e727
4 changed files with 67 additions and 20 deletions

View File

@ -18,17 +18,28 @@ EXE = example_glfw_opengl3
SOURCES = main.cpp SOURCES = main.cpp
SOURCES += ../imgui_impl_glfw.cpp ../imgui_impl_opengl3.cpp SOURCES += ../imgui_impl_glfw.cpp ../imgui_impl_opengl3.cpp
SOURCES += ../../imgui.cpp ../../imgui_demo.cpp ../../imgui_draw.cpp SOURCES += ../../imgui.cpp ../../imgui_demo.cpp ../../imgui_draw.cpp
SOURCES += ../libs/gl3w/GL/gl3w.c
OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES))))
UNAME_S := $(shell uname -s) UNAME_S := $(shell uname -s)
# Default OpenGL loader: gl3w
SOURCES += ../libs/gl3w/GL/gl3w.c
CXXFLAGS = -I../libs/gl3w
# You can switch to glad by changing the following compilation options,
# and changing the rule L73 of this Makefile
# SOURCES += ../libs/glad/src/glad.c
# CXXFLAGS = -I../libs/glad/include -DIMGUI_IMPL_OPENGL_LOADER_GLAD
# You can also use glew are you OpenGL loader
# This assumes a system-wide installation
# CXXFLAGS = -lGLEW -DIMGUI_IMPL_OPENGL_LOADER_GLEW
ifeq ($(UNAME_S), Linux) #LINUX ifeq ($(UNAME_S), Linux) #LINUX
ECHO_MESSAGE = "Linux" ECHO_MESSAGE = "Linux"
LIBS = -lGL `pkg-config --static --libs glfw3` LIBS = -lGL `pkg-config --static --libs glfw3`
CXXFLAGS = -I../ -I../../ -I../libs/gl3w `pkg-config --cflags glfw3` CXXFLAGS += -I../ -I../../ `pkg-config --cflags glfw3`
CXXFLAGS += -Wall -Wformat CXXFLAGS += -Wall -Wformat
CFLAGS = $(CXXFLAGS) CFLAGS = $(CXXFLAGS)
endif endif
@ -39,7 +50,7 @@ ifeq ($(UNAME_S), Darwin) #APPLE
#LIBS += -L/usr/local/lib -lglfw3 #LIBS += -L/usr/local/lib -lglfw3
LIBS += -L/usr/local/lib -lglfw LIBS += -L/usr/local/lib -lglfw
CXXFLAGS = -I../ -I../../ -I../libs/gl3w -I/usr/local/include CXXFLAGS += -I../ -I../../ -I/usr/local/include
CXXFLAGS += -Wall -Wformat CXXFLAGS += -Wall -Wformat
CFLAGS = $(CXXFLAGS) CFLAGS = $(CXXFLAGS)
endif endif
@ -48,7 +59,7 @@ ifeq ($(findstring MINGW,$(UNAME_S)),MINGW)
ECHO_MESSAGE = "Windows" ECHO_MESSAGE = "Windows"
LIBS = -lglfw3 -lgdi32 -lopengl32 -limm32 LIBS = -lglfw3 -lgdi32 -lopengl32 -limm32
CXXFLAGS = -I../ -I../../ -I../libs/gl3w `pkg-config --cflags glfw3` CXXFLAGS += -I../ -I../../ `pkg-config --cflags glfw3`
CXXFLAGS += -Wall -Wformat CXXFLAGS += -Wall -Wformat
CFLAGS = $(CXXFLAGS) CFLAGS = $(CXXFLAGS)
endif endif
@ -64,6 +75,7 @@ endif
$(CXX) $(CXXFLAGS) -c -o $@ $< $(CXX) $(CXXFLAGS) -c -o $@ $<
%.o:../libs/gl3w/GL/%.c %.o:../libs/gl3w/GL/%.c
# %.o:../libs/glad/src/%.c
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
all: $(EXE) all: $(EXE)

View File

@ -8,10 +8,16 @@
#include "imgui_impl_opengl3.h" #include "imgui_impl_opengl3.h"
#include <stdio.h> #include <stdio.h>
#include <GL/gl3w.h> // This example is using gl3w to access OpenGL functions. You may use another OpenGL loader/header such as: glew, glext, glad, glLoadGen, etc. // This example is using gl3w to access OpenGL functions. You may use another OpenGL loader/header such as: glew, glext, glad, glLoadGen, etc.
//#include <glew.h> #if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
//#include <glext.h> #include <GL/gl3w.h>
//#include <glad/glad.h> #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
#include <GL/glew.h>
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h>
#else
#pragma error("Cannot use custom loader for example application.")
#endif
#include <GLFW/glfw3.h> // Include glfw3.h after our OpenGL definitions #include <GLFW/glfw3.h> // Include glfw3.h after our OpenGL definitions
@ -50,7 +56,19 @@ int main(int, char**)
return 1; return 1;
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable vsync glfwSwapInterval(1); // Enable vsync
gl3wInit(); #if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
GLenum err = gl3wInit();
if (!err) {
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
GLenum err = glewInit();
if (GLEW_OK != err) {
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
GLenum err = gladLoadGL();
if (!err) {
#endif
fprintf(stderr, "Failed to initialize OpenGL\n");
return 1;
}
// Setup Dear ImGui binding // Setup Dear ImGui binding
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();

View File

@ -76,10 +76,17 @@
// (About OpenGL function loaders: modern OpenGL doesn't have a standard header file and requires individual functions to be loaded manually. // (About OpenGL function loaders: modern OpenGL doesn't have a standard header file and requires individual functions to be loaded manually.
// Helper libraries are often used for this purpose! Here we are using gl3w.h, which requires a call to gl3wInit(). // Helper libraries are often used for this purpose! Here we are using gl3w.h, which requires a call to gl3wInit().
// You may use another any other loader/header of your choice, such as glew, glext, glad, glLoadGen, etc.) // You may use another any other loader/header of your choice, such as glew, glext, glad, glLoadGen, etc.)
#if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
#include <GL/gl3w.h> #include <GL/gl3w.h>
//#include <glew.h> #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
//#include <glext.h> #include <GL/glew.h>
//#include <glad/glad.h> #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h>
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEXT)
#include <glext.h>
#else
#include IMGUI_IMPL_OPENGL_LOADER_CUSTOM
#endif
#endif #endif
// OpenGL Data // OpenGL Data
@ -136,7 +143,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
#ifdef GL_SAMPLER_BINDING
GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler); GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);
#endif
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
#ifdef GL_POLYGON_MODE #ifdef GL_POLYGON_MODE

View File

@ -19,6 +19,14 @@
// On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es" // On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es"
// Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp. // Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp.
// Set default OpenGL loader to be gl3w
#if !defined(IMGUI_IMPL_OPENGL_LOADER_GL3W) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLEW) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLAD) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
#define IMGUI_IMPL_OPENGL_LOADER_GL3W
#endif
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL); IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL);
IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown(); IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame(); IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame();