From f6fb1fd953462e1a798bc08f6953e66c2513afdd Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 2 Oct 2017 03:15:49 +0200 Subject: [PATCH] Create d3d_create_device --- gfx/common/d3d_common.cpp | 38 +++++++++++++++++++++++++++ gfx/common/d3d_common.h | 6 +++++ gfx/drivers/d3d.cpp | 55 +++++++++------------------------------ 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/gfx/common/d3d_common.cpp b/gfx/common/d3d_common.cpp index d06f78eebe..69ecfb9d02 100644 --- a/gfx/common/d3d_common.cpp +++ b/gfx/common/d3d_common.cpp @@ -768,6 +768,44 @@ static HRESULT d3d_test_cooperative_level(LPDIRECT3DDEVICE dev) #endif } +static bool d3d_create_device_internal(LPDIRECT3DDEVICE *dev, + D3DPRESENT_PARAMETERS *d3dpp, + LPDIRECT3D d3d, + HWND focus_window, + unsigned cur_mon_id, + DWORD behavior_flags) +{ + if (FAILED(d3d->CreateDevice( + cur_mon_id, + D3DDEVTYPE_HAL, + focus_window, + behavior_flags, + d3dpp, + dev))) + return false; + return true; +} + +bool d3d_create_device(LPDIRECT3DDEVICE *dev, + D3DPRESENT_PARAMETERS *d3dpp, + LPDIRECT3D d3d, + HWND focus_window, + unsigned cur_mon_id) +{ + if (!d3d_create_device_internal(dev, + d3dpp, + d3d, + focus_window, + cur_mon_id, + D3DCREATE_HARDWARE_VERTEXPROCESSING)) + if (!d3d_create_device_internal( + dev, d3dpp, d3d, focus_window, + cur_mon_id, + D3DCREATE_SOFTWARE_VERTEXPROCESSING)) + return false; + return true; +} + bool d3d_reset(LPDIRECT3DDEVICE dev, D3DPRESENT_PARAMETERS *d3dpp) { const char *err = NULL; diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index e727705f87..20c4a35515 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -141,6 +141,12 @@ bool d3d_surface_lock_rect(void *data, void *data2); void d3d_surface_unlock_rect(void *data); +bool d3d_create_device(LPDIRECT3DDEVICE *dev, + D3DPRESENT_PARAMETERS *d3dpp, + LPDIRECT3D d3d, + HWND focus_window, + unsigned cur_mon_id); + bool d3d_reset(LPDIRECT3DDEVICE dev, D3DPRESENT_PARAMETERS *d3dpp); void d3d_device_free(LPDIRECT3DDEVICE dev, LPDIRECT3D pd3d); diff --git a/gfx/drivers/d3d.cpp b/gfx/drivers/d3d.cpp index 5e97d73503..d457ff1db0 100644 --- a/gfx/drivers/d3d.cpp +++ b/gfx/drivers/d3d.cpp @@ -621,8 +621,8 @@ void d3d_make_d3dpp(void *data, static bool d3d_init_base(void *data, const video_info_t *info) { D3DPRESENT_PARAMETERS d3dpp; - HRESULT d3d_err; - d3d_video_t *d3d = (d3d_video_t*)data; + HWND focus_window = NULL; + d3d_video_t *d3d = (d3d_video_t*)data; d3d_make_d3dpp(d3d, info, &d3dpp); @@ -636,49 +636,18 @@ static bool d3d_init_base(void *data, const video_info_t *info) #ifdef _XBOX360 d3d->cur_mon_id = 0; #endif - -#ifdef _XBOX - if (FAILED(d3d_err = g_pD3D->CreateDevice( - d3d->cur_mon_id, - D3DDEVTYPE_HAL, - NULL, - D3DCREATE_HARDWARE_VERTEXPROCESSING, - &d3dpp, - &d3d->dev))) -#else - if (FAILED(d3d_err = g_pD3D->CreateDevice( - d3d->cur_mon_id, - D3DDEVTYPE_HAL, - win32_get_window(), - D3DCREATE_HARDWARE_VERTEXPROCESSING, - &d3dpp, - &d3d->dev))) +#ifndef _XBOX + focus_window = win32_get_window(); #endif + + if (!d3d_create_device(&d3d->dev, &d3dpp, + g_pD3D, + focus_window, + d3d->cur_mon_id) + ) { - RARCH_WARN("[D3D]: Failed to init device with hardware vertex processing (code: 0x%x). Trying to fall back to software vertex processing.\n", - (unsigned)d3d_err); - -#ifdef _XBOX - if (FAILED(d3d_err = g_pD3D->CreateDevice( - d3d->cur_mon_id, - D3DDEVTYPE_HAL, - NULL, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &d3dpp, - &d3d->dev))) -#else - if (FAILED(d3d_err = g_pD3D->CreateDevice( - d3d->cur_mon_id, - D3DDEVTYPE_HAL, - win32_get_window(), - D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &d3dpp, - &d3d->dev))) -#endif - { - RARCH_ERR("[D3D]: Failed to initialize device.\n"); - return false; - } + RARCH_ERR("[D3D]: Failed to initialize device.\n"); + return false; } return true;