mirror of
https://github.com/libretro/RetroArch
synced 2025-02-20 15:40:44 +00:00
Add set_mvp function callback
This commit is contained in:
parent
b6b6ba9226
commit
721b5f9529
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user