From e08cc6e2609ddf0159ac41e47351e31385f7d51f Mon Sep 17 00:00:00 2001 From: MajorPainTheCactus <89490246+MajorPainTheCactus@users.noreply.github.com> Date: Sat, 25 Sep 2021 23:19:45 +0100 Subject: [PATCH] Fixed up the d3d9 driver (#13038) * Fixed d3d9 mvp matrix issue * Fixed up the d3d9 driver to display the game now --- gfx/drivers/d3d9.c | 3 +- gfx/drivers/d3d_shaders/opaque.hlsl.d3d9.h | 6 +- .../d3d9_hlsl_renderchain.c | 30 +++++--- gfx/drivers_renderchain/d3d9_renderchain.h | 77 ++++++++----------- 4 files changed, 55 insertions(+), 61 deletions(-) diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 75faac0a69..bd81a79846 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -1556,6 +1556,7 @@ static bool d3d9_frame(void *data, const void *frame, d3d9_set_viewports(d3d->dev, &screen_vp); d3d9_clear(d3d->dev, 0, 0, D3DCLEAR_TARGET, 0, 1, 0); + d3d9_set_mvp(d3d->dev, &d3d->mvp_transposed); if (!d3d->renderchain_driver->render( d3d, frame, frame_width, frame_height, pitch, d3d->dev_rotation)) @@ -1604,7 +1605,7 @@ static bool d3d9_frame(void *data, const void *frame, #ifdef HAVE_OVERLAY if (d3d->overlays_enabled) { - d3d9_set_mvp(d3d->dev, &d3d->mvp); + d3d9_set_mvp(d3d->dev, &d3d->mvp_transposed); for (i = 0; i < d3d->overlays_size; i++) d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true); } diff --git a/gfx/drivers/d3d_shaders/opaque.hlsl.d3d9.h b/gfx/drivers/d3d_shaders/opaque.hlsl.d3d9.h index b3be6f4391..e27f9da17f 100644 --- a/gfx/drivers/d3d_shaders/opaque.hlsl.d3d9.h +++ b/gfx/drivers/d3d_shaders/opaque.hlsl.d3d9.h @@ -3,18 +3,18 @@ static const char *stock_hlsl_program = CG( void main_vertex ( - float4 position : POSITION, + float3 position : POSITION, float4 color : COLOR, + float2 texCoord : TEXCOORD0, uniform float4x4 modelViewProj, - float4 texCoord : TEXCOORD0, out float4 oPosition : POSITION, out float4 oColor : COLOR, out float2 otexCoord : TEXCOORD ) { - oPosition = mul(modelViewProj, position); + oPosition = mul(modelViewProj, float4(position, 1.0f)); oColor = color; otexCoord = texCoord; } diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index 8b6242335b..91a0d107ac 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -228,10 +228,14 @@ static bool hlsl_d3d9_renderchain_init_shader_fvf( d3d9_renderchain_t *chain, struct shader_pass *pass) { - static const D3DVERTEXELEMENT9 decl[] = + static const D3DVERTEXELEMENT9 decl[4] = { - { 0, 0 * sizeof(float), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - D3D9_DECL_FVF_TEXCOORD(0, 2, 0), + {0, offsetof(Vertex, x), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, + D3DDECLUSAGE_POSITION, 0}, + {0, offsetof(Vertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, + D3DDECLUSAGE_COLOR, 0}, + {0, offsetof(Vertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, + D3DDECLUSAGE_TEXCOORD, 0}, D3DDECL_END() }; @@ -265,7 +269,7 @@ static bool hlsl_d3d9_renderchain_create_first_pass( chain->prev.last_height[i] = 0; chain->prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9) d3d9_vertex_buffer_new( - chain->dev, 4 * sizeof(struct D3D9Vertex), + chain->dev, 4 * sizeof(struct Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL); if (!chain->prev.vertex_buf[i]) @@ -471,21 +475,25 @@ static void hlsl_d3d9_renderchain_render_pass( struct shader_pass *pass, unsigned pass_index) { - unsigned i; - - d3d9_hlsl_bind_program(pass, chain->chain.dev); + /* Currently we override the passes shader program with the stock shader as at least the last pass is not setup correctly */ + /*d3d9_hlsl_bind_program(pass, chain->chain.dev);*/ + d3d9_hlsl_bind_program(&chain->stock_shader, chain->chain.dev); d3d9_set_texture(chain->chain.dev, 0, pass->tex); + + /* d3d8 sets the sampler address modes - I've left them out for the time being but maybe this is a bug in d3d9 */ + /*d3d9_set_sampler_address_u(chain->chain.dev, 0, D3DTADDRESS_BORDER);*/ + /*d3d9_set_sampler_address_v(chain->chain.dev, 0, D3DTADDRESS_BORDER);*/ d3d9_set_sampler_minfilter(chain->chain.dev, 0, d3d_translate_filter(pass->info.pass->filter)); d3d9_set_sampler_magfilter(chain->chain.dev, 0, d3d_translate_filter(pass->info.pass->filter)); d3d9_set_vertex_declaration(chain->chain.dev, pass->vertex_decl); - for (i = 0; i < 4; i++) - d3d9_set_stream_source(chain->chain.dev, i, - pass->vertex_buf, 0, - sizeof(struct D3D9Vertex)); + + d3d9_set_stream_source(chain->chain.dev, 0, + pass->vertex_buf, 0, + sizeof(struct Vertex)); #if 0 /* Set orig texture. */ diff --git a/gfx/drivers_renderchain/d3d9_renderchain.h b/gfx/drivers_renderchain/d3d9_renderchain.h index 338f547aec..2a59fbeea4 100644 --- a/gfx/drivers_renderchain/d3d9_renderchain.h +++ b/gfx/drivers_renderchain/d3d9_renderchain.h @@ -111,7 +111,7 @@ static INLINE void d3d9_renderchain_set_vertices_on_change( unsigned rotation ) { - struct D3D9Vertex vert[4]; + struct Vertex vert[4]; unsigned i; void *verts = NULL; const struct @@ -122,64 +122,49 @@ static INLINE void d3d9_renderchain_set_vertices_on_change( 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; + /* Copied from d3d8 driver */ + vert[0].x = 0.0f; + vert[0].y = 1.0f; + vert[0].z = 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 = 1.0f; + vert[1].y = 1.0f; + vert[1].z = 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 = 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 = 1.0f; + vert[3].y = 0.0f; + vert[3].z = 1.0f; + + vert[0].u = 0.0f; + vert[0].v = 0.0f; + vert[1].v = 0.0f; + vert[2].u = 0.0f; + vert[1].u = _u; + vert[2].v = _v; + vert[3].u = _u; + vert[3].v = _v; + + vert[0].color = 0xFFFFFFFF; + vert[1].color = 0xFFFFFFFF; + vert[2].color = 0xFFFFFFFF; + vert[3].color = 0xFFFFFFFF; /* Align texels and vertices. * * 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 for (i = 0; i < 4; i++) { vert[i].x -= 0.5f; vert[i].y += 0.5f; } + */ verts = d3d9_vertex_buffer_lock(pass->vertex_buf); memcpy(verts, vert, sizeof(vert)); @@ -193,7 +178,7 @@ static INLINE bool d3d9_renderchain_add_pass(d3d9_renderchain_t *chain, LPDIRECT3DTEXTURE9 tex; LPDIRECT3DVERTEXBUFFER9 vertbuf = (LPDIRECT3DVERTEXBUFFER9) d3d9_vertex_buffer_new(chain->dev, - 4 * sizeof(struct D3D9Vertex), + 4 * sizeof(struct Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL); if (!vertbuf)