Hack in crude OSMesa support

Mostly this is quick, "do nothing" ifdefs when built with
SYSTEM=linux-osmesa, to support the off-screen rendering mode of Mesa in
headless tests.  Support in glewinfo and visualinfo is enough to get
them compile, but insufficient for them to run successfully.
This commit is contained in:
Julian Squires 2014-06-24 11:03:28 -04:00
parent 404df2ee70
commit 1084b73e1c
10 changed files with 129 additions and 30 deletions

View File

@ -200,7 +200,8 @@ $(S.DEST)/glew.c: $(EXT)/.dummy
$(BIN)/make_list.pl $(GL_CORE_SPEC) | grep -v '\"GL_VERSION' >> $@ $(BIN)/make_list.pl $(GL_CORE_SPEC) | grep -v '\"GL_VERSION' >> $@
$(BIN)/make_list.pl $(GL_EXT_SPEC) >> $@ $(BIN)/make_list.pl $(GL_EXT_SPEC) >> $@
echo -e "\n return GLEW_OK;\n}\n" >> $@ echo -e "\n return GLEW_OK;\n}\n" >> $@
echo -e "\n#if defined(_WIN32)" >> $@ echo -e "\n#if defined(GLEW_OSMESA)" >> $@
echo -e "\n#elif defined(_WIN32)" >> $@
echo -e "\n#if !defined(GLEW_MX)" >> $@ echo -e "\n#if !defined(GLEW_MX)" >> $@
$(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@
$(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@
@ -250,7 +251,8 @@ $(S.DEST)/glew_def.c: $(EXT)/.dummy
echo -e "\n#if !defined(GLEW_MX)\n\nGLboolean __GLEW_VERSION_1_1 = GL_FALSE;" >> $@ echo -e "\n#if !defined(GLEW_MX)\n\nGLboolean __GLEW_VERSION_1_1 = GL_FALSE;" >> $@
$(BIN)/make_def_var.pl GL $(GL_CORE_SPEC) >> $@ $(BIN)/make_def_var.pl GL $(GL_CORE_SPEC) >> $@
$(BIN)/make_def_var.pl GL $(GL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl GL $(GL_EXT_SPEC) >> $@
echo -e "\n#if defined(_WIN32)" >> $@ echo -e "\n#if defined(GLEW_OSMESA)" >> $@
echo -e "\n#elif defined(_WIN32)" >> $@
$(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@
$(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@
echo -e "\n#endif /* _WIN32 */" >> $@ echo -e "\n#endif /* _WIN32 */" >> $@

View File

@ -1,6 +1,9 @@
#include <GL/glew.h> #include <GL/glew.h>
#if defined(_WIN32) #if defined(GLEW_OSMESA)
# define GLAPI extern
# include <GL/osmesa.h>
#elif defined(_WIN32)
# include <GL/wglew.h> # include <GL/wglew.h>
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
# include <GL/glxew.h> # include <GL/glxew.h>
@ -137,7 +140,9 @@ void* NSGLGetProcAddress (const GLubyte *name)
/* /*
* Define glewGetProcAddress. * Define glewGetProcAddress.
*/ */
#if defined(GLEW_REGAL) #if defined(GLEW_OSMESA)
# define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name)
#elif defined(GLEW_REGAL)
# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name) # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name)
#elif defined(_WIN32) #elif defined(_WIN32)
# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) # define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name)

View File

@ -34,7 +34,8 @@ GLboolean glewExperimental = GL_FALSE;
#if !defined(GLEW_MX) #if !defined(GLEW_MX)
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
extern GLenum GLEWAPIENTRY wglewContextInit (void); extern GLenum GLEWAPIENTRY wglewContextInit (void);
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
extern GLenum GLEWAPIENTRY glxewContextInit (void); extern GLenum GLEWAPIENTRY glxewContextInit (void);
@ -45,7 +46,9 @@ GLenum GLEWAPIENTRY glewInit (void)
GLenum r; GLenum r;
r = glewContextInit(); r = glewContextInit();
if ( r != 0 ) return r; if ( r != 0 ) return r;
#if defined(_WIN32) #if defined(GLEW_OSMESA)
return r;
#elif defined(_WIN32)
return wglewContextInit(); return wglewContextInit();
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */
return glxewContextInit(); return glxewContextInit();

View File

@ -4,7 +4,8 @@
return ret; return ret;
} }
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
#if defined(GLEW_MX) #if defined(GLEW_MX)
GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name) GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name)

View File

@ -30,7 +30,10 @@
*/ */
#include <GL/glew.h> #include <GL/glew.h>
#if defined(_WIN32) #if defined(GLEW_OSMESA)
# define GLAPI extern
# include <GL/osmesa.h>
#elif defined(_WIN32)
# include <GL/wglew.h> # include <GL/wglew.h>
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
# include <GL/glxew.h> # include <GL/glxew.h>

View File

@ -2,7 +2,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <GL/glew.h> #include <GL/glew.h>
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#define GLAPI extern
#include <GL/osmesa.h>
#elif defined(_WIN32)
#include <GL/wglew.h> #include <GL/wglew.h>
#elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
#include <GL/glxew.h> #include <GL/glxew.h>
@ -17,7 +20,8 @@ static FILE* f;
#ifdef GLEW_MX #ifdef GLEW_MX
GLEWContext _glewctx; GLEWContext _glewctx;
#define glewGetContext() (&_glewctx) #define glewGetContext() (&_glewctx)
#ifdef _WIN32 #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
WGLEWContext _wglewctx; WGLEWContext _wglewctx;
#define wglewGetContext() (&_wglewctx) #define wglewGetContext() (&_wglewctx)
#elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
@ -26,7 +30,9 @@ GLXEWContext _glxewctx;
#endif #endif
#endif #endif
#if defined(_WIN32) #if defined(GLEW_OSMESA)
GLboolean glewCreateContext ();
#elif defined(_WIN32)
GLboolean glewCreateContext (int* pixelformat); GLboolean glewCreateContext (int* pixelformat);
#elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
GLboolean glewCreateContext (const char* display, int* visual); GLboolean glewCreateContext (const char* display, int* visual);
@ -34,7 +40,7 @@ GLboolean glewCreateContext (const char* display, int* visual);
GLboolean glewCreateContext (); GLboolean glewCreateContext ();
#endif #endif
#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual); GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual);
#endif #endif

View File

@ -4,7 +4,7 @@
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
int main (int argc, char** argv) int main (int argc, char** argv)
#else #else
int main (void) int main (void)
@ -12,7 +12,7 @@ int main (void)
{ {
GLuint err; GLuint err;
#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
char* display = NULL; char* display = NULL;
int visual = -1; int visual = -1;
@ -27,7 +27,9 @@ int main (void)
} }
#endif #endif
#if defined(_WIN32) #if defined(GLEW_OSMESA)
if (GL_TRUE == glewCreateContext())
#elif defined(_WIN32)
if (GL_TRUE == glewCreateContext(&visual)) if (GL_TRUE == glewCreateContext(&visual))
#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
if (GL_TRUE == glewCreateContext()) if (GL_TRUE == glewCreateContext())
@ -44,7 +46,7 @@ int main (void)
err = glewContextInit(glewGetContext()); err = glewContextInit(glewGetContext());
#ifdef _WIN32 #ifdef _WIN32
err = err || wglewContextInit(wglewGetContext()); err = err || wglewContextInit(wglewGetContext());
#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
err = err || glxewContextInit(glxewGetContext()); err = err || glxewContextInit(glxewGetContext());
#endif #endif
@ -74,7 +76,7 @@ int main (void)
fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION)); fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION));
#if defined(_WIN32) #if defined(_WIN32)
fprintf(f, "Reporting capabilities of pixelformat %d\n", visual); fprintf(f, "Reporting capabilities of pixelformat %d\n", visual);
#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n", fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n",
display == NULL ? getenv("DISPLAY") : display, visual); display == NULL ? getenv("DISPLAY") : display, visual);
#endif #endif
@ -82,7 +84,8 @@ int main (void)
glGetString(GL_RENDERER), glGetString(GL_VENDOR)); glGetString(GL_RENDERER), glGetString(GL_VENDOR));
fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION)); fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION));
glewInfo(); glewInfo();
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
wglewInfo(); wglewInfo();
#else #else
glxewInfo(); glxewInfo();
@ -94,7 +97,7 @@ int main (void)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual) GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual)
{ {
int p = 0; int p = 0;
@ -130,7 +133,22 @@ GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) #if defined(GLEW_OSMESA)
OSMesaContext ctx;
GLboolean glewCreateContext ()
{
ctx = OSMesaCreateContext(OSMESA_RGBA, NULL);
if (NULL == ctx) return GL_TRUE;
return GL_FALSE;
}
void glewDestroyContext ()
{
if (NULL != ctx) OSMesaDestroyContext(ctx);
}
#elif defined(_WIN32)
HWND wnd = NULL; HWND wnd = NULL;
HDC dc = NULL; HDC dc = NULL;

View File

@ -2,7 +2,8 @@
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#ifdef _WIN32 #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
static void wglewInfo () static void wglewInfo ()
{ {

View File

@ -0,0 +1,36 @@
NAME = $(GLEW_NAME)
CC = cc
LD = cc
M_ARCH ?= $(shell uname -m)
ARCH64 = false
ifeq (x86_64,${M_ARCH})
ARCH64 = true
endif
ifeq (ppc64,${M_ARCH})
ARCH64 = true
endif
ifeq (${ARCH64},true)
LDFLAGS.EXTRA = -L/usr/lib64
LIBDIR = $(GLEW_DEST)/lib64
else
LDFLAGS.EXTRA = -L/usr/lib
LIBDIR = $(GLEW_DEST)/lib
endif
LDFLAGS.GL = -lOSMesa
LDFLAGS.STATIC = -Wl,-Bstatic
LDFLAGS.DYNAMIC = -Wl,-Bdynamic
NAME = GLEW
WARN = -Wall -W
POPT = -O2
CFLAGS.EXTRA += -fPIC -DGLEW_OSMESA
BIN.SUFFIX =
LIB.SONAME = lib$(NAME).so.$(SO_MAJOR)
LIB.DEVLNK = lib$(NAME).so
LIB.SHARED = lib$(NAME).so.$(SO_VERSION)
LIB.STATIC = lib$(NAME).a
LDFLAGS.SO = -shared -Wl,-soname=$(LIB.SONAME)
LIB.SONAME.MX = lib$(NAME)mx.so.$(SO_MAJOR)
LIB.DEVLNK.MX = lib$(NAME)mx.so
LIB.SHARED.MX = lib$(NAME)mx.so.$(SO_VERSION)
LIB.STATIC.MX = lib$(NAME)mx.a
LDFLAGS.SO.MX = -shared -Wl,-soname=$(LIB.SONAME.MX)

View File

@ -34,12 +34,15 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <GL/glew.h> #include <GL/glew.h>
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#include <GL/wglew.h> # define GLAPI extern
# include <GL/osmesa.h>
#elif defined(_WIN32)
# include <GL/wglew.h>
#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
#include <AGL/agl.h> # include <AGL/agl.h>
#elif !defined(__HAIKU__) #elif !defined(__HAIKU__)
#include <GL/glxew.h> # include <GL/glxew.h>
#endif #endif
#ifdef GLEW_MX #ifdef GLEW_MX
@ -48,7 +51,7 @@ GLEWContext _glewctx;
# ifdef _WIN32 # ifdef _WIN32
WGLEWContext _wglewctx; WGLEWContext _wglewctx;
# define wglewGetContext() (&_wglewctx) # define wglewGetContext() (&_wglewctx)
# elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) # elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
GLXEWContext _glxewctx; GLXEWContext _glxewctx;
# define glxewGetContext() (&_glxewctx) # define glxewGetContext() (&_glxewctx)
# endif # endif
@ -62,6 +65,8 @@ typedef struct GLContextStruct
HGLRC rc; HGLRC rc;
#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
AGLContext ctx, octx; AGLContext ctx, octx;
#elif defined(GLEW_OSMESA)
OSMesaContext ctx;
#elif !defined(__HAIKU__) #elif !defined(__HAIKU__)
Display* dpy; Display* dpy;
XVisualInfo* vi; XVisualInfo* vi;
@ -130,7 +135,7 @@ main (int argc, char** argv)
err = glewContextInit(glewGetContext()); err = glewContextInit(glewGetContext());
# ifdef _WIN32 # ifdef _WIN32
err = err || wglewContextInit(wglewGetContext()); err = err || wglewContextInit(wglewGetContext());
# elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) # elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) || !defined(GLEW_OSMESA)
err = err || glxewContextInit(glxewGetContext()); err = err || glxewContextInit(glxewGetContext());
# endif # endif
#else #else
@ -189,7 +194,7 @@ main (int argc, char** argv)
(const char*)wglGetExtensionsStringEXT()); (const char*)wglGetExtensionsStringEXT());
} }
#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
#elif defined(GLEW_OSMESA)
#elif defined(__HAIKU__) #elif defined(__HAIKU__)
/* TODO */ /* TODO */
@ -595,7 +600,7 @@ VisualInfo (GLContext* ctx)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) #elif (defined(__APPLE__) && !defined(GLEW_APPLE_GLX)) || defined(GLEW_OSMESA)
void void
VisualInfo (GLContext* __attribute__((__unused__)) ctx) VisualInfo (GLContext* __attribute__((__unused__)) ctx)
@ -1002,7 +1007,26 @@ VisualInfo (GLContext* ctx)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) #if defined(GLEW_OSMESA)
void InitContext (GLContext* ctx)
{
ctx->ctx = NULL;
}
GLboolean CreateContext (GLContext* ctx)
{
if (NULL == ctx) return GL_TRUE;
ctx->ctx = OSMesaCreateContext(OSMESA_RGBA, NULL);
if (NULL == ctx->ctx) return GL_TRUE;
return GL_FALSE;
}
void DestroyContext (GLContext* ctx)
{
if (NULL == ctx) return;
if (NULL != ctx->ctx) OSMesaDestroyContext(ctx->ctx);
}
#elif defined(_WIN32)
void InitContext (GLContext* ctx) void InitContext (GLContext* ctx)
{ {