diff --git a/gfx/d3d/d3d.cpp b/gfx/d3d/d3d.cpp index 952f50104c..c3313686ca 100644 --- a/gfx/d3d/d3d.cpp +++ b/gfx/d3d/d3d.cpp @@ -878,7 +878,8 @@ static bool d3d_init_chain(d3d_video_t *d3d, const video_info_t *video_info) RARCH_LOG("Renderchain driver: %s\n", d3d->renderchain_driver->ident); - if (!d3d->renderchain_driver->init_shader(d3d, d3d->renderchain_data)) + if (!d3d->renderchain_driver->init_shader(d3d, d3d->renderchain_data, + d3d->shader)) { RARCH_ERR("Failed to initialize shader subsystem.\n"); return false; @@ -1552,7 +1553,7 @@ static bool d3d_frame(void *data, const void *frame, #else d3d->renderchain_data, #endif - frame, width, height, + frame, d3d->shader, width, height, pitch, d3d->dev_rotation)) { RARCH_ERR("[D3D]: Failed to render scene.\n"); diff --git a/gfx/d3d/render_chain_cg.cpp b/gfx/d3d/render_chain_cg.cpp index 06f040efaf..d705a7b77c 100644 --- a/gfx/d3d/render_chain_cg.cpp +++ b/gfx/d3d/render_chain_cg.cpp @@ -1385,7 +1385,8 @@ static void renderchain_render_pass(void *data, void *pass_data, unsigned pass_i renderchain_unbind_all(chain); } -static bool cg_d3d9_renderchain_render(void *chain_data, const void *data, +static bool cg_d3d9_renderchain_render(void *chain_data, + const void *data, void *shader_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { Pass *last_pass; @@ -1393,6 +1394,7 @@ static bool cg_d3d9_renderchain_render(void *chain_data, const void *data, unsigned i, current_width, current_height, out_width = 0, out_height = 0; cg_renderchain_t *chain = (cg_renderchain_t*)chain_data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)chain->dev; + const shader_backend_t *shader = (const shader_backend_t*)shader_data; renderchain_start_render(chain); diff --git a/gfx/d3d/render_chain_driver.h b/gfx/d3d/render_chain_driver.h index 504ac14af5..35a4bcb266 100644 --- a/gfx/d3d/render_chain_driver.h +++ b/gfx/d3d/render_chain_driver.h @@ -40,7 +40,7 @@ typedef struct renderchain_driver { void (*chain_free)(void *data); void *(*chain_new)(void); - bool (*init_shader)(void *data, void *renderchain_data); + bool (*init_shader)(void *data, void *renderchain_data, void *shader_data); bool (*init_shader_fvf)(void *data, void *pass_data); bool (*reinit)(void *data, const void *info_data); bool (*init)(void *data, @@ -56,7 +56,7 @@ typedef struct renderchain_driver const char *id, const char *path, bool smooth); void (*add_state_tracker)(void *data, void *tracker_data); - bool (*render)(void *chain_data, const void *data, + bool (*render)(void *chain_data, const void *data, void *shader_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation); void (*convert_geometry)(void *data, const void *info_data, unsigned *out_width, unsigned *out_height, diff --git a/gfx/d3d/render_chain_null.cpp b/gfx/d3d/render_chain_null.cpp index c178ed90e1..9f3e40f080 100644 --- a/gfx/d3d/render_chain_null.cpp +++ b/gfx/d3d/render_chain_null.cpp @@ -69,12 +69,14 @@ static void null_renderchain_set_final_viewport(void *data, (void)viewport_data; } -static bool null_renderchain_render(void *data, const void *frame, +static bool null_renderchain_render(void *data, + const void *frame, void *shader_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { (void)data; (void)frame; + (void)shader_data; (void)width; (void)height; (void)pitch; diff --git a/gfx/d3d/render_chain_xdk.cpp b/gfx/d3d/render_chain_xdk.cpp index 2c490de156..3dddffc08c 100644 --- a/gfx/d3d/render_chain_xdk.cpp +++ b/gfx/d3d/render_chain_xdk.cpp @@ -37,7 +37,9 @@ typedef struct xdk_renderchain unsigned tex_h; } xdk_renderchain_t; -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void renderchain_set_mvp(void *data, + const shader_backend_t *shader, + unsigned vp_width, unsigned vp_height, unsigned rotation) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -45,8 +47,8 @@ static void renderchain_set_mvp(void *data, unsigned vp_width, #if defined(_XBOX360) && defined(HAVE_HLSL) hlsl_set_proj_matrix(XMMatrixRotationZ(rotation * (M_PI / 2.0))); - if (d3d->shader && d3d->shader->set_mvp) - d3d->shader->set_mvp(d3d, NULL); + if (shader && shader->set_mvp) + shader->set_mvp(d3d, NULL); #elif defined(HAVE_D3D8) D3DXMATRIX p_out, p_rotate, mat; D3DXMatrixOrthoOffCenterLH(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f); @@ -200,21 +202,6 @@ static void renderchain_set_vertices(void *data, unsigned pass, d3d_vertex_buffer_unlock(d3d->vertex_buf); } -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) -#ifdef _XBOX - if (d3d->shader) - { - renderchain_set_mvp(d3d, d3d->screen_width, d3d->screen_height, d3d->dev_rotation); - if (d3d->shader->use) - d3d->shader->use(d3d, pass); - if (d3d->shader->set_params) - d3d->shader->set_params(d3d, width, height, d3d->tex_w, - d3d->tex_h, d3d->screen_width, - d3d->screen_height, runloop->frames.video.count, - NULL, NULL, NULL, 0); - } -#endif -#endif } static void renderchain_blit_to_texture(void *data, const void *frame, @@ -286,11 +273,13 @@ void *xdk_renderchain_new(void) return renderchain; } -static bool xdk_renderchain_init_shader(void *data, void *renderchain_data) +static bool xdk_renderchain_init_shader(void *data, + void *renderchain_data, void *shader_data) { - const char *shader_path = NULL; - d3d_video_t *d3d = (d3d_video_t*)data; - settings_t *settings = config_get_ptr(); + const char *shader_path = NULL; + d3d_video_t *d3d = (d3d_video_t*)data; + settings_t *settings = config_get_ptr(); + const shader_backend_t *shader = (const shader_backend_t*)shader_data; if (!d3d) return false; @@ -298,12 +287,12 @@ static bool xdk_renderchain_init_shader(void *data, void *renderchain_data) #if defined(HAVE_HLSL) RARCH_LOG("D3D]: Using HLSL shader backend.\n"); shader_path = settings->video.shader_path; - d3d->shader = &hlsl_backend; + shader = &hlsl_backend; - if (!d3d->shader) + if (!shader) return false; - return d3d->shader->init(d3d, shader_path); + return shader->init(d3d, shader_path); #endif return true; @@ -354,7 +343,8 @@ static void xdk_renderchain_set_final_viewport(void *data, /* stub */ } -static bool xdk_renderchain_render(void *data, const void *frame, +static bool xdk_renderchain_render(void *data, + const void *frame, void *shader_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { unsigned i; @@ -362,10 +352,28 @@ static bool xdk_renderchain_render(void *data, const void *frame, LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; runloop_t *runloop = rarch_main_get_ptr(); settings_t *settings = config_get_ptr(); + const shader_backend_t *shader = (const shader_backend_t*)shader_data; renderchain_blit_to_texture(d3d, frame, width, height, pitch); renderchain_set_vertices(d3d, 1, width, height); +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) +#ifdef _XBOX + if (shader) + { + renderchain_set_mvp(d3d, shader, + d3d->screen_width, d3d->screen_height, d3d->dev_rotation); + if (shader->use) + shader->use(d3d, pass); + if (shader->set_params) + shader->set_params(d3d, width, height, d3d->tex_w, + d3d->tex_h, d3d->screen_width, + d3d->screen_height, runloop->frames.video.count, + NULL, NULL, NULL, 0); + } +#endif +#endif + d3d_set_texture(d3dr, 0, d3d->tex); d3d_set_viewport(d3d->dev, &d3d->final_viewport); d3d_set_sampler_minfilter(d3dr, 0, settings->video.smooth ? @@ -378,7 +386,8 @@ static bool xdk_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, d3d->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, d3d->screen_width, d3d->screen_height, d3d->dev_rotation); + renderchain_set_mvp(d3d, shader, + d3d->screen_width, d3d->screen_height, d3d->dev_rotation); return true; }