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 committed by Nigel Stewart
parent ba913841ae
commit d2af6d3918
9 changed files with 114 additions and 18 deletions

View File

@ -204,7 +204,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) >> $@

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

@ -39,6 +39,8 @@ GLenum GLEWAPIENTRY glewInit (void)
GLenum r; GLenum r;
r = glewContextInit(); r = glewContextInit();
if ( r != 0 ) return r; if ( r != 0 ) return r;
#if defined(GLEW_OSMESA)
return r;
#if defined(_WIN32) #if defined(_WIN32)
return wglewInit(); return wglewInit();
#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 */

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

@ -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>
@ -21,7 +24,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)
@ -34,7 +38,8 @@ GLXEWContext _glxewctx;
struct createParams struct createParams
{ {
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
int pixelformat; int pixelformat;
#elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
const char* display; const char* display;

View File

@ -9,7 +9,8 @@ int main (int argc, char** argv)
GLuint err; GLuint err;
struct createParams params = struct createParams params =
{ {
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
-1, /* pixelformat */ -1, /* pixelformat */
#elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
"", /* display */ "", /* display */
@ -24,7 +25,8 @@ int main (int argc, char** argv)
if (glewParseArgs(argc-1, argv+1, &params)) if (glewParseArgs(argc-1, argv+1, &params))
{ {
fprintf(stderr, "Usage: glewinfo " fprintf(stderr, "Usage: glewinfo "
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
"[-pf <pixelformat>] " "[-pf <pixelformat>] "
#elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
"[-display <display>] " "[-display <display>] "
@ -46,7 +48,8 @@ int main (int argc, char** argv)
glewExperimental = GL_TRUE; glewExperimental = GL_TRUE;
#ifdef GLEW_MX #ifdef GLEW_MX
err = glewContextInit(glewGetContext()); err = glewContextInit(glewGetContext());
#ifdef _WIN32 #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
err = err || wglewContextInit(wglewGetContext()); err = err || wglewContextInit(wglewGetContext());
#elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
err = err || glxewContextInit(glxewGetContext()); err = err || glxewContextInit(glxewGetContext());
@ -76,7 +79,8 @@ int main (int argc, char** argv)
fprintf(f, " GLEW Extension Info\n"); fprintf(f, " GLEW Extension Info\n");
fprintf(f, "---------------------------\n\n"); fprintf(f, "---------------------------\n\n");
fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION)); fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION));
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
fprintf(f, "Reporting capabilities of pixelformat %d\n", params.pixelformat); fprintf(f, "Reporting capabilities of pixelformat %d\n", params.pixelformat);
#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n", fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n",
@ -86,7 +90,8 @@ int main (int argc, char** argv)
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();
@ -150,7 +155,22 @@ GLboolean glewParseArgs (int argc, char** argv, struct createParams *params)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#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,7 +34,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(GLEW_APPLE_GLX) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
@ -57,7 +60,9 @@ GLXEWContext _glxewctx;
typedef struct GLContextStruct typedef struct GLContextStruct
{ {
#ifdef _WIN32 #if defined(GLEW_OSMESA)
OSMesaContext ctx;
#elif defined(_WIN32)
HWND wnd; HWND wnd;
HDC dc; HDC dc;
HGLRC rc; HGLRC rc;
@ -180,7 +185,8 @@ main (int argc, char** argv)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/* extensions string */ /* extensions string */
#if defined(_WIN32) #if defined(GLEW_OSMESA)
#elif defined(_WIN32)
/* WGL extensions */ /* WGL extensions */
if (WGLEW_ARB_extensions_string || WGLEW_EXT_extensions_string) if (WGLEW_ARB_extensions_string || WGLEW_EXT_extensions_string)
{ {
@ -1003,7 +1009,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)
{ {