diff --git a/gfx/drivers/d3d.c b/gfx/drivers/d3d.c index 31cd9e571c41..48aefd123ecc 100644 --- a/gfx/drivers/d3d.c +++ b/gfx/drivers/d3d.c @@ -1064,11 +1064,20 @@ static bool d3d_init_internal(d3d_video_t *d3d, * later. */ type = video_shader_parse_type(settings->paths.path_shader, RARCH_SHADER_NONE); - if (settings->bools.video_shader_enable && type == RARCH_SHADER_CG) + + if (settings->bools.video_shader_enable) { - if (!string_is_empty(d3d->shader_path)) - free(d3d->shader_path); - d3d->shader_path = strdup(settings->paths.path_shader); + switch (type) + { + case RARCH_SHADER_CG: + if (!string_is_empty(d3d->shader_path)) + free(d3d->shader_path); + if (!string_is_empty(settings->paths.path_shader)) + d3d->shader_path = strdup(settings->paths.path_shader); + break; + default: + break; + } } if (!d3d_process_shader(d3d)) @@ -1710,9 +1719,21 @@ static void d3d_unload_texture(void *data, uintptr_t id) d3d_texture_free(texid); } +static void d3d_set_mvp(void *data, + void *shader_data, + const void *mat_data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; + if (d3d && d3d->renderchain_driver->set_mvp) + d3d->renderchain_driver->set_mvp( + d3d->renderchain_data, + data, + 640, 480, 0); +} + static const video_poke_interface_t d3d_poke_interface = { NULL, /* set_coords */ - NULL, /* set_mvp */ + d3d_set_mvp, d3d_load_texture, d3d_unload_texture, NULL, diff --git a/gfx/drivers_renderchain/d3d8_renderchain.c b/gfx/drivers_renderchain/d3d8_renderchain.c index 2dc9b4dcf92f..faef44aee724 100644 --- a/gfx/drivers_renderchain/d3d8_renderchain.c +++ b/gfx/drivers_renderchain/d3d8_renderchain.c @@ -43,13 +43,17 @@ typedef struct d3d8_renderchain uint64_t frame_count; } d3d8_renderchain_t; -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void d3d8_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; D3DMATRIX p_out, p_rotate, mat; + (void)chain_data; + d3d_matrix_ortho_off_center_lh(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f); d3d_matrix_identity(&p_out); d3d_matrix_rotation_z(&p_rotate, rotation * (M_PI / 2.0)); @@ -67,7 +71,7 @@ static void d3d8_renderchain_clear(void *data) d3d_vertex_buffer_free(chain->vertex_buf, chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool d3d8_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -106,7 +110,7 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void d3d8_renderchain_set_vertices(void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { unsigned width, height; @@ -171,7 +175,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, } } -static void renderchain_blit_to_texture(void *data, const void *frame, +static void d3d8_renderchain_blit_to_texture(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; @@ -254,7 +258,7 @@ static bool d3d8_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!d3d8_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -283,17 +287,17 @@ static bool d3d8_renderchain_render(void *data, const void *frame, { unsigned i; unsigned width, height; - d3d_video_t *d3d = (d3d_video_t*)data; - LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - settings_t *settings = config_get_ptr(); + d3d_video_t *d3d = (d3d_video_t*)data; + LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; + settings_t *settings = config_get_ptr(); d3d8_renderchain_t *chain = (d3d8_renderchain_t*)d3d->renderchain_data; chain->frame_count++; video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + d3d8_renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); + d3d8_renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -307,7 +311,7 @@ static bool d3d8_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + d3d8_renderchain_set_mvp(chain, d3d, width, height, d3d->dev_rotation); return true; } @@ -365,7 +369,8 @@ static bool d3d8_renderchain_reinit(void *data, return true; } -static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void d3d8_renderchain_viewport_info(void *data, + struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -385,6 +390,7 @@ static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp } d3d_renderchain_driver_t d3d8_d3d_renderchain = { + d3d8_renderchain_set_mvp, d3d8_renderchain_free, d3d8_renderchain_new, d3d8_renderchain_reinit, diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.c b/gfx/drivers_renderchain/d3d9_cg_renderchain.c index b153c8f177e6..5a83b9af751e 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.c @@ -1191,13 +1191,14 @@ static void d3d9_cg_renderchain_end_render(cg_renderchain_t *chain) } static void d3d9_cg_renderchain_set_mvp( - cg_renderchain_t *chain, - void *vertex_program, + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { D3DMATRIX proj, ortho, rot, tmp; - CGprogram vPrg = (CGprogram)vertex_program; + CGprogram vPrg = (CGprogram)data; + cg_renderchain_t *chain = (cg_renderchain_t*)chain_data; d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1); d3d_matrix_identity(&rot); @@ -1686,6 +1687,7 @@ static void d3d9_cg_renderchain_viewport_info( } d3d_renderchain_driver_t cg_d3d9_renderchain = { + d3d9_cg_renderchain_set_mvp, d3d9_cg_renderchain_free, d3d9_cg_renderchain_new, NULL, diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index 6408c5ab66e1..8d96721d86f0 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -44,14 +44,17 @@ typedef struct hlsl_d3d9_renderchain /* TODO/FIXME - this forward declaration should not be necesary */ void hlsl_set_proj_matrix(void *data, XMMATRIX rotation_value); -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void hlsl_d3d9_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - hlsl_set_proj_matrix((void*)&d3d->shader, XMMatrixRotationZ(rotation * (M_PI / 2.0))); + hlsl_set_proj_matrix((void*)&d3d->shader, + XMMatrixRotationZ(rotation * (M_PI / 2.0))); mvp.data = d3d; mvp.matrix = NULL; @@ -87,7 +90,7 @@ static bool hlsl_d3d9_renderchain_init_shader_fvf(void *data, void *pass_data) VertexElements, (void**)&chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool hlsl_d3d9_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -126,7 +129,8 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void hlsl_d3d9_renderchain_set_vertices( + void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { video_shader_ctx_params_t params; @@ -187,7 +191,8 @@ static void renderchain_set_vertices(void *data, unsigned pass, d3d_vertex_buffer_unlock(chain->vertex_buf); } - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp(chain, + d3d, width, height, d3d->dev_rotation); shader_info.data = d3d; shader_info.idx = pass; @@ -212,8 +217,9 @@ static void renderchain_set_vertices(void *data, unsigned pass, video_shader_driver_set_parameters(params); } -static void renderchain_blit_to_texture(void *data, const void *frame, - unsigned width, unsigned height, unsigned pitch) +static void hlsl_d3d9_renderchain_blit_to_texture( + void *data, const void *frame, + unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)data; @@ -261,7 +267,6 @@ static void hlsl_d3d9_renderchain_free(void *data) hlsl_d3d9_renderchain_clear(chain->renderchain_data); } - void *hlsl_d3d9_renderchain_new(void) { hlsl_d3d9_renderchain_t *renderchain = @@ -327,7 +332,7 @@ static bool hlsl_d3d9_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!hlsl_d3d9_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -366,8 +371,10 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + hlsl_d3d9_renderchain_blit_to_texture(chain, + frame, frame_width, frame_height, pitch); + hlsl_d3d9_renderchain_set_vertices(d3d, + 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -381,12 +388,14 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp( + chain, d3d, width, height, d3d->dev_rotation); return true; } -static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) +static bool hlsl_d3d9_renderchain_add_pass( + void *data, const void *info_data) { (void)data; (void)info_data; @@ -395,7 +404,8 @@ static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) return true; } -static void hlsl_d3d9_renderchain_add_state_tracker(void *data, void *tracker_data) +static void hlsl_d3d9_renderchain_add_state_tracker( + void *data, void *tracker_data) { (void)data; (void)tracker_data; @@ -441,7 +451,8 @@ static bool hlsl_d3d9_renderchain_reinit(void *data, return true; } -static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void hlsl_d3d9_renderchain_viewport_info( + void *data, struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -461,6 +472,7 @@ static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewpor } d3d_renderchain_driver_t hlsl_d3d9_renderchain = { + hlsl_d3d9_renderchain_set_mvp, hlsl_d3d9_renderchain_free, hlsl_d3d9_renderchain_new, hlsl_d3d9_renderchain_reinit, diff --git a/gfx/drivers_renderchain/null_renderchain.c b/gfx/drivers_renderchain/null_renderchain.c index 2bad39d720d1..a3ed173615ed 100644 --- a/gfx/drivers_renderchain/null_renderchain.c +++ b/gfx/drivers_renderchain/null_renderchain.c @@ -118,7 +118,8 @@ static void null_renderchain_convert_geometry( (void)final_viewport_data; } -d3d_renderchain_driver_t null_renderchain = { +d3d_renderchain_driver_t null_d3d_renderchain = { + NULL, null_renderchain_free, null_renderchain_new, NULL, diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 61d3601dfb3c..60aee353408d 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -417,7 +417,7 @@ static const d3d_renderchain_driver_t *renderchain_d3d_drivers[] = { #if defined(_WIN32) && defined(HAVE_D3D8) &d3d8_renderchain, #endif - &null_renderchain, + &null_d3d_renderchain, NULL }; diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 2d02f1eff4a4..69970be4bb51 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -803,6 +803,9 @@ typedef struct video_driver typedef struct d3d_renderchain_driver { + void (*set_mvp)(void *chain_data, + void *data, unsigned vp_width, + unsigned vp_height, unsigned rotation); void (*chain_free)(void *data); void *(*chain_new)(void); bool (*reinit)(void *data, const void *info_data); @@ -1368,7 +1371,7 @@ extern const shader_backend_t shader_null_backend; extern d3d_renderchain_driver_t d3d8_renderchain; extern d3d_renderchain_driver_t cg_d3d9_renderchain; extern d3d_renderchain_driver_t hlsl_d3d9_renderchain; -extern d3d_renderchain_driver_t null_renderchain; +extern d3d_renderchain_driver_t null_d3d_renderchain; extern gl_renderchain_driver_t gl2_renderchain; diff --git a/menu/drivers_display/menu_display_d3d.c b/menu/drivers_display/menu_display_d3d.c index e7b300498b94..f4895783f76e 100644 --- a/menu/drivers_display/menu_display_d3d.c +++ b/menu/drivers_display/menu_display_d3d.c @@ -143,9 +143,7 @@ static void menu_display_d3d_bind_texture(void *data) static void menu_display_d3d_draw(void *data) { -#if 0 - math_matrix_4x4 *mat = NULL; -#endif + video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)video_driver_get_ptr(false); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; @@ -159,6 +157,12 @@ static void menu_display_d3d_draw(void *data) if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = menu_display_d3d_get_default_tex_coords(); + mvp.data = d3d; + mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data + : (math_matrix_4x4*)menu_display_d3d_get_default_mvp(); + + video_driver_set_mvp(&mvp); + menu_display_d3d_viewport(draw); menu_display_d3d_bind_texture(draw);