com.sun.opengl.impl.x11

Class DRIHack


public class DRIHack
extends Object

Helper class for working around problems with open-source DRI drivers. In the current DRI implementation it is required that the symbols in libGL.so.1.2 be globally visible to be accessible from other libraries that are dynamically loaded by the implementation. Applications may typically satisfy this need either by linking against libGL.so on the command line (-lGL) or by dlopen'ing libGL.so.1.2 with the RTLD_GLOBAL flag. The JOGL implementation links against libGL on all platforms rather than forcing all OpenGL entry points to be called through a function pointer. This allows the JOGL library to link directly to core 1.1 OpenGL entry points like glVertex3f, while calling through function pointers for entry points from later OpenGL versions as well as from extensions. However, because libjogl.so (which links against libGL.so) is loaded by the JVM, and because the JVM implicitly uses RTLD_LOCAL in the implementation of System.loadLibrary(), this means via transitivity that the symbols for libGL.so have only RTLD_LOCAL visibility to the rest of the application, so the DRI drivers can not find the symbols required.

There are at least two possible solutions. One would be to change the JOGL implementation to call through function pointers uniformly so that it does not need to link against libGL.so. This is possible, but requires changes to GlueGen and also is not really necessary in any other situation than with the DRI drivers. Another solution is to force the first load of libGL.so.1.2 to be done dynamically with RTLD_GLOBAL before libjogl.so is loaded and causes libGL.so.1.2 to be loaded again. This requires the C APIs dlopen and dlclose to be made available before libjogl.so is loaded. This is the solution currently chosen and is called the "DRI hack" because again it is needed only in this situation.

Method Summary

static void
begin()
static int
dlclose(long handle)
static long
dlopen(String name)
static void
end()

Method Details

begin

public static void begin()

dlclose

public static int dlclose(long handle)

dlopen

public static long dlopen(String name)

end

public static void end()

Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.