Move more common code to d3d9_renderchain.h

This commit is contained in:
twinaphex 2018-05-17 17:38:42 +02:00
parent a024da61f4
commit f8b7104ef2
3 changed files with 91 additions and 104 deletions

View File

@ -194,7 +194,7 @@ error:
}
static void d3d9_cg_renderchain_set_shader_params(
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass,
unsigned video_w, unsigned video_h,
unsigned tex_w, unsigned tex_h,
@ -219,10 +219,10 @@ static void d3d9_cg_renderchain_set_shader_params(
set_cg_param(pass->vprg, "IN.output_size", &output_size);
set_cg_param(pass->fprg, "IN.output_size", &output_size);
frame_cnt = chain->chain.frame_count;
frame_cnt = chain->frame_count;
if (pass->info.pass->frame_count_mod)
frame_cnt = chain->chain.frame_count
frame_cnt = chain->frame_count
% pass->info.pass->frame_count_mod;
set_cg_param(pass->fprg, "IN.frame_count", &frame_cnt);
@ -379,13 +379,13 @@ static bool d3d9_cg_renderchain_init_shader_fvf(
}
static void d3d9_cg_renderchain_bind_orig(
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass)
{
CGparameter param;
float video_size[2];
float texture_size[2];
struct shader_pass *first_pass = (struct shader_pass*)&chain->chain.passes->data[0];
struct shader_pass *first_pass = (struct shader_pass*)&chain->passes->data[0];
video_size[0] = first_pass->last_width;
video_size[1] = first_pass->last_height;
texture_size[0] = first_pass->info.tex_w;
@ -401,14 +401,14 @@ static void d3d9_cg_renderchain_bind_orig(
if (param)
{
unsigned index = cgGetParameterResourceIndex(param);
d3d9_set_texture(chain->chain.dev, index, first_pass->tex);
d3d9_set_sampler_magfilter(chain->chain.dev, index,
d3d9_set_texture(chain->dev, index, first_pass->tex);
d3d9_set_sampler_magfilter(chain->dev, index,
d3d_translate_filter(first_pass->info.pass->filter));
d3d9_set_sampler_minfilter(chain->chain.dev, index,
d3d9_set_sampler_minfilter(chain->dev, index,
d3d_translate_filter(first_pass->info.pass->filter));
d3d9_set_sampler_address_u(chain->chain.dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->chain.dev, index, D3DTADDRESS_BORDER);
unsigned_vector_list_append(chain->chain.bound_tex, index);
d3d9_set_sampler_address_u(chain->dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->dev, index, D3DTADDRESS_BORDER);
unsigned_vector_list_append(chain->bound_tex, index);
}
param = cgGetNamedParameter(pass->vprg, "ORIG.tex_coord");
@ -419,13 +419,13 @@ static void d3d9_cg_renderchain_bind_orig(
pass->attrib_map;
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
d3d9_set_stream_source(chain->chain.dev, index,
d3d9_set_stream_source(chain->dev, index,
vert_buf, 0, sizeof(struct D3D9Vertex));
unsigned_vector_list_append(chain->chain.bound_vert, index);
unsigned_vector_list_append(chain->bound_vert, index);
}
}
static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain,
struct shader_pass *pass)
{
unsigned i;
@ -444,8 +444,8 @@ static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
"PREV6",
};
texture_size[0] = chain->chain.passes->data[0].info.tex_w;
texture_size[1] = chain->chain.passes->data[0].info.tex_h;
texture_size[0] = chain->passes->data[0].info.tex_w;
texture_size[1] = chain->passes->data[0].info.tex_h;
for (i = 0; i < TEXTURES - 1; i++)
{
@ -457,10 +457,10 @@ static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
snprintf(attr_tex_size, sizeof(attr_tex_size), "%s.texture_size", prev_names[i]);
snprintf(attr_coord, sizeof(attr_coord), "%s.tex_coord", prev_names[i]);
video_size[0] = chain->chain.prev.last_width[
(chain->chain.prev.ptr - (i + 1)) & TEXTURESMASK];
video_size[1] = chain->chain.prev.last_height[
(chain->chain.prev.ptr - (i + 1)) & TEXTURESMASK];
video_size[0] = chain->prev.last_width[
(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
video_size[1] = chain->prev.last_height[
(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
set_cg_param(pass->vprg, attr_input_size, &video_size);
set_cg_param(pass->fprg, attr_input_size, &video_size);
@ -474,38 +474,38 @@ static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
unsigned index = cgGetParameterResourceIndex(param);
tex = (LPDIRECT3DTEXTURE9)
chain->chain.prev.tex[
(chain->chain.prev.ptr - (i + 1)) & TEXTURESMASK];
chain->prev.tex[
(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
d3d9_set_texture(chain->chain.dev, index, tex);
unsigned_vector_list_append(chain->chain.bound_tex, index);
d3d9_set_texture(chain->dev, index, tex);
unsigned_vector_list_append(chain->bound_tex, index);
d3d9_set_sampler_magfilter(chain->chain.dev, index,
d3d_translate_filter(chain->chain.passes->data[0].info.pass->filter));
d3d9_set_sampler_minfilter(chain->chain.dev, index,
d3d_translate_filter(chain->chain.passes->data[0].info.pass->filter));
d3d9_set_sampler_address_u(chain->chain.dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->chain.dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_magfilter(chain->dev, index,
d3d_translate_filter(chain->passes->data[0].info.pass->filter));
d3d9_set_sampler_minfilter(chain->dev, index,
d3d_translate_filter(chain->passes->data[0].info.pass->filter));
d3d9_set_sampler_address_u(chain->dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->dev, index, D3DTADDRESS_BORDER);
}
param = cgGetNamedParameter(pass->vprg, attr_coord);
if (param)
{
LPDIRECT3DVERTEXBUFFER9 vert_buf = (LPDIRECT3DVERTEXBUFFER9)
chain->chain.prev.vertex_buf[
(chain->chain.prev.ptr - (i + 1)) & TEXTURESMASK];
chain->prev.vertex_buf[
(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
struct unsigned_vector_list *attrib_map = (struct unsigned_vector_list*)pass->attrib_map;
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
d3d9_set_stream_source(chain->chain.dev, index,
d3d9_set_stream_source(chain->dev, index,
vert_buf, 0, sizeof(struct D3D9Vertex));
unsigned_vector_list_append(chain->chain.bound_vert, index);
unsigned_vector_list_append(chain->bound_vert, index);
}
}
}
static void d3d9_cg_renderchain_bind_pass(
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass, unsigned pass_index)
{
unsigned i;
@ -520,7 +520,7 @@ static void d3d9_cg_renderchain_bind_pass(
char attr_input_size[64] = {0};
char attr_tex_size[64] = {0};
char attr_coord[64] = {0};
struct shader_pass *curr_pass = (struct shader_pass*)&chain->chain.passes->data[i];
struct shader_pass *curr_pass = (struct shader_pass*)&chain->passes->data[i];
snprintf(pass_base, sizeof(pass_base), "PASS%u", i);
snprintf(attr_texture, sizeof(attr_texture), "%s.texture", pass_base);
@ -542,15 +542,15 @@ static void d3d9_cg_renderchain_bind_pass(
if (param)
{
unsigned index = cgGetParameterResourceIndex(param);
unsigned_vector_list_append(chain->chain.bound_tex, index);
unsigned_vector_list_append(chain->bound_tex, index);
d3d9_set_texture(chain->chain.dev, index, curr_pass->tex);
d3d9_set_sampler_magfilter(chain->chain.dev, index,
d3d9_set_texture(chain->dev, index, curr_pass->tex);
d3d9_set_sampler_magfilter(chain->dev, index,
d3d_translate_filter(curr_pass->info.pass->filter));
d3d9_set_sampler_minfilter(chain->chain.dev, index,
d3d9_set_sampler_minfilter(chain->dev, index,
d3d_translate_filter(curr_pass->info.pass->filter));
d3d9_set_sampler_address_u(chain->chain.dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->chain.dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_u(chain->dev, index, D3DTADDRESS_BORDER);
d3d9_set_sampler_address_v(chain->dev, index, D3DTADDRESS_BORDER);
}
param = cgGetNamedParameter(pass->vprg, attr_coord);
@ -560,9 +560,9 @@ static void d3d9_cg_renderchain_bind_pass(
(struct unsigned_vector_list*)pass->attrib_map;
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
d3d9_set_stream_source(chain->chain.dev, index, curr_pass->vertex_buf,
d3d9_set_stream_source(chain->dev, index, curr_pass->vertex_buf,
0, sizeof(struct D3D9Vertex));
unsigned_vector_list_append(chain->chain.bound_vert, index);
unsigned_vector_list_append(chain->bound_vert, index);
}
}
}
@ -965,25 +965,6 @@ static bool d3d9_cg_renderchain_add_lut(void *data,
return d3d9_renderchain_add_lut(chain, id, path, smooth);
}
static void d3d9_cg_renderchain_start_render(cg_renderchain_t *chain)
{
chain->chain.passes->data[0].tex = chain->chain.prev.tex[
chain->chain.prev.ptr];
chain->chain.passes->data[0].vertex_buf = chain->chain.prev.vertex_buf[
chain->chain.prev.ptr];
chain->chain.passes->data[0].last_width = chain->chain.prev.last_width[
chain->chain.prev.ptr];
chain->chain.passes->data[0].last_height = chain->chain.prev.last_height[
chain->chain.prev.ptr];
}
static void d3d9_cg_renderchain_end_render(cg_renderchain_t *chain)
{
chain->chain.prev.last_width[chain->chain.prev.ptr] = chain->chain.passes->data[0].last_width;
chain->chain.prev.last_height[chain->chain.prev.ptr] = chain->chain.passes->data[0].last_height;
chain->chain.prev.ptr = (chain->chain.prev.ptr + 1) & TEXTURESMASK;
}
static void d3d9_cg_renderchain_calc_and_set_shader_mvp(
CGprogram vprg,
unsigned vp_width, unsigned vp_height,
@ -1005,7 +986,7 @@ static void d3d9_cg_renderchain_calc_and_set_shader_mvp(
static void cg_d3d9_renderchain_set_vertices(
const video_frame_info_t *video_info,
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass,
unsigned width, unsigned height,
unsigned out_width, unsigned out_height,
@ -1098,7 +1079,7 @@ static void cg_d3d9_renderchain_set_vertices(
}
static void cg_d3d9_renderchain_set_params(
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass,
state_tracker_t *tracker,
unsigned pass_index)
@ -1111,7 +1092,7 @@ static void cg_d3d9_renderchain_set_params(
if (pass_index == 1)
cnt = state_tracker_get_uniform(tracker, tracker_info,
GFX_MAX_VARIABLES, chain->chain.frame_count);
GFX_MAX_VARIABLES, chain->frame_count);
for (i = 0; i < cnt; i++)
{
@ -1125,7 +1106,7 @@ static void cg_d3d9_renderchain_set_params(
}
static void cg_d3d9_renderchain_render_pass(
cg_renderchain_t *chain,
d3d9_renderchain_t *chain,
struct shader_pass *pass,
state_tracker_t *tracker,
unsigned pass_index)
@ -1135,15 +1116,15 @@ static void cg_d3d9_renderchain_render_pass(
cgD3D9BindProgram(pass->fprg);
cgD3D9BindProgram(pass->vprg);
d3d9_set_texture(chain->chain.dev, 0, pass->tex);
d3d9_set_sampler_minfilter(chain->chain.dev, 0,
d3d9_set_texture(chain->dev, 0, pass->tex);
d3d9_set_sampler_minfilter(chain->dev, 0,
d3d_translate_filter(pass->info.pass->filter));
d3d9_set_sampler_magfilter(chain->chain.dev, 0,
d3d9_set_sampler_magfilter(chain->dev, 0,
d3d_translate_filter(pass->info.pass->filter));
d3d9_set_vertex_declaration(chain->chain.dev, pass->vertex_decl);
d3d9_set_vertex_declaration(chain->dev, pass->vertex_decl);
for (i = 0; i < 4; i++)
d3d9_set_stream_source(chain->chain.dev, i,
d3d9_set_stream_source(chain->dev, i,
pass->vertex_buf, 0,
sizeof(struct D3D9Vertex));
@ -1154,11 +1135,11 @@ static void cg_d3d9_renderchain_render_pass(
d3d9_cg_renderchain_bind_prev(chain, pass);
/* Set lookup textures */
for (i = 0; i < chain->chain.luts->count; i++)
for (i = 0; i < chain->luts->count; i++)
{
CGparameter vparam;
CGparameter fparam = cgGetNamedParameter(
pass->fprg, chain->chain.luts->data[i].id);
pass->fprg, chain->luts->data[i].id);
int bound_index = -1;
if (fparam)
@ -1166,17 +1147,17 @@ static void cg_d3d9_renderchain_render_pass(
unsigned index = cgGetParameterResourceIndex(fparam);
bound_index = index;
d3d9_cg_renderchain_add_lut_internal(&chain->chain, index, i);
d3d9_cg_renderchain_add_lut_internal(chain, index, i);
}
vparam = cgGetNamedParameter(pass->vprg,
chain->chain.luts->data[i].id);
chain->luts->data[i].id);
if (vparam)
{
unsigned index = cgGetParameterResourceIndex(vparam);
if (index != (unsigned)bound_index)
d3d9_cg_renderchain_add_lut_internal(&chain->chain, index, i);
d3d9_cg_renderchain_add_lut_internal(chain, index, i);
}
}
@ -1187,14 +1168,14 @@ static void cg_d3d9_renderchain_render_pass(
if (tracker)
cg_d3d9_renderchain_set_params(chain, pass, tracker, pass_index);
d3d9_draw_primitive(chain->chain.dev, D3DPT_TRIANGLESTRIP, 0, 2);
d3d9_draw_primitive(chain->dev, D3DPT_TRIANGLESTRIP, 0, 2);
/* So we don't render with linear filter into render targets,
* which apparently looked odd (too blurry). */
d3d9_set_sampler_minfilter(chain->chain.dev, 0, D3DTEXF_POINT);
d3d9_set_sampler_magfilter(chain->chain.dev, 0, D3DTEXF_POINT);
d3d9_set_sampler_minfilter(chain->dev, 0, D3DTEXF_POINT);
d3d9_set_sampler_magfilter(chain->dev, 0, D3DTEXF_POINT);
d3d9_renderchain_unbind_all(&chain->chain);
d3d9_renderchain_unbind_all(chain);
}
static bool d3d9_cg_renderchain_render(
@ -1212,7 +1193,7 @@ static bool d3d9_cg_renderchain_render(
cg_renderchain_t *chain = d3d ?
(cg_renderchain_t*)d3d->renderchain_data : NULL;
d3d9_cg_renderchain_start_render(chain);
d3d9_renderchain_start_render(&chain->chain);
current_width = width;
current_height = height;
@ -1268,12 +1249,13 @@ static bool d3d9_cg_renderchain_render(
d3d9_set_viewports(chain->chain.dev, &viewport);
cg_d3d9_renderchain_set_vertices(video_info,
chain, from_pass,
&chain->chain, from_pass,
current_width, current_height,
out_width, out_height,
out_width, out_height, 0);
cg_d3d9_renderchain_render_pass(chain, from_pass, tracker,
cg_d3d9_renderchain_render_pass(&chain->chain,
from_pass, tracker,
i + 1);
current_width = out_width;
@ -1294,14 +1276,15 @@ static bool d3d9_cg_renderchain_render(
d3d9_set_viewports(chain->chain.dev, chain->chain.final_viewport);
cg_d3d9_renderchain_set_vertices(video_info,
chain, last_pass,
&chain->chain, last_pass,
current_width, current_height,
out_width, out_height,
chain->chain.final_viewport->Width,
chain->chain.final_viewport->Height,
rotation);
cg_d3d9_renderchain_render_pass(chain, last_pass,
cg_d3d9_renderchain_render_pass(&chain->chain,
last_pass,
tracker,
chain->chain.passes->count);
@ -1309,7 +1292,7 @@ static bool d3d9_cg_renderchain_render(
d3d9_surface_free(back_buffer);
d3d9_cg_renderchain_end_render(chain);
d3d9_renderchain_end_render(&chain->chain);
cgD3D9BindProgram(chain->fStock);
cgD3D9BindProgram(chain->vStock);
d3d9_cg_renderchain_calc_and_set_shader_mvp(

View File

@ -1029,21 +1029,6 @@ static void hlsl_d3d9_renderchain_render_pass(
d3d9_renderchain_unbind_all(&chain->chain);
}
static void d3d9_hlsl_renderchain_start_render(hlsl_d3d9_renderchain_t *chain)
{
chain->chain.passes->data[0].tex = chain->chain.prev.tex[chain->chain.prev.ptr];
chain->chain.passes->data[0].vertex_buf = chain->chain.prev.vertex_buf[chain->chain.prev.ptr];
chain->chain.passes->data[0].last_width = chain->chain.prev.last_width[chain->chain.prev.ptr];
chain->chain.passes->data[0].last_height = chain->chain.prev.last_height[chain->chain.prev.ptr];
}
static void d3d9_hlsl_renderchain_end_render(hlsl_d3d9_renderchain_t *chain)
{
chain->chain.prev.last_width[chain->chain.prev.ptr] = chain->chain.passes->data[0].last_width;
chain->chain.prev.last_height[chain->chain.prev.ptr] = chain->chain.passes->data[0].last_height;
chain->chain.prev.ptr = (chain->chain.prev.ptr + 1) & TEXTURESMASK;
}
static bool hlsl_d3d9_renderchain_render(
d3d9_video_t *d3d,
const video_frame_info_t *video_info,
@ -1060,7 +1045,7 @@ static bool hlsl_d3d9_renderchain_render(
hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)
d3d->renderchain_data;
d3d9_hlsl_renderchain_start_render(chain);
d3d9_renderchain_start_render(&chain->chain);
current_width = width;
current_height = height;
@ -1162,7 +1147,7 @@ static bool hlsl_d3d9_renderchain_render(
d3d9_surface_free(back_buffer);
d3d9_hlsl_renderchain_end_render(chain);
d3d9_renderchain_end_render(&chain->chain);
#if 0
cgD3D9BindProgram(chain->fStock);
cgD3D9BindProgram(chain->vStock);

View File

@ -154,6 +154,25 @@ static INLINE void d3d9_cg_renderchain_add_lut_internal(
unsigned_vector_list_append(chain->bound_tex, index);
}
static INLINE void d3d9_renderchain_start_render(d3d9_renderchain_t *chain)
{
chain->passes->data[0].tex = chain->prev.tex[
chain->prev.ptr];
chain->passes->data[0].vertex_buf = chain->prev.vertex_buf[
chain->prev.ptr];
chain->passes->data[0].last_width = chain->prev.last_width[
chain->prev.ptr];
chain->passes->data[0].last_height = chain->prev.last_height[
chain->prev.ptr];
}
static INLINE void d3d9_renderchain_end_render(d3d9_renderchain_t *chain)
{
chain->prev.last_width[chain->prev.ptr] = chain->passes->data[0].last_width;
chain->prev.last_height[chain->prev.ptr] = chain->passes->data[0].last_height;
chain->prev.ptr = (chain->prev.ptr + 1) & TEXTURESMASK;
}
static INLINE void d3d9_renderchain_unbind_all(d3d9_renderchain_t *chain)
{
unsigned i;