static int DISPMANX_VideoInit(_THIS, SDL_PixelFormat *vformat)
{

#ifdef debug_mode
 fp = fopen("SDL_log.txt","w");
#endif
	
#if !SDL_THREADS_DISABLED
	/* Create the hardware surface lock mutex */
	hw_lock = SDL_CreateMutex();
	if ( hw_lock == NULL ) {
		SDL_SetError("Unable to create lock mutex");
		DISPMANX_VideoQuit(this);
		return(-1);
	}
#endif

	
	/* Enable mouse and keyboard support */
	if ( DISPMANX_OpenKeyboard(this) < 0 ) {
		DISPMANX_VideoQuit(this);
		return(-1);
	}
	if ( DISPMANX_OpenMouse(this) < 0 ) {
		const char *sdl_nomouse;
		//MAC Si esto da problemas, es por los premisos de gpm sobre
		//el raton en /dev/mice. Edita /etc/init.d/gpm y aniade
		//en la seccion start() la linea chmod 0666{MOUSEDEV}
		sdl_nomouse = SDL_getenv("SDL_NOMOUSE");
		if ( ! sdl_nomouse ) {
			printf("\nERR - Couldn't open mouse. Look for permissions in /etc/init.d/gpm.\n");
			DISPMANX_VideoQuit(this);
			return(-1);
		}
	}
	
	//MAC Esto es necesario para que SDL_SetVideoMode de SDL_Video.c (NO DISPMANX_SetVideoMode()) no
	//se piense que tenemos un modo con paleta, porque eso haria que se llamase a DISPMANX_SetColors
	//desde SDL_SetVideoMode(). Esto ocurre porque no es la parte de DISPMANX donde se asigna el 
	//format a mode (que es lo que retorna DISPMANX_SetVideoMode())	sino que nos viene asignado de la 
	//llamada a SDL_CreateRGBSurface() de SDL_VideoInit().
	vformat->BitsPerPixel = 16;
	vformat->Rmask = 0;
	vformat->Gmask = 0;
	vformat->Bmask = 0;
	
	//Pongo pixmem a NULL para saber en DISPMANX_VideoQuit() si hay que liberar las cosas de dispmanx o no.
	//Esto es porque en juegos y emuladores tipo MAME y tal se entra por VideoInit() pero no por SetVideoMode(),
	//donde dispvars->pixmem dejara­a de ser NULL y entonces si­tendriamos que liberar cosas.
	dispvars->pixmem = NULL;
		
	/* We're done! */
	return(0);
}
Exemplo n.º 2
0
static int DISPMANX_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
	int i;
	int ret = 0;
#if !SDL_THREADS_DISABLED
	/* Create the hardware surface lock mutex */
	hw_lock = SDL_CreateMutex();
	if ( hw_lock == NULL ) {
		SDL_SetError("Unable to create lock mutex");
		DISPMANX_VideoQuit(this);
		return(-1);
	}
#endif
	//MAC Inicializamos el SOC
	bcm_host_init();
		
	//MAC Abrimos el display dispmanx
	uint32_t screen = 0;
	printf("dispmanx: Opening display[%i]...\n", screen );
        dispvars->display = vc_dispmanx_display_open( screen );
	
	//MAC Recuperamos algunos datos de la configuración del buffer actual
	vc_dispmanx_display_get_info( dispvars->display, &(dispvars->amode));
	assert(ret == 0);
	vformat->BitsPerPixel = 16; //Pon lo que quieras.Era para restaurar fb
	
	//MAC Para que las funciones GetVideoInfo() devuelvan un SDL_VideoInfo con contenidos.
	this->info.current_w = dispvars->amode.width;
        this->info.current_h = dispvars->amode.height;
        this->info.wm_available = 0;
        this->info.hw_available = 1;
	this->info.video_mem = 32768 /1024;
		
	printf( "Physical video mode is %d x %d\n", 
	   dispvars->amode.width, dispvars->amode.height );
	
	/* Limpiamos LAS listas de modos disponibles */
	for ( i=0; i<NUM_MODELISTS; ++i ) {
		SDL_nummodes[i] = 0;
		SDL_modelist[i] = NULL;
	}	
	
	// Añadimos nuestros modos de vídeo	
	
	//En DISPMANX sólo tenemos el modo de vídeo que se está usando 
	//actualmente, sea cual sea, y los demás modos se escalan a ese 
	//por hardware. SDL NO entiende de timings (incluyendo tasas de 
	//refresco), así que eso no se tiene que resolver aquí, supongo.

	for (i = 0; i < NUM_MODELISTS; i++){
              //Añado cada modo a la lista 0 (8bpp), lista 1 (16), lista 2(24)..
              //Por eso itero hasta NUM_MODELIST: cada MODELIST es para un bpp.
              DISPMANX_AddMode(this, i, dispvars->amode.width, 
	          dispvars->amode.height, 0);
              printf("Adding video mode: %d x %d - %d bpp\n", dispvars->amode.width,
                 dispvars->amode.height, (i+1)*8);
        }

	/* Enable mouse and keyboard support */
	if ( DISPMANX_OpenKeyboard(this) < 0 ) {
		DISPMANX_VideoQuit(this);
		return(-1);
	}
	if ( DISPMANX_OpenMouse(this) < 0 ) {
		const char *sdl_nomouse;
		//MAC Si esto da problemas, es por los premisos de gpm sobre
		//el ratón en /dev/mice. Edita /etc/init.d/gpm y añade
		//en la sección start() la línea chmod 0666{MOUSEDEV}
		sdl_nomouse = SDL_getenv("SDL_NOMOUSE");
		if ( ! sdl_nomouse ) {
			printf("\nERR - Couldn't open mouse. Look for permissions in /etc/init.d/gpm.\n");
			DISPMANX_VideoQuit(this);
			return(-1);
		}
	}

	/* We're done! */
	return(0);
}