static bool font_init_first( const void **font_driver, void **font_handle, void *video_data, const char *font_path, float font_size, enum font_driver_render_api api) { if (font_path && !font_path[0]) font_path = NULL; switch (api) { #ifdef HAVE_D3D case FONT_DRIVER_RENDER_DIRECT3D_API: return d3d_font_init_first(font_driver, font_handle, video_data, font_path, font_size); #endif #ifdef HAVE_OPENGL case FONT_DRIVER_RENDER_OPENGL_API: return gl_font_init_first(font_driver, font_handle, video_data, font_path, font_size); #endif #ifdef HAVE_VITA2D case FONT_DRIVER_RENDER_VITA2D: return vita2d_font_init_first(font_driver, font_handle, video_data, font_path, font_size); #endif case FONT_DRIVER_RENDER_DONT_CARE: /* TODO/FIXME - lookup graphics driver's 'API' */ break; default: break; } return false; }
static void xdk_d3d_start(void) { video_info_t video_info = {0}; video_info.vsync = g_settings.video.vsync; video_info.force_aspect = false; video_info.smooth = g_settings.video.smooth; video_info.input_scale = 2; video_info.fullscreen = true; video_info.rgb32 = false; driver.video_data = xdk_d3d_init(&video_info, NULL, NULL); xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; #if defined(_XBOX1) font_x = 0; font_y = 0; #elif defined(_XBOX360) snprintf(g_settings.video.font_path, sizeof(g_settings.video.font_path), "game:\\media\\Arial_12.xpr"); #endif d3d->font_ctx = d3d_font_init_first(d3d, g_settings.video.font_path, g_settings.video.font_size); }
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 *xdk_d3d_init(const video_info_t *video, const input_driver_t **input, void **input_data) { HRESULT ret; if (driver.video_data) { xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; // Reinitialize textures as we might have changed pixel formats. xdk_d3d_reinit_textures(d3d, video); return driver.video_data; } //we'll just use driver.video_data throughout here because it needs to //exist when we delegate initing to the context file driver.video_data = (xdk_d3d_video_t*)calloc(1, sizeof(xdk_d3d_video_t)); if (!driver.video_data) return NULL; xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; d3d->vsync = video->vsync; d3d->tex_w = RARCH_SCALE_BASE * video->input_scale; d3d->tex_h = RARCH_SCALE_BASE * video->input_scale; #if defined(_XBOX1) d3d->ctx_driver = gfx_ctx_init_first(GFX_CTX_DIRECT3D8_API, 8, 0); #elif defined(_XBOX360) d3d->ctx_driver = gfx_ctx_init_first(GFX_CTX_DIRECT3D9_API, 9, 0); #endif if (d3d->ctx_driver) { D3DPRESENT_PARAMETERS d3dpp; xdk_d3d_generate_pp(&d3dpp, video); ret = d3d->d3d_device->CreateDevice(0, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &d3d->d3d_render_device); if (ret != S_OK) RARCH_ERR("Failed at CreateDevice.\n"); RD3DDevice_Clear(d3d->d3d_render_device, 0, NULL, D3DCLEAR_TARGET, 0xff000000, 1.0f, 0); } else { free(d3d); return NULL; } RARCH_LOG("Found D3D context: %s\n", d3d->ctx_driver->ident); xdk_d3d_init_textures(d3d, video); #if defined(_XBOX1) // use an orthogonal matrix for the projection matrix D3DXMATRIX mat; D3DXMatrixOrthoOffCenterLH(&mat, 0, d3d->win_width , d3d->win_height , 0, 0.0f, 1.0f); d3d->d3d_render_device->SetTransform(D3DTS_PROJECTION, &mat); // use an identity matrix for the world and view matrices D3DXMatrixIdentity(&mat); d3d->d3d_render_device->SetTransform(D3DTS_WORLD, &mat); d3d->d3d_render_device->SetTransform(D3DTS_VIEW, &mat); ret = d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &d3d->vertex_buf); if (ret != S_OK) { RARCH_ERR("[xdk_d3d_init::] Failed at CreateVertexBuffer.\n"); return NULL; } const DrawVerticeFormats init_verts[] = { { -1.0f, -1.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, -1.0f, 1.0f, 1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }, }; BYTE *verts_ptr; RD3DVertexBuffer_Lock(d3d->vertex_buf, 0, 0, &verts_ptr, 0); memcpy(verts_ptr, init_verts, sizeof(init_verts)); RD3DVertexBuffer_Unlock(d3d->vertex_buf); RD3DDevice_SetVertexShader(d3d->d3d_render_device, D3DFVF_XYZ | D3DFVF_TEX1); #elif defined(_XBOX360) ret = d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats), 0, 0, 0, &d3d->vertex_buf, NULL); if (ret != S_OK) { RARCH_ERR("[xdk_d3d_init::] Failed at CreateVertexBuffer.\n"); return NULL; } static const DrawVerticeFormats init_verts[] = { { -1.0f, -1.0f, 0.0f, 1.0f }, { 1.0f, -1.0f, 1.0f, 1.0f }, { -1.0f, 1.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f }, }; void *verts_ptr; RD3DVertexBuffer_Lock(d3d->vertex_buf, 0, 0, &verts_ptr, 0); memcpy(verts_ptr, init_verts, sizeof(init_verts)); RD3DVertexBuffer_Unlock(d3d->vertex_buf); static const D3DVERTEXELEMENT VertexElements[] = { { 0, 0 * sizeof(float), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 2 * sizeof(float), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; ret = d3d->d3d_render_device->CreateVertexDeclaration(VertexElements, &d3d->v_decl); if (ret != S_OK) { RARCH_ERR("[xdk_d3d_init::] Failed at CreateVertexDeclaration.\n"); } #endif if (d3d->ctx_driver) d3d->ctx_driver->get_video_size(&d3d->win_width, &d3d->win_height); RARCH_LOG("Detecting screen resolution: %ux%u.\n", d3d->win_width, d3d->win_height); d3d->ctx_driver->swap_interval(d3d->vsync ? 1 : 0); #ifdef HAVE_HLSL if (!hlsl_shader_init()) { RARCH_ERR("Shader init failed.\n"); d3d->ctx_driver->destroy(); free(d3d); return NULL; } RARCH_LOG("D3D: Loaded %u program(s).\n", d3d->shader->num_shaders()); #endif #if 0 /* ifdef HAVE_FBO */ xdk_d3d_init_fbo(d3d); #endif if (input && input_data) d3d->ctx_driver->input_driver(input, input_data); xdk_d3d_set_rotation(d3d, g_settings.video.rotation); #if defined(_XBOX1) font_x = 0; font_y = 0; #elif 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, 0 /* font size - fixed/unused */); return d3d; }
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; }