graphics

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 54a11ede8d05dc2ff95f6d3e6650e6738bf1214e
parent 552ccdd5fd43bff32b3b00929ce131971aa61c28
Author: Brian Swetland <swetland@frotz.net>
Date:   Mon,  2 Sep 2013 05:08:39 -0700

build: remove compile time dependency on OpenGL

- no longer link against libGL.so
- SDL will dlopen it at runtime
- use the same symbol resolution code that supported windows
- tidy up and automate the funcpoint/functable header generation

Diffstat:
MMakefile | 6++----
Mcommon/core.h | 11+----------
Acommon/gen-opengl-h.sh | 21+++++++++++++++++++++
Acommon/gl-api.txt | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Mcommon/glapp.cc | 13++++---------
Mcommon/opengl.h | 117+++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
6 files changed, 154 insertions(+), 65 deletions(-)

diff --git a/Makefile b/Makefile @@ -20,7 +20,7 @@ SDLCFG := /work/sdl2/bin/sdl2-config SDLFLAGS := $(shell $(SDLCFG) --cflags) #SDLLIBS := $(shell $(SDLCFG) --static-libs) -SDLLIBS := /work/sdl2/lib/libSDL2.a -lpthread -lrt +SDLLIBS := /work/sdl2/lib/libSDL2.a -lpthread -lrt -ldl HOST_CFLAGS := $(SDLFLAGS) -Wall -g -O2 HOST_CFLAGS += -std=c++0x @@ -32,9 +32,7 @@ HOST_LFLAGS := -static-libstdc++ #HOST_LFLAGS += -Wl,--verbose #HOST_LFLAGS += -Wl,-gc-sections -#GLLIB := /usr/lib/nvidia-experimental-310/libGL.so.310.14 -GLLIB := -L/usr/lib -lGL -HOST_LIBS := $(SDLLIBS) $(GLLIB) -lm -lpng +HOST_LIBS := $(SDLLIBS) -lm -lpng include $(wildcard arch/*/config.mk) diff --git a/common/core.h b/common/core.h @@ -16,18 +16,9 @@ #ifndef _CORE_H_ #define _CORE_H_ -#ifdef _WIN32 -#define NO_SDL_GLEXT 1 +//#define NO_SDL_GLEXT 1 #include <SDL.h> -#include <SDL_opengl.h> #include "opengl.h" -#else -#define GL_GLEXT_PROTOTYPES 1 -#define NO_SDL_GLEXT 1 -#include <SDL.h> -#include <SDL_opengl.h> -#include "glcorearb.h" -#endif #include <math.h> diff --git a/common/gen-opengl-h.sh b/common/gen-opengl-h.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +echo '/* WARNING - MACHINE GENERATED FILE - DO NOT EDIT */' +echo '#ifndef _OPEN_GL_H_' +echo '#define _OPEN_GL_H_' +echo '#include "glcorearb.h"' +echo '#ifndef GLXTN' +echo '#define GLXTN extern' +echo '#define __NO_GLXTN_TABLE__' +echo '#endif' +awk '{ print "GLXTN PFN" toupper($1) "PROC " $1 ";" }' < gl-api.txt +echo '#ifndef __NO_GLXTN_TABLE__' +echo '#define __GLFN__(n) { (void**) &n, #n }' +echo 'struct {' +echo ' void **func;' +echo ' const char *name;' +echo '} fntb[] = {' +awk '{ print "\t__GLFN__(" $1 ")," }' < gl-api.txt +echo '};' +echo '#endif' +echo '#endif' diff --git a/common/gl-api.txt b/common/gl-api.txt @@ -0,0 +1,51 @@ +glActiveTexture +glAttachShader +glBindBuffer +glBindBufferBase +glBindTexture +glBindVertexArray +glBlendFunc +glBufferData +glClear +glCompileShader +glCreateProgram +glCreateShader +glDeleteBuffers +glDeleteProgram +glDeleteShader +glDeleteTextures +glDeleteVertexArrays +glDisable +glDisableVertexAttribArray +glDrawArrays +glDrawArraysInstanced +glDrawElements +glDrawElementsInstanced +glEnable +glEnableVertexAttribArray +glFlush +glGenBuffers +glGenerateMipmap +glGenTextures +glGenVertexArrays +glGetAttribLocation +glGetIntegerv +glGetProgramInfoLog +glGetProgramiv +glGetShaderInfoLog +glGetShaderiv +glGetString +glGetUniformBlockIndex +glGetUniformLocation +glLinkProgram +glShaderSource +glTexImage2D +glTexParameteri +glUniform1i +glUniform4fv +glUniformBlockBinding +glUniformMatrix4fv +glUseProgram +glVertexAttribDivisor +glVertexAttribIPointer +glVertexAttribPointer diff --git a/common/glapp.cc b/common/glapp.cc @@ -15,17 +15,14 @@ #include <stdio.h> #include <stdlib.h> - #include <time.h> -#ifdef _WIN32 -#define GLUE_DEFINE_EXTENSIONS 1 -#endif +/* flag opengl.h to include the extension table */ +#define GLXTN #include "app.h" #include "util.h" -#ifdef _WIN32 static void gl_map_functions(void) { int n; if (!SDL_GL_ExtensionSupported("GL_ARB_shader_objects") || @@ -39,9 +36,6 @@ static void gl_map_functions(void) { die("cannot find func '%s'", fntb[n].name); } } -#else -void gl_map_functions(void) {} -#endif static void quit(void) { SDL_Quit(); @@ -219,6 +213,8 @@ int App::start(void) { /* todo: verify extension availability */ } + gl_map_functions(); + { // TODO: filter or disable in release mode PFNGLDEBUGMESSAGECALLBACKPROC fn; fn = (PFNGLDEBUGMESSAGECALLBACKPROC) @@ -240,7 +236,6 @@ int App::start(void) { dump_gl_params(); SDL_GL_SetSwapInterval(_vsync); - gl_map_functions(); if (init()) return -1; diff --git a/common/opengl.h b/common/opengl.h @@ -1,86 +1,119 @@ -/* Copyright 2013 Brian Swetland <swetland@frotz.net> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +/* WARNING - MACHINE GENERATED FILE - DO NOT EDIT */ #ifndef _OPEN_GL_H_ #define _OPEN_GL_H_ - #include "glcorearb.h" - -#ifndef GLUE_DEFINE_EXTENSIONS +#ifndef GLXTN #define GLXTN extern -#else -#define GLXTN +#define __NO_GLXTN_TABLE__ #endif - GLXTN PFNGLACTIVETEXTUREPROC glActiveTexture; GLXTN PFNGLATTACHSHADERPROC glAttachShader; GLXTN PFNGLBINDBUFFERPROC glBindBuffer; GLXTN PFNGLBINDBUFFERBASEPROC glBindBufferBase; +GLXTN PFNGLBINDTEXTUREPROC glBindTexture; GLXTN PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +GLXTN PFNGLBLENDFUNCPROC glBlendFunc; GLXTN PFNGLBUFFERDATAPROC glBufferData; +GLXTN PFNGLCLEARPROC glClear; GLXTN PFNGLCOMPILESHADERPROC glCompileShader; GLXTN PFNGLCREATEPROGRAMPROC glCreateProgram; GLXTN PFNGLCREATESHADERPROC glCreateShader; GLXTN PFNGLDELETEBUFFERSPROC glDeleteBuffers; GLXTN PFNGLDELETEPROGRAMPROC glDeleteProgram; GLXTN PFNGLDELETESHADERPROC glDeleteShader; +GLXTN PFNGLDELETETEXTURESPROC glDeleteTextures; GLXTN PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; +GLXTN PFNGLDISABLEPROC glDisable; GLXTN PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; +GLXTN PFNGLDRAWARRAYSPROC glDrawArrays; GLXTN PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; +GLXTN PFNGLDRAWELEMENTSPROC glDrawElements; GLXTN PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; +GLXTN PFNGLENABLEPROC glEnable; GLXTN PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; +GLXTN PFNGLFLUSHPROC glFlush; GLXTN PFNGLGENBUFFERSPROC glGenBuffers; GLXTN PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +GLXTN PFNGLGENTEXTURESPROC glGenTextures; GLXTN PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; GLXTN PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; -GLXTN PFNGLGETPROGRAMIVPROC glGetProgramiv; +GLXTN PFNGLGETINTEGERVPROC glGetIntegerv; GLXTN PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; -GLXTN PFNGLGETSHADERIVPROC glGetShaderiv; +GLXTN PFNGLGETPROGRAMIVPROC glGetProgramiv; GLXTN PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +GLXTN PFNGLGETSHADERIVPROC glGetShaderiv; +GLXTN PFNGLGETSTRINGPROC glGetString; +GLXTN PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; GLXTN PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; GLXTN PFNGLLINKPROGRAMPROC glLinkProgram; GLXTN PFNGLSHADERSOURCEPROC glShaderSource; +GLXTN PFNGLTEXIMAGE2DPROC glTexImage2D; +GLXTN PFNGLTEXPARAMETERIPROC glTexParameteri; GLXTN PFNGLUNIFORM1IPROC glUniform1i; GLXTN PFNGLUNIFORM4FVPROC glUniform4fv; -GLXTN PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; GLXTN PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; +GLXTN PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; GLXTN PFNGLUSEPROGRAMPROC glUseProgram; GLXTN PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; -GLXTN PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; GLXTN PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; - -#ifdef GLUE_DEFINE_EXTENSIONS -#define EFUNC(n) { (void**) &n, #n } +GLXTN PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +#ifndef __NO_GLXTN_TABLE__ +#define __GLFN__(n) { (void**) &n, #n } struct { void **func; const char *name; } fntb[] = { - EFUNC(glActiveTexture), EFUNC(glAttachShader), EFUNC(glBindBuffer), - EFUNC(glBindBufferBase), EFUNC(glBindVertexArray), EFUNC(glBufferData), - EFUNC(glCompileShader), EFUNC(glCreateProgram), EFUNC(glCreateShader), - EFUNC(glDeleteBuffers), EFUNC(glDeleteProgram), EFUNC(glDeleteShader), - EFUNC(glDeleteVertexArrays), EFUNC(glDisableVertexAttribArray), - EFUNC(glDrawArraysInstanced), EFUNC(glDrawElementsInstanced), - EFUNC(glEnableVertexAttribArray), EFUNC(glGenBuffers), EFUNC(glGenerateMipmap), - EFUNC(glGenVertexArrays), EFUNC(glGetAttribLocation), EFUNC(glGetProgramiv), - EFUNC(glGetProgramInfoLog), EFUNC(glGetShaderiv), EFUNC(glGetShaderInfoLog), - EFUNC(glGetUniformLocation), EFUNC(glLinkProgram), EFUNC(glShaderSource), - EFUNC(glUniform1i), EFUNC(glUniform4fv), EFUNC(glUniformMatrix4fv), - EFUNC(glUniformBlockBinding), EFUNC(glUseProgram), EFUNC(glVertexAttribDivisor), - EFUNC(glVertexAttribPointer), EFUNC(glVertexAttribIPointer), + __GLFN__(glActiveTexture), + __GLFN__(glAttachShader), + __GLFN__(glBindBuffer), + __GLFN__(glBindBufferBase), + __GLFN__(glBindTexture), + __GLFN__(glBindVertexArray), + __GLFN__(glBlendFunc), + __GLFN__(glBufferData), + __GLFN__(glClear), + __GLFN__(glCompileShader), + __GLFN__(glCreateProgram), + __GLFN__(glCreateShader), + __GLFN__(glDeleteBuffers), + __GLFN__(glDeleteProgram), + __GLFN__(glDeleteShader), + __GLFN__(glDeleteTextures), + __GLFN__(glDeleteVertexArrays), + __GLFN__(glDisable), + __GLFN__(glDisableVertexAttribArray), + __GLFN__(glDrawArrays), + __GLFN__(glDrawArraysInstanced), + __GLFN__(glDrawElements), + __GLFN__(glDrawElementsInstanced), + __GLFN__(glEnable), + __GLFN__(glEnableVertexAttribArray), + __GLFN__(glFlush), + __GLFN__(glGenBuffers), + __GLFN__(glGenerateMipmap), + __GLFN__(glGenTextures), + __GLFN__(glGenVertexArrays), + __GLFN__(glGetAttribLocation), + __GLFN__(glGetIntegerv), + __GLFN__(glGetProgramInfoLog), + __GLFN__(glGetProgramiv), + __GLFN__(glGetShaderInfoLog), + __GLFN__(glGetShaderiv), + __GLFN__(glGetString), + __GLFN__(glGetUniformBlockIndex), + __GLFN__(glGetUniformLocation), + __GLFN__(glLinkProgram), + __GLFN__(glShaderSource), + __GLFN__(glTexImage2D), + __GLFN__(glTexParameteri), + __GLFN__(glUniform1i), + __GLFN__(glUniform4fv), + __GLFN__(glUniformBlockBinding), + __GLFN__(glUniformMatrix4fv), + __GLFN__(glUseProgram), + __GLFN__(glVertexAttribDivisor), + __GLFN__(glVertexAttribIPointer), + __GLFN__(glVertexAttribPointer), }; #endif #endif -