Skip to content

Commit

Permalink
Support older 2.x series of glbinding as loader for OpenGL3
Browse files Browse the repository at this point in the history
For the moment I have only the older 2.x series available on my system
which uses slightly different header filenames and initialisation, so
as a slight variation of the 3.x series support recently implemented
here the glue needed to make 2.x series work as well.

As having a versioned and a unversioned definition is deemed to
confusing we use the unversioned definition for auto-detection on
supporting compilers and add two versioned definitions for explicit
requests.

References: ocornut#2870, 5e2329b
  • Loading branch information
DonKult committed Mar 23, 2020
1 parent 110f506 commit d3d04f8
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 11 deletions.
4 changes: 4 additions & 0 deletions examples/example_glfw_opengl3/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ CXXFLAGS += -I../libs/gl3w -DIMGUI_IMPL_OPENGL_LOADER_GL3W
## Using OpenGL loader: glbinding
## (This assumes a system-wide installation)
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING
## If autodetection fails for some reason you can select one of
## the supported versions explicitly with:
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING_3

##---------------------------------------------------------------------
## BUILD FLAGS PER PLATFORM
Expand Down
11 changes: 9 additions & 2 deletions examples/example_glfw_opengl3/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@
#include <GL/glew.h> // Initialize with glewInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h> // Initialize with gladLoadGL()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2) || defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
#define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors.
#if defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
#include <glbinding/Binding.h> // Initialize with glbinding::Binding::initialize()
#else
#include <glbinding/glbinding.h> // Initialize with glbinding::initialize()
#endif
#include <glbinding/gl/gl.h>
using namespace gl;
#else
Expand Down Expand Up @@ -79,7 +83,10 @@ int main(int, char**)
bool err = glewInit() != GLEW_OK;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
bool err = gladLoadGL() == 0;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
bool err = false;
glbinding::Binding::initialize();
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
bool err = false;
glbinding::initialize([](const char* name) { return (glbinding::ProcAddress)glfwGetProcAddress(name); });
#else
Expand Down
4 changes: 4 additions & 0 deletions examples/example_sdl_opengl3/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ CXXFLAGS += -I../libs/gl3w -DIMGUI_IMPL_OPENGL_LOADER_GL3W
## Using OpenGL loader: glbinding
## (This assumes a system-wide installation)
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING
## If autodetection fails for some reason you can select one of
## the supported versions explicitly with:
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
# CXXFLAGS += -lglbinding -DIMGUI_IMPL_OPENGL_LOADER_GLBINDING_3

##---------------------------------------------------------------------
## BUILD FLAGS PER PLATFORM
Expand Down
13 changes: 10 additions & 3 deletions examples/example_sdl_opengl3/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@
#include <GL/glew.h> // Initialize with glewInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h> // Initialize with gladLoadGL()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2) || defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
#if defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
#include <glbinding/Binding.h> // Initialize with glbinding::Binding::initialize()
#else
#include <glbinding/glbinding.h> // Initialize with glbinding::initialize()
#endif
#include <glbinding/gl/gl.h>
using namespace gl;
#else
Expand Down Expand Up @@ -73,9 +77,12 @@ int main(int, char**)
bool err = glewInit() != GLEW_OK;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
bool err = gladLoadGL() == 0;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
bool err = false;
glbinding::Binding::initialize();
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
bool err = false;
glbinding::initialize([](const char* name) { return (glbinding::ProcAddress)SDL_GL_GetProcAddress(name); });
glbinding::initialize([](const char* name) { return (glbinding::ProcAddress)glfwGetProcAddress(name); });
#else
bool err = false; // If you use IMGUI_IMPL_OPENGL_LOADER_CUSTOM, your loader is likely to requires some form of initialization.
#endif
Expand Down
16 changes: 13 additions & 3 deletions examples/imgui_impl_opengl3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,17 @@
#undef IMGUI_IMPL_OPENGL_LOADER_GLEW
#undef IMGUI_IMPL_OPENGL_LOADER_GLAD
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3
#undef IMGUI_IMPL_OPENGL_LOADER_CUSTOM
#elif defined(__EMSCRIPTEN__)
#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100"
#undef IMGUI_IMPL_OPENGL_LOADER_GL3W
#undef IMGUI_IMPL_OPENGL_LOADER_GLEW
#undef IMGUI_IMPL_OPENGL_LOADER_GLAD
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3
#undef IMGUI_IMPL_OPENGL_LOADER_CUSTOM
#endif
#endif
Expand All @@ -118,9 +122,13 @@
#include <GL/glew.h> // Needs to be initialized with glewInit() in user's code
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h> // Needs to be initialized with gladLoadGL() in user's code
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2) || defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
#include <glbinding/gl/gl.h> // Initialize with glbinding::initialize()
#if defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
#include <glbinding/Binding.h>
#else
#include <glbinding/glbinding.h>
#endif
using namespace gl;
#else
#include IMGUI_IMPL_OPENGL_LOADER_CUSTOM
Expand Down Expand Up @@ -193,8 +201,10 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
gl_loader = "GLEW";
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
gl_loader = "GLAD";
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
gl_loader = "glbinding";
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2)
gl_loader = "glbinding2";
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3)
gl_loader = "glbinding3";
#else // IMGUI_IMPL_OPENGL_LOADER_CUSTOM
gl_loader = "Custom";
#endif
Expand Down
24 changes: 21 additions & 3 deletions examples/imgui_impl_opengl3.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,26 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
// If auto-detection fails or doesn't select the same GL loader file as used by your application,
// you are likely to get a crash in ImGui_ImplOpenGL3_Init().
// You can explicitly select a loader by using '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line.
#if defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING)
#if defined(__has_include)
#if __has_include(<glbinding/glbinding.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING
#elif __has_include(<glbinding/Binding.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
#undef IMGUI_IMPL_OPENGL_LOADER_GLBINDING
#else
#error "Cannot auto-detect GLBinding version as expected headers are not present!"
#endif
#else
#error "Cannot auto-detect GLBinding version as your compiler does not provide a method of header detection!"
#endif
#endif
#if !defined(IMGUI_IMPL_OPENGL_LOADER_GL3W) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLEW) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLAD) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3) \
&& !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
#if defined(__has_include)
#if __has_include(<GL/glew.h>)
Expand All @@ -55,8 +71,10 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
#define IMGUI_IMPL_OPENGL_LOADER_GLAD
#elif __has_include(<GL/gl3w.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GL3W
#elif __has_include(<glbinding/gl/gl.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GLBINDING
#elif __has_include(<glbinding/glbinding.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GLBINDING_3
#elif __has_include(<glbinding/Binding.h>)
#define IMGUI_IMPL_OPENGL_LOADER_GLBINDING_2
#else
#error "Cannot detect OpenGL loader!"
#endif
Expand Down

0 comments on commit d3d04f8

Please sign in to comment.