Eu criei o contêiner lxc
de nosso conjunto de ferramentas personalizado que tem muitos pacotes.
Relacionado a gráficos, instalei o driver nvidia 367.27
usando o instalador nvidia dentro deste container (chamado mk7icontainer
)
As bibliotecas / binários do driver nvidia são instaladas no caminho /usr/share/nvidia
dentro desse contêiner.
Eu também instalei mesa
instalado no caminho /usr
dentro do container.
Eu compilei o código-fonte glxdemo
usando o comando como:
gcc -g glxdemo.c -Wl,--rpath-link,/usr/share/nvidia/lib -Wl,-rpath,/usr/share/nvidia/lib \
-Wl,--rpath-link,/usr/share/nvidia/lib/tls -Wl,-rpath,/usr/share/nvidia/lib/tls \
-Wl,--rpath-link,/usr/share/nvidia/lib/vdpau -Wl,-rpath,/usr/share/nvidia/lib/vdpau \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules/drivers -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules/drivers \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules/extensions -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules/extensions -lX11 -lGL -lGLU -lglut -lm -o glxdemo
Dentro do contêiner, eu tenho
DISPLAY=":0"
XAUTHORITY=/root/.Xauthority
Estou iniciando o bash
no contêiner usando o comando abaixo:
sudo lxc-attach -n mk7icontainer --clear-env -- /usr/bin/bash
Minha máquina host está executando Ubuntu 16.0.4
e instalei o mesmo driver nvidia 367.27
usando seu instalador. Está funcionando bem. Eu posso até executar glxdemo
na máquina host sem problemas.
No entanto, quando tento executar glxdemo
dentro do contêiner (compilado usando o comando acima mencionado), recebo o seguinte erro:
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 24
Current serial number in output stream: 25
alguém tem alguma ideia do que está errado aqui?
Eu também quero saber como ler esses erros para diminuir o problema.
O código-fonte para glxdemo
é:
#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>
#include <stdlib.h>
static void redraw( Display *dpy, Window w )
{
printf("Redraw event\n");
glClear( GL_COLOR_BUFFER_BIT );
glColor3f( 1.0, 1.0, 0.0 );
glRectf( -0.8, -0.8, 0.8, 0.8 );
glXSwapBuffers( dpy, w );
}
static void resize( unsigned int width, unsigned int height )
{
printf("Resize event\n");
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
}
static Window make_rgb_db_window( Display *dpy,
unsigned int width, unsigned int height )
{
int attrib[] = { GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
GLX_DOUBLEBUFFER,
None };
int scrnum;
XSetWindowAttributes attr;
unsigned long mask;
Window root;
Window win;
GLXContext ctx;
XVisualInfo *visinfo;
scrnum = DefaultScreen( dpy );
root = RootWindow( dpy, scrnum );
visinfo = glXChooseVisual( dpy, scrnum, attrib );
if (!visinfo) {
printf("Error: couldn't get an RGB, Double-buffered visual\n");
exit(1);
}
/* window attributes */
attr.background_pixel = 0;
attr.border_pixel = 0;
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
attr.event_mask = StructureNotifyMask | ExposureMask;
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
win = XCreateWindow( dpy, root, 0, 0, width, height,
0, visinfo->depth, InputOutput,
visinfo->visual, mask, &attr );
printf("\n XCreateWindow successfull \n");
ctx = glXCreateContext( dpy, visinfo, NULL, True );
if (!ctx) {
printf("Error: glXCreateContext failed\n");
exit(1);
}
printf("\n glXCreateContext successfull \n");
glXMakeCurrent( dpy, win, ctx );
return win;
}
static void event_loop( Display *dpy )
{
XEvent event;
while (1) {
XNextEvent( dpy, &event );
switch (event.type) {
case Expose:
redraw( dpy, event.xany.window );
break;
case ConfigureNotify:
resize( event.xconfigure.width, event.xconfigure.height );
break;
}
}
}
int main( int argc, char *argv[] )
{
Display *dpy;
Window win;
dpy = XOpenDisplay(NULL);
if(!dpy)
{
printf("\nError in XOpenDisplay\n");
}
printf("\nXOpenDisplay successfull\n");
win = make_rgb_db_window( dpy, 300, 300 );
printf("\nmake_rgb_db_window successfull \n");
glShadeModel( GL_FLAT );
glClearColor( 0.5, 0.5, 0.5, 1.0 );
XMapWindow( dpy, win );
event_loop( dpy );
return 0;
}