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 dejaraa de ser NULL y entonces sitendriamos que liberar cosas. dispvars->pixmem = NULL; /* We're done! */ return(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); }