static bool d3d_initialize(d3d_video_t *d3d, const video_info_t *info) { unsigned width, height; bool ret = true; settings_t *settings = config_get_ptr(); if (!d3d) return false; if (!g_pD3D) ret = d3d_init_base(d3d, info); else if (d3d->needs_restore) { D3DPRESENT_PARAMETERS d3dpp; d3d_make_d3dpp(d3d, info, &d3dpp); if (!d3d_reset(d3d->dev, &d3dpp)) { d3d_deinitialize(d3d); d3d_device_free(NULL, g_pD3D); g_pD3D = NULL; ret = d3d_init_base(d3d, info); if (ret) RARCH_LOG("[D3D]: Recovered from dead state.\n"); } } if (!ret) return ret; if (!d3d_init_chain(d3d, info)) { RARCH_ERR("Failed to initialize render chain.\n"); return false; } video_driver_get_size(&width, &height); d3d_set_viewport(d3d, width, height, false, true); #if defined(_XBOX360) strlcpy(settings->path.font, "game:\\media\\Arial_12.xpr", sizeof(settings->path.font)); #endif if (!font_driver_init_first(NULL, NULL, d3d, settings->path.font, 0, false, FONT_DRIVER_RENDER_DIRECT3D_API)) { RARCH_ERR("[D3D]: Failed to initialize font renderer.\n"); return false; } return true; }
static void d3d_reinit_renderchain(void *data, const video_info_t *video) { d3d_video_t *d3d = (d3d_video_t*)data; d3d->pixel_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t); d3d->tex_w = d3d->tex_h = RARCH_SCALE_BASE * video->input_scale; RARCH_LOG("Reinitializing renderchain - and textures (%u x %u @ %u bpp)\n", d3d->tex_w, d3d->tex_h, d3d->pixel_size * CHAR_BIT); d3d_deinit_chain(d3d); d3d_init_chain(d3d, video); }
static void *d3d_init(const video_info_t *info, const input_driver_t **input, void **input_data) { d3d_video_t *d3d = NULL; const gfx_ctx_driver_t *ctx_driver = NULL; #ifdef _XBOX if (video_driver_get_ptr(false)) { d3d = (d3d_video_t*)video_driver_get_ptr(false); /* Reinitialize renderchain as we * might have changed pixel formats.*/ if (d3d->renderchain_driver->reinit(d3d, (const void*)info)) { d3d_deinit_chain(d3d); d3d_init_chain(d3d, info); input_driver_set(input, input_data); video_driver_ctl(RARCH_DISPLAY_CTL_SET_OWN_DRIVER, NULL); return d3d; } } #endif d3d = new d3d_video_t(); if (!d3d) goto error; ctx_driver = d3d_get_context(d3d); if (!ctx_driver) goto error; /* Default values */ d3d->dev = NULL; d3d->dev_rotation = 0; d3d->needs_restore = false; #ifdef HAVE_OVERLAY d3d->overlays_enabled = false; #endif #ifdef _XBOX d3d->should_resize = false; #else #ifdef HAVE_MENU d3d->menu = NULL; #endif #endif gfx_ctx_set(ctx_driver); if (!d3d_construct(d3d, info, input, input_data)) { RARCH_ERR("[D3D]: Failed to init D3D.\n"); goto error; } d3d->keep_aspect = info->force_aspect; #ifdef _XBOX video_driver_ctl(RARCH_DISPLAY_CTL_SET_OWN_DRIVER, NULL); video_driver_ctl(RARCH_INPUT_CTL_SET_OWN_DRIVER, NULL); #endif return d3d; error: gfx_ctx_destroy(ctx_driver); if (d3d) delete d3d; return NULL; }
static bool d3d_initialize(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; bool ret = true; if (!d3d->g_pD3D) ret = d3d_init_base(d3d, info); else if (d3d->needs_restore) { D3DPRESENT_PARAMETERS d3dpp; d3d_make_d3dpp(d3d, info, &d3dpp); if (d3d->dev->Reset(&d3dpp) != D3D_OK) { HRESULT res = d3d->dev->TestCooperativeLevel(); const char *err; switch (res) { case D3DERR_DEVICELOST: err = "DEVICELOST"; break; case D3DERR_DEVICENOTRESET: err = "DEVICENOTRESET"; break; case D3DERR_DRIVERINTERNALERROR: err = "DRIVERINTERNALERROR"; break; default: err = "Unknown"; } // Try to recreate the device completely ... RARCH_WARN("[D3D]: Attempting to recover from dead state (%s).\n", err); d3d_deinitialize(d3d); d3d->g_pD3D->Release(); d3d->g_pD3D = NULL; ret = d3d_init_base(d3d, info); if (ret) RARCH_LOG("[D3D]: Recovered from dead state.\n"); else return ret; } } if (!ret) return ret; d3d_calculate_rect(d3d, d3d->screen_width, d3d->screen_height, info->force_aspect, g_extern.system.aspect_ratio); #ifdef HAVE_SHADERS if (!d3d_init_shader(d3d)) { RARCH_ERR("Failed to initialize shader subsystem.\n"); return false; } #endif if (!d3d_init_chain(d3d, info)) { RARCH_ERR("Failed to initialize render chain.\n"); return false; } #if defined(_XBOX360) strlcpy(g_settings.video.font_path, "game:\\media\\Arial_12.xpr", sizeof(g_settings.video.font_path)); #endif d3d->font_ctx = d3d_font_init_first(d3d, g_settings.video.font_path, g_settings.video.font_size); if (!d3d->font_ctx) { RARCH_ERR("Failed to initialize font.\n"); return false; } return true; }
static void *d3d_init(const video_info_t *info, const input_driver_t **input, void **input_data) { d3d_video_t *vid = NULL; driver_t *driver = driver_get_ptr(); #ifdef _XBOX if (driver->video_data) { d3d_video_t *vid = (d3d_video_t*)driver->video_data; /* Reinitialize renderchain as we * might have changed pixel formats.*/ if (vid->renderchain_driver->reinit(vid, (const void*)info)) { d3d_deinit_chain(vid); d3d_init_chain(vid, info); if (input && input_data) { *input = driver->input; *input_data = driver->input_data; } driver->video_data_own = true; driver->input_data_own = true; return driver->video_data; } } #endif vid = (d3d_video_t*)calloc(1, sizeof(*vid)); if (!vid) goto error; vid->ctx_driver = d3d_get_context(vid); if (!vid->ctx_driver) goto error; /* Default values */ vid->g_pD3D = NULL; vid->dev = NULL; vid->dev_rotation = 0; vid->needs_restore = false; #ifdef HAVE_OVERLAY vid->overlays_enabled = false; #endif #ifdef _XBOX vid->should_resize = false; #else vid->menu = NULL; #endif if (!d3d_construct(vid, info, input, input_data)) { RARCH_ERR("[D3D]: Failed to init D3D.\n"); goto error; } #ifdef _XBOX driver->video_data_own = true; driver->input_data_own = true; #endif return vid; error: if (vid) free(vid); return NULL; }
static bool d3d_initialize(d3d_video_t *d3d, const video_info_t *info) { bool ret = true; settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); if (!d3d) return false; if (!d3d->g_pD3D) ret = d3d_init_base(d3d, info); else if (d3d->needs_restore) { D3DPRESENT_PARAMETERS d3dpp; d3d_make_d3dpp(d3d, info, &d3dpp); if (d3d->dev->Reset(&d3dpp) != D3D_OK) { /* Try to recreate the device completely. */ #ifndef _XBOX HRESULT res = d3d->dev->TestCooperativeLevel(); const char *err; switch (res) { case D3DERR_DEVICELOST: err = "DEVICELOST"; break; case D3DERR_DEVICENOTRESET: err = "DEVICENOTRESET"; break; case D3DERR_DRIVERINTERNALERROR: err = "DRIVERINTERNALERROR"; break; default: err = "Unknown"; } RARCH_WARN( "[D3D]: Attempting to recover from dead state (%s).\n", err); #else RARCH_WARN("[D3D]: Attempting to recover from dead state.\n"); #endif d3d_deinitialize(d3d); d3d->g_pD3D->Release(); d3d->g_pD3D = NULL; ret = d3d_init_base(d3d, info); if (ret) RARCH_LOG("[D3D]: Recovered from dead state.\n"); } } if (!ret) return ret; d3d_calculate_rect(d3d, d3d->screen_width, d3d->screen_height, info->force_aspect, global->system.aspect_ratio); if (!d3d_init_chain(d3d, info)) { RARCH_ERR("Failed to initialize render chain.\n"); return false; } #if defined(_XBOX360) strlcpy(settings->video.font_path, "game:\\media\\Arial_12.xpr", sizeof(settings->video.font_path)); #endif if (!d3d_font_init_first(&d3d->font_driver, &d3d->font_handle, d3d, settings->video.font_path, 0)) { RARCH_ERR("[D3D]: Failed to initialize font renderer.\n"); return false; } return true; }