From: Malte S. <ma...@co...> - 2006-03-14 04:09:39
|
Hi, I recently tried to compile the Mesa fbdev/DRI drivers. Since I do not have X installed, this seemed to be exactly what I needed. Although the Mesa fbdev/DRI drivers do not require X, it seems that some X utilities and libs are at least required during the compilation process. I encountered a few problems which I managed to fix, and I thought I'd share them here for other people who may want to compile these drivers and have no X installed. First off, the makedepend utility is required for the compilation process. However, makedepend is a utility provided by the XFree86 and X.Org projects. One actually needs X to be able to compile makedepend (I don't really know why, since makedepend does not directly depend on X, but it is that way - and I really don't feel like going into the makedepend source code ;-) So, if you don't have X, you don't have makedepend either, and the compilation process aborts at the very beginning because the makedepend command is not found. A simple solution to this problem is to use gcc along with the -M option instead of makedepend. A clean way to do this is to override the MKDEP and MKDEP_OPTIONS variables (set in config/defaults) in configs/linux-solo. So, in configs/linux-solo, first -DIN_MINI_GLX needs to be added to the DEFINES variable, so that miniGLX is used instead of X, and the following lines are to be added to configs/linux-solo (after the DEFINES variable is defined, of course): MKDEP = gcc MKDEP_OPTIONS = -M -o depend -$(DEFINES) With this done, the compilation process gets a bit further, but it will again abort because of missing X libraries, shortly afterwards, while doing the 'depend' target in src/mesa/ This is because all sources are preprocessed (that are in the $(ALL_SOURCES) variable), including the x11 drivers. To avoid this, in the definition of the $ALL_SOURCES variable, the line $(X11_DRIVER_SOURCES) \ needs to be commented out. Furthermore, still while running make depend in src/mesa/, it will complain because of missing matypes.h header file (I guess this is due to the fact that gcc -M is used instead of makedepend - it probably works differently). Nevertheless, weirdly, matypes.h is generated before the compile process aborts, so what I did was copy the src/mesa/x86/matypes.h to some secure directory, run make realclean, copy matypes.h back to src/mesa/x86/, and run make linux-solo again. Now it *almost* compiles, but there are some errors in src/mesa/drivers/dri/fb/fb_egl.c (fb and tdfx are the only things is my $DRIVER_DIRS, to minimize the sources of error) which lead to the following abort: gcc -c -I../../../../../src/glx/mini -I/root/drm/shared-core -I/root/drm/libdrm -I. -I../../../../../src/mesa/drivers/dri/common -Iserver -I/root/drm/shared-core -I../../../../../include -I../../../../../include/GL/internal -I../../../../../src/mesa -I../../../../../src/mesa/main -I../../../../../src/mesa/glapi -I../../../../../src/mesa/math -I../../../../../src/mesa/transform -I../../../../../src/mesa/shader -I../../../../../src/mesa/swrast -I../../../../../src/mesa/swrast_setup -I../../../../../src/egl/main -I../../../../../src/egl/drivers/dri -Wall -Wundef -O3 -g -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DDRM_USE_MALLOC -DIN_DRI_DRIVER -DIN_MINI_GLX -std=c99 -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DDRM_USE_MALLOC -DIN_DRI_DRIVER -DIN_MINI_GLX fb_egl.c -o fb_egl.o fb_egl.c: In function `fbInitialize': fb_egl.c:315: warning: implicit declaration of function `_eglAddMode' fb_egl.c: In function `fbCreateContext': fb_egl.c:470: warning: passing arg 1 of `_eglInitContext' from incompatible pointer type fb_egl.c:470: too few arguments to function `_eglInitContext' fb_egl.c: In function `fbCreatePbufferSurface': fb_egl.c:573: warning: implicit declaration of function `_eglInitPbufferSurface' fb_egl.c: In function `fbCreateScreenSurfaceMESA': fb_egl.c:679: warning: implicit declaration of function `_eglInitScreenSurface' fb_egl.c: In function `fbShowSurfaceMESA': fb_egl.c:754: warning: implicit declaration of function `_eglShowSurfaceMESA' fb_egl.c: In function `_eglMain': fb_egl.c:872: structure has no member named `Initialize' fb_egl.c:873: structure has no member named `Terminate' fb_egl.c:874: structure has no member named `CreateContext' fb_egl.c:875: structure has no member named `MakeCurrent' fb_egl.c:876: structure has no member named `CreateWindowSurface' fb_egl.c:877: structure has no member named `CreatePixmapSurface' fb_egl.c:878: structure has no member named `CreatePbufferSurface' fb_egl.c:879: structure has no member named `DestroySurface' fb_egl.c:880: structure has no member named `DestroyContext' fb_egl.c:881: structure has no member named `CreateScreenSurfaceMESA' fb_egl.c:882: structure has no member named `ShowSurfaceMESA' fb_egl.c:883: structure has no member named `SwapBuffers' fb_egl.c:886: structure has no member named `MESA_screen_surface' fb_egl.c:887: structure has no member named `MESA_copy_context' make[6]: *** [fb_egl.o] Error 1 make[6]: Leaving directory `/usr/EXTROOTHOME/Mesa/src/mesa/drivers/dri/fb' make[5]: *** [subdirs] Error 1 make[5]: Leaving directory `/usr/EXTROOTHOME/Mesa/src/mesa/drivers/dri' make[4]: *** [linux-solo] Error 2 make[4]: Leaving directory `/usr/EXTROOTHOME/Mesa/src/mesa' make[3]: *** [default] Error 2 make[3]: Leaving directory `/usr/EXTROOTHOME/Mesa/src/mesa' make[2]: *** [subdirs] Error 1 make[2]: Leaving directory `/usr/EXTROOTHOME/Mesa/src' make[1]: *** [default] Error 1 make[1]: Leaving directory `/usr/EXTROOTHOME/Mesa' make: *** [linux-solo] Error 2 gcc is perfectly right here, at least considering the included egl stuff in src/egl/main/. Mostly, the above mentioned members are in a substructure, and there's a function call with some missing arguments. I fixed this, here's a diff: $ diff fb_egl.c.bak fb_egl.c 470c470 < _eglInitContext(&c->Base); --- > _eglInitContext(drv, dpy, &c->Base, config, attrib_list); 872,883c872,883 < fb->Base.Initialize = fbInitialize; < fb->Base.Terminate = fbTerminate; < fb->Base.CreateContext = fbCreateContext; < fb->Base.MakeCurrent = fbMakeCurrent; < fb->Base.CreateWindowSurface = fbCreateWindowSurface; < fb->Base.CreatePixmapSurface = fbCreatePixmapSurface; < fb->Base.CreatePbufferSurface = fbCreatePbufferSurface; < fb->Base.DestroySurface = fbDestroySurface; < fb->Base.DestroyContext = fbDestroyContext; < fb->Base.CreateScreenSurfaceMESA = fbCreateScreenSurfaceMESA; < fb->Base.ShowSurfaceMESA = fbShowSurfaceMESA; < fb->Base.SwapBuffers = fbSwapBuffers; --- > fb->Base.API.Initialize = fbInitialize; > fb->Base.API.Terminate = fbTerminate; > fb->Base.API.CreateContext = fbCreateContext; > fb->Base.API.MakeCurrent = fbMakeCurrent; > fb->Base.API.CreateWindowSurface = fbCreateWindowSurface; > fb->Base.API.CreatePixmapSurface = fbCreatePixmapSurface; > fb->Base.API.CreatePbufferSurface = fbCreatePbufferSurface; > fb->Base.API.DestroySurface = fbDestroySurface; > fb->Base.API.DestroyContext = fbDestroyContext; > fb->Base.API.CreateScreenSurfaceMESA = fbCreateScreenSurfaceMESA; > fb->Base.API.ShowScreenSurfaceMESA = fbShowSurfaceMESA; > fb->Base.API.SwapBuffers = fbSwapBuffers; 886,887c886,887 < fb->Base.MESA_screen_surface = EGL_TRUE; < fb->Base.MESA_copy_context = EGL_TRUE; --- > fb->Base.Extensions.MESA_screen_surface = EGL_TRUE; > fb->Base.Extensions.MESA_copy_context = EGL_TRUE; Now it compiled fine, but when I tried to start the sample_server (after installing the libs and configuring /etc/miniglx.conf), it complained: Couldn't find __driDriver in tdfx_dri.so InitDriver failed Error: __miniglx_StartServer failed So, in src/mesa/drivers/dri/tdfx/Makefile, I uncommented the line # not yet # MINIGLX_SOURCES = server/tdfx_dri.c (only the second one, obviously; the fact that it says "not yet" irritated me a bit, though, but I thought I'd give it a shot anyway) I recompiled, installed the libs, and now sample_server seems to work (at first sight). It gives the following output: [miniglx] probed chipset 0x5 got MMIOAddress 0x412b0000 offset 16773120 [drm] added 8192 byte SAREA at 0xe28d4000 [drm] mapped SAREA 0xe28d4000 to 0x40014000, size 8192 mtrr: base(0xd8000000) is not aligned on a size(0xfff000) boundary [drm] framebuffer handle = 0xd8000000 [drm] register handle = 0xd4000000 [miniglx] Setting mode: visible 1024x768 virtual 1024x768x32 [miniglx] Readback mode: visible 1024x768 virtual 1024x768x32 tdfxEngineRestore: not implemented Now when I start miniglxtest, it outputs: [miniglx] probed chipset 0x5 CreateNotify Authorize - magic 9 libGL error: InitDriver failed libGL error: reverting to (slow) indirect rendering XOpenDisplay: __driCreateScreen failed Error: XOpenDisplay failed (with that magic number increasing every time I call miniglxtest again) ...and I'm back to the prompt :-( I'm using a 3dfx Voodoo 3 card. Could it be that this one is not yet supported? That would explain why MINIGLX_SOURCES are commented out in src/mesa/drivers/dri/tdfx/Makefile, and that "tdfxEngineRestore: not implemented" message, wouldn't it? Am I better off using a Radeon card? Any ideas how to fix this? I'd be grateful for any hints :-) Cheers, Malte |