[Mesa-dev] is it possible to dynamic load OSMesa?
Patrick Baggett
baggett.patrick at gmail.com
Fri Jul 15 12:45:35 PDT 2011
If libOSMesa.so is separate library, then isn't libGL.so too? You're calling
glGetIntegerv() from libGL.so but not from libOSMesa.so -- try doing
dlsym("glGetIntegerv") and removing libGL.so from the link line.
Patrick
On Fri, Jul 15, 2011 at 2:41 PM, Paul Gotzel <paul.gotzel at gmail.com> wrote:
> Hello,
>
> I've downloaded the latest 7.10.3 and I need to be able to dynamically load
> OSMesa. Is this possible? I've tried to use dlopen and dlsym to load the
> functions and all the OSMesa calls return success but when I make the gl
> calls I get:
>
> GL User Error: glGetIntegerv called without a rendering context
> GL User Error: glGetIntegerv called without a rendering context
> GL User Error: glGetIntegerv called without a rendering context
>
> Any help would be appreciated.
>
> Thanks,
> Paul
>
> My sample program is as follows. I compile it with the same flags as the
> rest of the demo programs without linking to OSMesa.
>
> static void *
> loadOSMesa()
> {
> return dlopen("libOSMesa.so", RTLD_DEEPBIND | RTLD_NOW | RTLD_GLOBAL);
> }
>
> static OSMesaContext
> dynOSMesaCreateContext()
> {
> typedef OSMesaContext (*CreateContextProto)( GLenum , GLint , GLint ,
> GLint , OSMesaContext );
> static void *createPfunc = NULL;
> CreateContextProto createContext;
> if (createPfunc == NULL)
> {
> void *handle = loadOSMesa();
> if (handle)
> {
> createPfunc = dlsym(handle, "OSMesaCreateContextExt");
> }
> }
>
> if (createPfunc)
> {
> createContext = (CreateContextProto)(createPfunc);
> return (*createContext)(GL_RGBA, 16, 0, 0, NULL);
> }
> return 0;
> }
>
> static GLboolean
> dynOSMesaMakeCurrent(OSMesaContext cid, void * win, GLenum type, GLsizei w,
> GLsizei h)
> {
> typedef GLboolean (*MakeCurrentProto)(OSMesaContext, void *, GLenum,
> GLsizei, GLsizei);
> static void *currentPfunc = NULL;
> MakeCurrentProto makeCurrent;
> if (currentPfunc == NULL)
> {
> void *handle = loadOSMesa();
> if (handle)
> {
> currentPfunc = dlsym(handle, "OSMesaMakeCurrent");
> }
> }
> if (currentPfunc)
> {
> makeCurrent = (MakeCurrentProto)(currentPfunc);
> return (*makeCurrent)(cid, win, type, w, h);
> }
> return GL_FALSE;
> }
>
> int
> main(int argc, char *argv[])
> {
> OSMesaContext ctx;
> void *buffer;
>
> ctx = dynOSMesaCreateContext();
> if (!ctx) {
> printf("OSMesaCreateContext failed!\n");
> return 0;
> }
>
> int Width = 100;
> int Height = 100;
>
> /* Allocate the image buffer */
> buffer = malloc( Width * Height * 4 * sizeof(GLubyte) );
> if (!buffer) {
> printf("Alloc image buffer failed!\n");
> return 0;
> }
>
> /* Bind the buffer to the context and make it current */
> if (!dynOSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height
> )) {
> printf("OSMesaMakeCurrent failed!\n");
> return 0;
> }
>
>
> {
> int z, s, a;
> glGetIntegerv(GL_DEPTH_BITS, &z);
> glGetIntegerv(GL_STENCIL_BITS, &s);
> glGetIntegerv(GL_ACCUM_RED_BITS, &a);
> printf("Depth=%d Stencil=%d Accum=%d\n", z, s, a);
> }
>
> return 0;
> }
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110715/a02da950/attachment-0001.htm>
More information about the mesa-dev
mailing list