261 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2005 Novell, Inc.
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software
 | |
|  * and its documentation for any purpose is hereby granted without
 | |
|  * fee, provided that the above copyright notice appear in all copies
 | |
|  * and that both that copyright notice and this permission notice
 | |
|  * appear in supporting documentation, and that the name of
 | |
|  * Novell, Inc. not be used in advertising or publicity pertaining to
 | |
|  * distribution of the software without specific, written prior permission.
 | |
|  * Novell, Inc. makes no representations about the suitability of this
 | |
|  * software for any purpose. It is provided "as is" without express or
 | |
|  * implied warranty.
 | |
|  *
 | |
|  * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
 | |
|  * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 | |
|  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 | |
|  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 | |
|  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  * Author: David Reveman <davidr@novell.com>
 | |
|  */
 | |
| 
 | |
| #include "xglglx.h"
 | |
| 
 | |
| #ifdef GLXEXT
 | |
| 
 | |
| #ifdef XGL_MODULAR
 | |
| #include <dlfcn.h>
 | |
| #endif
 | |
| 
 | |
| xglGLXFuncRec __xglGLXFunc;
 | |
| 
 | |
| #ifndef NGLXEXTLOG
 | |
| FILE *__xglGLXLogFp;
 | |
| #endif
 | |
| 
 | |
| static void *glXHandle = 0;
 | |
| static void *glCoreHandle = 0;
 | |
| 
 | |
| #define SYM(ptr, name) { (void **) &(ptr), (name) }
 | |
| 
 | |
| __GLXextensionInfo *__xglExtensionInfo;
 | |
| __GLXscreenInfo *__xglScreenInfoPtr;
 | |
| 
 | |
| void
 | |
| GlxSetVisualConfigs (int	       nconfigs,
 | |
| 		     __GLXvisualConfig *configs,
 | |
| 		     void              **privates)
 | |
| {
 | |
|     if (glXHandle && glCoreHandle)
 | |
| 	(*__xglGLXFunc.setVisualConfigs) (nconfigs, configs, privates);
 | |
| }
 | |
| 
 | |
| void
 | |
| GlxExtensionInit (void)
 | |
| {
 | |
|     if (glXHandle && glCoreHandle)
 | |
| 	(*__xglGLXFunc.extensionInit) ();
 | |
| }
 | |
| 
 | |
| void
 | |
| GlxWrapInitVisuals (miInitVisualsProcPtr *initVisuals)
 | |
| {
 | |
|     if (glXHandle && glCoreHandle)
 | |
| 	(*__xglGLXFunc.wrapInitVisuals) (initVisuals);
 | |
| }
 | |
| 
 | |
| int
 | |
| GlxInitVisuals (VisualPtr     *visualp,
 | |
| 		DepthPtr      *depthp,
 | |
| 		int	      *nvisualp,
 | |
| 		int	      *ndepthp,
 | |
| 		int	      *rootDepthp,
 | |
| 		VisualID      *defaultVisp,
 | |
| 		unsigned long sizes,
 | |
| 		int	      bitsPerRGB,
 | |
| 		int	      preferredVis)
 | |
| {
 | |
|     if (glXHandle && glCoreHandle)
 | |
| 	return (*__xglGLXFunc.initVisuals) (visualp, depthp, nvisualp, ndepthp,
 | |
| 					    rootDepthp, defaultVisp, sizes,
 | |
| 					    bitsPerRGB, preferredVis);
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| void
 | |
| GlxFlushContextCache (void)
 | |
| {
 | |
|     (*__xglGLXFunc.flushContextCache) ();
 | |
| }
 | |
| 
 | |
| void
 | |
| GlxSetRenderTables (struct _glapi_table *table)
 | |
| {
 | |
|   (*__xglGLXFunc.setRenderTables) (table);
 | |
| }
 | |
| 
 | |
| struct _glapi_table *_mglapi_Dispatch;
 | |
| 
 | |
| void *(*__glcore_DDXScreenInfo)(void);
 | |
| 
 | |
| void *__glXglDDXScreenInfo(void)
 | |
| {
 | |
|   return __xglScreenInfoPtr;
 | |
| }
 | |
| 
 | |
| void *(*__glcore_DDXExtensionInfo)(void);
 | |
| 
 | |
| void *__glXglDDXExtensionInfo(void)
 | |
| {
 | |
|   return __xglExtensionInfo;
 | |
| }	
 | |
| 
 | |
| void _gl_copy_visual_to_context_mode( __GLcontextModes * mode,
 | |
|                                  const __GLXvisualConfig * config )
 | |
| {
 | |
| 	(*__xglGLXFunc.copy_visual_to_context_mode)(mode, config);
 | |
| }
 | |
| 
 | |
| __GLcontextModes *_gl_context_modes_create( unsigned count, size_t minimum_size )
 | |
| {
 | |
| 	return (*__xglGLXFunc.context_modes_create)(count, minimum_size);
 | |
| }
 | |
| 
 | |
| void _gl_context_modes_destroy( __GLcontextModes * modes )
 | |
| {
 | |
| 	(*__xglGLXFunc.context_modes_destroy)(modes);
 | |
| }
 | |
| 
 | |
| GLint _gl_convert_from_x_visual_type( int visualType )
 | |
| {
 | |
| 	return (*__xglGLXFunc.convert_from_x_visual_type)(visualType);
 | |
| }
 | |
| 
 | |
| GLint _gl_convert_to_x_visual_type( int visualType )
 | |
| {
 | |
| 	return (*__xglGLXFunc.convert_to_x_visual_type)(visualType);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| Bool
 | |
| xglLoadGLXModules (void)
 | |
| {
 | |
| 
 | |
| #ifdef XGL_MODULAR
 | |
|     if (!glXHandle)
 | |
|     {
 | |
| 	xglSymbolRec sym[] = {
 | |
| 	    SYM (__xglGLXFunc.extensionInit,     "GlxExtensionInit"),
 | |
| 	    SYM (__xglGLXFunc.setVisualConfigs,  "GlxSetVisualConfigs"),
 | |
| 	    SYM (__xglGLXFunc.wrapInitVisuals,   "GlxWrapInitVisuals"),
 | |
| 	    SYM (__xglGLXFunc.initVisuals,	 "GlxInitVisuals"),
 | |
| 	    SYM (__xglGLXFunc.flushContextCache, "__glXFlushContextCache"),
 | |
| 	    SYM (__xglGLXFunc.setRenderTables,   "GlxSetRenderTables"),
 | |
| 	    SYM (__xglGLXFunc.copy_visual_to_context_mode, "_gl_copy_visual_to_context_mode"),
 | |
| 	    SYM (__xglGLXFunc.context_modes_create, "_gl_context_modes_create"),
 | |
| 	    SYM (__xglGLXFunc.context_modes_destroy, "_gl_context_modes_destroy"),
 | |
| 	    SYM (__xglGLXFunc.convert_from_x_visual_type, "_gl_convert_from_x_visual_type"),
 | |
| 	    SYM (__xglGLXFunc.convert_to_x_visual_type, "_gl_convert_to_x_visual_type"),
 | |
| 	};
 | |
| 
 | |
| 	glXHandle = xglLoadModule ("glx", RTLD_NOW | RTLD_LOCAL);
 | |
| 	if (!glXHandle)
 | |
| 	    return FALSE;
 | |
| 
 | |
| 	if (!xglLookupSymbols (glXHandle, sym, sizeof (sym) / sizeof (sym[0])))
 | |
| 	{
 | |
| 	    xglUnloadModule (glXHandle);
 | |
| 	    glXHandle = 0;
 | |
| 
 | |
| 	    return FALSE;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (!glCoreHandle)
 | |
|     {
 | |
|         xglSymbolRec ddxsym[] = {
 | |
| 	    SYM (__glcore_DDXExtensionInfo, "__glXglDDXExtensionInfo"),
 | |
| 	    SYM (__glcore_DDXScreenInfo, "__glXglDDXScreenInfo")
 | |
|         };	
 | |
| 
 | |
| 	glCoreHandle = xglLoadModule ("glcore", RTLD_NOW | RTLD_LOCAL);
 | |
| 	if (!glCoreHandle)
 | |
| 	    return FALSE;
 | |
| 
 | |
| 	if (!xglLookupSymbols (glCoreHandle, ddxsym,
 | |
| 			       sizeof (ddxsym) / sizeof(ddxsym[0])))
 | |
| 	{
 | |
| 	  xglUnloadModule (glCoreHandle);
 | |
| 	  glCoreHandle = 0;
 | |
| 	  
 | |
| 	  return FALSE;
 | |
| 	}
 | |
| 
 | |
| 	__xglScreenInfoPtr = __glcore_DDXScreenInfo();
 | |
| 	__xglExtensionInfo = __glcore_DDXExtensionInfo();
 | |
| 	{
 | |
| 	  xglSymbolRec sym[] = {
 | |
| 	      SYM (__xglScreenInfoPtr->screenProbe,    "__MESA_screenProbe"),
 | |
|   	    SYM (__xglScreenInfoPtr->createContext,  "__MESA_createContext"),
 | |
| 	    SYM (__xglScreenInfoPtr->createBuffer,   "__MESA_createBuffer"),
 | |
| 	    SYM (__xglExtensionInfo->resetExtension,
 | |
| 		 "__MESA_resetExtension"),
 | |
| 	    SYM (__xglExtensionInfo->initVisuals, "__MESA_initVisuals"),
 | |
| 	    SYM (__xglExtensionInfo->setVisualConfigs,
 | |
| 		 "__MESA_setVisualConfigs"),
 | |
| 
 | |
| 	  };
 | |
| 
 | |
| 
 | |
| 	  if (!xglLookupSymbols (glCoreHandle, sym,
 | |
| 				 sizeof (sym) / sizeof (sym[0])))
 | |
| 	  {
 | |
| 	    xglUnloadModule (glCoreHandle);
 | |
| 	    glCoreHandle = 0;
 | |
| 	    
 | |
| 	    return FALSE;
 | |
| 	  }
 | |
| 	}
 | |
| 
 | |
| 	if (!xglLoadHashFuncs (glCoreHandle))
 | |
| 	{
 | |
| 	    xglUnloadModule (glCoreHandle);
 | |
| 	    glCoreHandle = 0;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return TRUE;
 | |
| #else
 | |
|     return FALSE;
 | |
| #endif
 | |
| 
 | |
| }
 | |
| 
 | |
| void
 | |
| xglUnloadGLXModules (void)
 | |
| {
 | |
| 
 | |
| #ifdef XGL_MODULAR
 | |
|     if (glXHandle)
 | |
|     {
 | |
| 	xglUnloadModule (glXHandle);
 | |
| 	glXHandle = 0;
 | |
|     }
 | |
| 
 | |
|     if (glCoreHandle)
 | |
|     {
 | |
| 	xglUnloadModule (glCoreHandle);
 | |
| 	glCoreHandle = 0;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| }
 | |
| 
 | |
| #endif
 |