static void gl_restart(void) { #ifdef HAVE_CG_MENU bool should_menu_render; #endif #ifdef RARCH_CONSOLE bool should_block_swap; #endif gl_t *gl = driver.video_data; if (!gl) return; #ifdef RARCH_CONSOLE should_block_swap = gl->block_swap; #endif #ifdef HAVE_CG_MENU should_menu_render = gl->menu_render; #endif gl_stop(); gl_cg_invalidate_context(); gl_start(); #ifdef HAVE_CG_MENU gl->menu_render = should_menu_render; #endif gl->frame_count = 0; #ifdef RARCH_CONSOLE gl->block_swap = should_block_swap; SET_TIMER_EXPIRATION(gl, 30); #endif }
static bool xdk360_key_pressed(void *data, int key) { (void)data; XINPUT_STATE state; bool retval; XInputGetState(0, &state); retval = false; switch(key) { case RARCH_FAST_FORWARD_HOLD_KEY: return ((state.Gamepad.sThumbRY < -DEADZONE) && !(state.Gamepad.bRightTrigger > 128)); case RARCH_LOAD_STATE_KEY: return ((state.Gamepad.sThumbRY > DEADZONE) && (state.Gamepad.bRightTrigger > 128)); case RARCH_SAVE_STATE_KEY: return ((state.Gamepad.sThumbRY < -DEADZONE) && (state.Gamepad.bRightTrigger > 128)); case RARCH_STATE_SLOT_PLUS: return ((state.Gamepad.sThumbRX > DEADZONE) && (state.Gamepad.bRightTrigger > 128)); case RARCH_STATE_SLOT_MINUS: return ((state.Gamepad.sThumbRX < -DEADZONE) && (state.Gamepad.bRightTrigger > 128)); case RARCH_FRAMEADVANCE: if(g_console.frame_advance_enable) { g_console.menu_enable = true; g_console.ingame_menu_enable = true; g_console.mode_switch = MODE_MENU; } return false; case RARCH_REWIND: return ((state.Gamepad.sThumbRY > DEADZONE) && !(state.Gamepad.bRightTrigger > 128)); case RARCH_QUIT_KEY: if(IS_TIMER_EXPIRED()) { uint32_t left_thumb_pressed = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB); uint32_t right_thumb_pressed = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB); g_console.menu_enable = right_thumb_pressed && left_thumb_pressed && IS_TIMER_EXPIRED(); g_console.ingame_menu_enable = right_thumb_pressed && !left_thumb_pressed; if(g_console.menu_enable || (g_console.ingame_menu_enable && !g_console.menu_enable)) { g_console.mode_switch = MODE_MENU; SET_TIMER_EXPIRATION(30); retval = g_console.menu_enable; } retval = g_console.ingame_menu_enable ? g_console.ingame_menu_enable : g_console.menu_enable; } } return retval; }
void menu_loop(void) { g_console.menu_enable = true; HRESULT hr; xdk360_video_t *vid = (xdk360_video_t*)g_d3d; if(g_console.emulator_initialized) video_xdk360.set_swap_block_state(NULL, true); do { g_frame_count++; if(g_console.emulator_initialized) { rarch_render_cached_frame(); } else vid->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 32, 32, 64), 1.0f, 0); XINPUT_STATE state; XInputGetState(0, &state); g_console.menu_enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_console.emulator_initialized) && IS_TIMER_EXPIRED()); g_console.mode_switch = g_console.menu_enable ? MODE_MENU : MODE_EMULATION; app.RunFrame(); /* Update XUI */ hr = app.Render(); /* Render XUI */ hr = XuiTimersRun(); /* Update XUI timers */ if(g_console.mode_switch == MODE_EMULATION && !g_console.frame_advance_enable) { SET_TIMER_EXPIRATION(30); } video_xdk360.swap(NULL); }while(g_console.menu_enable); if(g_console.emulator_initialized) video_xdk360.set_swap_block_state(NULL, false); g_console.ingame_menu_enable = false; }
bool rmenu_iterate(void) { static bool preinit = true; const char *msg; xdk_d3d_video_t *device_ptr = (xdk_d3d_video_t*)driver.video_data; if(preinit) { g_extern.console.rmenu.input_loop = INPUT_LOOP_MENU; g_extern.draw_menu = true; preinit = false; } g_extern.frame_count++; XINPUT_STATE state; XInputGetState(0, &state); bool rmenu_enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_extern.console.emulator_initialized) && IS_TIMER_EXPIRED(0)); rarch_render_cached_frame(); g_extern.console.rmenu.mode = rmenu_enable ? MODE_MENU : MODE_EMULATION; switch(g_extern.console.rmenu.input_loop) { case INPUT_LOOP_FILEBROWSER: case INPUT_LOOP_MENU: app.RunFrame(); /* Update XUI */ if((state.Gamepad.wButtons & XINPUT_GAMEPAD_B) && hCur != app.hMainScene) XuiSceneNavigateBack(hCur, app.hMainScene, XUSER_INDEX_ANY); break; case INPUT_LOOP_RESIZE_MODE: ingame_menu_resize(); break; default: break; } if(g_extern.console.rmenu.mode == MODE_EMULATION || g_extern.console.rmenu.mode == MODE_EXIT) goto deinit; msg = msg_queue_pull(g_extern.msg_queue); if (msg) { device_ptr->font_ctx->render_msg(device_ptr, msg); } device_ptr->ctx_driver->swap_buffers(); return true; deinit: if(!(g_extern.lifecycle_state & (1ULL << RARCH_FRAMEADVANCE))) { // set a timer delay so that we don't instantly switch back to the menu when // press and holding L3 + R3 in the emulation loop (lasts for 30 frame ticks) SET_TIMER_EXPIRATION(0, 30); } g_extern.console.rmenu.state.ingame_menu.enable = false; g_extern.draw_menu = false; preinit = true; return false; }
static bool xdk_d3d_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { if (!frame) return true; xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data; #ifdef HAVE_FBO D3DSurface* pRenderTarget0; #endif bool menu_enabled = g_console.menu_enable; if (d3d->last_width != width || d3d->last_height != height) { D3DLOCKED_RECT d3dlr; d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK); memset(d3dlr.pBits, 0, 512 * d3dlr.Pitch); d3d->lpTexture->UnlockRect(0); float tex_w = width / 512.0f; float tex_h = height / 512.0f; DrawVerticeFormats verts[] = { { -1.0f, -1.0f, 0.0f, tex_h }, { 1.0f, -1.0f, tex_w, tex_h }, { -1.0f, 1.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, tex_w, 0.0f }, }; // Align texels and vertices (D3D9 quirk). for (unsigned i = 0; i < 4; i++) { verts[i].x -= 0.5f / 512.0f; verts[i].y += 0.5f / 512.0f; } void *verts_ptr; d3d->vertex_buf->Lock(0, 0, &verts_ptr, 0); memcpy(verts_ptr, verts, sizeof(verts)); d3d->vertex_buf->Unlock(); d3d->last_width = width; d3d->last_height = height; } #ifdef HAVE_FBO if (d3d->fbo_enabled) { d3d->d3d_render_device->GetRenderTarget(0, &pRenderTarget0); d3d->d3d_render_device->SetRenderTarget(0, d3d->lpSurface); } #endif if (d3d->should_resize) xdk_d3d_set_viewport(false); d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, 0xff000000, 1.0f, 0); d3d->frame_count++; d3d->d3d_render_device->SetTexture(0, d3d->lpTexture); #ifdef HAVE_HLSL hlsl_use(1); #endif #ifdef HAVE_FBO if(d3d->fbo_enabled) { #ifdef HAVE_HLSL hlsl_set_params(width, height, 512, 512, g_settings.video.fbo_scale_x * width, g_settings.video.fbo_scale_y * height, d3d->frame_count); #endif D3DVIEWPORT vp = {0}; vp.Width = g_settings.video.fbo_scale_x * width; vp.Height = g_settings.video.fbo_scale_y * height; vp.X = 0; vp.Y = 0; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; d3d->d3d_render_device->SetViewport(&vp); } else #endif { #ifdef HAVE_HLSL hlsl_set_params(width, height, 512, 512, d3d->d3dpp.BackBufferWidth, d3d->d3dpp.BackBufferHeight, d3d->frame_count); #endif } D3DLOCKED_RECT d3dlr; d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK); for (unsigned y = 0; y < height; y++) { const uint8_t *in = (const uint8_t*)frame + y * pitch; uint8_t *out = (uint8_t*)d3dlr.pBits + y * d3dlr.Pitch; memcpy(out, in, width * sizeof(uint16_t)); } d3d->lpTexture->UnlockRect(0); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl); d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf, 0, sizeof(DrawVerticeFormats)); d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); #ifdef HAVE_FBO if(d3d->fbo_enabled) { d3d->d3d_render_device->Resolve(D3DRESOLVE_RENDERTARGET0, NULL, d3d->lpTexture_ot, NULL, 0, 0, NULL, 0, 0, NULL); d3d->d3d_render_device->SetRenderTarget(0, pRenderTarget0); pRenderTarget0->Release(); d3d->d3d_render_device->SetTexture(0, &d3d->lpTexture_ot_as16srgb); #ifdef HAVE_HLSL hlsl_use(2); hlsl_set_params(g_settings.video.fbo_scale_x * width, g_settings.video.fbo_scale_y * height, g_settings.video.fbo_scale_x * 512, g_settings.video.fbo_scale_y * 512, d3d->d3dpp.BackBufferWidth, d3d->d3dpp.BackBufferHeight, d3d->frame_count); #endif xdk_d3d_set_viewport(false); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_settings.video.second_pass_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_settings.video.second_pass_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl); d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf, 0, sizeof(DrawVerticeFormats)); d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); } #endif /* XBox 360 specific font code */ if (msg && !menu_enabled) { if(IS_TIMER_EXPIRED(d3d)) { xdk360_console_format(msg); SET_TIMER_EXPIRATION(d3d, 30); } xdk360_console_draw(); } if(!d3d->block_swap) gfx_ctx_swap_buffers(); return true; }
static void menu_loop(void) { gx_video_t *gx = (gx_video_t*)driver.video_data; uint16_t old_input_state = 0; bool first = true; bool first_held = false; bool initial_held = true; g_console.menu_enable = true; gx->menu_render = true; do { uint16_t input_state = 0; input_gx.poll(NULL); for (unsigned i = 0; i < GX_DEVICE_NAV_LAST; i++) { input_state |= input_gx.input_state(NULL, gx_nav_binds, 0, RETRO_DEVICE_JOYPAD, 0, i) ? (1 << i) : 0; } uint16_t trigger_state = input_state & ~old_input_state; bool do_held = (input_state & ((1 << GX_DEVICE_NAV_UP) | (1 << GX_DEVICE_NAV_DOWN) | (1 << GX_DEVICE_NAV_LEFT) | (1 << GX_DEVICE_NAV_RIGHT))) && !(input_state & ((1 << GX_DEVICE_NAV_MENU) | (1 << GX_DEVICE_NAV_QUIT))); if(do_held) { if(!first_held) { first_held = true; SET_TIMER_EXPIRATION(gx, (initial_held) ? 15 : 7); } if(IS_TIMER_EXPIRED(gx)) { first_held = false; trigger_state = input_state; //second input frame set as current frame } initial_held = false; } else { first_held = false; initial_held = true; } rgui_action_t action = RGUI_ACTION_NOOP; // don't run anything first frame, only capture held inputs for old_input_state if (!first) { if (trigger_state & (1 << GX_DEVICE_NAV_UP)) action = RGUI_ACTION_UP; else if (trigger_state & (1 << GX_DEVICE_NAV_DOWN)) action = RGUI_ACTION_DOWN; else if (trigger_state & (1 << GX_DEVICE_NAV_LEFT)) action = RGUI_ACTION_LEFT; else if (trigger_state & (1 << GX_DEVICE_NAV_RIGHT)) action = RGUI_ACTION_RIGHT; else if (trigger_state & (1 << GX_DEVICE_NAV_B)) action = RGUI_ACTION_CANCEL; else if (trigger_state & (1 << GX_DEVICE_NAV_A)) action = RGUI_ACTION_OK; else if (trigger_state & (1 << GX_DEVICE_NAV_START)) action = RGUI_ACTION_START; else if (trigger_state & (1 << GX_DEVICE_NAV_SELECT)) action = RGUI_ACTION_SETTINGS; } else { first = false; } rgui_iterate(rgui, action); rarch_render_cached_frame(); old_input_state = input_state; bool goto_menu_key_pressed = (trigger_state & (1 << GX_DEVICE_NAV_MENU)); bool quit_key_pressed = (trigger_state & (1 << GX_DEVICE_NAV_QUIT)); if(IS_TIMER_EXPIRED(gx)) { // if we want to force goto the emulation loop, skip this if(g_console.mode_switch != MODE_EMULATION) { if(goto_menu_key_pressed) { g_console.menu_enable = (goto_menu_key_pressed && g_console.emulator_initialized) ? false : true; g_console.mode_switch = g_console.menu_enable ? MODE_MENU : MODE_EMULATION; } } } if(quit_key_pressed) { g_console.menu_enable = false; g_console.mode_switch = MODE_EXIT; } // set a timer delay so that we don't instantly switch back to the menu when // press and holding QUIT in the emulation loop (lasts for 30 frame ticks) if(g_console.mode_switch == MODE_EMULATION) { SET_TIMER_EXPIRATION(gx, 30); } }while(g_console.menu_enable); gx->menu_render = false; g_console.ingame_menu_enable = false; }
void menu_loop(void) { HRESULT hr; xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; g_extern.console.rmenu.state.rmenu.enable = true; d3d->block_swap = true; g_extern.console.rmenu.input_loop = INPUT_LOOP_MENU; do { if(g_extern.console.emulator_initialized) rarch_render_cached_frame(); else { d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); d3d->frame_count++; } XINPUT_STATE state; XInputGetState(0, &state); g_extern.console.rmenu.state.rmenu.enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_extern.console.emulator_initialized) && IS_TIMER_EXPIRED(d3d)); g_extern.console.rmenu.mode = g_extern.console.rmenu.state.rmenu.enable ? MODE_MENU : MODE_EMULATION; switch(g_extern.console.rmenu.input_loop) { case INPUT_LOOP_FILEBROWSER: /* if(((state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) && hCur != app.hMainScene)) { uint64_t action = (1 << RMENU_DEVICE_NAV_A); browser_update(browser, action, rarch_console_get_rom_ext()); SET_TIMER_EXPIRATION(d3d, 15); } */ case INPUT_LOOP_MENU: app.RunFrame(); /* Update XUI */ if((state.Gamepad.wButtons & XINPUT_GAMEPAD_B) && hCur != app.hMainScene) XuiSceneNavigateBack(hCur, app.hMainScene, XUSER_INDEX_ANY); break; case INPUT_LOOP_RESIZE_MODE: ingame_menu_resize(); break; default: break; } hr = app.Render(); /* Render XUI */ hr = XuiTimersRun(); /* Update XUI timers */ if(g_extern.console.rmenu.mode == MODE_EMULATION && !g_extern.console.screen.state.frame_advance.enable) { SET_TIMER_EXPIRATION(d3d, 30); } const char *message = msg_queue_pull(g_extern.msg_queue); if (message) { xdk360_console_format(message); xdk360_console_draw(); } context->swap_buffers(); }while(g_extern.console.rmenu.state.rmenu.enable); d3d->block_swap = false; g_extern.console.rmenu.state.ingame_menu.enable = false; }
void menu_loop(void) { HRESULT hr; xdk360_video_t *d3d9 = (xdk360_video_t*)driver.video_data; g_console.menu_enable = true; d3d9->block_swap = true; g_console.input_loop = INPUT_LOOP_MENU; do { if(g_console.emulator_initialized) { rarch_render_cached_frame(); } else { d3d9->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); d3d9->frame_count++; } XINPUT_STATE state; XInputGetState(0, &state); g_console.menu_enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_console.emulator_initialized) && IS_TIMER_EXPIRED(d3d9)); g_console.mode_switch = g_console.menu_enable ? MODE_MENU : MODE_EMULATION; switch(g_console.input_loop) { case INPUT_LOOP_MENU: app.RunFrame(); /* Update XUI */ if(state.Gamepad.wButtons & XINPUT_GAMEPAD_B && hCur != app.hMainScene) XuiSceneNavigateBack(hCur, app.hMainScene, XUSER_INDEX_ANY); break; case INPUT_LOOP_RESIZE_MODE: ingame_menu_resize(); break; default: break; } hr = app.Render(); /* Render XUI */ hr = XuiTimersRun(); /* Update XUI timers */ if(g_console.mode_switch == MODE_EMULATION && !g_console.frame_advance_enable) { SET_TIMER_EXPIRATION(d3d9, 30); } const char *message = msg_queue_pull(g_extern.msg_queue); if (message) { if(IS_TIMER_EXPIRED(d3d9)) { xdk360_console_format(message); SET_TIMER_EXPIRATION(d3d9, 30); } xdk360_console_draw(); } gfx_ctx_swap_buffers(); }while(g_console.menu_enable); d3d9->block_swap = false; g_console.ingame_menu_enable = false; }