From eae35b9a5060d1e208144d2fe842e86440282ae4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 9 Jan 2014 19:05:31 +0100 Subject: [PATCH] (D3D) Move more functions out of D3DVideo class --- gfx/d3d9/d3d.cpp | 25 ++++--- gfx/d3d9/d3d9.hpp | 20 ++--- gfx/d3d9/d3d9_pc.cpp | 170 ++++++++++++++++++++++--------------------- 3 files changed, 109 insertions(+), 106 deletions(-) diff --git a/gfx/d3d9/d3d.cpp b/gfx/d3d9/d3d.cpp index 6222866ead..282b56608c 100644 --- a/gfx/d3d9/d3d.cpp +++ b/gfx/d3d9/d3d.cpp @@ -52,8 +52,9 @@ static BOOL CALLBACK monitor_enum_proc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT } // Multi-monitor support. -RECT D3DVideo::monitor_rect(void) +RECT d3d_monitor_rect(void *data) { + D3DVideo *d3d = reinterpret_cast(data); Monitor::num_mons = 0; EnumDisplayMonitors(NULL, NULL, monitor_enum_proc, 0); @@ -94,7 +95,7 @@ static void d3d_deinitialize(void *data) d3d->deinit_font(); d3d->deinit_chain(); #ifdef HAVE_CG - d3d->deinit_cg(); + d3d_deinit_shader(d3d); #endif d3d->needs_restore = false; @@ -274,7 +275,7 @@ static bool d3d_initialize(void *data, const video_info_t *info) d3d_calculate_rect(d3d, d3d->screen_width, d3d->screen_height, info->force_aspect, g_extern.system.aspect_ratio); #ifdef HAVE_CG - if (!d3d->init_cg()) + if (!d3d_init_shader(d3d)) { RARCH_ERR("Failed to initialize Cg.\n"); return false; @@ -460,7 +461,7 @@ static void d3d_set_viewport(void *data, int x, int y, unsigned width, unsigned d3d->final_viewport = viewport; - d3d->set_font_rect(NULL); + d3d_set_font_rect(d3d, NULL); } static void d3d_calculate_rect(void *data, unsigned width, unsigned height, @@ -527,7 +528,7 @@ static bool d3d_frame(void *data, const void *frame, { d3d_calculate_rect(d3d, d3d->screen_width, d3d->screen_height, d3d->video_info.force_aspect, g_extern.system.aspect_ratio); d3d->chain->set_final_viewport(d3d->final_viewport); - d3d->recompute_pass_sizes(); + d3d_recompute_pass_sizes(d3d); d3d->should_resize = false; } @@ -585,7 +586,7 @@ static bool d3d_frame(void *data, const void *frame, return true; } - d3d->update_title(); + d3d_update_title(d3d); return true; } @@ -760,7 +761,7 @@ static bool d3d_set_shader(void *data, enum rarch_shader_type type, const char * bool restore_old = false; d3d->cg_shader = path; - if (!d3d->process_shader() || !d3d_restore(d3d)) + if (!d3d_process_shader(d3d) || !d3d_restore(d3d)) { RARCH_ERR("[D3D9]: Setting shader failed.\n"); restore_old = true; @@ -769,7 +770,7 @@ static bool d3d_set_shader(void *data, enum rarch_shader_type type, const char * if (restore_old) { d3d->cg_shader = old_shader; - d3d->process_shader(); + d3d_process_shader(d3d); d3d_restore(d3d); } @@ -950,7 +951,7 @@ static void d3d_render_msg(void *data, const char *msg, void *userdata) } if (params) - d3d->set_font_rect(NULL); + d3d_set_font_rect(d3d, NULL); } static void d3d_set_osd_msg(void *data, const char *msg, void *userdata) @@ -959,7 +960,7 @@ static void d3d_set_osd_msg(void *data, const char *msg, void *userdata) D3DVideo *d3d = reinterpret_cast(data); if (params) - d3d->set_font_rect(params); + d3d_set_font_rect(d3d, params); d3d_render_msg(d3d, msg, params); } @@ -1110,7 +1111,7 @@ bool d3d_construct(void *data, const video_info_t *info, const input_driver_t ** #endif #ifdef HAVE_MONITOR - RECT mon_rect = d3d->monitor_rect(); + RECT mon_rect = d3d_monitor_rect(d3d); #endif bool windowed_full = g_settings.video.windowed_fullscreen; @@ -1177,7 +1178,7 @@ bool d3d_construct(void *data, const video_info_t *info, const input_driver_t ** d3d->cg_shader = g_settings.video.shader_path; #endif - if (!d3d->process_shader()) + if (!d3d_process_shader(d3d)) return false; d3d->video_info = *info; diff --git a/gfx/d3d9/d3d9.hpp b/gfx/d3d9/d3d9.hpp index 8d1850cbef..37d798ae78 100644 --- a/gfx/d3d9/d3d9.hpp +++ b/gfx/d3d9/d3d9.hpp @@ -53,14 +53,17 @@ typedef struct LPDIRECT3DVERTEXBUFFER vert_buf; } overlay_t; +void d3d_set_font_rect(void *data, font_params_t *params); +bool d3d_process_shader(void *data); +void d3d_update_title(void *data); +void d3d_recompute_pass_sizes(void *data); +RECT d3d_monitor_rect(void *data); +bool d3d_init_shader(void *data); +void d3d_deinit_shader(void *data); + class D3DVideo { public: - bool process_shader(void); - - void set_filtering(unsigned index, bool smooth); - void set_font_rect(font_params_t *params); - bool should_resize; WNDCLASSEX windowClass; @@ -69,7 +72,6 @@ public: LPDIRECT3DDEVICE dev; LPD3DXFONT font; - void recompute_pass_sizes(); unsigned screen_width; unsigned screen_height; unsigned dev_rotation; @@ -79,16 +81,12 @@ public: struct gfx_shader shader; - RECT monitor_rect(void); - video_info_t video_info; bool needs_restore; #ifdef HAVE_CG CGcontext cgCtx; - bool init_cg(); - void deinit_cg(); #endif bool init_imports(void); @@ -104,8 +102,6 @@ public: RECT font_rect_shifted; uint32_t font_color; - void update_title(void); - #ifdef HAVE_OVERLAY bool overlays_enabled; std::vector overlays; diff --git a/gfx/d3d9/d3d9_pc.cpp b/gfx/d3d9/d3d9_pc.cpp index d6a6bece3e..8e2071f9c4 100644 --- a/gfx/d3d9/d3d9_pc.cpp +++ b/gfx/d3d9/d3d9_pc.cpp @@ -34,8 +34,36 @@ #endif #endif -void D3DVideo::set_font_rect(font_params_t *params) +bool d3d_process_shader(void *data) { + D3DVideo *d3d = reinterpret_cast(data); + if (strcmp(path_get_extension(d3d->cg_shader.c_str()), "cgp") == 0) + return d3d->init_multipass(); + + return d3d->init_singlepass(); +} + +void d3d_update_title(void *data) +{ + D3DVideo *d3d = reinterpret_cast(data); + char buffer[128], buffer_fps[128]; + bool fps_draw = g_settings.fps_show; + if (gfx_get_fps(buffer, sizeof(buffer), fps_draw ? buffer_fps : NULL, sizeof(buffer_fps))) + { + std::string title = buffer; + title += " || Direct3D9"; + SetWindowText(d3d->hWnd, title.c_str()); + } + + if (fps_draw) + msg_queue_push(g_extern.msg_queue, buffer_fps, 1, 1); + + g_extern.frame_count++; +} + +void d3d_set_font_rect(void *data, font_params_t *params) +{ + D3DVideo *d3d = reinterpret_cast(data); float pos_x = g_settings.video.msg_pos_x; float pos_y = g_settings.video.msg_pos_y; float font_size = g_settings.video.font_size; @@ -47,43 +75,85 @@ void D3DVideo::set_font_rect(font_params_t *params) font_size *= params->scale; } - font_rect.left = final_viewport.X + final_viewport.Width * pos_x; - font_rect.right = final_viewport.X + final_viewport.Width; - font_rect.top = final_viewport.Y + (1.0f - pos_y) * final_viewport.Height - font_size; - font_rect.bottom = final_viewport.Height; + d3d->font_rect.left = d3d->final_viewport.X + d3d->final_viewport.Width * pos_x; + d3d->font_rect.right = d3d->final_viewport.X + d3d->final_viewport.Width; + d3d->font_rect.top = d3d->final_viewport.Y + (1.0f - pos_y) * d3d->final_viewport.Height - font_size; + d3d->font_rect.bottom = d3d->final_viewport.Height; - font_rect_shifted = font_rect; - font_rect_shifted.left -= 2; - font_rect_shifted.right -= 2; - font_rect_shifted.top += 2; - font_rect_shifted.bottom += 2; + d3d->font_rect_shifted = d3d->font_rect; + d3d->font_rect_shifted.left -= 2; + d3d->font_rect_shifted.right -= 2; + d3d->font_rect_shifted.top += 2; + d3d->font_rect_shifted.bottom += 2; +} + +void d3d_recompute_pass_sizes(void *data) +{ + D3DVideo *d3d = reinterpret_cast(data); + LinkInfo link_info = {0}; + link_info.pass = &d3d->shader.pass[0]; + link_info.tex_w = link_info.tex_h = d3d->video_info.input_scale * RARCH_SCALE_BASE; + + unsigned current_width = link_info.tex_w; + unsigned current_height = link_info.tex_h; + unsigned out_width = 0; + unsigned out_height = 0; + + if (!d3d->chain->set_pass_size(0, current_width, current_height)) + { + RARCH_ERR("[D3D]: Failed to set pass size.\n"); + return; + } + + for (unsigned i = 1; i < d3d->shader.passes; i++) + { + RenderChain::convert_geometry(link_info, + out_width, out_height, + current_width, current_height, d3d->final_viewport); + + link_info.tex_w = next_pow2(out_width); + link_info.tex_h = next_pow2(out_height); + + if (!d3d->chain->set_pass_size(i, link_info.tex_w, link_info.tex_h)) + { + RARCH_ERR("[D3D]: Failed to set pass size.\n"); + return; + } + + current_width = out_width; + current_height = out_height; + + link_info.pass = &d3d->shader.pass[i]; + } } #ifdef HAVE_CG -bool D3DVideo::init_cg(void) +bool d3d_init_shader(void *data) { - cgCtx = cgCreateContext(); - if (cgCtx == NULL) + D3DVideo *d3d = reinterpret_cast(data); + d3d->cgCtx = cgCreateContext(); + if (d3d->cgCtx == NULL) return false; RARCH_LOG("[D3D9 Cg]: Created context.\n"); - HRESULT ret = cgD3D9SetDevice(dev); + HRESULT ret = cgD3D9SetDevice(d3d->dev); if (FAILED(ret)) return false; return true; } -void D3DVideo::deinit_cg(void) +void d3d_deinit_shader(void *data) { - if (!cgCtx) + D3DVideo *d3d = reinterpret_cast(data); + if (!d3d->cgCtx) return; cgD3D9UnloadAllPrograms(); cgD3D9SetDevice(NULL); - cgDestroyContext(cgCtx); - cgCtx = NULL; + cgDestroyContext(d3d->cgCtx); + d3d->cgCtx = NULL; } #endif @@ -200,53 +270,6 @@ bool D3DVideo::init_multipass(void) return true; } -bool D3DVideo::process_shader(void) -{ - if (strcmp(path_get_extension(cg_shader.c_str()), "cgp") == 0) - return init_multipass(); - - return init_singlepass(); -} - -void D3DVideo::recompute_pass_sizes(void) -{ - LinkInfo link_info = {0}; - link_info.pass = &shader.pass[0]; - link_info.tex_w = link_info.tex_h = video_info.input_scale * RARCH_SCALE_BASE; - - unsigned current_width = link_info.tex_w; - unsigned current_height = link_info.tex_h; - unsigned out_width = 0; - unsigned out_height = 0; - - if (!chain->set_pass_size(0, current_width, current_height)) - { - RARCH_ERR("[D3D]: Failed to set pass size.\n"); - return; - } - - for (unsigned i = 1; i < shader.passes; i++) - { - RenderChain::convert_geometry(link_info, - out_width, out_height, - current_width, current_height, final_viewport); - - link_info.tex_w = next_pow2(out_width); - link_info.tex_h = next_pow2(out_height); - - if (!chain->set_pass_size(i, link_info.tex_w, link_info.tex_h)) - { - RARCH_ERR("[D3D]: Failed to set pass size.\n"); - return; - } - - current_width = out_width; - current_height = out_height; - - link_info.pass = &shader.pass[i]; - } -} - bool D3DVideo::init_chain(const video_info_t *video_info) { // Setup information for first pass. @@ -338,21 +361,4 @@ void D3DVideo::deinit_font(void) if (font) font->Release(); font = NULL; -} - -void D3DVideo::update_title(void) -{ - char buffer[128], buffer_fps[128]; - bool fps_draw = g_settings.fps_show; - if (gfx_get_fps(buffer, sizeof(buffer), fps_draw ? buffer_fps : NULL, sizeof(buffer_fps))) - { - std::string title = buffer; - title += " || Direct3D9"; - SetWindowText(hWnd, title.c_str()); - } - - if (fps_draw) - msg_queue_push(g_extern.msg_queue, buffer_fps, 1, 1); - - g_extern.frame_count++; } \ No newline at end of file