(D3D9) Cleanups

This commit is contained in:
twinaphex 2022-04-19 11:03:24 +02:00
parent 9a354982a9
commit a5802ce757
3 changed files with 59 additions and 78 deletions

View File

@ -674,10 +674,9 @@ static D3DFORMAT d3d9_get_color_format_backbuffer(bool rgb32, bool windowed)
bool d3d9_has_windowed(void *data) { return true; }
#endif
void d3d9_make_d3dpp(void *data,
void d3d9_make_d3dpp(d3d9_video_t *d3d,
const video_info_t *info, void *_d3dpp)
{
d3d9_video_t *d3d = (d3d9_video_t*)data;
D3DPRESENT_PARAMETERS *d3dpp = (D3DPRESENT_PARAMETERS*)_d3dpp;
#ifdef _XBOX
/* TODO/FIXME - get rid of global state dependencies. */
@ -833,27 +832,22 @@ void d3d9_log_info(const struct LinkInfo *info)
info->pass->filter == RARCH_FILTER_LINEAR ? "true" : "false");
}
static bool d3d9_set_resize(d3d9_video_t *d3d,
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 false;
return;
d3d->video_info.width = new_width;
d3d->video_info.height = new_height;
video_driver_set_size(new_width, new_height);
return true;
}
static bool d3d9_init_singlepass(d3d9_video_t *d3d)
static void d3d9_init_singlepass(d3d9_video_t *d3d)
{
struct video_shader_pass *pass = NULL;
if (!d3d)
return false;
struct video_shader_pass *pass = NULL;
memset(&d3d->shader, 0, sizeof(d3d->shader));
d3d->shader.passes = 1;
@ -870,8 +864,6 @@ static bool d3d9_init_singlepass(d3d9_video_t *d3d)
if (!string_is_empty(d3d->shader_path))
strlcpy(pass->source.path, d3d->shader_path,
sizeof(pass->source.path));
return true;
}
static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path)
@ -930,13 +922,14 @@ static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path)
bool d3d9_process_shader(d3d9_video_t *d3d)
{
const char *shader_path = d3d->shader_path;
if (d3d && !string_is_empty(shader_path))
if (!string_is_empty(shader_path))
{
RARCH_ERR("[D3D9]: Failed to parse shader preset.\n");
return d3d9_init_multipass(d3d, shader_path);
}
return d3d9_init_singlepass(d3d);
d3d9_init_singlepass(d3d);
return true;
}
void d3d9_viewport_info(void *data, struct video_viewport *vp)
@ -955,6 +948,35 @@ void d3d9_viewport_info(void *data, struct video_viewport *vp)
vp->full_height = height;
}
void d3d9_set_viewport(void *data,
unsigned width, unsigned height,
bool force_full,
bool allow_rotate)
{
int x = 0;
int y = 0;
d3d9_video_t *d3d = (d3d9_video_t*)data;
d3d9_calculate_rect(d3d, &width, &height, &x, &y,
force_full, allow_rotate);
/* D3D doesn't support negative X/Y viewports ... */
if (x < 0)
x = 0;
if (y < 0)
y = 0;
d3d->final_viewport.X = x;
d3d->final_viewport.Y = y;
d3d->final_viewport.Width = width;
d3d->final_viewport.Height = height;
d3d->final_viewport.MinZ = 0.0f;
d3d->final_viewport.MaxZ = 1.0f;
d3d9_set_font_rect(d3d, NULL);
}
#if defined(HAVE_MENU) || defined(HAVE_OVERLAY)
void d3d9_overlay_render(d3d9_video_t *d3d,
unsigned width,
@ -978,7 +1000,7 @@ void d3d9_overlay_render(d3d9_video_t *d3d,
D3DDECL_END()
};
if (!d3d || !overlay || !overlay->tex)
if (!overlay || !overlay->tex)
return;
dev = d3d->dev;
@ -1000,7 +1022,7 @@ void d3d9_overlay_render(d3d9_video_t *d3d,
for (i = 0; i < 4; i++)
{
vert[i].z = 0.5f;
vert[i].z = 0.5f;
vert[i].color = (((uint32_t)(overlay->alpha_mod * 0xFF)) << 24) | 0xFFFFFF;
}
@ -1086,9 +1108,9 @@ void d3d9_set_nonblock_state(void *data, bool state,
unsigned swap_interval)
{
#ifdef _XBOX
int interval = 0;
int interval = 0;
#endif
d3d9_video_t *d3d = (d3d9_video_t*)data;
d3d9_video_t *d3d = (d3d9_video_t*)data;
if (!d3d)
return;
@ -1107,7 +1129,7 @@ void d3d9_set_nonblock_state(void *data, bool state,
D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE
);
#else
d3d->needs_restore = true;
d3d->needs_restore = true;
d3d9_restore(d3d);
#endif
}
@ -1439,14 +1461,13 @@ end:
return ret;
}
void d3d9_calculate_rect(void *data,
void d3d9_calculate_rect(d3d9_video_t *d3d,
unsigned *width, unsigned *height,
int *x, int *y,
bool force_full,
bool allow_rotate)
{
float device_aspect = (float)*width / *height;
d3d9_video_t *d3d = (d3d9_video_t*)data;
settings_t *settings = config_get_ptr();
bool scale_integer = settings->bools.video_scale_integer;

View File

@ -811,10 +811,10 @@ static INLINE void d3d9_convert_geometry(
}
}
void d3d9_make_d3dpp(void *data,
void d3d9_make_d3dpp(d3d9_video_t *d3d,
const video_info_t *info, void *_d3dpp);
void d3d9_calculate_rect(void *data,
void d3d9_calculate_rect(d3d9_video_t *d3d,
unsigned *width, unsigned *height,
int *x, int *y,
bool force_full,
@ -883,15 +883,20 @@ void d3d9_set_video_mode(void *data,
void d3d9_set_aspect_ratio(void *data, unsigned aspect_ratio_idx);
void d3d9_apply_state_changes(void *data);
void d3d9_set_menu_texture_frame(void *data,
const void *frame, bool rgb32, unsigned width, unsigned height,
float alpha);
void d3d9_set_viewport(void *data,
unsigned width, unsigned height,
bool force_full,
bool allow_rotate);
void d3d9_set_menu_texture_enable(void *data,
bool state, bool full_screen);
void d3d9_apply_state_changes(void *data);
bool d3d9_restore(d3d9_video_t *d3d);
extern LPDIRECT3D9 g_pD3D9;

View File

@ -48,13 +48,8 @@
#include "../video_coord_array.h"
#include "../../configuration.h"
#include "../../dynamic.h"
#include "../../ui/ui_companion_driver.h"
#include "../../frontend/frontend_driver.h"
#ifdef HAVE_THREADS
#include "../video_thread_wrapper.h"
#endif
#include "../common/win32_common.h"
#ifdef HAVE_MENU
@ -74,7 +69,7 @@
#error "UWP does not support D3D9"
#endif
/* Temporary workaround for d3d9 not being able to poll flags during init */
/* TODO/FIXME - Temporary workaround for D3D9 not being able to poll flags during init */
static gfx_ctx_driver_t d3d9_fake_context;
LPDIRECT3D9 g_pD3D9;
@ -145,7 +140,6 @@ static bool d3d9_set_shader(void *data,
#endif
}
static void d3d9_deinit_chain(d3d9_video_t *d3d)
{
if (!d3d || !d3d->renderchain_driver)
@ -320,10 +314,9 @@ static void d3d9_deinitialize(d3d9_video_t *d3d)
d3d->menu_display.decl = NULL;
}
static bool d3d9_init_base(void *data, const video_info_t *info)
static bool d3d9_init_base(d3d9_video_t *d3d, const video_info_t *info)
{
D3DPRESENT_PARAMETERS d3dpp;
d3d9_video_t *d3d = (d3d9_video_t*)data;
#ifndef _XBOX
HWND focus_window = win32_get_window();
#endif
@ -336,63 +329,22 @@ static bool d3d9_init_base(void *data, const video_info_t *info)
d3d9_make_d3dpp(d3d, info, &d3dpp);
if (!g_pD3D9)
{
RARCH_ERR("[D3D9]: Failed to create D3D interface.\n");
return false;
}
if (!d3d9_create_device(&d3d->dev, &d3dpp,
g_pD3D9,
focus_window,
d3d->cur_mon_id)
)
{
RARCH_ERR("[D3D9]: Failed to initialize device.\n");
return false;
}
return true;
}
static void d3d9_set_viewport(void *data,
unsigned width, unsigned height,
bool force_full,
bool allow_rotate)
{
int x = 0;
int y = 0;
d3d9_video_t *d3d = (d3d9_video_t*)data;
d3d9_calculate_rect(data, &width, &height, &x, &y,
force_full, allow_rotate);
/* D3D doesn't support negative X/Y viewports ... */
if (x < 0)
x = 0;
if (y < 0)
y = 0;
d3d->final_viewport.X = x;
d3d->final_viewport.Y = y;
d3d->final_viewport.Width = width;
d3d->final_viewport.Height = height;
d3d->final_viewport.MinZ = 0.0f;
d3d->final_viewport.MaxZ = 1.0f;
d3d9_set_font_rect(d3d, NULL);
}
static bool d3d9_initialize(d3d9_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_pD3D9)
ret = d3d9_init_base(d3d, info);
else if (d3d->needs_restore)
@ -603,7 +555,11 @@ static bool d3d9_init_internal(d3d9_video_t *d3d,
version_str[0] = '\0';
snprintf(version_str, sizeof(version_str), "%u.%u.%u.%u", HIWORD(ident.DriverVersion.HighPart), LOWORD(ident.DriverVersion.HighPart), HIWORD(ident.DriverVersion.LowPart), LOWORD(ident.DriverVersion.LowPart));
snprintf(version_str, sizeof(version_str), "%u.%u.%u.%u",
HIWORD(ident.DriverVersion.HighPart),
LOWORD(ident.DriverVersion.HighPart),
HIWORD(ident.DriverVersion.LowPart),
LOWORD(ident.DriverVersion.LowPart));
RARCH_LOG("[D3D9]: Using GPU: \"%s\".\n", ident.Description);
RARCH_LOG("[D3D9]: GPU API Version: %s\n", version_str);
@ -711,7 +667,6 @@ bool d3d9_restore(d3d9_video_t *d3d)
return true;
}
static bool d3d9_frame(void *data, const void *frame,
unsigned frame_width, unsigned frame_height,
uint64_t frame_count, unsigned pitch,