Skip to content

Commit

Permalink
Add set_mvp function callback
Browse files Browse the repository at this point in the history
  • Loading branch information
inactive123 committed Nov 15, 2017
1 parent b6b6ba9 commit 721b5f9
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 41 deletions.
31 changes: 26 additions & 5 deletions gfx/drivers/d3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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,
Expand Down
30 changes: 18 additions & 12 deletions gfx/drivers_renderchain/d3d8_renderchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down
8 changes: 5 additions & 3 deletions gfx/drivers_renderchain/d3d9_cg_renderchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down
42 changes: 27 additions & 15 deletions gfx/drivers_renderchain/d3d9_hlsl_renderchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion gfx/drivers_renderchain/null_renderchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion gfx/video_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
};

Expand Down
5 changes: 4 additions & 1 deletion gfx/video_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down
10 changes: 7 additions & 3 deletions menu/drivers_display/menu_display_d3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);

Expand Down

0 comments on commit 721b5f9

Please sign in to comment.