(D3D9) Simplifications to HLSL/Cg drivers

This commit is contained in:
twinaphex 2022-04-27 19:07:04 +02:00
parent 251208fd0b
commit 604335bc27
2 changed files with 99 additions and 136 deletions

View File

@ -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)
{

View File

@ -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)
{