示例#1
0
int ggiMesaInit()
{
	int err;
	char *str;
	char *conffile;
	
	GGIMESADPRINT_CORE("ggiMesaInit() called\n");
	
	_ggimesaLibIsUp++;
	if (_ggimesaLibIsUp > 1) return 0; /* Initialize only at first call */
	
	str = getenv("GGIMESA_DEBUGSYNC");
	if (str != NULL) {
		_ggimesaDebugSync = 1;
	}
	
	str = getenv("GGIMESA_DEBUG");
	if (str != NULL) {
		_ggimesaDebugState = atoi(str);
		GGIMESADPRINT_CORE("%s Debugging=%d\n",
			_ggimesaDebugSync ? "sync" : "async",
			_ggimesaDebugState);
	}
	

	conffile = malloc(strlen(ggiMesaGetConfDir()) + 1
			  + strlen(GGIMESACONFFILE) +1);
	if (conffile == NULL) {
		fprintf(stderr, "GGIMesa: unable to allocate memory for config filename.\n");
		return GGI_ENOMEM;
	}
	sprintf(conffile, "%s%c%s",
		ggiMesaGetConfDir(), '/', GGIMESACONFFILE);
	err = ggLoadConfig(conffile, &_ggimesaConfigHandle);
	if (err != GGI_OK) {
		fprintf(stderr, "GGIMesa: Couldn't open %s\n",
			conffile);
		free(conffile);
		_ggimesaLibIsUp--;
		return err;
	}
	free(conffile);
	
	_ggiMesaID = ggiExtensionRegister("GGIMesa",
					 sizeof(struct ggi_mesa_ext), changed);
	if (_ggiMesaID < 0) {
		fprintf(stderr, "GGIMesa: failed to register as extension\n");
		_ggimesaLibIsUp--;
		ggFreeConfig(_ggimesaConfigHandle);
		return _ggiMesaID;
	}
	
	return 0;
}
static int GGIdlinit(ggi_visual *vis, struct ggi_dlhandle *dlh,
			const char *args, void *argptr, uint32 *dlret)
{
	struct genkgi_priv_mesa *priv;
	char libname[256], libargs[256];
	int id, err;
	struct stat junk;
	ggifunc_getapi *oldgetapi;

	GGIMESADPRINT_CORE("display-fbdev-kgicon-mesa: GGIdlinit start\n");
	
	GENKGI_PRIV_MESA(vis) = priv = malloc(sizeof(struct genkgi_priv_mesa));
	if (priv == NULL) 
	{
		fprintf(stderr, "Failed to allocate genkgi private data\n");
		return GGI_DL_ERROR;
	}
	
	priv->oldpriv = GENKGI_PRIV(vis);
#if 0
	err = ggLoadConfig(conffile, &_configHandle);
	if (err != GGI_OK)
	{
		gl_ggiPrint("display-fbdev-kgicon-mesa: Couldn't open %s\n", conffile);
		return err;
	}

	/* Hack city here.  We need to probe the KGI driver properly for
	 * suggest-strings to discover the acceleration type(s).
	 */
	priv->have_accel = 0;

	if (stat("/proc/gfx0", &junk) == 0)
	{
		sprintf(priv->accel, "%s%s", accel_prefix, "d3dim");
		priv->have_accel = 1;
		GGIMESADPRINT_CORE("display-fbdev-kgicon-mesa: Using accel: \"%s\"\n", priv->accel);
	}

	/* Mode management */
	vis->opdisplay->getapi = GGIMesa_genkgi_getapi;	
	ggiIndicateChange(vis, GGI_CHG_APILIST);
	
	/* Give the accel sublibs a chance to set up a driver */
	if (priv->have_accel == 1)
	{
		oldgetapi = vis->opdisplay->getapi;
		vis->opdisplay->getapi = GGIMesa_genkgi_getapi;
		changed(vis, GGI_CHG_APILIST);
		/* If the accel sublibs didn't produce, back up
		 * and keep looking */
		if ((LIBGGI_MESAEXT(vis)->update_state == NULL) ||
		    (LIBGGI_MESAEXT(vis)->setup_driver == NULL))
		  vis->opdisplay->getapi = oldgetapi;
	}
	
	LIBGGI_MESAEXT(vis)->update_state = genkgi_update_state;
	LIBGGI_MESAEXT(vis)->setup_driver = genkgi_setup_driver;
#endif	
	GGIMESADPRINT_CORE("display-fbdev-kgicon-mesa: GGIdlinit finished\n");

	*dlret = GGI_DL_OPDRAW;
	return 0;
}
示例#3
0
文件: init.c 项目: Nekrofage/DoomRPi
int giiInit(void)
{
	int err;
	const char *str;
	char *conffile;
	
	if (_giiLibIsUp>0) {
		/* Initialize only at first call. */
		_giiLibIsUp++;
		return 0;
	}

	err = ggInit();
	if (err != GGI_OK) {
		fprintf(stderr, "LibGII: unable to initialize LibGG\n");
		return err;
	}

	err = GGI_ENOMEM;
	if ((_gii_event_lock = ggLockCreate()) == NULL) {
		fprintf(stderr,"LibGII: unable to initialize event mutex.\n");
		goto out_ggexit;
	}

	if ((_gii_safe_lock = ggLockCreate()) == NULL) {
		fprintf(stderr,"LibGII: unable to initialize safe mutex.\n");
		goto out_destroy_event;
	}

	if ((_gii_global_lock = ggLockCreate()) == NULL) {
		fprintf(stderr,"LibGII: unable to initialize global mutex.\n");
		goto out_destroy_safe;
	}

	conffile = malloc(strlen(giiGetConfDir()) + 1
			  + strlen(GIICONFFILE) +1);
	if (conffile == NULL) {
		fprintf(stderr,"LibGII: unable to allocate memory for config filename.\n");
		goto out_destroy_global;
	}
	snprintf(conffile, strlen(giiGetConfDir()) + strlen(GIICONFFILE) + 2,
		"%s%c%s", giiGetConfDir(), CHAR_DIRDELIM, GIICONFFILE);
	if(ggLoadConfig(conffile, &_giiconfhandle)) {
		fprintf(stderr, "LibGII: fatal error - could not load %s\n",
			conffile);
		free(conffile);
		goto out_destroy_global;
	}
	free(conffile);
	
	str = getenv("GII_DEBUGSYNC");
	if (str != NULL) {
		_giiDebug |= DEBUG_SYNC;
	}
	
	str = getenv("GII_DEBUG");
	if (str != NULL) {
		_giiDebug |= atoi(str) & DEBUG_ALL;
		DPRINT_CORE("%s Debugging=%d\n",
			    DEBUG_ISSYNC ? "sync" : "async",
			    _giiDebug);
	}

	_giiInitBuiltins();

	_giiLibIsUp++;
	
	return 0;

  out_destroy_global:
	ggLockDestroy(_gii_global_lock);
  out_destroy_safe:
	ggLockDestroy(_gii_safe_lock);
  out_destroy_event:
	ggLockDestroy(_gii_event_lock);
  out_ggexit:
	ggExit();

	return err;
}