diff --git a/gfx/d3d9/d3d.cpp b/gfx/d3d9/d3d.cpp index b216dfa825..6e17f12f92 100644 --- a/gfx/d3d9/d3d.cpp +++ b/gfx/d3d9/d3d.cpp @@ -17,7 +17,7 @@ #include "d3d9.hpp" #include "render_chain.hpp" - +#include "../../file.h" #include "../gfx_common.h" #ifndef _XBOX @@ -224,6 +224,114 @@ bool d3d_init_chain(void *data, const video_info_t *video_info) return true; } + + +#ifdef HAVE_FBO +bool d3d_init_multipass(void *data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; + config_file_t *conf = config_file_new(d3d->cg_shader.c_str()); + if (!conf) + { + RARCH_ERR("Failed to load preset.\n"); + return false; + } + + memset(&d3d->shader, 0, sizeof(d3d->shader)); + + if (!gfx_shader_read_conf_cgp(conf, &d3d->shader)) + { + config_file_free(conf); + RARCH_ERR("Failed to parse CGP file.\n"); + return false; + } + + config_file_free(conf); + + gfx_shader_resolve_relative(&d3d->shader, d3d->cg_shader.c_str()); + + RARCH_LOG("[D3D9 Meta-Cg] Found %d shaders.\n", d3d->shader.passes); + + for (unsigned i = 0; i < d3d->shader.passes; i++) + { + if (!d3d->shader.pass[i].fbo.valid) + { + d3d->shader.pass[i].fbo.scale_x = d3d->shader.pass[i].fbo.scale_y = 1.0f; + d3d->shader.pass[i].fbo.type_x = d3d->shader.pass[i].fbo.type_y = RARCH_SCALE_INPUT; + } + } + + bool use_extra_pass = d3d->shader.passes < GFX_MAX_SHADERS && d3d->shader.pass[d3d->shader.passes - 1].fbo.valid; + if (use_extra_pass) + { + d3d->shader.passes++; + gfx_shader_pass &dummy_pass = d3d->shader.pass[d3d->shader.passes - 1]; + dummy_pass.fbo.scale_x = dummy_pass.fbo.scale_y = 1.0f; + dummy_pass.fbo.type_x = dummy_pass.fbo.type_y = RARCH_SCALE_VIEWPORT; + dummy_pass.filter = RARCH_FILTER_UNSPEC; + } + else + { + gfx_shader_pass &pass = d3d->shader.pass[d3d->shader.passes - 1]; + pass.fbo.scale_x = pass.fbo.scale_y = 1.0f; + pass.fbo.type_x = pass.fbo.type_y = RARCH_SCALE_VIEWPORT; + } + + return true; +} +#endif + +void d3d_set_font_rect(void *data, font_params_t *params) +{ + d3d_video_t *d3d = (d3d_video_t*)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; + + if (params) + { + pos_x = params->x; + pos_y = params->y; + font_size *= params->scale; + } + + 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; + + 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; +} + +bool d3d_init_singlepass(void *data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; + memset(&d3d->shader, 0, sizeof(d3d->shader)); + d3d->shader.passes = 1; + gfx_shader_pass &pass = d3d->shader.pass[0]; + pass.fbo.valid = true; + pass.fbo.scale_x = pass.fbo.scale_y = 1.0; + pass.fbo.type_x = pass.fbo.type_y = RARCH_SCALE_VIEWPORT; + strlcpy(pass.source.cg, d3d->cg_shader.c_str(), sizeof(pass.source.cg)); + + return true; +} + +bool d3d_process_shader(void *data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; +#ifdef HAVE_FBO + if (strcmp(path_get_extension(d3d->cg_shader.c_str()), "cgp") == 0) + return d3d_init_multipass(d3d); +#endif + + return d3d_init_singlepass(d3d); +} + bool d3d_init_luts(void *data) { d3d_video_t *d3d = (d3d_video_t*)data; diff --git a/gfx/d3d9/d3d9_pc.cpp b/gfx/d3d9/d3d9_pc.cpp index d0a41e8216..1daf408f11 100644 --- a/gfx/d3d9/d3d9_pc.cpp +++ b/gfx/d3d9/d3d9_pc.cpp @@ -16,7 +16,6 @@ */ #include "d3d9.hpp" -#include "../../file.h" #include "../context/win32_common.h" #ifdef _MSC_VER @@ -36,6 +35,7 @@ extern bool d3d_restore(void *data); static void d3d_resize(unsigned new_width, unsigned new_height) { +#ifndef _XBOX d3d_video_t *d3d = (d3d_video_t*)curD3D; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; if (!d3dr) @@ -49,6 +49,7 @@ static void d3d_resize(unsigned new_width, unsigned new_height) d3d->video_info.height = d3d->screen_height = new_height; d3d_restore(d3d); } +#endif } #ifdef HAVE_WINDOW @@ -88,17 +89,6 @@ LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, } #endif -bool d3d_process_shader(void *data) -{ - d3d_video_t *d3d = (d3d_video_t*)data; -#ifdef HAVE_FBO - if (strcmp(path_get_extension(d3d->cg_shader.c_str()), "cgp") == 0) - return d3d_init_multipass(d3d); -#endif - - return d3d_init_singlepass(d3d); -} - static void gfx_ctx_d3d_swap_buffers(void) { d3d_video_t *d3d = (d3d_video_t*)driver.video_data; @@ -145,103 +135,6 @@ static void gfx_ctx_d3d_update_title(void) g_extern.frame_count++; } -void d3d_set_font_rect(void *data, font_params_t *params) -{ - d3d_video_t *d3d = (d3d_video_t*)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; - - if (params) - { - pos_x = params->x; - pos_y = params->y; - font_size *= params->scale; - } - - 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; - - 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; -} - -bool d3d_init_singlepass(void *data) -{ - d3d_video_t *d3d = (d3d_video_t*)data; - memset(&d3d->shader, 0, sizeof(d3d->shader)); - d3d->shader.passes = 1; - gfx_shader_pass &pass = d3d->shader.pass[0]; - pass.fbo.valid = true; - pass.fbo.scale_x = pass.fbo.scale_y = 1.0; - pass.fbo.type_x = pass.fbo.type_y = RARCH_SCALE_VIEWPORT; - strlcpy(pass.source.cg, d3d->cg_shader.c_str(), sizeof(pass.source.cg)); - - return true; -} - - - -#ifdef HAVE_FBO -bool d3d_init_multipass(void *data) -{ - d3d_video_t *d3d = (d3d_video_t*)data; - config_file_t *conf = config_file_new(d3d->cg_shader.c_str()); - if (!conf) - { - RARCH_ERR("Failed to load preset.\n"); - return false; - } - - memset(&d3d->shader, 0, sizeof(d3d->shader)); - - if (!gfx_shader_read_conf_cgp(conf, &d3d->shader)) - { - config_file_free(conf); - RARCH_ERR("Failed to parse CGP file.\n"); - return false; - } - - config_file_free(conf); - - gfx_shader_resolve_relative(&d3d->shader, d3d->cg_shader.c_str()); - - RARCH_LOG("[D3D9 Meta-Cg] Found %d shaders.\n", d3d->shader.passes); - - for (unsigned i = 0; i < d3d->shader.passes; i++) - { - if (!d3d->shader.pass[i].fbo.valid) - { - d3d->shader.pass[i].fbo.scale_x = d3d->shader.pass[i].fbo.scale_y = 1.0f; - d3d->shader.pass[i].fbo.type_x = d3d->shader.pass[i].fbo.type_y = RARCH_SCALE_INPUT; - } - } - - bool use_extra_pass = d3d->shader.passes < GFX_MAX_SHADERS && d3d->shader.pass[d3d->shader.passes - 1].fbo.valid; - if (use_extra_pass) - { - d3d->shader.passes++; - gfx_shader_pass &dummy_pass = d3d->shader.pass[d3d->shader.passes - 1]; - dummy_pass.fbo.scale_x = dummy_pass.fbo.scale_y = 1.0f; - dummy_pass.fbo.type_x = dummy_pass.fbo.type_y = RARCH_SCALE_VIEWPORT; - dummy_pass.filter = RARCH_FILTER_UNSPEC; - } - else - { - gfx_shader_pass &pass = d3d->shader.pass[d3d->shader.passes - 1]; - pass.fbo.scale_x = pass.fbo.scale_y = 1.0f; - pass.fbo.type_x = pass.fbo.type_y = RARCH_SCALE_VIEWPORT; - } - - return true; -} -#endif - static void gfx_ctx_d3d_show_mouse(bool state) { #ifdef HAVE_WINDOW