This commit is contained in:
twinaphex 2018-05-17 19:47:22 +02:00
parent bef7b481c6
commit 0de7e7bf46
1 changed files with 48 additions and 33 deletions

View File

@ -48,7 +48,8 @@ static void *d3d9_cg_get_constant_by_name(void *data, const char *name)
return cgGetNamedParameter(prog, name); return cgGetNamedParameter(prog, name);
} }
static INLINE void d3d9_cg_set_param_1f(void *data, const char *name, const void *values) static INLINE void d3d9_cg_set_param_1f(void *data, void *userdata,
const char *name, const void *values)
{ {
CGprogram prog = (CGprogram)data; CGprogram prog = (CGprogram)data;
CGparameter cgp = d3d9_cg_get_constant_by_name(prog, name); CGparameter cgp = d3d9_cg_get_constant_by_name(prog, name);
@ -56,10 +57,20 @@ static INLINE void d3d9_cg_set_param_1f(void *data, const char *name, const void
cgD3D9SetUniform(cgp, values); cgD3D9SetUniform(cgp, values);
} }
static INLINE void d3d9_cg_set_param_2f(void *data, const char *name, const void *values) static INLINE void d3d9_cg_set_param_2f(void *data, void *userdata,
const char *name, const void *values)
{ {
/* Makes zero difference to Cg D3D9 */ /* Makes zero difference to Cg D3D9 */
return d3d9_cg_set_param_1f(data, name, values); return d3d9_cg_set_param_1f(data, userdata, name, values);
}
static INLINE void d3d9_cg_set_param_matrix(void *data, void *userdata,
const char *name, const void *values)
{
CGprogram prog = (CGprogram)data;
CGparameter cgp = d3d9_cg_get_constant_by_name(prog, name);
if (cgp)
cgD3D9SetUniformMatrix(cgp, (D3DMATRIX*)values);
} }
#include "d3d9_renderchain.h" #include "d3d9_renderchain.h"
@ -205,6 +216,7 @@ error:
static void d3d9_cg_renderchain_set_shader_params( static void d3d9_cg_renderchain_set_shader_params(
d3d9_renderchain_t *chain, d3d9_renderchain_t *chain,
LPDIRECT3DDEVICE9 dev,
struct shader_pass *pass, struct shader_pass *pass,
unsigned video_w, unsigned video_h, unsigned video_w, unsigned video_h,
unsigned tex_w, unsigned tex_h, unsigned tex_w, unsigned tex_h,
@ -224,12 +236,12 @@ static void d3d9_cg_renderchain_set_shader_params(
output_size[0] = viewport_w; output_size[0] = viewport_w;
output_size[1] = viewport_h; output_size[1] = viewport_h;
d3d9_cg_set_param_2f(vprg, "IN.video_size", &video_size); d3d9_cg_set_param_2f(vprg, dev, "IN.video_size", &video_size);
d3d9_cg_set_param_2f(fprg, "IN.video_size", &video_size); d3d9_cg_set_param_2f(fprg, dev, "IN.video_size", &video_size);
d3d9_cg_set_param_2f(vprg, "IN.texture_size", &texture_size); d3d9_cg_set_param_2f(vprg, dev, "IN.texture_size", &texture_size);
d3d9_cg_set_param_2f(fprg, "IN.texture_size", &texture_size); d3d9_cg_set_param_2f(fprg, dev, "IN.texture_size", &texture_size);
d3d9_cg_set_param_2f(vprg, "IN.output_size", &output_size); d3d9_cg_set_param_2f(vprg, dev, "IN.output_size", &output_size);
d3d9_cg_set_param_2f(fprg, "IN.output_size", &output_size); d3d9_cg_set_param_2f(fprg, dev, "IN.output_size", &output_size);
frame_cnt = chain->frame_count; frame_cnt = chain->frame_count;
@ -237,8 +249,8 @@ static void d3d9_cg_renderchain_set_shader_params(
frame_cnt = chain->frame_count frame_cnt = chain->frame_count
% pass->info.pass->frame_count_mod; % pass->info.pass->frame_count_mod;
d3d9_cg_set_param_1f(fprg, "IN.frame_count", &frame_cnt); d3d9_cg_set_param_1f(fprg, dev, "IN.frame_count", &frame_cnt);
d3d9_cg_set_param_1f(vprg, "IN.frame_count", &frame_cnt); d3d9_cg_set_param_1f(vprg, dev, "IN.frame_count", &frame_cnt);
} }
#define DECL_FVF_COLOR(stream, offset, index) \ #define DECL_FVF_COLOR(stream, offset, index) \
@ -392,6 +404,7 @@ static bool d3d9_cg_renderchain_init_shader_fvf(
static void d3d9_cg_renderchain_bind_orig( static void d3d9_cg_renderchain_bind_orig(
d3d9_renderchain_t *chain, d3d9_renderchain_t *chain,
LPDIRECT3DDEVICE9 dev,
struct shader_pass *pass) struct shader_pass *pass)
{ {
CGparameter param; CGparameter param;
@ -403,10 +416,10 @@ static void d3d9_cg_renderchain_bind_orig(
texture_size[0] = first_pass->info.tex_w; texture_size[0] = first_pass->info.tex_w;
texture_size[1] = first_pass->info.tex_h; texture_size[1] = first_pass->info.tex_h;
d3d9_cg_set_param_2f(pass->vprg, "ORIG.video_size", &video_size); d3d9_cg_set_param_2f(pass->vprg, dev, "ORIG.video_size", &video_size);
d3d9_cg_set_param_2f(pass->fprg, "ORIG.video_size", &video_size); d3d9_cg_set_param_2f(pass->fprg, dev, "ORIG.video_size", &video_size);
d3d9_cg_set_param_2f(pass->vprg, "ORIG.texture_size", &texture_size); d3d9_cg_set_param_2f(pass->vprg, dev, "ORIG.texture_size", &texture_size);
d3d9_cg_set_param_2f(pass->fprg, "ORIG.texture_size", &texture_size); d3d9_cg_set_param_2f(pass->fprg, dev, "ORIG.texture_size", &texture_size);
param = d3d9_cg_get_constant_by_name(pass->fprg, "ORIG.texture"); param = d3d9_cg_get_constant_by_name(pass->fprg, "ORIG.texture");
@ -438,6 +451,7 @@ static void d3d9_cg_renderchain_bind_orig(
} }
static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain, static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain,
LPDIRECT3DDEVICE9 dev,
struct shader_pass *pass) struct shader_pass *pass)
{ {
unsigned i; unsigned i;
@ -474,10 +488,10 @@ static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain,
video_size[1] = chain->prev.last_height[ video_size[1] = chain->prev.last_height[
(chain->prev.ptr - (i + 1)) & TEXTURESMASK]; (chain->prev.ptr - (i + 1)) & TEXTURESMASK];
d3d9_cg_set_param_2f(pass->vprg, attr_input_size, &video_size); d3d9_cg_set_param_2f(pass->vprg, dev, attr_input_size, &video_size);
d3d9_cg_set_param_2f(pass->fprg, attr_input_size, &video_size); d3d9_cg_set_param_2f(pass->fprg, dev, attr_input_size, &video_size);
d3d9_cg_set_param_2f(pass->vprg, attr_tex_size, &texture_size); d3d9_cg_set_param_2f(pass->vprg, dev, attr_tex_size, &texture_size);
d3d9_cg_set_param_2f(pass->fprg, attr_tex_size, &texture_size); d3d9_cg_set_param_2f(pass->fprg, dev, attr_tex_size, &texture_size);
param = d3d9_cg_get_constant_by_name(pass->fprg, attr_texture); param = d3d9_cg_get_constant_by_name(pass->fprg, attr_texture);
if (param) if (param)
@ -518,6 +532,7 @@ static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain,
static void d3d9_cg_renderchain_bind_pass( static void d3d9_cg_renderchain_bind_pass(
d3d9_renderchain_t *chain, d3d9_renderchain_t *chain,
LPDIRECT3DDEVICE9 dev,
struct shader_pass *pass, unsigned pass_index) struct shader_pass *pass, unsigned pass_index)
{ {
unsigned i; unsigned i;
@ -545,10 +560,10 @@ static void d3d9_cg_renderchain_bind_pass(
texture_size[0] = curr_pass->info.tex_w; texture_size[0] = curr_pass->info.tex_w;
texture_size[1] = curr_pass->info.tex_h; texture_size[1] = curr_pass->info.tex_h;
d3d9_cg_set_param_2f(pass->vprg, attr_input_size, &video_size); d3d9_cg_set_param_2f(pass->vprg, dev, attr_input_size, &video_size);
d3d9_cg_set_param_2f(pass->fprg, attr_input_size, &video_size); d3d9_cg_set_param_2f(pass->fprg, dev, attr_input_size, &video_size);
d3d9_cg_set_param_2f(pass->vprg, attr_tex_size, &texture_size); d3d9_cg_set_param_2f(pass->vprg, dev, attr_tex_size, &texture_size);
d3d9_cg_set_param_2f(pass->fprg, attr_tex_size, &texture_size); d3d9_cg_set_param_2f(pass->fprg, dev, attr_tex_size, &texture_size);
param = d3d9_cg_get_constant_by_name(pass->fprg, attr_texture); param = d3d9_cg_get_constant_by_name(pass->fprg, attr_texture);
if (param) if (param)
@ -841,7 +856,6 @@ static void d3d9_cg_renderchain_calc_and_set_shader_mvp(
unsigned rotation) unsigned rotation)
{ {
struct d3d_matrix proj, ortho, rot, matrix; struct d3d_matrix proj, ortho, rot, matrix;
CGparameter cgpModelViewProj = d3d9_cg_get_constant_by_name(vprg, "modelViewProj");
d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1); d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1);
d3d_matrix_identity(&rot); d3d_matrix_identity(&rot);
@ -850,8 +864,7 @@ static void d3d9_cg_renderchain_calc_and_set_shader_mvp(
d3d_matrix_multiply(&proj, &ortho, &rot); d3d_matrix_multiply(&proj, &ortho, &rot);
d3d_matrix_transpose(&matrix, &proj); d3d_matrix_transpose(&matrix, &proj);
if (cgpModelViewProj) d3d9_cg_set_param_matrix(vprg, NULL, "modelViewProj", (const void*)&matrix);
cgD3D9SetUniformMatrix(cgpModelViewProj, (D3DMATRIX*)&matrix);
} }
static void cg_d3d9_renderchain_set_vertices( static void cg_d3d9_renderchain_set_vertices(
@ -942,7 +955,8 @@ static void cg_d3d9_renderchain_set_vertices(
d3d9_cg_renderchain_calc_and_set_shader_mvp( d3d9_cg_renderchain_calc_and_set_shader_mvp(
pass->vprg, vp_width, vp_height, rotation); pass->vprg, vp_width, vp_height, rotation);
d3d9_cg_renderchain_set_shader_params(chain, pass, d3d9_cg_renderchain_set_shader_params(chain, chain->dev,
pass,
width, height, width, height,
info->tex_w, info->tex_h, info->tex_w, info->tex_h,
vp_width, vp_height); vp_width, vp_height);
@ -950,6 +964,7 @@ static void cg_d3d9_renderchain_set_vertices(
static void cg_d3d9_renderchain_set_params( static void cg_d3d9_renderchain_set_params(
d3d9_renderchain_t *chain, d3d9_renderchain_t *chain,
LPDIRECT3DDEVICE9 dev,
struct shader_pass *pass, struct shader_pass *pass,
state_tracker_t *tracker, state_tracker_t *tracker,
unsigned pass_index) unsigned pass_index)
@ -966,8 +981,8 @@ static void cg_d3d9_renderchain_set_params(
for (i = 0; i < cnt; i++) for (i = 0; i < cnt; i++)
{ {
d3d9_cg_set_param_2f(pass->fprg, tracker_info[i].id, &tracker_info[i].value); d3d9_cg_set_param_2f(pass->fprg, dev, tracker_info[i].id, &tracker_info[i].value);
d3d9_cg_set_param_2f(pass->vprg, tracker_info[i].id, &tracker_info[i].value); d3d9_cg_set_param_2f(pass->vprg, dev, tracker_info[i].id, &tracker_info[i].value);
} }
} }
@ -995,10 +1010,10 @@ static void cg_d3d9_renderchain_render_pass(
sizeof(struct D3D9Vertex)); sizeof(struct D3D9Vertex));
/* Set orig texture. */ /* Set orig texture. */
d3d9_cg_renderchain_bind_orig(chain, pass); d3d9_cg_renderchain_bind_orig(chain, chain->dev, pass);
/* Set prev textures. */ /* Set prev textures. */
d3d9_cg_renderchain_bind_prev(chain, pass); d3d9_cg_renderchain_bind_prev(chain, chain->dev, pass);
/* Set lookup textures */ /* Set lookup textures */
for (i = 0; i < chain->luts->count; i++) for (i = 0; i < chain->luts->count; i++)
@ -1029,10 +1044,10 @@ static void cg_d3d9_renderchain_render_pass(
/* We only bother binding passes which are two indices behind. */ /* We only bother binding passes which are two indices behind. */
if (pass_index >= 3) if (pass_index >= 3)
d3d9_cg_renderchain_bind_pass(chain, pass, pass_index); d3d9_cg_renderchain_bind_pass(chain, chain->dev, pass, pass_index);
if (tracker) if (tracker)
cg_d3d9_renderchain_set_params(chain, pass, tracker, pass_index); cg_d3d9_renderchain_set_params(chain, chain->dev, pass, tracker, pass_index);
d3d9_draw_primitive(chain->dev, D3DPT_TRIANGLESTRIP, 0, 2); d3d9_draw_primitive(chain->dev, D3DPT_TRIANGLESTRIP, 0, 2);