mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
(D3D9) Simplifications to HLSL/Cg drivers
This commit is contained in:
parent
251208fd0b
commit
604335bc27
@ -872,20 +872,6 @@ static bool d3d9_cg_renderchain_init(
|
||||
return true;
|
||||
}
|
||||
|
||||
static void d3d9_cg_renderchain_set_final_viewport(
|
||||
d3d9_video_t *d3d,
|
||||
void *renderchain_data,
|
||||
const D3DVIEWPORT9 *final_viewport)
|
||||
{
|
||||
cg_renderchain_t *_chain = (cg_renderchain_t*)renderchain_data;
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
|
||||
if (chain && final_viewport)
|
||||
chain->final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
|
||||
d3d9_recompute_pass_sizes(chain->dev, chain, d3d);
|
||||
}
|
||||
|
||||
static bool d3d9_cg_renderchain_add_pass(void *data, const struct LinkInfo *info)
|
||||
{
|
||||
struct shader_pass pass;
|
||||
@ -935,62 +921,62 @@ static INLINE void d3d9_cg_renderchain_set_vertices_on_change(
|
||||
{
|
||||
struct D3D9CGVertex vert[4];
|
||||
unsigned i;
|
||||
void* verts = NULL;
|
||||
void* verts = NULL;
|
||||
const struct
|
||||
LinkInfo* info = (const struct LinkInfo*)&pass->info;
|
||||
float _u = (float)(width) / info->tex_w;
|
||||
float _v = (float)(height) / info->tex_h;
|
||||
float _u = (float)(width) / info->tex_w;
|
||||
float _v = (float)(height) / info->tex_h;
|
||||
|
||||
pass->last_width = width;
|
||||
pass->last_width = width;
|
||||
pass->last_height = height;
|
||||
|
||||
vert[0].x = 0.0f;
|
||||
vert[0].y = out_height;
|
||||
vert[0].z = 0.5f;
|
||||
vert[0].u = 0.0f;
|
||||
vert[0].v = 0.0f;
|
||||
vert[0].lut_u = 0.0f;
|
||||
vert[0].lut_v = 0.0f;
|
||||
vert[0].r = 1.0f;
|
||||
vert[0].g = 1.0f;
|
||||
vert[0].b = 1.0f;
|
||||
vert[0].a = 1.0f;
|
||||
vert[0].x = 0.0f;
|
||||
vert[0].y = out_height;
|
||||
vert[0].z = 0.5f;
|
||||
vert[0].u = 0.0f;
|
||||
vert[0].v = 0.0f;
|
||||
vert[0].lut_u = 0.0f;
|
||||
vert[0].lut_v = 0.0f;
|
||||
vert[0].r = 1.0f;
|
||||
vert[0].g = 1.0f;
|
||||
vert[0].b = 1.0f;
|
||||
vert[0].a = 1.0f;
|
||||
|
||||
vert[1].x = out_width;
|
||||
vert[1].y = out_height;
|
||||
vert[1].z = 0.5f;
|
||||
vert[1].u = _u;
|
||||
vert[1].v = 0.0f;
|
||||
vert[1].lut_u = 1.0f;
|
||||
vert[1].lut_v = 0.0f;
|
||||
vert[1].r = 1.0f;
|
||||
vert[1].g = 1.0f;
|
||||
vert[1].b = 1.0f;
|
||||
vert[1].a = 1.0f;
|
||||
vert[1].x = out_width;
|
||||
vert[1].y = out_height;
|
||||
vert[1].z = 0.5f;
|
||||
vert[1].u = _u;
|
||||
vert[1].v = 0.0f;
|
||||
vert[1].lut_u = 1.0f;
|
||||
vert[1].lut_v = 0.0f;
|
||||
vert[1].r = 1.0f;
|
||||
vert[1].g = 1.0f;
|
||||
vert[1].b = 1.0f;
|
||||
vert[1].a = 1.0f;
|
||||
|
||||
vert[2].x = 0.0f;
|
||||
vert[2].y = 0.0f;
|
||||
vert[2].z = 0.5f;
|
||||
vert[2].u = 0.0f;
|
||||
vert[2].v = _v;
|
||||
vert[2].lut_u = 0.0f;
|
||||
vert[2].lut_v = 1.0f;
|
||||
vert[2].r = 1.0f;
|
||||
vert[2].g = 1.0f;
|
||||
vert[2].b = 1.0f;
|
||||
vert[2].a = 1.0f;
|
||||
vert[2].x = 0.0f;
|
||||
vert[2].y = 0.0f;
|
||||
vert[2].z = 0.5f;
|
||||
vert[2].u = 0.0f;
|
||||
vert[2].v = _v;
|
||||
vert[2].lut_u = 0.0f;
|
||||
vert[2].lut_v = 1.0f;
|
||||
vert[2].r = 1.0f;
|
||||
vert[2].g = 1.0f;
|
||||
vert[2].b = 1.0f;
|
||||
vert[2].a = 1.0f;
|
||||
|
||||
vert[3].x = out_width;
|
||||
vert[3].y = 0.0f;
|
||||
vert[3].z = 0.5f;
|
||||
vert[3].u = _u;
|
||||
vert[3].v = _v;
|
||||
vert[3].lut_u = 1.0f;
|
||||
vert[3].lut_v = 1.0f;
|
||||
vert[3].r = 1.0f;
|
||||
vert[3].g = 1.0f;
|
||||
vert[3].b = 1.0f;
|
||||
vert[3].a = 1.0f;
|
||||
vert[3].x = out_width;
|
||||
vert[3].y = 0.0f;
|
||||
vert[3].z = 0.5f;
|
||||
vert[3].u = _u;
|
||||
vert[3].v = _v;
|
||||
vert[3].lut_u = 1.0f;
|
||||
vert[3].lut_v = 1.0f;
|
||||
vert[3].r = 1.0f;
|
||||
vert[3].g = 1.0f;
|
||||
vert[3].b = 1.0f;
|
||||
vert[3].a = 1.0f;
|
||||
|
||||
/* Align texels and vertices.
|
||||
*
|
||||
@ -1102,7 +1088,7 @@ static void d3d9_cg_renderchain_render_pass(
|
||||
d3d9_renderchain_unbind_all(chain);
|
||||
}
|
||||
|
||||
static bool d3d9_cg_renderchain_render(
|
||||
static void d3d9_cg_renderchain_render(
|
||||
d3d9_video_t *d3d,
|
||||
const void *frame_data,
|
||||
unsigned width, unsigned height,
|
||||
@ -1221,8 +1207,6 @@ static bool d3d9_cg_renderchain_render(
|
||||
(CGprogram)_chain->stock_shader.vprg,
|
||||
chain->final_viewport->Width,
|
||||
chain->final_viewport->Height, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint32_t d3d9_cg_get_flags(void *data)
|
||||
@ -1783,9 +1767,15 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
|
||||
if (d3d->should_resize)
|
||||
{
|
||||
cg_renderchain_t *_chain = (cg_renderchain_t*)
|
||||
d3d->renderchain_data;
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
d3d9_set_viewport(d3d, width, height, false, true);
|
||||
d3d9_cg_renderchain_set_final_viewport(d3d,
|
||||
d3d->renderchain_data, &d3d->final_viewport);
|
||||
|
||||
if (chain)
|
||||
chain->final_viewport = (D3DVIEWPORT9*)&d3d->final_viewport;
|
||||
|
||||
d3d9_recompute_pass_sizes(chain->dev, chain, d3d);
|
||||
|
||||
d3d->should_resize = false;
|
||||
}
|
||||
@ -1804,13 +1794,9 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
|
||||
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev,
|
||||
0, (const float*)&d3d->mvp, 4);
|
||||
if (!d3d9_cg_renderchain_render(
|
||||
d3d9_cg_renderchain_render(
|
||||
d3d, frame, frame_width, frame_height,
|
||||
pitch, d3d->dev_rotation))
|
||||
{
|
||||
RARCH_ERR("[D3D9]: Failed to render scene.\n");
|
||||
return false;
|
||||
}
|
||||
pitch, d3d->dev_rotation);
|
||||
|
||||
if (black_frame_insertion && !d3d->menu->enabled)
|
||||
{
|
||||
|
@ -411,13 +411,14 @@ static INLINE void d3d9_hlsl_renderchain_set_vertices_on_change(
|
||||
* Fixes infamous 'half-texel offset' issue of D3D9
|
||||
* http://msdn.microsoft.com/en-us/library/bb219690%28VS.85%29.aspx.
|
||||
*/
|
||||
/* Maybe we do need something like this left out for now
|
||||
/* Maybe we do need something like this left out for now */
|
||||
#if 0
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
vert[i].x -= 0.5f;
|
||||
vert[i].y += 0.5f;
|
||||
vert[i].x -= 0.5f;
|
||||
vert[i].y += 0.5f;
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
IDirect3DVertexBuffer9_Lock(pass->vertex_buf, 0, 0, &verts, 0);
|
||||
memcpy(verts, vert, sizeof(vert));
|
||||
@ -504,14 +505,6 @@ static void hlsl_d3d9_renderchain_free(void *data)
|
||||
free(chain);
|
||||
}
|
||||
|
||||
static bool hlsl_d3d9_renderchain_init_shader(d3d9_video_t *d3d,
|
||||
hlsl_renderchain_t *chain)
|
||||
{
|
||||
RARCH_LOG("[D3D9]: Using HLSL shader backend.\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool hlsl_d3d9_renderchain_init(
|
||||
d3d9_video_t *d3d,
|
||||
LPDIRECT3DDEVICE9 dev,
|
||||
@ -527,11 +520,8 @@ static bool hlsl_d3d9_renderchain_init(
|
||||
|
||||
if (!chain)
|
||||
return false;
|
||||
if (!hlsl_d3d9_renderchain_init_shader(d3d, chain))
|
||||
{
|
||||
RARCH_ERR("[D3D9 HLSL]: Failed to initialize shader subsystem.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
RARCH_LOG("[D3D9]: Using HLSL shader backend.\n");
|
||||
|
||||
chain->chain.dev = dev;
|
||||
chain->chain.final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
@ -548,19 +538,6 @@ static bool hlsl_d3d9_renderchain_init(
|
||||
return true;
|
||||
}
|
||||
|
||||
static void hlsl_d3d9_renderchain_set_final_viewport(
|
||||
d3d9_video_t *d3d,
|
||||
hlsl_renderchain_t *_chain,
|
||||
const D3DVIEWPORT9 *final_viewport)
|
||||
{
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
|
||||
if (chain && final_viewport)
|
||||
chain->final_viewport = (D3DVIEWPORT9*)final_viewport;
|
||||
|
||||
d3d9_recompute_pass_sizes(chain->dev, chain, d3d);
|
||||
}
|
||||
|
||||
static void hlsl_d3d9_renderchain_render_pass(
|
||||
hlsl_renderchain_t *chain,
|
||||
struct shader_pass *pass,
|
||||
@ -655,7 +632,7 @@ static void hlsl_d3d9_renderchain_render_pass(
|
||||
d3d9_renderchain_unbind_all(&chain->chain);
|
||||
}
|
||||
|
||||
static bool hlsl_d3d9_renderchain_render(
|
||||
static void hlsl_d3d9_renderchain_render(
|
||||
d3d9_video_t *d3d,
|
||||
const void *frame,
|
||||
unsigned width, unsigned height,
|
||||
@ -785,8 +762,6 @@ static bool hlsl_d3d9_renderchain_render(
|
||||
chain, &chain->stock_shader,
|
||||
chain->chain.final_viewport->Width,
|
||||
chain->chain.final_viewport->Height, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool hlsl_d3d9_renderchain_add_pass(
|
||||
@ -805,18 +780,10 @@ static bool hlsl_d3d9_renderchain_add_pass(
|
||||
d3d9_hlsl_load_program_from_file(
|
||||
chain->chain.dev, &pass, info->pass->source.path);
|
||||
|
||||
if (!hlsl_d3d9_renderchain_init_shader_fvf(&chain->chain, &pass))
|
||||
return false;
|
||||
|
||||
return d3d9_renderchain_add_pass(&chain->chain, &pass,
|
||||
info);
|
||||
}
|
||||
|
||||
static bool hlsl_d3d9_renderchain_add_lut(hlsl_renderchain_t *_chain,
|
||||
const char *id, const char *path, bool smooth)
|
||||
{
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
return d3d9_renderchain_add_lut(chain, id, path, smooth);
|
||||
if (hlsl_d3d9_renderchain_init_shader_fvf(&chain->chain, &pass))
|
||||
return d3d9_renderchain_add_pass(&chain->chain, &pass,
|
||||
info);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* END HLSL RENDERCHAIN */
|
||||
@ -951,18 +918,23 @@ static bool d3d9_hlsl_init_chain(d3d9_video_t *d3d,
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
for (i = 0; i < d3d->shader.luts; i++)
|
||||
{
|
||||
if (!hlsl_d3d9_renderchain_add_lut(
|
||||
d3d->renderchain_data,
|
||||
d3d->shader.lut[i].id, d3d->shader.lut[i].path,
|
||||
d3d->shader.lut[i].filter == RARCH_FILTER_UNSPEC
|
||||
? video_smooth
|
||||
: (d3d->shader.lut[i].filter == RARCH_FILTER_LINEAR)))
|
||||
hlsl_renderchain_t *_chain = (hlsl_renderchain_t*)d3d->renderchain_data;
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
|
||||
for (i = 0; i < d3d->shader.luts; i++)
|
||||
{
|
||||
RARCH_ERR("[D3D9]: Failed to init LUTs.\n");
|
||||
return false;
|
||||
if (!d3d9_renderchain_add_lut(
|
||||
chain,
|
||||
d3d->shader.lut[i].id,
|
||||
d3d->shader.lut[i].path,
|
||||
d3d->shader.lut[i].filter == RARCH_FILTER_UNSPEC
|
||||
? video_smooth
|
||||
: (d3d->shader.lut[i].filter == RARCH_FILTER_LINEAR)))
|
||||
{
|
||||
RARCH_ERR("[D3D9]: Failed to init LUTs.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1361,11 +1333,17 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
|
||||
|
||||
if (d3d->should_resize)
|
||||
{
|
||||
d3d9_set_viewport(d3d, width, height, false, true);
|
||||
hlsl_d3d9_renderchain_set_final_viewport(d3d,
|
||||
d3d->renderchain_data, &d3d->final_viewport);
|
||||
hlsl_renderchain_t *_chain = (hlsl_renderchain_t*)d3d->renderchain_data;
|
||||
d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain;
|
||||
|
||||
d3d->should_resize = false;
|
||||
d3d9_set_viewport(d3d, width, height, false, true);
|
||||
|
||||
if (chain)
|
||||
chain->final_viewport = (D3DVIEWPORT9*)&d3d->final_viewport;
|
||||
|
||||
d3d9_recompute_pass_sizes(chain->dev, chain, d3d);
|
||||
|
||||
d3d->should_resize = false;
|
||||
}
|
||||
|
||||
/* render_chain() only clears out viewport,
|
||||
@ -1382,10 +1360,9 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
|
||||
|
||||
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev, 0,
|
||||
(const float*)&d3d->mvp_transposed, 4);
|
||||
if (!hlsl_d3d9_renderchain_render(
|
||||
d3d, frame, frame_width, frame_height,
|
||||
pitch, d3d->dev_rotation))
|
||||
return false;
|
||||
hlsl_d3d9_renderchain_render(
|
||||
d3d, frame, frame_width, frame_height,
|
||||
pitch, d3d->dev_rotation);
|
||||
|
||||
if (black_frame_insertion && !d3d->menu->enabled)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user