void log_console_enable_video(bool enable) { struct _reent *r = _REENT; u16 i, l; if (video_active == enable) return; LWP_MutexLock(console_mutex); video_active = enable; if (enable) VIDEO_SetPostRetraceCallback(rcb); else VIDEO_SetPostRetraceCallback(NULL); usleep(100); fflush(stdout); usleep(100); if (!enable || !log_size) { LWP_MutexUnlock(console_mutex); return; } LWP_MutexUnlock(console_mutex); for (i = 0; i < log_size; ++i) { l = (log_next + 1 + i) % log_size; if (log[l]) { dot_video->write_r(r, 0, log[l], strlen(log[l])); free(log[l]); log[l] = NULL; } } }
void log_console_init(GXRModeObj *vmode, u16 logsize) { u16 i; LWP_MutexInit(&console_mutex, false); #ifndef WIILIB CON_InitEx(vmode, 20, 30, vmode->fbWidth - 40, vmode->xfbHeight - 60); //CON_InitEx(vmode, 10, 10 , (vmode->fbWidth / 2)-80, vmode->xfbHeight - 40); #endif rcb = VIDEO_SetPostRetraceCallback(NULL); VIDEO_SetPostRetraceCallback(rcb); /* VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK); VIDEO_ClearFrameBuffer(vmode, xfb[1], COLOR_BLACK); VIDEO_SetNextFramebuffer(xfb[whichfb]); VIDEO_SetBlack(FALSE); VIDEO_Flush(); VIDEO_WaitVSync(); if (vmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); */ gecko = usb_isgeckoalive(1); if (log_size && log) { for (i = 0; i < log_size; ++i) if (log[i]) free(log[i]); free(log); } log_size = logsize; log_next = 0; if (log_size) { log = (char **) malloc(log_size * sizeof(char *)); for (i = 0; i < log_size; ++i) log[i] = NULL; } log_active = log_size > 0; dot_video = devoptab_list[STD_OUT]; video_active = true; devoptab_list[STD_OUT] = &dot_out; devoptab_list[STD_ERR] = &dot_out; }
s32 CON_InitTr(GXRModeObj *rmode, s32 conXOrigin,s32 conYOrigin,s32 conWidth,s32 conHeight, s32 bgColor) { VIDEO_SetPostRetraceCallback(NULL); if(_console_buffer) free(_console_buffer); _console_buffer = malloc(conWidth*conHeight*VI_DISPLAY_PIX_SZ); if(!_console_buffer) return -1; _con_free_bg_buff(); _bg_buffer = malloc(conWidth*conHeight*VI_DISPLAY_PIX_SZ); if(!_bg_buffer) return -1; _c_buffer_size = sizeof(struct _c1) * (conWidth / FONT_XSIZE) * (conHeight/FONT_YSIZE); _c_buffer = malloc(_c_buffer_size); if(!_c_buffer) return -1; memset(_c_buffer, 0, _c_buffer_size); if (bgColor < 0 || bgColor > 15) bgColor = 0; _bg_color = color_table[bgColor]; __console_init_ex(_console_buffer,conXOrigin,conYOrigin,rmode->fbWidth*VI_DISPLAY_PIX_SZ,conWidth,conHeight,conWidth*VI_DISPLAY_PIX_SZ); return 0; }
s32 CON_InitEx(GXRModeObj *rmode, s32 conXOrigin,s32 conYOrigin,s32 conWidth,s32 conHeight) { VIDEO_SetPostRetraceCallback(NULL); if(_console_buffer) free(_console_buffer); _console_buffer = malloc(conWidth*conHeight*VI_DISPLAY_PIX_SZ); if(!_console_buffer) return -1; __console_init_ex(_console_buffer,conXOrigin,conYOrigin,rmode->fbWidth*VI_DISPLAY_PIX_SZ,conWidth,conHeight,conWidth*VI_DISPLAY_PIX_SZ); return 0; }
int main(int argc, char *argv[]) { /* INITIALIZE */ #ifdef HW_RVL DI_UseCache(false); if (!__di_check_ahbprot()) { s32 preferred = IOS_GetPreferredVersion(); if (preferred == 58 || preferred == 61) IOS_ReloadIOS(preferred); else DI_LoadDVDX(true); } DI_Init(); // first #endif loadSettings(argc, argv); MenuContext *menu = new MenuContext(vmode); VIDEO_SetPostRetraceCallback (ScanPADSandReset); #ifndef WII DVD_Init(); #endif #ifdef DEBUGON //DEBUG_Init(GDBSTUB_DEVICE_TCP,GDBSTUB_DEF_TCPPORT); //Default port is 2828 DEBUG_Init(GDBSTUB_DEVICE_USB, 1); _break(); #endif control_info_init(); //Perform controller auto assignment at least once at startup. // Start up AESND (inited here because its used in SPU and CD) AESND_Init(); #ifdef HW_RVL // Initialize the network if the user has specified something in their SMB settings if(strlen(&smbShareName[0]) && strlen(&smbIpAddr[0])) { init_network_thread(); } #endif while (menu->isRunning()) {} // Shut down AESND AESND_Reset(); delete menu; return 0; }
void __console_init_ex(void *conbuffer,int tgt_xstart,int tgt_ystart,int tgt_stride,int con_xres,int con_yres,int con_stride) { unsigned int level; console_data_s *con = &stdcon; _CPU_ISR_Disable(level); con->destbuffer = conbuffer; con->target_x = tgt_xstart; con->target_y = tgt_ystart; con->con_xres = con_xres; con->con_yres = con_yres; con->tgt_stride = tgt_stride; con->con_stride = con_stride; con->con_cols = con_xres / FONT_XSIZE; con->con_rows = con_yres / FONT_YSIZE; con->cursor_row = 0; con->cursor_col = 0; con->saved_row = 0; con->saved_col = 0; con->font = console_font_8x16; con->foreground = COLOR_WHITE; con->background = COLOR_BLACK; curr_con = con; if(_bg_buffer) { _bg_grab(); con->background = _bg_color; } __console_clear(); fb_change = 1; retrace_cnt = 0; devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; VIDEO_SetPostRetraceCallback(__console_vipostcb); _CPU_ISR_Restore(level); setvbuf(stdout, NULL , _IONBF, 0); setvbuf(stderr, NULL , _IONBF, 0); }
void initialise_video(GXRModeObj *m) { VIDEO_Configure (m); if(xfb[0]) free(MEM_K1_TO_K0(xfb[0])); if(xfb[1]) free(MEM_K1_TO_K0(xfb[1])); xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (m)); xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (m)); VIDEO_ClearFrameBuffer (m, xfb[0], COLOR_BLACK); VIDEO_ClearFrameBuffer (m, xfb[1], COLOR_BLACK); VIDEO_SetNextFramebuffer (xfb[0]); VIDEO_SetPostRetraceCallback (ProperScanPADS); VIDEO_SetBlack (0); VIDEO_Flush (); VIDEO_WaitVSync (); if (m->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); else while (VIDEO_GetNextField()) VIDEO_WaitVSync(); // setup the fifo and then init GX if(gp_fifo == NULL) { gp_fifo = MEM_K0_TO_K1 (memalign (32, DEFAULT_FIFO_SIZE)); memset (gp_fifo, 0, DEFAULT_FIFO_SIZE); GX_Init (gp_fifo, DEFAULT_FIFO_SIZE); } // clears the bg to color and clears the z buffer GX_SetCopyClear ((GXColor) {0, 0, 0, 0xFF}, GX_MAX_Z24); // init viewport GX_SetViewport (0, 0, m->fbWidth, m->efbHeight, 0, 1); // Set the correct y scaling for efb->xfb copy operation GX_SetDispCopyYScale ((f32) m->xfbHeight / (f32) m->efbHeight); GX_SetDispCopySrc (0, 0, m->fbWidth, m->efbHeight); GX_SetDispCopyDst (m->fbWidth, m->xfbHeight); GX_SetCopyFilter (m->aa, m->sample_pattern, GX_TRUE, m->vfilter); GX_SetFieldMode (m->field_rendering, ((m->viHeight == 2 * m->xfbHeight) ? GX_ENABLE : GX_DISABLE)); if (m->aa) GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); else GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); GX_SetCullMode (GX_CULL_NONE); // default in rsp init GX_CopyDisp (xfb[0], GX_TRUE); // This clears the efb GX_CopyDisp (xfb[0], GX_TRUE); // This clears the xfb }
void InitVideo () { VIDEO_Init(); vmode = VIDEO_GetPreferredMode(NULL); // get default video mode // widescreen fix if(CONF_GetAspectRatio() == CONF_ASPECT_16_9) { vmode->viWidth = VI_MAX_WIDTH_PAL-12; vmode->viXOrigin = ((VI_MAX_WIDTH_PAL - vmode->viWidth) / 2) + 2; } VIDEO_Configure (vmode); screenheight = vmode->xfbHeight; screenwidth = vmode->fbWidth; // Allocate the video buffers xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode)); xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode)); // Clear framebuffers etc. VIDEO_ClearFrameBuffer (vmode, xfb[0], COLOR_BLACK); VIDEO_ClearFrameBuffer (vmode, xfb[1], COLOR_BLACK); VIDEO_SetNextFramebuffer (xfb[0]); // video callback VIDEO_SetPostRetraceCallback ((VIRetraceCallback)UpdatePadsCB); VIDEO_SetBlack (FALSE); VIDEO_Flush (); VIDEO_WaitVSync (); if (vmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync (); StartGX(); ResetVideo_Menu(); // Finally, the video is up and ready for use :) }
void log_console_deinit(void) { u16 i; if (log_size && log) { for (i = 0; i < log_size; ++i) if (log[i]) free(log[i]); free(log); log = NULL; } log_size = 0; log_next = 0; devoptab_list[STD_OUT] = dot_video; devoptab_list[STD_ERR] = dot_video; VIDEO_SetPostRetraceCallback(rcb); LWP_MutexDestroy(console_mutex); dot_video = NULL; }
int main(int argc, char* argv[]){ /* INITIALIZE */ #ifdef HW_RVL DI_Init(); // first #endif #ifdef DEBUGON //DEBUG_Init(GDBSTUB_DEVICE_TCP,GDBSTUB_DEF_TCPPORT); //Default port is 2828 DEBUG_Init(GDBSTUB_DEVICE_USB, 1); _break(); #endif Initialise(); // Stock OGC initialization // vmode = VIDEO_GetPreferredMode(NULL); MenuContext *menu = new MenuContext(vmode); VIDEO_SetPostRetraceCallback (ScanPADSandReset); #ifndef WII DVD_Init(); #endif // menuInit(); #ifdef DEBUGON //DEBUG_Init(GDBSTUB_DEVICE_TCP,GDBSTUB_DEF_TCPPORT); //Default port is 2828 // DEBUG_Init(GDBSTUB_DEVICE_USB, 1); // _break(); #endif // Default Settings audioEnabled = 1; // Audio #ifdef RELEASE showFPSonScreen = 0; // Show FPS on Screen #else showFPSonScreen = 1; // Show FPS on Screen #endif printToScreen = 1; // Show DEBUG text on screen printToSD = 0; // Disable SD logging Timers.limitVIs = 0; // Sync to Audio saveEnabled = 0; // Don't save game nativeSaveDevice = 0; // SD saveStateDevice = 0; // SD autoSave = 1; // Auto Save Game creditsScrolling = 0; // Normal menu for now dynacore = 1; // Dynarec screenMode = 0; // Stretch FB horizontally padAutoAssign = PADAUTOASSIGN_AUTOMATIC; padType[0] = PADTYPE_NONE; padType[1] = PADTYPE_NONE; padType[2] = PADTYPE_NONE; padType[3] = PADTYPE_NONE; padAssign[0] = PADASSIGN_INPUT0; padAssign[1] = PADASSIGN_INPUT1; padAssign[2] = PADASSIGN_INPUT2; padAssign[3] = PADASSIGN_INPUT3; pakMode[0] = PAKMODE_MEMPAK; // memPak plugged into controller 1 pakMode[1] = PAKMODE_MEMPAK; pakMode[2] = PAKMODE_MEMPAK; pakMode[3] = PAKMODE_MEMPAK; loadButtonSlot = LOADBUTTON_DEFAULT; #ifdef GLN64_GX // glN64 specific settings glN64_useFrameBufferTextures = 0; // Disable FrameBuffer textures glN64_use2xSaiTextures = 0; // Disable 2xSai textures renderCpuFramebuffer = 0; // Disable CPU Framebuffer Rendering #endif //GLN64_GX menuActive = 1; //config stuff fileBrowser_file* configFile_file; int (*configFile_init)(fileBrowser_file*) = fileBrowser_libfat_init; #ifdef HW_RVL if(argv[0][0] == 'u') { //assume USB configFile_file = &saveDir_libfat_USB; if(configFile_init(configFile_file)) { //only if device initialized ok FILE* f = fopen( "usb:/wii64/settings.cfg", "r" ); //attempt to open file if(f) { //open ok, read it readConfig(f); fclose(f); } f = fopen( "usb:/wii64/controlG.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_GC); //write out GC controller mappings fclose(f); } #ifdef HW_RVL f = fopen( "usb:/wii64/controlC.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_Classic); //write out Classic controller mappings fclose(f); } f = fopen( "usb:/wii64/controlN.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_WiimoteNunchuk); //write out WM+NC controller mappings fclose(f); } f = fopen( "usb:/wii64/controlW.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_Wiimote); //write out Wiimote controller mappings fclose(f); } #endif //HW_RVL } } else /*if((argv[0][0]=='s') || (argv[0][0]=='/'))*/ #endif { //assume SD configFile_file = &saveDir_libfat_Default; if(configFile_init(configFile_file)) { //only if device initialized ok FILE* f = fopen( "sd:/wii64/settings.cfg", "r" ); //attempt to open file if(f) { //open ok, read it readConfig(f); fclose(f); } f = fopen( "sd:/wii64/controlG.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_GC); //write out GC controller mappings fclose(f); } #ifdef HW_RVL f = fopen( "sd:/wii64/controlC.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_Classic); //write out Classic controller mappings fclose(f); } f = fopen( "sd:/wii64/controlN.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_WiimoteNunchuk); //write out WM+NC controller mappings fclose(f); } f = fopen( "sd:/wii64/controlW.cfg", "r" ); //attempt to open file if(f) { load_configurations(f, &controller_Wiimote); //write out Wiimote controller mappings fclose(f); } #endif //HW_RVL } } #ifdef HW_RVL // Handle options passed in through arguments int i; for(i=1; i<argc; ++i){ handleConfigPair(argv[i]); } #endif while (menu->isRunning()) {} delete menu; return 0; }
/**************************************************************************** * Initialise Video * * Before doing anything in libogc, it's recommended to configure a video * output. ****************************************************************************/ static void Initialise (void) { VIDEO_Init (); /*** ALWAYS CALL FIRST IN ANY LIBOGC PROJECT! Not only does it initialise the video subsystem, but also sets up the ogc os ***/ PAD_Init (); /*** Initialise pads for input ***/ #ifdef HW_RVL WPAD_Init (); #endif // get default video mode vmode = VIDEO_GetPreferredMode(NULL); switch (vmode->viTVMode >> 2) { case VI_PAL: // 576 lines (PAL 50Hz) // display should be centered vertically (borders) //Make all video modes the same size so menus doesn't screw up vmode = &TVPal576IntDfScale; vmode->xfbHeight = 480; vmode->viYOrigin = (VI_MAX_HEIGHT_PAL - 480)/2; vmode->viHeight = 480; vmode_60hz = 0; break; case VI_NTSC: // 480 lines (NTSC 60hz) vmode_60hz = 1; break; default: // 480 lines (PAL 60Hz) vmode_60hz = 1; break; } #ifdef HW_DOL /* we have component cables, but the preferred mode is interlaced * why don't we switch into progressive? * (user may not have progressive compatible display but component input) * on the Wii, the user can do this themselves on their Wii Settings */ if(VIDEO_HaveComponentCable()) vmode = &TVNtsc480Prog; #endif /* // check for progressive scan // bool progressive = FALSE; if (vmode->viTVMode == VI_TVMODE_NTSC_PROG) progressive = true; */ #ifdef HW_RVL // widescreen fix if(CONF_GetAspectRatio()) { vmode->viWidth = 678; vmode->viXOrigin = (VI_MAX_WIDTH_PAL - 678) / 2; } #endif // configure VI VIDEO_Configure (vmode); // always 480 lines /*** Update screen height for font engine ***/ screenheight = vmode->xfbHeight; /*** Now configure the framebuffer. Really a framebuffer is just a chunk of memory to hold the display line by line. ***/ // Allocate the video buffers xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode)); /*** I prefer also to have a second buffer for double-buffering. This is not needed for the console demo. ***/ xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode)); /*** Define a console ***/ console_init (xfb[0], 20, 64, vmode->fbWidth, vmode->xfbHeight, vmode->fbWidth * 2); /*** Clear framebuffer to black ***/ VIDEO_ClearFrameBuffer (vmode, xfb[0], COLOR_BLACK); VIDEO_ClearFrameBuffer (vmode, xfb[1], COLOR_BLACK); /*** Set the framebuffer to be displayed at next VBlank ***/ VIDEO_SetNextFramebuffer (xfb[0]); /*** Get the PAD status updated by libogc ***/ VIDEO_SetPostRetraceCallback (updatePAD); VIDEO_SetBlack (0); /*** Update the video for next vblank ***/ VIDEO_Flush (); VIDEO_WaitVSync (); /*** Wait for VBL ***/ if (vmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync (); }