Package: libglewmx1.9
Version: 1.9.0-3
Severity: important
Dear Maintainer,
i recently tried to add multi-context support to a project of mine that is
already using GLEW.
so i installed GLEWmx, added the necessary glue to my code, compiled and linked
against the MX enabled version of the library.
unfortunately, this gives me a lot of errors.
i tried to narrow down the problem, and it seems that the binary libGLEWmx as
shipped with debian, currently lacks a number of functions.
if i fetch the glew-sources from upstream and build libGLEWmx myself, everything
works as expected.
to reproduce the problem, i created a minimal program based on glewinfo
(attached).
the program can be compiled either without multi-context support (glewtest),
with multi-context support (glewtestMX) and - for convenience - with
multi-context support but linking against a local copy of libGLEWmx.
the results are:
$ make glewtest
> gcc glewtest.c -o glewtest -lGLEW -lGL -lX11
$ make glewtestMXlocal
> gcc glewtest.c -o glewtestMXlocal -DGLEW_MX -L/tmp/zmoelnig/glew-1.9.0/lib/
> -lGLEWmx -lGL -lX11
$ make glewtestMX
> gcc glewtest.c -o glewtestMX -DGLEW_MX -lGLEWmx -lGL -lX11
> /tmp/cczVClYT.o:glewtest.c:function main: error: undefined reference to
> '__glewClearBufferData'
> collect2: error: ld returned 1 exit status
> make: *** [glewtestMX] Error 1
$
running the two successfully built binaries, i get (in both cases):
> ---------------------------
> GLEW Extension Info
> ---------------------------
>
> GLEW version 1.9.0
> Reporting capabilities of display :0.0, visual 0x2f
> Running on a GeForce 7800 GTX/PCIe/SSE2 from NVIDIA Corporation
> OpenGL version 2.1.2 NVIDIA 304.88 is supported
> glClearBufferData: MISSING
since linking works ok with my local copy of libGLEWmx, i guess there is a
problem with the libglewmx1.9 package.
another (non-minimal) way to trigger the problem, is to try building the
ordinary `glewinfo` utilitiy with MX-support:
$ gcc glewinfo.c -o glewinfo -DGLEW_MX -lGLEWmx -lGL -lX11 2>&1 | grep -c error
> 79
$
hope that helps.
-- System Information:
Debian Release: jessie/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'stable'), (500, 'oldstable'), (1,
'experimental')
Architecture: i386 (i686)
Kernel: Linux 3.2.0-4-686-pae (SMP w/4 CPU cores)
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages libglewmx1.9 depends on:
ii libc6 2.17-3
ii libgl1-mesa-glx [libgl1] 8.0.5-5
ii libx11-6 2:1.5.0-1
ii libxext6 2:1.3.1-2
ii libxi6 2:1.6.1-1
ii libxmu6 2:1.1.1-1
ii multiarch-support 2.17-3
libglewmx1.9 recommends no packages.
libglewmx1.9 suggests no packages.
-- no debconf information
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/glew.h>
#if defined(_WIN32)
#include <GL/wglew.h>
#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
#include <GL/glxew.h>
#endif
#ifdef GLEW_REGAL
#include <GL/Regal.h>
#endif
static FILE* f;
#ifdef GLEW_MX
GLEWContext _glewctx;
#define glewGetContext() (&_glewctx)
GLXEWContext _glxewctx;
#define glxewGetContext() (&_glxewctx)
#endif
GLboolean glewCreateContext (const char* display, int* visual);
GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual);
void glewDestroyContext ();
static void glewInfoFunc (const char* name, GLint undefined)
{
unsigned int i;
fprintf(f, " %s:", name);
for (i=0; i<60-strlen(name); i++) fprintf(f, " ");
fprintf(f, "%s\n", undefined ? "MISSING" : "OK");
fflush(f);
}
/* ------------------------------------------------------------------------- */
int main (int argc, char** argv)
{
GLuint err;
char* display = NULL;
int visual = -1;
if (glewParseArgs(argc-1, argv+1, &display, &visual))
{
fprintf(stderr, "Usage: glewinfo [-display <display>] [-visual <id>]\n");
return 1;
}
if (GL_TRUE == glewCreateContext(display, &visual))
{
fprintf(stderr, "Error: glewCreateContext failed\n");
glewDestroyContext();
return 1;
}
glewExperimental = GL_TRUE;
#ifdef GLEW_MX
err = glewContextInit(glewGetContext());
err = err || glxewContextInit(glxewGetContext());
#else
err = glewInit();
#endif
if (GLEW_OK != err)
{
fprintf(stderr, "Error [main]: glewInit failed: %s\n", glewGetErrorString(err));
glewDestroyContext();
return 1;
}
f = stdout;
fprintf(f, "---------------------------\n");
fprintf(f, " GLEW Extension Info\n");
fprintf(f, "---------------------------\n\n");
fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION));
fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n",
display == NULL ? getenv("DISPLAY") : display, visual);
fprintf(f, "Running on a %s from %s\n",
glGetString(GL_RENDERER), glGetString(GL_VENDOR));
fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION));
#ifdef GL_ARB_clear_buffer_object
glewInfoFunc("glClearBufferData", glClearBufferData == NULL);
#endif
if (f != stdout) fclose(f);
glewDestroyContext();
return 0;
}
/* ------------------------------------------------------------------------ */
GLboolean glewParseArgs (int argc, char** argv, char** display, int* visual)
{
int p = 0;
while (p < argc)
{
if (!strcmp(argv[p], "-display"))
{
if (++p >= argc) return GL_TRUE;
*display = argv[p++];
}
else if (!strcmp(argv[p], "-visual"))
{
if (++p >= argc) return GL_TRUE;
*visual = (int)strtol(argv[p++], NULL, 0);
}
else
return GL_TRUE;
}
return GL_FALSE;
}
/* ------------------------------------------------------------------------ */
Display* dpy = NULL;
XVisualInfo* vi = NULL;
XVisualInfo* vis = NULL;
GLXContext ctx = NULL;
Window wnd = 0;
Colormap cmap = 0;
GLboolean glewCreateContext (const char* display, int* visual)
{
int attrib[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None };
int erb, evb;
XSetWindowAttributes swa;
/* open display */
dpy = XOpenDisplay(display);
if (NULL == dpy) return GL_TRUE;
/* query for glx */
if (!glXQueryExtension(dpy, &erb, &evb)) return GL_TRUE;
/* choose visual */
if (*visual == -1)
{
vi = glXChooseVisual(dpy, DefaultScreen(dpy), attrib);
if (NULL == vi) return GL_TRUE;
*visual = (int)XVisualIDFromVisual(vi->visual);
}
else
{
int n_vis, i;
vis = XGetVisualInfo(dpy, 0, NULL, &n_vis);
for (i=0; i<n_vis; i++)
{
if ((int)XVisualIDFromVisual(vis[i].visual) == *visual)
vi = &vis[i];
}
if (vi == NULL) return GL_TRUE;
}
/* create context */
ctx = glXCreateContext(dpy, vi, None, True);
if (NULL == ctx) return GL_TRUE;
/* create window */
/*wnd = XCreateSimpleWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 1, 1, 1, 0, 0);*/
cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
swa.border_pixel = 0;
swa.colormap = cmap;
wnd = XCreateWindow(dpy, RootWindow(dpy, vi->screen),
0, 0, 1, 1, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap, &swa);
/* make context current */
if (!glXMakeCurrent(dpy, wnd, ctx)) return GL_TRUE;
return GL_FALSE;
}
void glewDestroyContext ()
{
if (NULL != dpy && NULL != ctx) glXDestroyContext(dpy, ctx);
if (NULL != dpy && 0 != wnd) XDestroyWindow(dpy, wnd);
if (NULL != dpy && 0 != cmap) XFreeColormap(dpy, cmap);
if (NULL != vis)
XFree(vis);
else if (NULL != vi)
XFree(vi);
if (NULL != dpy) XCloseDisplay(dpy);
}
LOCALGLEWLIB=/tmp/zmoelnig/glew-1.9.0/lib/
glewtest: glewtest.c
gcc $^ -o $@ -lGLEW -lGL -lX11
glewtestMX: glewtest.c
gcc $^ -o $@ -DGLEW_MX -lGLEWmx -lGL -lX11
glewtestMXlocal: glewtest.c
gcc $^ -o $@ -DGLEW_MX -L$(LOCALGLEWLIB) -lGLEWmx -lGL -lX11
clean:
rm -f glewtest glewtestMX glewtestMXlocal