Fixed up the d3d9 driver (#13038)

* Fixed d3d9 mvp matrix issue

* Fixed up the d3d9 driver to display the game now
This commit is contained in:
MajorPainTheCactus 2021-09-25 23:19:45 +01:00 committed by GitHub
parent 714cfc581d
commit e08cc6e260
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 61 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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. */

View File

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