mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 22:13:51 +00:00
(D3D9) Move functions to d3d9.c
This commit is contained in:
parent
6a032fc1f8
commit
6195711bb3
@ -833,19 +833,6 @@ void d3d9_log_info(const struct LinkInfo *info)
|
|||||||
info->pass->filter == RARCH_FILTER_LINEAR ? "true" : "false");
|
info->pass->filter == RARCH_FILTER_LINEAR ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d3d9_set_resize(d3d9_video_t *d3d,
|
|
||||||
unsigned new_width, unsigned new_height)
|
|
||||||
{
|
|
||||||
/* No changes? */
|
|
||||||
if ( (new_width == d3d->video_info.width)
|
|
||||||
&& (new_height == d3d->video_info.height))
|
|
||||||
return;
|
|
||||||
|
|
||||||
d3d->video_info.width = new_width;
|
|
||||||
d3d->video_info.height = new_height;
|
|
||||||
video_driver_set_size(new_width, new_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void d3d9_init_singlepass(d3d9_video_t *d3d)
|
static void d3d9_init_singlepass(d3d9_video_t *d3d)
|
||||||
{
|
{
|
||||||
struct video_shader_pass *pass = NULL;
|
struct video_shader_pass *pass = NULL;
|
||||||
@ -1133,70 +1120,6 @@ void d3d9_free_overlay(d3d9_video_t *d3d, overlay_t *overlay)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void d3d9_set_nonblock_state(void *data, bool state,
|
|
||||||
bool adaptive_vsync_enabled,
|
|
||||||
unsigned swap_interval)
|
|
||||||
{
|
|
||||||
#ifdef _XBOX
|
|
||||||
int interval = 0;
|
|
||||||
#endif
|
|
||||||
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
|
||||||
|
|
||||||
if (!d3d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef _XBOX
|
|
||||||
if (!state)
|
|
||||||
interval = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
d3d->video_info.vsync = !state;
|
|
||||||
|
|
||||||
#ifdef _XBOX
|
|
||||||
d3d9_set_render_state(d3d->dev,
|
|
||||||
D3DRS_PRESENTINTERVAL,
|
|
||||||
interval ?
|
|
||||||
D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
d3d->needs_restore = true;
|
|
||||||
d3d9_restore(d3d);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool d3d9_alive(void *data)
|
|
||||||
{
|
|
||||||
unsigned temp_width = 0;
|
|
||||||
unsigned temp_height = 0;
|
|
||||||
bool ret = false;
|
|
||||||
bool quit = false;
|
|
||||||
bool resize = false;
|
|
||||||
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
|
||||||
|
|
||||||
/* Needed because some context drivers don't track their sizes */
|
|
||||||
video_driver_get_size(&temp_width, &temp_height);
|
|
||||||
|
|
||||||
win32_check_window(NULL, &quit, &resize, &temp_width, &temp_height);
|
|
||||||
|
|
||||||
if (quit)
|
|
||||||
d3d->quitting = quit;
|
|
||||||
|
|
||||||
if (resize)
|
|
||||||
{
|
|
||||||
d3d->should_resize = true;
|
|
||||||
d3d9_set_resize(d3d, temp_width, temp_height);
|
|
||||||
d3d9_restore(d3d);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = !quit;
|
|
||||||
|
|
||||||
if ( temp_width != 0 &&
|
|
||||||
temp_height != 0)
|
|
||||||
video_driver_set_size(temp_width, temp_height);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool d3d9_suppress_screensaver(void *data, bool enable)
|
bool d3d9_suppress_screensaver(void *data, bool enable)
|
||||||
{
|
{
|
||||||
#ifdef _XBOX
|
#ifdef _XBOX
|
||||||
|
@ -781,12 +781,6 @@ void d3d9_get_overlay_interface(void *data,
|
|||||||
const video_overlay_interface_t **iface);
|
const video_overlay_interface_t **iface);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void d3d9_set_nonblock_state(void *data, bool state,
|
|
||||||
bool adaptive_vsync_enabled,
|
|
||||||
unsigned swap_interval);
|
|
||||||
|
|
||||||
bool d3d9_alive(void *data);
|
|
||||||
|
|
||||||
void d3d9_set_rotation(void *data, unsigned rot);
|
void d3d9_set_rotation(void *data, unsigned rot);
|
||||||
|
|
||||||
void d3d9_viewport_info(void *data, struct video_viewport *vp);
|
void d3d9_viewport_info(void *data, struct video_viewport *vp);
|
||||||
@ -829,8 +823,6 @@ void d3d9_set_menu_texture_enable(void *data,
|
|||||||
|
|
||||||
void d3d9_apply_state_changes(void *data);
|
void d3d9_apply_state_changes(void *data);
|
||||||
|
|
||||||
bool d3d9_restore(d3d9_video_t *d3d);
|
|
||||||
|
|
||||||
extern LPDIRECT3D9 g_pD3D9;
|
extern LPDIRECT3D9 g_pD3D9;
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
@ -92,53 +92,6 @@ static uint32_t d3d9_get_flags(void *data)
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool d3d9_set_shader(void *data,
|
|
||||||
enum rarch_shader_type type, const char *path)
|
|
||||||
{
|
|
||||||
#if defined(HAVE_CG) || defined(HAVE_HLSL)
|
|
||||||
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
|
||||||
|
|
||||||
if (!d3d)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!string_is_empty(d3d->shader_path))
|
|
||||||
free(d3d->shader_path);
|
|
||||||
d3d->shader_path = NULL;
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case RARCH_SHADER_CG:
|
|
||||||
case RARCH_SHADER_HLSL:
|
|
||||||
|
|
||||||
if (type != supported_shader_type)
|
|
||||||
{
|
|
||||||
RARCH_WARN("[D3D9]: Shader preset %s is using unsupported shader type %s, falling back to stock %s.\n",
|
|
||||||
path, video_shader_type_to_str(type), video_shader_type_to_str(supported_shader_type));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string_is_empty(path))
|
|
||||||
d3d->shader_path = strdup(path);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case RARCH_SHADER_NONE:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
RARCH_WARN("[D3D9]: Only Cg shaders are supported. Falling back to stock.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!d3d9_process_shader(d3d) || !d3d9_restore(d3d))
|
|
||||||
{
|
|
||||||
RARCH_ERR("[D3D9]: Failed to set shader.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void d3d9_deinit_chain(d3d9_video_t *d3d)
|
static void d3d9_deinit_chain(d3d9_video_t *d3d)
|
||||||
{
|
{
|
||||||
if (!d3d || !d3d->renderchain_driver)
|
if (!d3d || !d3d->renderchain_driver)
|
||||||
@ -151,6 +104,46 @@ static void d3d9_deinit_chain(d3d9_video_t *d3d)
|
|||||||
d3d->renderchain_data = NULL;
|
d3d->renderchain_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void d3d9_deinitialize(d3d9_video_t *d3d)
|
||||||
|
{
|
||||||
|
if (!d3d)
|
||||||
|
return;
|
||||||
|
|
||||||
|
font_driver_free_osd();
|
||||||
|
|
||||||
|
d3d9_deinit_chain(d3d);
|
||||||
|
d3d9_vertex_buffer_free(d3d->menu_display.buffer,
|
||||||
|
d3d->menu_display.decl);
|
||||||
|
|
||||||
|
d3d->menu_display.buffer = NULL;
|
||||||
|
d3d->menu_display.decl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool d3d9_init_base(d3d9_video_t *d3d, const video_info_t *info)
|
||||||
|
{
|
||||||
|
D3DPRESENT_PARAMETERS d3dpp;
|
||||||
|
#ifndef _XBOX
|
||||||
|
HWND focus_window = win32_get_window();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(&d3dpp, 0, sizeof(d3dpp));
|
||||||
|
|
||||||
|
g_pD3D9 = (LPDIRECT3D9)d3d9_create();
|
||||||
|
|
||||||
|
/* this needs g_pD3D9 created first */
|
||||||
|
d3d9_make_d3dpp(d3d, info, &d3dpp);
|
||||||
|
|
||||||
|
if (!g_pD3D9)
|
||||||
|
return false;
|
||||||
|
if (!d3d9_create_device(&d3d->dev, &d3dpp,
|
||||||
|
g_pD3D9,
|
||||||
|
focus_window,
|
||||||
|
d3d->cur_mon_id)
|
||||||
|
)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool renderchain_d3d_init_first(
|
static bool renderchain_d3d_init_first(
|
||||||
enum gfx_ctx_api api,
|
enum gfx_ctx_api api,
|
||||||
const d3d9_renderchain_driver_t **renderchain_driver,
|
const d3d9_renderchain_driver_t **renderchain_driver,
|
||||||
@ -199,6 +192,7 @@ static bool renderchain_d3d_init_first(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool d3d9_init_chain(d3d9_video_t *d3d,
|
static bool d3d9_init_chain(d3d9_video_t *d3d,
|
||||||
unsigned input_scale,
|
unsigned input_scale,
|
||||||
bool rgb32)
|
bool rgb32)
|
||||||
@ -297,45 +291,6 @@ static bool d3d9_init_chain(d3d9_video_t *d3d,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d3d9_deinitialize(d3d9_video_t *d3d)
|
|
||||||
{
|
|
||||||
if (!d3d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
font_driver_free_osd();
|
|
||||||
|
|
||||||
d3d9_deinit_chain(d3d);
|
|
||||||
d3d9_vertex_buffer_free(d3d->menu_display.buffer,
|
|
||||||
d3d->menu_display.decl);
|
|
||||||
|
|
||||||
d3d->menu_display.buffer = NULL;
|
|
||||||
d3d->menu_display.decl = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool d3d9_init_base(d3d9_video_t *d3d, const video_info_t *info)
|
|
||||||
{
|
|
||||||
D3DPRESENT_PARAMETERS d3dpp;
|
|
||||||
#ifndef _XBOX
|
|
||||||
HWND focus_window = win32_get_window();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memset(&d3dpp, 0, sizeof(d3dpp));
|
|
||||||
|
|
||||||
g_pD3D9 = (LPDIRECT3D9)d3d9_create();
|
|
||||||
|
|
||||||
/* this needs g_pD3D9 created first */
|
|
||||||
d3d9_make_d3dpp(d3d, info, &d3dpp);
|
|
||||||
|
|
||||||
if (!g_pD3D9)
|
|
||||||
return false;
|
|
||||||
if (!d3d9_create_device(&d3d->dev, &d3dpp,
|
|
||||||
g_pD3D9,
|
|
||||||
focus_window,
|
|
||||||
d3d->cur_mon_id)
|
|
||||||
)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info)
|
static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info)
|
||||||
{
|
{
|
||||||
@ -433,6 +388,70 @@ static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool d3d9_restore(d3d9_video_t *d3d)
|
||||||
|
{
|
||||||
|
d3d9_deinitialize(d3d);
|
||||||
|
|
||||||
|
if (!d3d9_initialize(d3d, &d3d->video_info))
|
||||||
|
{
|
||||||
|
RARCH_ERR("[D3D9]: Restore error.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
d3d->needs_restore = false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool d3d9_set_shader(void *data,
|
||||||
|
enum rarch_shader_type type, const char *path)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_CG) || defined(HAVE_HLSL)
|
||||||
|
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
||||||
|
|
||||||
|
if (!d3d)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!string_is_empty(d3d->shader_path))
|
||||||
|
free(d3d->shader_path);
|
||||||
|
d3d->shader_path = NULL;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case RARCH_SHADER_CG:
|
||||||
|
case RARCH_SHADER_HLSL:
|
||||||
|
|
||||||
|
if (type != supported_shader_type)
|
||||||
|
{
|
||||||
|
RARCH_WARN("[D3D9]: Shader preset %s is using unsupported shader type %s, falling back to stock %s.\n",
|
||||||
|
path, video_shader_type_to_str(type), video_shader_type_to_str(supported_shader_type));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string_is_empty(path))
|
||||||
|
d3d->shader_path = strdup(path);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RARCH_SHADER_NONE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
RARCH_WARN("[D3D9]: Only Cg shaders are supported. Falling back to stock.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!d3d9_process_shader(d3d) || !d3d9_restore(d3d))
|
||||||
|
{
|
||||||
|
RARCH_ERR("[D3D9]: Failed to set shader.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static bool d3d9_init_internal(d3d9_video_t *d3d,
|
static bool d3d9_init_internal(d3d9_video_t *d3d,
|
||||||
const video_info_t *info, input_driver_t **input,
|
const video_info_t *info, input_driver_t **input,
|
||||||
void **input_data)
|
void **input_data)
|
||||||
@ -650,21 +669,6 @@ static void d3d9_free(void *data)
|
|||||||
free(d3d);
|
free(d3d);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool d3d9_restore(d3d9_video_t *d3d)
|
|
||||||
{
|
|
||||||
d3d9_deinitialize(d3d);
|
|
||||||
|
|
||||||
if (!d3d9_initialize(d3d, &d3d->video_info))
|
|
||||||
{
|
|
||||||
RARCH_ERR("[D3D9]: Restore error.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
d3d->needs_restore = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool d3d9_frame(void *data, const void *frame,
|
static bool d3d9_frame(void *data, const void *frame,
|
||||||
unsigned frame_width, unsigned frame_height,
|
unsigned frame_width, unsigned frame_height,
|
||||||
uint64_t frame_count, unsigned pitch,
|
uint64_t frame_count, unsigned pitch,
|
||||||
@ -867,6 +871,83 @@ static bool d3d9_gfx_widgets_enabled(void *data)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void d3d9_set_resize(d3d9_video_t *d3d,
|
||||||
|
unsigned new_width, unsigned new_height)
|
||||||
|
{
|
||||||
|
/* No changes? */
|
||||||
|
if ( (new_width == d3d->video_info.width)
|
||||||
|
&& (new_height == d3d->video_info.height))
|
||||||
|
return;
|
||||||
|
|
||||||
|
d3d->video_info.width = new_width;
|
||||||
|
d3d->video_info.height = new_height;
|
||||||
|
video_driver_set_size(new_width, new_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool d3d9_alive(void *data)
|
||||||
|
{
|
||||||
|
unsigned temp_width = 0;
|
||||||
|
unsigned temp_height = 0;
|
||||||
|
bool ret = false;
|
||||||
|
bool quit = false;
|
||||||
|
bool resize = false;
|
||||||
|
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
||||||
|
|
||||||
|
/* Needed because some context drivers don't track their sizes */
|
||||||
|
video_driver_get_size(&temp_width, &temp_height);
|
||||||
|
|
||||||
|
win32_check_window(NULL, &quit, &resize, &temp_width, &temp_height);
|
||||||
|
|
||||||
|
if (quit)
|
||||||
|
d3d->quitting = quit;
|
||||||
|
|
||||||
|
if (resize)
|
||||||
|
{
|
||||||
|
d3d->should_resize = true;
|
||||||
|
d3d9_set_resize(d3d, temp_width, temp_height);
|
||||||
|
d3d9_restore(d3d);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = !quit;
|
||||||
|
|
||||||
|
if ( temp_width != 0 &&
|
||||||
|
temp_height != 0)
|
||||||
|
video_driver_set_size(temp_width, temp_height);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void d3d9_set_nonblock_state(void *data, bool state,
|
||||||
|
bool adaptive_vsync_enabled,
|
||||||
|
unsigned swap_interval)
|
||||||
|
{
|
||||||
|
#ifdef _XBOX
|
||||||
|
int interval = 0;
|
||||||
|
#endif
|
||||||
|
d3d9_video_t *d3d = (d3d9_video_t*)data;
|
||||||
|
|
||||||
|
if (!d3d)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef _XBOX
|
||||||
|
if (!state)
|
||||||
|
interval = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
d3d->video_info.vsync = !state;
|
||||||
|
|
||||||
|
#ifdef _XBOX
|
||||||
|
d3d9_set_render_state(d3d->dev,
|
||||||
|
D3DRS_PRESENTINTERVAL,
|
||||||
|
interval ?
|
||||||
|
D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
d3d->needs_restore = true;
|
||||||
|
d3d9_restore(d3d);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
video_driver_t video_d3d9 = {
|
video_driver_t video_d3d9 = {
|
||||||
d3d9_init,
|
d3d9_init,
|
||||||
d3d9_frame,
|
d3d9_frame,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user