Mercurial > hg > forks > gldragon
changeset 42:3c7e1d3fa5a2
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().
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 05 Dec 2019 21:05:43 +0200 |
parents | eaa3e8575c12 |
children | a7d56f006063 |
files | Makefile Makefile.gen dmglexts.h gldragon.cpp |
diffstat | 4 files changed, 94 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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/
--- 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
--- /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 <ccr@tnsp.org> +// (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) +
--- 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"