mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
(d3d9_cg_renderchain.c) Reuse same struct
This commit is contained in:
parent
45f409b022
commit
30b6366158
@ -68,24 +68,9 @@ struct CGVertex
|
||||
|
||||
typedef struct cg_renderchain
|
||||
{
|
||||
unsigned pixel_size;
|
||||
uint64_t frame_count;
|
||||
struct
|
||||
{
|
||||
LPDIRECT3DTEXTURE9 tex[TEXTURES];
|
||||
LPDIRECT3DVERTEXBUFFER9 vertex_buf[TEXTURES];
|
||||
unsigned ptr;
|
||||
unsigned last_width[TEXTURES];
|
||||
unsigned last_height[TEXTURES];
|
||||
} prev;
|
||||
struct d3d9_renderchain chain;
|
||||
CGprogram vStock;
|
||||
CGprogram fStock;
|
||||
LPDIRECT3DDEVICE9 dev;
|
||||
D3DVIEWPORT9 *final_viewport;
|
||||
struct shader_pass_vector_list *passes;
|
||||
struct unsigned_vector_list *bound_tex;
|
||||
struct unsigned_vector_list *bound_vert;
|
||||
struct lut_info_vector_list *luts;
|
||||
CGcontext cgCtx;
|
||||
} cg_renderchain_t;
|
||||
|
||||
@ -160,6 +145,7 @@ static bool d3d9_cg_load_program(void *data,
|
||||
const char **fragment_opts = cgD3D9GetOptimalOptions(fragment_profile);
|
||||
const char **vertex_opts = cgD3D9GetOptimalOptions(vertex_profile);
|
||||
cg_renderchain_t *chain = (cg_renderchain_t*)data;
|
||||
CGcontext cgCtx = chain->cgCtx;
|
||||
|
||||
if (
|
||||
fragment_profile == CG_PROFILE_UNKNOWN ||
|
||||
@ -173,24 +159,24 @@ static bool d3d9_cg_load_program(void *data,
|
||||
RARCH_LOG("[D3D9 Cg]: Fragment profile: %s\n", cgGetProfileString(fragment_profile));
|
||||
|
||||
if (path_is_file && !string_is_empty(prog))
|
||||
*fprg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
|
||||
*fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE,
|
||||
prog, fragment_profile, "main_fragment", fragment_opts);
|
||||
else
|
||||
*fprg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_cg_d3d9_program,
|
||||
*fprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_d3d9_program,
|
||||
fragment_profile, "main_fragment", fragment_opts);
|
||||
|
||||
list = cgGetLastListing(chain->cgCtx);
|
||||
list = cgGetLastListing(cgCtx);
|
||||
if (list)
|
||||
listing_f = strdup(list);
|
||||
|
||||
if (path_is_file && !string_is_empty(prog))
|
||||
*vprg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
|
||||
*vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE,
|
||||
prog, vertex_profile, "main_vertex", vertex_opts);
|
||||
else
|
||||
*vprg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_cg_d3d9_program,
|
||||
*vprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_d3d9_program,
|
||||
vertex_profile, "main_vertex", vertex_opts);
|
||||
|
||||
list = cgGetLastListing(chain->cgCtx);
|
||||
list = cgGetLastListing(cgCtx);
|
||||
if (list)
|
||||
listing_v = strdup(list);
|
||||
|
||||
@ -243,10 +229,11 @@ 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->frame_count;
|
||||
frame_cnt = chain->chain.frame_count;
|
||||
|
||||
if (pass->info.pass->frame_count_mod)
|
||||
frame_cnt = chain->frame_count % pass->info.pass->frame_count_mod;
|
||||
frame_cnt = chain->chain.frame_count
|
||||
% pass->info.pass->frame_count_mod;
|
||||
|
||||
set_cg_param(pass->fprg, "IN.frame_count", &frame_cnt);
|
||||
set_cg_param(pass->vprg, "IN.frame_count", &frame_cnt);
|
||||
@ -397,7 +384,7 @@ static bool d3d9_cg_renderchain_init_shader_fvf(
|
||||
|
||||
free(indices);
|
||||
|
||||
return d3d9_vertex_declaration_new(chain->dev,
|
||||
return d3d9_vertex_declaration_new(chain->chain.dev,
|
||||
decl, (void**)&pass->vertex_decl);
|
||||
}
|
||||
|
||||
@ -408,7 +395,7 @@ static void d3d9_cg_renderchain_bind_orig(
|
||||
CGparameter param;
|
||||
float video_size[2];
|
||||
float texture_size[2];
|
||||
struct shader_pass *first_pass = (struct shader_pass*)&chain->passes->data[0];
|
||||
struct shader_pass *first_pass = (struct shader_pass*)&chain->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;
|
||||
@ -424,14 +411,14 @@ static void d3d9_cg_renderchain_bind_orig(
|
||||
if (param)
|
||||
{
|
||||
unsigned index = cgGetParameterResourceIndex(param);
|
||||
d3d9_set_texture(chain->dev, index, first_pass->tex);
|
||||
d3d9_set_sampler_magfilter(chain->dev, index,
|
||||
d3d9_set_texture(chain->chain.dev, index, first_pass->tex);
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(first_pass->info.pass->filter));
|
||||
d3d9_set_sampler_minfilter(chain->dev, index,
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(first_pass->info.pass->filter));
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
param = cgGetNamedParameter(pass->vprg, "ORIG.tex_coord");
|
||||
@ -442,9 +429,9 @@ static void d3d9_cg_renderchain_bind_orig(
|
||||
pass->attrib_map;
|
||||
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||
|
||||
d3d9_set_stream_source(chain->dev, index,
|
||||
d3d9_set_stream_source(chain->chain.dev, index,
|
||||
vert_buf, 0, sizeof(struct CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
unsigned_vector_list_append(chain->chain.bound_vert, index);
|
||||
}
|
||||
}
|
||||
|
||||
@ -467,8 +454,8 @@ static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
|
||||
"PREV6",
|
||||
};
|
||||
|
||||
texture_size[0] = chain->passes->data[0].info.tex_w;
|
||||
texture_size[1] = chain->passes->data[0].info.tex_h;
|
||||
texture_size[0] = chain->chain.passes->data[0].info.tex_w;
|
||||
texture_size[1] = chain->chain.passes->data[0].info.tex_h;
|
||||
|
||||
for (i = 0; i < TEXTURES - 1; i++)
|
||||
{
|
||||
@ -480,8 +467,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->prev.last_width[(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
|
||||
video_size[1] = chain->prev.last_height[(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
|
||||
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];
|
||||
|
||||
set_cg_param(pass->vprg, attr_input_size, &video_size);
|
||||
set_cg_param(pass->fprg, attr_input_size, &video_size);
|
||||
@ -495,30 +484,32 @@ static void d3d9_cg_renderchain_bind_prev(cg_renderchain_t *chain,
|
||||
unsigned index = cgGetParameterResourceIndex(param);
|
||||
|
||||
tex = (LPDIRECT3DTEXTURE9)
|
||||
chain->prev.tex[(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
|
||||
chain->chain.prev.tex[
|
||||
(chain->chain.prev.ptr - (i + 1)) & TEXTURESMASK];
|
||||
|
||||
d3d9_set_texture(chain->dev, index, tex);
|
||||
unsigned_vector_list_append(chain->bound_tex, index);
|
||||
d3d9_set_texture(chain->chain.dev, index, tex);
|
||||
unsigned_vector_list_append(chain->chain.bound_tex, index);
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
param = cgGetNamedParameter(pass->vprg, attr_coord);
|
||||
if (param)
|
||||
{
|
||||
LPDIRECT3DVERTEXBUFFER9 vert_buf = (LPDIRECT3DVERTEXBUFFER9)
|
||||
chain->prev.vertex_buf[(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
|
||||
chain->chain.prev.vertex_buf[
|
||||
(chain->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->dev, index,
|
||||
d3d9_set_stream_source(chain->chain.dev, index,
|
||||
vert_buf, 0, sizeof(struct CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
unsigned_vector_list_append(chain->chain.bound_vert, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -527,14 +518,14 @@ static void d3d9_cg_renderchain_add_lut_internal(
|
||||
cg_renderchain_t *chain,
|
||||
unsigned index, unsigned i)
|
||||
{
|
||||
d3d9_set_texture(chain->dev, index, chain->luts->data[i].tex);
|
||||
d3d9_set_sampler_magfilter(chain->dev, index,
|
||||
d3d_translate_filter(chain->luts->data[i].smooth ? RARCH_FILTER_LINEAR : RARCH_FILTER_NEAREST));
|
||||
d3d9_set_sampler_minfilter(chain->dev, index,
|
||||
d3d_translate_filter(chain->luts->data[i].smooth ? RARCH_FILTER_LINEAR : RARCH_FILTER_NEAREST));
|
||||
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);
|
||||
d3d9_set_texture(chain->chain.dev, index, chain->chain.luts->data[i].tex);
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(chain->chain.luts->data[i].smooth ? RARCH_FILTER_LINEAR : RARCH_FILTER_NEAREST));
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(chain->chain.luts->data[i].smooth ? RARCH_FILTER_LINEAR : RARCH_FILTER_NEAREST));
|
||||
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);
|
||||
}
|
||||
|
||||
static void d3d9_cg_renderchain_bind_pass(
|
||||
@ -553,7 +544,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->passes->data[i];
|
||||
struct shader_pass *curr_pass = (struct shader_pass*)&chain->chain.passes->data[i];
|
||||
|
||||
snprintf(pass_base, sizeof(pass_base), "PASS%u", i);
|
||||
snprintf(attr_texture, sizeof(attr_texture), "%s.texture", pass_base);
|
||||
@ -575,15 +566,15 @@ static void d3d9_cg_renderchain_bind_pass(
|
||||
if (param)
|
||||
{
|
||||
unsigned index = cgGetParameterResourceIndex(param);
|
||||
unsigned_vector_list_append(chain->bound_tex, index);
|
||||
unsigned_vector_list_append(chain->chain.bound_tex, index);
|
||||
|
||||
d3d9_set_texture(chain->dev, index, curr_pass->tex);
|
||||
d3d9_set_sampler_magfilter(chain->dev, index,
|
||||
d3d9_set_texture(chain->chain.dev, index, curr_pass->tex);
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(curr_pass->info.pass->filter));
|
||||
d3d9_set_sampler_minfilter(chain->dev, index,
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev, index,
|
||||
d3d_translate_filter(curr_pass->info.pass->filter));
|
||||
d3d9_set_sampler_address_u(chain->dev, index, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->dev, index, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_u(chain->chain.dev, index, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->chain.dev, index, D3DTADDRESS_BORDER);
|
||||
}
|
||||
|
||||
param = cgGetNamedParameter(pass->vprg, attr_coord);
|
||||
@ -593,9 +584,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->dev, index, curr_pass->vertex_buf,
|
||||
d3d9_set_stream_source(chain->chain.dev, index, curr_pass->vertex_buf,
|
||||
0, sizeof(struct CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
unsigned_vector_list_append(chain->chain.bound_vert, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -606,23 +597,23 @@ static void d3d9_cg_deinit_progs(cg_renderchain_t *chain)
|
||||
|
||||
RARCH_LOG("[D3D9 Cg]: Destroying programs.\n");
|
||||
|
||||
if (chain->passes->count >= 1)
|
||||
if (chain->chain.passes->count >= 1)
|
||||
{
|
||||
d3d9_vertex_buffer_free(NULL, chain->passes->data[0].vertex_decl);
|
||||
d3d9_vertex_buffer_free(NULL, chain->chain.passes->data[0].vertex_decl);
|
||||
|
||||
for (i = 1; i < chain->passes->count; i++)
|
||||
for (i = 1; i < chain->chain.passes->count; i++)
|
||||
{
|
||||
if (chain->passes->data[i].tex)
|
||||
d3d9_texture_free(chain->passes->data[i].tex);
|
||||
chain->passes->data[i].tex = NULL;
|
||||
if (chain->chain.passes->data[i].tex)
|
||||
d3d9_texture_free(chain->chain.passes->data[i].tex);
|
||||
chain->chain.passes->data[i].tex = NULL;
|
||||
d3d9_vertex_buffer_free(
|
||||
chain->passes->data[i].vertex_buf,
|
||||
chain->passes->data[i].vertex_decl);
|
||||
chain->chain.passes->data[i].vertex_buf,
|
||||
chain->chain.passes->data[i].vertex_decl);
|
||||
|
||||
if (chain->passes->data[i].fprg)
|
||||
cgDestroyProgram(chain->passes->data[i].fprg);
|
||||
if (chain->passes->data[i].vprg)
|
||||
cgDestroyProgram(chain->passes->data[i].vprg);
|
||||
if (chain->chain.passes->data[i].fprg)
|
||||
cgDestroyProgram(chain->chain.passes->data[i].fprg);
|
||||
if (chain->chain.passes->data[i].vprg)
|
||||
cgDestroyProgram(chain->chain.passes->data[i].vprg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -638,18 +629,18 @@ static void d3d9_cg_destroy_resources(cg_renderchain_t *chain)
|
||||
|
||||
for (i = 0; i < TEXTURES; i++)
|
||||
{
|
||||
if (chain->prev.tex[i])
|
||||
d3d9_texture_free(chain->prev.tex[i]);
|
||||
if (chain->prev.vertex_buf[i])
|
||||
d3d9_vertex_buffer_free(chain->prev.vertex_buf[i], NULL);
|
||||
if (chain->chain.prev.tex[i])
|
||||
d3d9_texture_free(chain->chain.prev.tex[i]);
|
||||
if (chain->chain.prev.vertex_buf[i])
|
||||
d3d9_vertex_buffer_free(chain->chain.prev.vertex_buf[i], NULL);
|
||||
}
|
||||
|
||||
d3d9_cg_deinit_progs(chain);
|
||||
|
||||
for (i = 0; i < chain->luts->count; i++)
|
||||
for (i = 0; i < chain->chain.luts->count; i++)
|
||||
{
|
||||
if (chain->luts->data[i].tex)
|
||||
d3d9_texture_free(chain->luts->data[i].tex);
|
||||
if (chain->chain.luts->data[i].tex)
|
||||
d3d9_texture_free(chain->chain.luts->data[i].tex);
|
||||
}
|
||||
|
||||
cgD3D9UnloadAllPrograms();
|
||||
@ -678,28 +669,28 @@ void d3d9_cg_renderchain_free(void *data)
|
||||
|
||||
d3d9_cg_destroy_resources(chain);
|
||||
|
||||
if (chain->passes)
|
||||
if (chain->chain.passes)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < chain->passes->count; i++)
|
||||
for (i = 0; i < chain->chain.passes->count; i++)
|
||||
{
|
||||
if (chain->passes->data[i].attrib_map)
|
||||
free(chain->passes->data[i].attrib_map);
|
||||
if (chain->chain.passes->data[i].attrib_map)
|
||||
free(chain->chain.passes->data[i].attrib_map);
|
||||
}
|
||||
|
||||
shader_pass_vector_list_free(chain->passes);
|
||||
shader_pass_vector_list_free(chain->chain.passes);
|
||||
|
||||
chain->passes = NULL;
|
||||
chain->chain.passes = NULL;
|
||||
}
|
||||
|
||||
lut_info_vector_list_free(chain->luts);
|
||||
unsigned_vector_list_free(chain->bound_tex);
|
||||
unsigned_vector_list_free(chain->bound_vert);
|
||||
lut_info_vector_list_free(chain->chain.luts);
|
||||
unsigned_vector_list_free(chain->chain.bound_tex);
|
||||
unsigned_vector_list_free(chain->chain.bound_vert);
|
||||
|
||||
chain->luts = NULL;
|
||||
chain->bound_tex = NULL;
|
||||
chain->bound_vert = NULL;
|
||||
chain->chain.luts = NULL;
|
||||
chain->chain.bound_tex = NULL;
|
||||
chain->chain.bound_vert = NULL;
|
||||
|
||||
d3d9_cg_deinit_context_state(chain);
|
||||
|
||||
@ -712,10 +703,10 @@ static void *d3d9_cg_renderchain_new(void)
|
||||
if (!renderchain)
|
||||
return NULL;
|
||||
|
||||
renderchain->passes = shader_pass_vector_list_new();
|
||||
renderchain->luts = lut_info_vector_list_new();
|
||||
renderchain->bound_tex = unsigned_vector_list_new();
|
||||
renderchain->bound_vert = unsigned_vector_list_new();
|
||||
renderchain->chain.passes = shader_pass_vector_list_new();
|
||||
renderchain->chain.luts = lut_info_vector_list_new();
|
||||
renderchain->chain.bound_tex = unsigned_vector_list_new();
|
||||
renderchain->chain.bound_vert = unsigned_vector_list_new();
|
||||
|
||||
return renderchain;
|
||||
}
|
||||
@ -731,10 +722,10 @@ static bool d3d9_cg_renderchain_init_shader(d3d9_video_t *d3d,
|
||||
return false;
|
||||
}
|
||||
|
||||
renderchain->cgCtx = cgCtx;
|
||||
|
||||
if (FAILED(cgD3D9SetDevice((IDirect3DDevice9*)d3d->dev)))
|
||||
return false;
|
||||
|
||||
renderchain->cgCtx = cgCtx;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -760,36 +751,36 @@ static bool d3d9_cg_renderchain_create_first_pass(
|
||||
pass.attrib_map = (struct unsigned_vector_list*)
|
||||
unsigned_vector_list_new();
|
||||
|
||||
chain->prev.ptr = 0;
|
||||
chain->chain.prev.ptr = 0;
|
||||
|
||||
for (i = 0; i < TEXTURES; i++)
|
||||
{
|
||||
chain->prev.last_width[i] = 0;
|
||||
chain->prev.last_height[i] = 0;
|
||||
chain->prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9)
|
||||
chain->chain.prev.last_width[i] = 0;
|
||||
chain->chain.prev.last_height[i] = 0;
|
||||
chain->chain.prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9)
|
||||
d3d9_vertex_buffer_new(
|
||||
chain->dev, 4 * sizeof(struct CGVertex),
|
||||
chain->chain.dev, 4 * sizeof(struct CGVertex),
|
||||
D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL);
|
||||
|
||||
if (!chain->prev.vertex_buf[i])
|
||||
if (!chain->chain.prev.vertex_buf[i])
|
||||
return false;
|
||||
|
||||
chain->prev.tex[i] = (LPDIRECT3DTEXTURE9)
|
||||
d3d9_texture_new(chain->dev, NULL,
|
||||
chain->chain.prev.tex[i] = (LPDIRECT3DTEXTURE9)
|
||||
d3d9_texture_new(chain->chain.dev, NULL,
|
||||
info->tex_w, info->tex_h, 1, 0, fmt,
|
||||
D3DPOOL_MANAGED, 0, 0, 0, NULL, NULL, false);
|
||||
|
||||
if (!chain->prev.tex[i])
|
||||
if (!chain->chain.prev.tex[i])
|
||||
return false;
|
||||
|
||||
d3d9_set_texture(chain->dev, 0, chain->prev.tex[i]);
|
||||
d3d9_set_texture(chain->chain.dev, 0, chain->chain.prev.tex[i]);
|
||||
d3d9_set_sampler_minfilter(dev, 0,
|
||||
d3d_translate_filter(info->pass->filter));
|
||||
d3d9_set_sampler_magfilter(dev, 0,
|
||||
d3d_translate_filter(info->pass->filter));
|
||||
d3d9_set_sampler_address_u(dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_texture(chain->dev, 0, NULL);
|
||||
d3d9_set_texture(chain->chain.dev, 0, NULL);
|
||||
}
|
||||
|
||||
d3d9_cg_load_program(chain, &pass.fprg,
|
||||
@ -797,7 +788,7 @@ static bool d3d9_cg_renderchain_create_first_pass(
|
||||
|
||||
if (!d3d9_cg_renderchain_init_shader_fvf(chain, &pass))
|
||||
return false;
|
||||
shader_pass_vector_list_append(chain->passes, pass);
|
||||
shader_pass_vector_list_append(chain->chain.passes, pass);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -820,10 +811,10 @@ static bool d3d9_cg_renderchain_init(
|
||||
return false;
|
||||
}
|
||||
|
||||
chain->dev = dev;
|
||||
chain->final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
chain->frame_count = 0;
|
||||
chain->pixel_size = (fmt == RETRO_PIXEL_FORMAT_RGB565) ? 2 : 4;
|
||||
chain->chain.dev = dev;
|
||||
chain->chain.final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
chain->chain.frame_count = 0;
|
||||
chain->chain.pixel_size = (fmt == RETRO_PIXEL_FORMAT_RGB565) ? 2 : 4;
|
||||
|
||||
if (!d3d9_cg_renderchain_create_first_pass(dev, chain, info, fmt))
|
||||
return false;
|
||||
@ -890,8 +881,9 @@ static void d3d9_cg_recompute_pass_sizes(
|
||||
|
||||
|
||||
if (!d3d9_cg_set_pass_size(dev,
|
||||
(struct shader_pass*)&chain->passes->data[0],
|
||||
(struct shader_pass*)&chain->passes->data[chain->passes->count - 1],
|
||||
(struct shader_pass*)&chain->chain.passes->data[0],
|
||||
(struct shader_pass*)&chain->chain.passes->data[
|
||||
chain->chain.passes->count - 1],
|
||||
current_width, current_height))
|
||||
{
|
||||
RARCH_ERR("[D3D9 Cg]: Failed to set pass size.\n");
|
||||
@ -909,8 +901,9 @@ static void d3d9_cg_recompute_pass_sizes(
|
||||
link_info.tex_h = next_pow2(out_height);
|
||||
|
||||
if (!d3d9_cg_set_pass_size(dev,
|
||||
(struct shader_pass*)&chain->passes->data[i],
|
||||
(struct shader_pass*)&chain->passes->data[chain->passes->count - 1],
|
||||
(struct shader_pass*)&chain->chain.passes->data[i],
|
||||
(struct shader_pass*)&chain->chain.passes->data[
|
||||
chain->chain.passes->count - 1],
|
||||
link_info.tex_w, link_info.tex_h))
|
||||
{
|
||||
RARCH_ERR("[D3D9 Cg]: Failed to set pass size.\n");
|
||||
@ -932,9 +925,9 @@ static void d3d9_cg_renderchain_set_final_viewport(
|
||||
cg_renderchain_t *chain = (cg_renderchain_t*)renderchain_data;
|
||||
|
||||
if (chain && final_viewport)
|
||||
chain->final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
chain->chain.final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
|
||||
d3d9_cg_recompute_pass_sizes(chain->dev, chain, d3d);
|
||||
d3d9_cg_recompute_pass_sizes(chain->chain.dev, chain, d3d);
|
||||
}
|
||||
|
||||
static bool d3d9_cg_renderchain_add_pass(
|
||||
@ -958,7 +951,7 @@ static bool d3d9_cg_renderchain_add_pass(
|
||||
return false;
|
||||
|
||||
pass.vertex_buf = (LPDIRECT3DVERTEXBUFFER9)
|
||||
d3d9_vertex_buffer_new(chain->dev,
|
||||
d3d9_vertex_buffer_new(chain->chain.dev,
|
||||
4 * sizeof(struct CGVertex),
|
||||
D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL);
|
||||
|
||||
@ -966,25 +959,26 @@ static bool d3d9_cg_renderchain_add_pass(
|
||||
return false;
|
||||
|
||||
pass.tex = (LPDIRECT3DTEXTURE9)d3d9_texture_new(
|
||||
chain->dev,
|
||||
chain->chain.dev,
|
||||
NULL,
|
||||
info->tex_w,
|
||||
info->tex_h,
|
||||
1,
|
||||
D3DUSAGE_RENDERTARGET,
|
||||
chain->passes->data[chain->passes->count - 1].info.pass->fbo.fp_fbo
|
||||
chain->chain.passes->data[
|
||||
chain->chain.passes->count - 1].info.pass->fbo.fp_fbo
|
||||
? D3DFMT_A32B32G32R32F : d3d9_get_argb8888_format(),
|
||||
D3DPOOL_DEFAULT, 0, 0, 0, NULL, NULL, false);
|
||||
|
||||
if (!pass.tex)
|
||||
return false;
|
||||
|
||||
d3d9_set_texture(chain->dev, 0, pass.tex);
|
||||
d3d9_set_sampler_address_u(chain->dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_texture(chain->dev, 0, NULL);
|
||||
d3d9_set_texture(chain->chain.dev, 0, pass.tex);
|
||||
d3d9_set_sampler_address_u(chain->chain.dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->chain.dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_texture(chain->chain.dev, 0, NULL);
|
||||
|
||||
shader_pass_vector_list_append(chain->passes, pass);
|
||||
shader_pass_vector_list_append(chain->chain.passes, pass);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -996,7 +990,7 @@ static bool d3d9_cg_renderchain_add_lut(void *data,
|
||||
cg_renderchain_t *chain = (cg_renderchain_t*)data;
|
||||
LPDIRECT3DTEXTURE9 lut = (LPDIRECT3DTEXTURE9)
|
||||
d3d9_texture_new(
|
||||
chain->dev,
|
||||
chain->chain.dev,
|
||||
path,
|
||||
D3D_DEFAULT_NONPOW2,
|
||||
D3D_DEFAULT_NONPOW2,
|
||||
@ -1020,29 +1014,33 @@ static bool d3d9_cg_renderchain_add_lut(void *data,
|
||||
if (!lut)
|
||||
return false;
|
||||
|
||||
d3d9_set_texture(chain->dev, 0, lut);
|
||||
d3d9_set_sampler_address_u(chain->dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_texture(chain->dev, 0, NULL);
|
||||
d3d9_set_texture(chain->chain.dev, 0, lut);
|
||||
d3d9_set_sampler_address_u(chain->chain.dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_sampler_address_v(chain->chain.dev, 0, D3DTADDRESS_BORDER);
|
||||
d3d9_set_texture(chain->chain.dev, 0, NULL);
|
||||
|
||||
lut_info_vector_list_append(chain->luts, info);
|
||||
lut_info_vector_list_append(chain->chain.luts, info);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void d3d9_cg_renderchain_start_render(cg_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];
|
||||
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->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;
|
||||
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(
|
||||
@ -1165,28 +1163,30 @@ static void cg_d3d9_renderchain_unbind_all(cg_renderchain_t *chain)
|
||||
/* Have to be a bit anal about it.
|
||||
* Render targets hate it when they have filters apparently.
|
||||
*/
|
||||
for (i = 0; i < chain->bound_tex->count; i++)
|
||||
for (i = 0; i < chain->chain.bound_tex->count; i++)
|
||||
{
|
||||
d3d9_set_sampler_minfilter(chain->dev,
|
||||
chain->bound_tex->data[i], D3DTEXF_POINT);
|
||||
d3d9_set_sampler_magfilter(chain->dev,
|
||||
chain->bound_tex->data[i], D3DTEXF_POINT);
|
||||
d3d9_set_texture(chain->dev, chain->bound_tex->data[i], NULL);
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev,
|
||||
chain->chain.bound_tex->data[i], D3DTEXF_POINT);
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev,
|
||||
chain->chain.bound_tex->data[i], D3DTEXF_POINT);
|
||||
d3d9_set_texture(chain->chain.dev,
|
||||
chain->chain.bound_tex->data[i], NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < chain->bound_vert->count; i++)
|
||||
d3d9_set_stream_source(chain->dev, chain->bound_vert->data[i], 0, 0, 0);
|
||||
for (i = 0; i < chain->chain.bound_vert->count; i++)
|
||||
d3d9_set_stream_source(chain->chain.dev,
|
||||
chain->chain.bound_vert->data[i], 0, 0, 0);
|
||||
|
||||
if (chain->bound_tex)
|
||||
if (chain->chain.bound_tex)
|
||||
{
|
||||
unsigned_vector_list_free(chain->bound_tex);
|
||||
chain->bound_tex = unsigned_vector_list_new();
|
||||
unsigned_vector_list_free(chain->chain.bound_tex);
|
||||
chain->chain.bound_tex = unsigned_vector_list_new();
|
||||
}
|
||||
|
||||
if (chain->bound_vert)
|
||||
if (chain->chain.bound_vert)
|
||||
{
|
||||
unsigned_vector_list_free(chain->bound_vert);
|
||||
chain->bound_vert = unsigned_vector_list_new();
|
||||
unsigned_vector_list_free(chain->chain.bound_vert);
|
||||
chain->chain.bound_vert = unsigned_vector_list_new();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1204,7 +1204,7 @@ static void cg_d3d9_renderchain_set_params(
|
||||
|
||||
if (pass_index == 1)
|
||||
cnt = state_tracker_get_uniform(tracker, tracker_info,
|
||||
GFX_MAX_VARIABLES, chain->frame_count);
|
||||
GFX_MAX_VARIABLES, chain->chain.frame_count);
|
||||
|
||||
for (i = 0; i < cnt; i++)
|
||||
{
|
||||
@ -1228,15 +1228,15 @@ static void cg_d3d9_renderchain_render_pass(
|
||||
cgD3D9BindProgram(pass->fprg);
|
||||
cgD3D9BindProgram(pass->vprg);
|
||||
|
||||
d3d9_set_texture(chain->dev, 0, pass->tex);
|
||||
d3d9_set_sampler_minfilter(chain->dev, 0,
|
||||
d3d9_set_texture(chain->chain.dev, 0, pass->tex);
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev, 0,
|
||||
d3d_translate_filter(pass->info.pass->filter));
|
||||
d3d9_set_sampler_magfilter(chain->dev, 0,
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev, 0,
|
||||
d3d_translate_filter(pass->info.pass->filter));
|
||||
|
||||
d3d9_set_vertex_declaration(chain->dev, pass->vertex_decl);
|
||||
d3d9_set_vertex_declaration(chain->chain.dev, pass->vertex_decl);
|
||||
for (i = 0; i < 4; i++)
|
||||
d3d9_set_stream_source(chain->dev, i,
|
||||
d3d9_set_stream_source(chain->chain.dev, i,
|
||||
pass->vertex_buf, 0,
|
||||
sizeof(struct CGVertex));
|
||||
|
||||
@ -1247,11 +1247,11 @@ static void cg_d3d9_renderchain_render_pass(
|
||||
d3d9_cg_renderchain_bind_prev(chain, pass);
|
||||
|
||||
/* Set lookup textures */
|
||||
for (i = 0; i < chain->luts->count; i++)
|
||||
for (i = 0; i < chain->chain.luts->count; i++)
|
||||
{
|
||||
CGparameter vparam;
|
||||
CGparameter fparam = cgGetNamedParameter(
|
||||
pass->fprg, chain->luts->data[i].id);
|
||||
pass->fprg, chain->chain.luts->data[i].id);
|
||||
int bound_index = -1;
|
||||
|
||||
if (fparam)
|
||||
@ -1262,7 +1262,8 @@ static void cg_d3d9_renderchain_render_pass(
|
||||
d3d9_cg_renderchain_add_lut_internal(chain, index, i);
|
||||
}
|
||||
|
||||
vparam = cgGetNamedParameter(pass->vprg, chain->luts->data[i].id);
|
||||
vparam = cgGetNamedParameter(pass->vprg,
|
||||
chain->chain.luts->data[i].id);
|
||||
|
||||
if (vparam)
|
||||
{
|
||||
@ -1279,12 +1280,12 @@ static void cg_d3d9_renderchain_render_pass(
|
||||
if (tracker)
|
||||
cg_d3d9_renderchain_set_params(chain, pass, tracker, pass_index);
|
||||
|
||||
d3d9_draw_primitive(chain->dev, D3DPT_TRIANGLESTRIP, 0, 2);
|
||||
d3d9_draw_primitive(chain->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->dev, 0, D3DTEXF_POINT);
|
||||
d3d9_set_sampler_magfilter(chain->dev, 0, D3DTEXF_POINT);
|
||||
d3d9_set_sampler_minfilter(chain->chain.dev, 0, D3DTEXF_POINT);
|
||||
d3d9_set_sampler_magfilter(chain->chain.dev, 0, D3DTEXF_POINT);
|
||||
|
||||
cg_d3d9_renderchain_unbind_all(chain);
|
||||
}
|
||||
@ -1309,12 +1310,13 @@ static bool d3d9_cg_renderchain_render(
|
||||
current_width = width;
|
||||
current_height = height;
|
||||
|
||||
first_pass = (struct shader_pass*)&chain->passes->data[0];
|
||||
first_pass = (struct shader_pass*)
|
||||
&chain->chain.passes->data[0];
|
||||
|
||||
d3d9_convert_geometry(
|
||||
&first_pass->info,
|
||||
&out_width, &out_height,
|
||||
current_width, current_height, chain->final_viewport);
|
||||
current_width, current_height, chain->chain.final_viewport);
|
||||
|
||||
d3d9_renderchain_blit_to_texture(first_pass->tex,
|
||||
frame_data,
|
||||
@ -1324,25 +1326,25 @@ static bool d3d9_cg_renderchain_render(
|
||||
height,
|
||||
first_pass->last_width,
|
||||
first_pass->last_height,
|
||||
pitch, chain->pixel_size);
|
||||
pitch, chain->chain.pixel_size);
|
||||
|
||||
/* Grab back buffer. */
|
||||
d3d9_device_get_render_target(chain->dev, 0, (void**)&back_buffer);
|
||||
d3d9_device_get_render_target(chain->chain.dev, 0, (void**)&back_buffer);
|
||||
|
||||
/* In-between render target passes. */
|
||||
for (i = 0; i < chain->passes->count - 1; i++)
|
||||
for (i = 0; i < chain->chain.passes->count - 1; i++)
|
||||
{
|
||||
D3DVIEWPORT9 viewport = {0};
|
||||
struct shader_pass *from_pass = (struct shader_pass*)&chain->passes->data[i];
|
||||
struct shader_pass *to_pass = (struct shader_pass*)&chain->passes->data[i + 1];
|
||||
struct shader_pass *from_pass = (struct shader_pass*)&chain->chain.passes->data[i];
|
||||
struct shader_pass *to_pass = (struct shader_pass*)&chain->chain.passes->data[i + 1];
|
||||
|
||||
d3d9_texture_get_surface_level(to_pass->tex, 0, (void**)&target);
|
||||
|
||||
d3d9_device_set_render_target(chain->dev, 0, (void*)target);
|
||||
d3d9_device_set_render_target(chain->chain.dev, 0, (void*)target);
|
||||
|
||||
d3d9_convert_geometry(&from_pass->info,
|
||||
&out_width, &out_height,
|
||||
current_width, current_height, chain->final_viewport);
|
||||
current_width, current_height, chain->chain.final_viewport);
|
||||
|
||||
/* Clear out whole FBO. */
|
||||
viewport.Width = to_pass->info.tex_w;
|
||||
@ -1350,13 +1352,13 @@ static bool d3d9_cg_renderchain_render(
|
||||
viewport.MinZ = 0.0f;
|
||||
viewport.MaxZ = 1.0f;
|
||||
|
||||
d3d9_set_viewports(chain->dev, &viewport);
|
||||
d3d9_clear(chain->dev, 0, 0, D3DCLEAR_TARGET, 0, 1, 0);
|
||||
d3d9_set_viewports(chain->chain.dev, &viewport);
|
||||
d3d9_clear(chain->chain.dev, 0, 0, D3DCLEAR_TARGET, 0, 1, 0);
|
||||
|
||||
viewport.Width = out_width;
|
||||
viewport.Height = out_height;
|
||||
|
||||
d3d9_set_viewports(chain->dev, &viewport);
|
||||
d3d9_set_viewports(chain->chain.dev, &viewport);
|
||||
|
||||
cg_d3d9_renderchain_set_vertices(video_info,
|
||||
chain, from_pass,
|
||||
@ -1373,29 +1375,30 @@ static bool d3d9_cg_renderchain_render(
|
||||
}
|
||||
|
||||
/* Final pass */
|
||||
d3d9_device_set_render_target(chain->dev, 0, (void*)back_buffer);
|
||||
d3d9_device_set_render_target(chain->chain.dev, 0, (void*)back_buffer);
|
||||
|
||||
last_pass = (struct shader_pass*)&chain->passes->
|
||||
data[chain->passes->count - 1];
|
||||
last_pass = (struct shader_pass*)&chain->chain.passes->
|
||||
data[chain->chain.passes->count - 1];
|
||||
|
||||
d3d9_convert_geometry(&last_pass->info,
|
||||
&out_width, &out_height,
|
||||
current_width, current_height, chain->final_viewport);
|
||||
current_width, current_height, chain->chain.final_viewport);
|
||||
|
||||
d3d9_set_viewports(chain->dev, chain->final_viewport);
|
||||
d3d9_set_viewports(chain->chain.dev, chain->chain.final_viewport);
|
||||
|
||||
cg_d3d9_renderchain_set_vertices(video_info,
|
||||
chain, last_pass,
|
||||
current_width, current_height,
|
||||
out_width, out_height,
|
||||
chain->final_viewport->Width, chain->final_viewport->Height,
|
||||
chain->chain.final_viewport->Width,
|
||||
chain->chain.final_viewport->Height,
|
||||
rotation);
|
||||
|
||||
cg_d3d9_renderchain_render_pass(chain, last_pass,
|
||||
tracker,
|
||||
chain->passes->count);
|
||||
chain->chain.passes->count);
|
||||
|
||||
chain->frame_count++;
|
||||
chain->chain.frame_count++;
|
||||
|
||||
d3d9_surface_free(back_buffer);
|
||||
|
||||
@ -1403,8 +1406,9 @@ static bool d3d9_cg_renderchain_render(
|
||||
cgD3D9BindProgram(chain->fStock);
|
||||
cgD3D9BindProgram(chain->vStock);
|
||||
d3d9_cg_renderchain_calc_and_set_shader_mvp(
|
||||
chain->vStock, chain->final_viewport->Width,
|
||||
chain->final_viewport->Height, 0);
|
||||
chain->vStock,
|
||||
chain->chain.final_viewport->Width,
|
||||
chain->chain.final_viewport->Height, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user