Try to use inline functions less - call D3D9 functions directly

This commit is contained in:
twinaphex 2022-04-20 15:01:40 +02:00
parent e185955bc1
commit 53b039cf7d
3 changed files with 99 additions and 59 deletions

View File

@ -573,7 +573,9 @@ static void hlsl_d3d9_renderchain_render_pass(
struct shader_pass *pass,
unsigned pass_index)
{
/* Currently we override the passes shader program with the stock shader as at least the last pass is not setup correctly */
/* Currently we override the passes shader program
with the stock shader as at least the last pass
is not setup correctly */
#if 0
d3d9_hlsl_bind_program(pass, chain->chain.dev);
#else
@ -587,8 +589,10 @@ static void hlsl_d3d9_renderchain_render_pass(
I've left them out for the time being
but maybe this is a bug in d3d9 */
#if 0
IDirect3DDevice9_SetSamplerState(chain->chain.dev, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
IDirect3DDevice9_SetSamplerState(chain->chain.dev, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
IDirect3DDevice9_SetSamplerState(chain->chain.dev,
0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
IDirect3DDevice9_SetSamplerState(chain->chain.dev,
0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
#endif
IDirect3DDevice9_SetSamplerState(chain->chain.dev,
0, D3DSAMP_MINFILTER,
@ -597,8 +601,10 @@ static void hlsl_d3d9_renderchain_render_pass(
0, D3DSAMP_MAGFILTER,
d3d_translate_filter(pass->info.pass->filter));
IDirect3DDevice9_SetVertexDeclaration(chain->chain.dev, pass->vertex_decl);
IDirect3DDevice9_SetStreamSource(chain->chain.dev, 0, pass->vertex_buf,
IDirect3DDevice9_SetVertexDeclaration(
chain->chain.dev, pass->vertex_decl);
IDirect3DDevice9_SetStreamSource(
chain->chain.dev, 0, pass->vertex_buf,
0,sizeof(struct Vertex));
#if 0
@ -637,11 +643,14 @@ static void hlsl_d3d9_renderchain_render_pass(
/* We only bother binding passes which are two indices behind. */
if (pass_index >= 3)
d3d9_hlsl_renderchain_bind_pass(chain, chain->chain.dev, pass, pass_index);
d3d9_hlsl_renderchain_bind_pass(chain, chain->chain.dev,
pass, pass_index);
#endif
d3d9_draw_primitive(chain->chain.dev, D3DPT_TRIANGLESTRIP, 0, 2);
IDirect3DDevice9_BeginScene(chain->chain.dev);
IDirect3DDevice9_DrawPrimitive(chain->chain.dev,
D3DPT_TRIANGLESTRIP, 0, 2);
IDirect3DDevice9_EndScene(chain->chain.dev);
/* So we don't render with linear filter into render targets,
* which apparently looked odd (too blurry). */
@ -660,7 +669,8 @@ static bool hlsl_d3d9_renderchain_render(
unsigned pitch, unsigned rotation)
{
LPDIRECT3DSURFACE9 back_buffer, target;
unsigned i, current_width, current_height, out_width = 0, out_height = 0;
unsigned i, current_width, current_height,
out_width = 0, out_height = 0;
struct shader_pass *last_pass = NULL;
struct shader_pass *first_pass = NULL;
hlsl_renderchain_t *chain = (hlsl_renderchain_t*)
@ -691,12 +701,13 @@ static bool hlsl_d3d9_renderchain_render(
chain->chain.pixel_size);
/* Grab back buffer. */
d3d9_device_get_render_target(chain->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->chain.passes->count - 1; i++)
{
D3DVIEWPORT9 viewport = {0};
D3DVIEWPORT9 viewport = {0};
struct shader_pass *from_pass = (struct shader_pass*)
&chain->chain.passes->data[i];
struct shader_pass *to_pass = (struct shader_pass*)
@ -716,14 +727,17 @@ static bool hlsl_d3d9_renderchain_render(
viewport.MinZ = 0.0f;
viewport.MaxZ = 1.0f;
IDirect3DDevice9_SetViewport(chain->chain.dev, (D3DVIEWPORT9*)&viewport);
IDirect3DDevice9_Clear(chain->chain.dev, 0, 0, D3DCLEAR_TARGET,
IDirect3DDevice9_SetViewport(
chain->chain.dev, (D3DVIEWPORT9*)&viewport);
IDirect3DDevice9_Clear(
chain->chain.dev, 0, 0, D3DCLEAR_TARGET,
0, 1, 0);
viewport.Width = out_width;
viewport.Height = out_height;
IDirect3DDevice9_SetViewport(chain->chain.dev, (D3DVIEWPORT9*)&viewport);
IDirect3DDevice9_SetViewport(
chain->chain.dev, (D3DVIEWPORT9*)&viewport);
hlsl_d3d9_renderchain_set_vertices(
d3d,
@ -752,7 +766,8 @@ static bool hlsl_d3d9_renderchain_render(
&out_width, &out_height,
current_width, current_height, chain->chain.final_viewport);
IDirect3DDevice9_SetViewport(chain->chain.dev, (D3DVIEWPORT9*)chain->chain.final_viewport);
IDirect3DDevice9_SetViewport(
chain->chain.dev, (D3DVIEWPORT9*)chain->chain.final_viewport);
hlsl_d3d9_renderchain_set_vertices(
d3d,
@ -772,7 +787,8 @@ static bool hlsl_d3d9_renderchain_render(
d3d9_renderchain_end_render(&chain->chain);
d3d9_hlsl_bind_program(&chain->stock_shader, chain->chain.dev);
hlsl_d3d9_renderchain_calc_and_set_shader_mvp(chain, &chain->stock_shader,
hlsl_d3d9_renderchain_calc_and_set_shader_mvp(
chain, &chain->stock_shader,
chain->chain.final_viewport->Width,
chain->chain.final_viewport->Height, 0);
@ -792,7 +808,8 @@ static bool hlsl_d3d9_renderchain_add_pass(
unsigned_vector_list_new();
pass.pool = D3DPOOL_DEFAULT;
d3d9_hlsl_load_program_from_file(chain->chain.dev, &pass, info->pass->source.path);
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;
@ -880,11 +897,11 @@ static bool renderchain_d3d_hlsl_init_first(
static bool d3d9_hlsl_init_chain(d3d9_video_t *d3d,
unsigned input_scale, bool rgb32)
{
unsigned i = 0;
struct LinkInfo link_info;
#ifndef _XBOX
unsigned current_width, current_height, out_width, out_height;
#endif
unsigned i = 0;
settings_t *settings = config_get_ptr();
bool video_smooth = settings->bools.video_smooth;
@ -958,7 +975,8 @@ static bool d3d9_hlsl_init_chain(d3d9_video_t *d3d,
return true;
}
static bool d3d9_hlsl_initialize(d3d9_video_t *d3d, const video_info_t *info)
static bool d3d9_hlsl_initialize(
d3d9_video_t *d3d, const video_info_t *info)
{
unsigned width, height;
bool ret = true;
@ -1015,12 +1033,15 @@ static bool d3d9_hlsl_initialize(d3d9_video_t *d3d, const video_info_t *info)
{
static const D3DVERTEXELEMENT9 VertexElements[4] = {
{0, offsetof(Vertex, x), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_POSITION, 0},
{0, offsetof(Vertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_TEXCOORD, 0},
{0, offsetof(Vertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_COLOR, 0},
{0, offsetof(Vertex, x),
D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_POSITION,0},
{0, offsetof(Vertex, u),
D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_TEXCOORD,0},
{0, offsetof(Vertex, color),
D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,
D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
if (!d3d9_vertex_declaration_new(d3d->dev,
@ -1369,7 +1390,8 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
IDirect3DDevice9_Clear(d3d->dev, 0, 0, D3DCLEAR_TARGET,
0, 1, 0);
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp_transposed, 4);
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))
@ -1397,7 +1419,8 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
#ifdef HAVE_OVERLAY
if (d3d->overlays_enabled && overlay_behind_menu)
{
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp_transposed, 4);
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev, 0,
(const float*)&d3d->mvp_transposed, 4);
for (i = 0; i < d3d->overlays_size; i++)
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
}
@ -1406,8 +1429,8 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
#ifdef HAVE_MENU
if (d3d->menu && d3d->menu->enabled)
{
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
float*)&d3d->mvp_transposed, 4);
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev, 0,
(const float*)&d3d->mvp_transposed, 4);
d3d9_overlay_render(d3d, width, height, d3d->menu, false);
d3d->menu_display.offset = 0;
@ -1423,7 +1446,7 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
if (osd_params)
{
IDirect3DDevice9_SetViewport(d3d->dev, (D3DVIEWPORT9*)&screen_vp);
d3d9_begin_scene(d3d->dev);
IDirect3DDevice9_BeginScene(d3d->dev);
font_driver_render_msg(d3d, stat_text,
(const struct font_params*)osd_params, NULL);
IDirect3DDevice9_EndScene(d3d->dev);
@ -1434,8 +1457,8 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
#ifdef HAVE_OVERLAY
if (d3d->overlays_enabled && !overlay_behind_menu)
{
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
float*)&d3d->mvp_transposed, 4);
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev, 0,
(const float*)&d3d->mvp_transposed, 4);
for (i = 0; i < d3d->overlays_size; i++)
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
}
@ -1449,7 +1472,7 @@ static bool d3d9_hlsl_frame(void *data, const void *frame,
if (msg && *msg)
{
IDirect3DDevice9_SetViewport(d3d->dev, (D3DVIEWPORT9*)&screen_vp);
d3d9_begin_scene(d3d->dev);
IDirect3DDevice9_BeginScene(d3d->dev);
font_driver_render_msg(d3d, msg, NULL, NULL);
IDirect3DDevice9_EndScene(d3d->dev);
}

View File

@ -87,7 +87,9 @@ static void gfx_display_d3d9_cg_blend_begin(void *data)
if (!d3d)
return;
d3d9_enable_blend_func(d3d->dev);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_ALPHABLENDENABLE, true);
}
static void gfx_display_d3d9_cg_blend_end(void *data)
@ -97,7 +99,7 @@ static void gfx_display_d3d9_cg_blend_end(void *data)
if (!d3d)
return;
d3d9_disable_blend_func(d3d->dev);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_ALPHABLENDENABLE, false);
}
static void gfx_display_d3d9_cg_bind_texture(gfx_display_ctx_draw_t *draw,
@ -105,12 +107,18 @@ static void gfx_display_d3d9_cg_bind_texture(gfx_display_ctx_draw_t *draw,
{
LPDIRECT3DDEVICE9 dev = d3d->dev;
d3d9_set_texture(dev, 0, (LPDIRECT3DTEXTURE9)draw->texture);
d3d9_set_sampler_address_u(dev, 0, D3DTADDRESS_COMM_CLAMP);
d3d9_set_sampler_address_v(dev, 0, D3DTADDRESS_COMM_CLAMP);
d3d9_set_sampler_minfilter(dev, 0, D3DTEXF_COMM_LINEAR);
d3d9_set_sampler_magfilter(dev, 0, D3DTEXF_COMM_LINEAR);
d3d9_set_sampler_mipfilter(dev, 0, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetTexture(dev, 0,
(IDirect3DBaseTexture9*)draw->texture);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_ADDRESSU, D3DTADDRESS_COMM_CLAMP);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_ADDRESSV, D3DTADDRESS_COMM_CLAMP);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_MINFILTER, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_MAGFILTER, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetSamplerState(dev, 0,
D3DSAMP_MIPFILTER, D3DTEXF_COMM_LINEAR);
}
static void gfx_display_d3d9_cg_draw(gfx_display_ctx_draw_t *draw,
@ -216,7 +224,6 @@ static void gfx_display_d3d9_cg_draw_pipeline(gfx_display_ctx_draw_t *draw,
gfx_display_t *p_disp,
void *data, unsigned video_width, unsigned video_height)
{
#if defined(HAVE_HLSL) || defined(HAVE_CG)
static float t = 0;
video_coord_array_t *ca = NULL;
@ -255,7 +262,6 @@ static void gfx_display_d3d9_cg_draw_pipeline(gfx_display_ctx_draw_t *draw,
}
break;
}
#endif
}
static bool gfx_display_d3d9_font_init_first(
@ -288,7 +294,7 @@ void gfx_display_d3d9_cg_scissor_begin(
rect.right = width + x;
rect.bottom = height + y;
d3d9_set_scissor_rect(d3d9->dev, &rect);
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
}
void gfx_display_d3d9_cg_scissor_end(void *data,
@ -305,7 +311,7 @@ void gfx_display_d3d9_cg_scissor_end(void *data,
rect.right = video_width;
rect.bottom = video_height;
d3d9_set_scissor_rect(d3d9->dev, &rect);
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
}
gfx_display_ctx_driver_t gfx_display_ctx_d3d9 = {

View File

@ -87,7 +87,9 @@ static void gfx_display_d3d9_hlsl_blend_begin(void *data)
if (!d3d)
return;
d3d9_enable_blend_func(d3d->dev);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_ALPHABLENDENABLE, true);
}
static void gfx_display_d3d9_hlsl_blend_end(void *data)
@ -97,7 +99,7 @@ static void gfx_display_d3d9_hlsl_blend_end(void *data)
if (!d3d)
return;
d3d9_disable_blend_func(d3d->dev);
IDirect3DDevice9_SetRenderState(d3d->dev, D3DRS_ALPHABLENDENABLE, false);
}
static void gfx_display_d3d9_bind_texture(gfx_display_ctx_draw_t *draw,
@ -105,12 +107,18 @@ static void gfx_display_d3d9_bind_texture(gfx_display_ctx_draw_t *draw,
{
LPDIRECT3DDEVICE9 dev = d3d->dev;
d3d9_set_texture(dev, 0, (LPDIRECT3DTEXTURE9)draw->texture);
d3d9_set_sampler_address_u(dev, 0, D3DTADDRESS_COMM_CLAMP);
d3d9_set_sampler_address_v(dev, 0, D3DTADDRESS_COMM_CLAMP);
d3d9_set_sampler_minfilter(dev, 0, D3DTEXF_COMM_LINEAR);
d3d9_set_sampler_magfilter(dev, 0, D3DTEXF_COMM_LINEAR);
d3d9_set_sampler_mipfilter(dev, 0, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetTexture(dev, 0,
(IDirect3DBaseTexture9*)draw->texture);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_ADDRESSU, D3DTADDRESS_COMM_CLAMP);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_ADDRESSV, D3DTADDRESS_COMM_CLAMP);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_MINFILTER, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetSamplerState(dev,
0, D3DSAMP_MAGFILTER, D3DTEXF_COMM_LINEAR);
IDirect3DDevice9_SetSamplerState(dev, 0,
D3DSAMP_MIPFILTER, D3DTEXF_COMM_LINEAR);
}
static void gfx_display_d3d9_hlsl_draw(gfx_display_ctx_draw_t *draw,
@ -197,7 +205,8 @@ static void gfx_display_d3d9_hlsl_draw(gfx_display_ctx_draw_t *draw,
matrix_4x4_multiply(m1, mop, m2);
matrix_4x4_multiply(m2, d3d->mvp_transposed, m1);
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&m2, 4);
IDirect3DDevice9_SetVertexShaderConstantF(d3d->dev,
0, (const float*)&m2, 4);
if (draw && draw->texture)
gfx_display_d3d9_bind_texture(draw, d3d);
@ -212,7 +221,8 @@ static void gfx_display_d3d9_hlsl_draw(gfx_display_ctx_draw_t *draw,
d3d->menu_display.offset += draw->coords->vertices;
}
static void gfx_display_d3d9_hlsl_draw_pipeline(gfx_display_ctx_draw_t *draw,
static void gfx_display_d3d9_hlsl_draw_pipeline(
gfx_display_ctx_draw_t *draw,
gfx_display_t *p_disp,
void *data, unsigned video_width, unsigned video_height)
{
@ -237,12 +247,12 @@ static void gfx_display_d3d9_hlsl_draw_pipeline(gfx_display_ctx_draw_t *draw,
case VIDEO_SHADER_MENU:
case VIDEO_SHADER_MENU_2:
case VIDEO_SHADER_MENU_3:
/* TODO/FIXME - implement */
#if 0
{
struct uniform_info uniform_param = {0};
t += 0.01;
(void)uniform_param;
uniform_param.enabled = true;
uniform_param.lookup.enable = true;
uniform_param.lookup.add_prefix = true;
@ -252,6 +262,7 @@ static void gfx_display_d3d9_hlsl_draw_pipeline(gfx_display_ctx_draw_t *draw,
uniform_param.lookup.ident = "time";
uniform_param.result.f.v0 = t;
}
#endif
break;
}
}
@ -286,7 +297,7 @@ void gfx_display_d3d9_hlsl_scissor_begin(
rect.right = width + x;
rect.bottom = height + y;
d3d9_set_scissor_rect(d3d9->dev, &rect);
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
}
void gfx_display_d3d9_hlsl_scissor_end(void *data,
@ -303,7 +314,7 @@ void gfx_display_d3d9_hlsl_scissor_end(void *data,
rect.right = video_width;
rect.bottom = video_height;
d3d9_set_scissor_rect(d3d9->dev, &rect);
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
}
gfx_display_ctx_driver_t gfx_display_ctx_d3d9_hlsl = {