Skip to content

Commit

Permalink
Add support for GLAD
Browse files Browse the repository at this point in the history
  • Loading branch information
kintel committed Mar 15, 2023
1 parent a814b8a commit dc132f9
Show file tree
Hide file tree
Showing 13 changed files with 35,916 additions and 29 deletions.
35 changes: 26 additions & 9 deletions CMakeLists.txt
Expand Up @@ -38,6 +38,7 @@ option(EXPERIMENTAL "Enable Experimental Features" OFF)
option(SNAPSHOT "Create dev snapshot, uses nightly icons" OFF)
option(HEADLESS "Build without GUI frontend" OFF)
option(ENABLE_EGL "Enable EGL instead of GLX support if available" OFF)
option(USE_GLAD "Use GLAD instead of glew" OFF)
option(WASM "Build WebAssembly, (implies NULLGL=ON) " OFF)
option(NULLGL "Build without OpenGL, (implies HEADLESS=ON) " OFF)
option(IDPREFIX "Prefix CSG nodes with index # (debugging purposes only, will break node cache)" OFF)
Expand Down Expand Up @@ -111,6 +112,12 @@ if(WASM)
target_compile_definitions(OpenSCAD PRIVATE CGAL_DISABLE_ROUNDING_MATH_CHECK)
endif()

if(USE_GLAD)
target_compile_definitions(OpenSCAD PRIVATE USE_GLAD)
else()
target_compile_definitions(OpenSCAD PRIVATE USE_GLEW)
endif()

if(NULLGL)
set(HEADLESS ON CACHE BOOL "" FORCE)
endif()
Expand Down Expand Up @@ -160,6 +167,9 @@ add_subdirectory(submodules)

if (MXECROSS)
target_compile_definitions(OpenSCAD PRIVATE GLEW_STATIC LIBXML_STATIC STATIC_QT_SVG_PLUGIN)
if (NOT USE_GLAD)
target_compile_definitions(OpenSCAD PRIVATE GLEW_STATIC)
endif()
target_link_libraries(OpenSCAD PRIVATE bcrypt)
endif()

Expand All @@ -175,18 +185,23 @@ macro(find_graphics)
target_compile_definitions(OpenSCAD PRIVATE ENABLE_OPENCSG)

if(MSVC)
find_package(GLEW CONFIG REQUIRED QUIET)
if (NOT USE_GLAD)
find_package(GLEW CONFIG REQUIRED QUIET)
message(STATUS "GLEW: Using target GLEW::GLEW")
target_link_libraries(OpenSCAD PRIVATE GLEW::GLEW)
endif()
find_path(OPENCSG_INCLUDE_DIRS opencsg/opencsg.h)
message(STATUS "GLEW: Using target GLEW::GLEW")
target_include_directories(OpenSCAD SYSTEM PRIVATE "${OPENCSG_INCLUDE_DIRS}/opencsg")
target_link_libraries(OpenSCAD PRIVATE GLEW::GLEW)
else()
find_package(GLEW REQUIRED)
if (NOT USE_GLAD)
find_package(GLEW REQUIRED)
message(STATUS "GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
message(STATUS "GLEW_LIBRARY: ${GLEW_LIBRARY}")
target_include_directories(OpenSCAD SYSTEM PRIVATE ${GLEW_INCLUDE_DIR})
target_link_libraries(OpenSCAD PRIVATE ${GLEW_LIBRARY})
endif()
target_include_directories(OpenSCAD SYSTEM PRIVATE ${OPENCSG_INCLUDE_DIRS})
find_path(OPENCSG_INCLUDE_DIRS opencsg.h)
message(STATUS "GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
message(STATUS "GLEW_LIBRARY: ${GLEW_LIBRARY}")
target_include_directories(OpenSCAD SYSTEM PRIVATE ${GLEW_INCLUDE_DIR} ${OPENCSG_INCLUDE_DIRS})
target_link_libraries(OpenSCAD PRIVATE ${GLEW_LIBRARY})
endif()

find_package(OpenGL REQUIRED QUIET)
Expand Down Expand Up @@ -534,7 +549,9 @@ elseif(UNIX)
set(OFFSCREEN_METHOD "Unix EGL")
message(STATUS "Offscreen OpenGL Context - using Unix EGL")
set(PLATFORM_SOURCES ${PLATFORM_SOURCES} src/glview/OffscreenContextEGL.cc)
target_compile_definitions(OpenSCAD PRIVATE GLEW_EGL)
if (NOT USE_GLAD)
target_compile_definitions(OpenSCAD PRIVATE GLEW_EGL)
endif()
target_link_libraries(OpenSCAD PRIVATE OpenGL::EGL)
else()
set(OFFSCREEN_METHOD "Unix GLX on X11")
Expand Down
6 changes: 6 additions & 0 deletions cmake/Modules/info.cmake
Expand Up @@ -23,6 +23,12 @@ message(STATUS "Experimental Features: ${EXPERIMENTAL}")
message(STATUS "Snapshot build: ${SNAPSHOT}")
message(STATUS "Headless build: ${HEADLESS}")
message(STATUS "NULLGL build: ${NULLGL}")
if (USE_GLAD)
set(WRANGLER "GLAD")
else()
set(WRANGLER "glew")
endif()
message(STATUS "OpenGL wrangler: ${WRANGLER}")
message(STATUS "Profiling/coverage: ${PROFILE}")
message(STATUS "Use mimalloc: ${USE_MIMALLOC}")
message(STATUS "CSG node id-prefix: ${IDPREFIX}")
Expand Down
8 changes: 7 additions & 1 deletion src/glview/GLView.cc
Expand Up @@ -197,7 +197,13 @@ void glCompileCheck(GLuint shader) {
void GLView::enable_opencsg_shaders()
{
// All OpenGL 2 contexts are OpenCSG capable
if (GLEW_VERSION_2_0) {
#ifdef USE_GLEW
const bool hasOpenGL2_0 = GLEW_VERSION_2_0;
#endif
#ifdef USE_GLAD
const bool hasOpenGL2_0 = GLAD_GL_VERSION_2_0;
#endif
if (hasOpenGL2_0) {
this->is_opencsg_capable = true;
this->has_shaders = true;
}
Expand Down
4 changes: 2 additions & 2 deletions src/glview/NULLGL.cc
Expand Up @@ -15,7 +15,7 @@ void GLView::setColorScheme(const std::string& cs) {assert(false && "not impleme
#include "system-gl.h"

double gl_version() { return -1; }
std::string glew_dump() { return std::string("GL Renderer: NULLGL Glew\n"); }
std::string glew_extensions_dump() { return std::string("NULLGL Glew Extensions"); }
std::string gl_dump() { return std::string("GL Renderer: NULLGL\n"); }
std::string gl_extensions_dump() { return std::string("NULLGL Extensions"); }
bool report_glerror(const char *function) { return false; }

14 changes: 14 additions & 0 deletions src/glview/OffscreenContextAll.hpp
Expand Up @@ -57,11 +57,25 @@ bool save_framebuffer_common(const OffscreenContext *ctx, std::ostream& output)
OffscreenContext *create_offscreen_context_common(OffscreenContext *ctx)
{
if (!ctx) return nullptr;

#ifdef USE_GLEW
GLenum err = glewInit(); // must come after Context creation and before FBO c$
if (GLEW_OK != err) {
std::cerr << "Unable to init GLEW: " << glewGetErrorString(err) << "\n";
return nullptr;
}
#endif
#ifdef USE_GLAD
// FIXME: We could ask for gladLoaderLoadGLES2() here instead
const auto version = gladLoaderLoadGL();
if (version == 0) {
// FIXME: Can we figure out why?
std::cerr << "Unable to init GLAD" << std::endl;
return nullptr;
}
// FIXME: Only if verbose
std::cout << "GLAD: Loaded OpenGL " << GLAD_VERSION_MAJOR(version) << "." << GLAD_VERSION_MINOR(version) << std::endl;
#endif

ctx->fbo = fbo_new();
if (!fbo_init(ctx->fbo, ctx->width, ctx->height)) {
Expand Down
2 changes: 1 addition & 1 deletion src/glview/OffscreenView.cc
Expand Up @@ -39,5 +39,5 @@ bool OffscreenView::save(std::ostream& output) const

std::string OffscreenView::getRendererInfo() const
{
return STR(glew_dump(), offscreen_context_getinfo(this->ctx));
return STR(gl_dump(), offscreen_context_getinfo(this->ctx));
}
8 changes: 4 additions & 4 deletions src/glview/fbo.cc
Expand Up @@ -18,7 +18,7 @@ fbo_t *fbo_new()
bool use_ext()
{
// do we need to use the EXT or ARB version?
if (!glewIsSupported("GL_ARB_framebuffer_object") && glewIsSupported("GL_EXT_framebuffer_object")) {
if (!hasGLExtension(GL_ARB_framebuffer_object) && hasGLExtension(GL_EXT_framebuffer_object)) {
return true;
} else {
return false;
Expand Down Expand Up @@ -90,7 +90,7 @@ bool fbo_ext_init(fbo_t *fbo, size_t width, size_t height)
return false;
}

if (glewIsSupported("GL_EXT_packed_depth_stencil")) {
if (hasGLExtension(GL_EXT_packed_depth_stencil)) {
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT, fbo->depthbuf_id);
if (report_glerror("specifying depth render buffer EXT")) return false;
Expand Down Expand Up @@ -174,7 +174,7 @@ bool fbo_init(fbo_t *fbo, size_t width, size_t height)
*/

auto result = false;
if (glewIsSupported("GL_ARB_framebuffer_object")) {
if (hasGLExtension(GL_ARB_framebuffer_object)) {
result = fbo_arb_init(fbo, width, height);
} else if (use_ext()) {
result = fbo_ext_init(fbo, width, height);
Expand All @@ -188,7 +188,7 @@ bool fbo_resize(fbo_t *fbo, size_t width, size_t height)
{
if (use_ext()) {
glBindRenderbufferEXT(GL_RENDERBUFFER, fbo->depthbuf_id);
if (glewIsSupported("GL_EXT_packed_depth_stencil")) {
if (hasGLExtension(GL_EXT_packed_depth_stencil)) {
glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
if (report_glerror("creating EXT depth stencil render buffer")) return false;
} else {
Expand Down

0 comments on commit dc132f9

Please sign in to comment.