# HG changeset patch # User Matti Hamalainen # Date 1575572743 -7200 # Node ID 3c7e1d3fa5a2c937ded37ec14dde7b4fb3823e24 # Parent eaa3e8575c122270b902c85da309b49995cddf3e Implement OpengL extension handling through new header file dmglexts.h to "define" the entrypoints we require and some wonderful preprocessor macro magic to add checks for them via SDL_GL_ExtensionSupported() and initialize function pointers with SDL_GL_GetProcAddress(). diff -r eaa3e8575c12 -r 3c7e1d3fa5a2 Makefile --- a/Makefile Thu Dec 05 18:32:13 2019 +0200 +++ b/Makefile Thu Dec 05 21:05:43 2019 +0200 @@ -1,3 +1,4 @@ +CXXFLAGS ?= -DGL_GLEXT_PROTOTYPES BINEXT ?= OBJPATH ?= ./obj/unix/ diff -r eaa3e8575c12 -r 3c7e1d3fa5a2 Makefile.gen --- a/Makefile.gen Thu Dec 05 18:32:13 2019 +0200 +++ b/Makefile.gen Thu Dec 05 21:05:43 2019 +0200 @@ -1,5 +1,5 @@ -CXXFLAGS ?= -O3 -W -Wall -DGL_GLEXT_PROTOTYPES -std=c++11 -LDFLAGS ?= +CXXFLAGS += -O3 -W -Wall -std=c++11 +LDFLAGS += CXXFLAGS += $(SDL_CFLAGS) $(GL_CFLAGS) MKDIR ?= mkdir diff -r eaa3e8575c12 -r 3c7e1d3fa5a2 dmglexts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmglexts.h Thu Dec 05 21:05:43 2019 +0200 @@ -0,0 +1,23 @@ +// +// GLDragon - OpenGL PLY model viewer / simple benchmark +// -- OpenGL extension definitions +// Programmed and designed by Matti 'ccr' Hämäläinen +// (C) Copyright 2019 Tecnic Software productions (TNSP) +// +// See file "COPYING" for license information. +// +DM_GLEXT_INIT(PFNGLCREATEPROGRAMPROC, glCreateProgram) +DM_GLEXT_INIT(PFNGLUSEPROGRAMPROC, glUseProgram) +DM_GLEXT_INIT(PFNGLLINKPROGRAMPROC, glLinkProgram) + +DM_GLEXT_INIT(PFNGLCOMPILESHADERPROC, glCompileShader) +DM_GLEXT_INIT(PFNGLCREATESHADERPROC, glCreateShader) +DM_GLEXT_INIT(PFNGLATTACHSHADERPROC, glAttachShader) +DM_GLEXT_INIT(PFNGLSHADERSOURCEPROC, glShaderSource) + +DM_GLEXT_INIT(PFNGLUNIFORM1IPROC, glUniform1i) + +DM_GLEXT_INIT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) +DM_GLEXT_INIT(PFNGLGETSHADERIVPROC, glGetShaderiv) +DM_GLEXT_INIT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) + diff -r eaa3e8575c12 -r 3c7e1d3fa5a2 gldragon.cpp --- a/gldragon.cpp Thu Dec 05 18:32:13 2019 +0200 +++ b/gldragon.cpp Thu Dec 05 21:05:43 2019 +0200 @@ -39,6 +39,70 @@ /* Helpers */ +#ifdef GL_GLEXT_PROTOTYPES +#define DM_GLEXT_INIT(extproctype, extprocname) /* stub */ +#else +// GL_GLEXT_PROTOTYPES not defined + +#define DM_GLEXT_INIT(extproctype, extprocname) extproctype extprocname = NULL; +#include "dmglexts.h" +#undef DM_GLEXT_INIT + + +void * dmGLExtTry(const std::string &name) +{ + bool res = SDL_GL_ExtensionSupported(name.c_str()); + void *ptr = SDL_GL_GetProcAddress(name.c_str()); + res = true; + + printf(" - Checking '%s' : %s : %p\n", + name.c_str(), + res ? "YES" : "no", + ptr); + + if (res && ptr != NULL) + return ptr; + else + return NULL; +} + +void * dmGLExtInit(const std::string &name, bool &status) +{ + void *ptr; + + if ((ptr = dmGLExtTry(name)) != NULL) + return ptr; + else + if ((ptr = dmGLExtTry(name + "EXT")) != NULL) + return ptr; + else + if ((ptr = dmGLExtTry(name + "ARB")) != NULL) + return ptr; + + status = false; + return NULL; +} + + +#define DM_GLEXT_INIT(extproctype, extprocname) \ + extprocname = (extproctype) dmGLExtInit(#extprocname, status); + +#endif + + + +bool dmInitGLExtensions(void) +{ +#ifdef GL_GLEXT_PROTOTYPES + return true; +#else + bool status = true; +#include "dmglexts.h" + return status; +#endif +} + + bool dmInitSDLGL(const int width, const int height, const char *title) { int ret; @@ -114,6 +178,10 @@ return false; } + // Get/initialize OpenGL extension function pointers + if (optUseShaders && !dmInitGLExtensions()) + return false; + // Dump some information printf( "GL_VENDOR : %s\n"