diff --git a/defines/d3d_defines.h b/defines/d3d_defines.h index 47c7b0aed1..9374e91611 100644 --- a/defines/d3d_defines.h +++ b/defines/d3d_defines.h @@ -84,11 +84,7 @@ #elif defined(HAVE_D3D9) #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1) #elif defined(HAVE_D3D8) -#if 1 -#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1) -#else -#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1) -#endif +#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE) #endif #endif diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index 3351be71ea..8b79014a44 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -204,9 +204,9 @@ bool d3d_initialize_symbols(void) #if defined(HAVE_D3D9) #if defined(DEBUG) || defined(_DEBUG) g_d3d_dll = dylib_load("d3d9d.dll"); -#else - g_d3d_dll = dylib_load("d3d9.dll"); + if(!g_d3d_dll) #endif + g_d3d_dll = dylib_load("d3d9.dll"); #ifdef HAVE_D3DX g_d3dx_dll = dylib_load_d3dx(); #endif @@ -221,9 +221,9 @@ bool d3d_initialize_symbols(void) #elif defined(HAVE_D3D8) #if defined(DEBUG) || defined(_DEBUG) g_d3d_dll = dylib_load("d3d8d.dll"); -#else - g_d3d_dll = dylib_load("d3d8.dll"); + if(!g_d3d_dll) #endif + g_d3d_dll = dylib_load("d3d8.dll"); if (!g_d3d_dll) return false; #endif @@ -431,7 +431,7 @@ bool d3d_texture_get_surface_level(LPDIRECT3DTEXTURE tex, if (SUCCEEDED(IDirect3DTexture9_GetSurfaceLevel(tex, idx, (IDirect3DSurface9**)_ppsurface_level))) return true; #elif defined(HAVE_D3D8) && !defined(__cplusplus) - if (SUCCEEDED(IDirect3DTexture8_GetSurfaceLevel(tex, idx, (LPDIRECT3DSURFACE**)_ppsurface_level))) + if (SUCCEEDED(IDirect3DTexture8_GetSurfaceLevel(tex, idx, (IDirect3DSurface8**)_ppsurface_level))) return true; #else if (SUCCEEDED(tex->GetSurfaceLevel(idx, (ID3DSURFACE**)_ppsurface_level))) @@ -683,11 +683,11 @@ void *d3d_vertex_buffer_lock(void *vertbuf_ptr) #elif defined(_XBOX360) buf = D3DVertexBuffer_Lock(vertbuf, 0, 0, 0); #elif defined(HAVE_D3D9) && !defined(__cplusplus) - IDirect3DVertexBuffer9_Lock(vertbuf, 0, sizeof(buf), &buf, 0); + IDirect3DVertexBuffer9_Lock(vertbuf, 0, 0, &buf, 0); #elif defined(HAVE_D3D8) && !defined(__cplusplus) - IDirect3DVertexBuffer8_Lock(vertbuf, 0, sizeof(buf), &buf, 0); + IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0); #else - vertbuf->Lock(0, sizeof(buf), &buf, 0); + vertbuf->Lock(0, 0, &buf, 0); #endif if (!buf) @@ -1074,7 +1074,7 @@ void d3d_set_texture(LPDIRECT3DDEVICE dev, unsigned sampler, #elif defined(HAVE_D3D9) && !defined(__cplusplus) IDirect3DDevice9_SetTexture(dev, sampler, (IDirect3DBaseTexture9*)tex); #elif defined(HAVE_D3D8) && !defined(__cplusplus) - IDirect3DDevice8_SetTexture(dev, sampler, tex); + IDirect3DDevice8_SetTexture(dev, sampler, (IDirect3DBaseTexture8*)tex); #else dev->SetTexture(sampler, tex); #endif diff --git a/gfx/drivers/d3d.c b/gfx/drivers/d3d.c index be187bf495..20bb88f99b 100644 --- a/gfx/drivers/d3d.c +++ b/gfx/drivers/d3d.c @@ -341,7 +341,8 @@ static void d3d_overlay_render(d3d_video_t *d3d, struct video_viewport vp; void *verts; unsigned i; - float vert[4][9]; + Vertex vert[4]; + unsigned width = video_info->width; unsigned height = video_info->height; @@ -351,7 +352,7 @@ static void d3d_overlay_render(d3d_video_t *d3d, if (!overlay->vert_buf) { overlay->vert_buf = d3d_vertex_buffer_new( - d3d->dev, sizeof(vert), 0, 0, D3DPOOL_MANAGED, NULL); + d3d->dev, sizeof(vert), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, NULL); if (!overlay->vert_buf) return; @@ -359,49 +360,45 @@ static void d3d_overlay_render(d3d_video_t *d3d, for (i = 0; i < 4; i++) { - vert[i][2] = 0.5f; - vert[i][5] = 1.0f; - vert[i][6] = 1.0f; - vert[i][7] = 1.0f; - vert[i][8] = overlay->alpha_mod; + vert[i].z = 0.5f; + vert[i].color = (((uint32_t)(overlay->alpha_mod * 0xFF)) << 24) | 0xFFFFFF; } d3d_viewport_info(d3d, &vp); - vert[0][0] = overlay->vert_coords[0]; - vert[1][0] = overlay->vert_coords[0] + overlay->vert_coords[2]; - vert[2][0] = overlay->vert_coords[0]; - vert[3][0] = overlay->vert_coords[0] + overlay->vert_coords[2]; - vert[0][1] = overlay->vert_coords[1]; - vert[1][1] = overlay->vert_coords[1]; - vert[2][1] = overlay->vert_coords[1] + overlay->vert_coords[3]; - vert[3][1] = overlay->vert_coords[1] + overlay->vert_coords[3]; + vert[0].x = overlay->vert_coords[0]; + vert[1].x = overlay->vert_coords[0] + overlay->vert_coords[2]; + vert[2].x = overlay->vert_coords[0]; + vert[3].x = overlay->vert_coords[0] + overlay->vert_coords[2]; + vert[0].y = overlay->vert_coords[1]; + vert[1].y = overlay->vert_coords[1]; + vert[2].y = overlay->vert_coords[1] + overlay->vert_coords[3]; + vert[3].y = overlay->vert_coords[1] + overlay->vert_coords[3]; - vert[0][3] = overlay->tex_coords[0]; - vert[1][3] = overlay->tex_coords[0] + overlay->tex_coords[2]; - vert[2][3] = overlay->tex_coords[0]; - vert[3][3] = overlay->tex_coords[0] + overlay->tex_coords[2]; - vert[0][4] = overlay->tex_coords[1]; - vert[1][4] = overlay->tex_coords[1]; - vert[2][4] = overlay->tex_coords[1] + overlay->tex_coords[3]; - vert[3][4] = overlay->tex_coords[1] + overlay->tex_coords[3]; + vert[0].u = overlay->tex_coords[0]; + vert[1].u = overlay->tex_coords[0] + overlay->tex_coords[2]; + vert[2].u = overlay->tex_coords[0]; + vert[3].u = overlay->tex_coords[0] + overlay->tex_coords[2]; + vert[0].v = overlay->tex_coords[1]; + vert[1].v = overlay->tex_coords[1]; + vert[2].v = overlay->tex_coords[1] + overlay->tex_coords[3]; + vert[3].v = overlay->tex_coords[1] + overlay->tex_coords[3]; verts = d3d_vertex_buffer_lock(overlay->vert_buf); memcpy(verts, vert, sizeof(vert)); d3d_vertex_buffer_unlock(overlay->vert_buf); d3d_enable_blend_func(d3d->dev); - #if defined(HAVE_D3D9) { LPDIRECT3DVERTEXDECLARATION vertex_decl; /* set vertex declaration for overlay. */ D3DVERTEXELEMENT vElems[4] = { - {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, + {0, offsetof(Vertex, x), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, - {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, + {0, offsetof(Vertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, - {0, 20, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, + {0, offsetof(Vertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, D3DDECL_END() }; @@ -409,6 +406,8 @@ static void d3d_overlay_render(d3d_video_t *d3d, d3d_set_vertex_declaration(d3d->dev, vertex_decl); d3d_vertex_declaration_free(vertex_decl); } +#elif defined(HAVE_D3D8) + d3d_set_vertex_shader(d3d->dev, D3DFVF_CUSTOMVERTEX, NULL); #endif d3d_set_stream_source(d3d->dev, 0, overlay->vert_buf, diff --git a/gfx/drivers/d3d.h b/gfx/drivers/d3d.h index 9e8af02a7e..74010360ab 100644 --- a/gfx/drivers/d3d.h +++ b/gfx/drivers/d3d.h @@ -56,13 +56,8 @@ typedef struct typedef struct Vertex { - float x, y; -#if defined(HAVE_D3D8) - float z; -#if 1 - float rhw; -#endif -#endif + float x, y, z; + uint32_t color; float u, v; } Vertex; diff --git a/gfx/drivers_renderchain/d3d8_renderchain.c b/gfx/drivers_renderchain/d3d8_renderchain.c index f61c1d03ac..cea8e87577 100644 --- a/gfx/drivers_renderchain/d3d8_renderchain.c +++ b/gfx/drivers_renderchain/d3d8_renderchain.c @@ -47,14 +47,18 @@ static void d3d8_renderchain_set_mvp( void *shader_data, const void *mat_data) { - D3DMATRIX identity; + D3DMATRIX matrix; d3d_video_t *d3d = (d3d_video_t*)data; - d3d_matrix_identity(&identity); + d3d_matrix_identity(&matrix); - d3d_set_transform(d3d->dev, D3DTS_WORLD, &identity); - d3d_set_transform(d3d->dev, D3DTS_VIEW, &identity); - d3d_set_transform(d3d->dev, D3DTS_PROJECTION, mat_data); + d3d_set_transform(d3d->dev, D3DTS_PROJECTION, &matrix); + d3d_set_transform(d3d->dev, D3DTS_VIEW, &matrix); + + if (mat_data) + d3d_matrix_transpose(&matrix, mat_data); + + d3d_set_transform(d3d->dev, D3DTS_WORLD, &matrix); } static bool d3d8_renderchain_create_first_pass(void *data, @@ -80,14 +84,14 @@ static bool d3d8_renderchain_create_first_pass(void *data, #else D3DFMT_X8R8G8B8 : D3DFMT_R5G6B5, #endif - 0, 0, 0, 0, NULL, NULL, + D3DPOOL_MANAGED, 0, 0, 0, NULL, NULL, false); if (!chain->tex) return false; - d3d_set_sampler_address_u(d3dr, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); - d3d_set_sampler_address_v(d3dr, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); + d3d_set_sampler_address_u(d3dr, 0, D3DTADDRESS_BORDER); + d3d_set_sampler_address_v(d3dr, 0, D3DTADDRESS_BORDER); d3d_set_render_state(d3dr, D3DRS_LIGHTING, 0); d3d_set_render_state(d3dr, D3DRS_CULLMODE, D3DCULL_NONE); d3d_set_render_state(d3dr, D3DRS_ZENABLE, FALSE); @@ -121,20 +125,20 @@ static void d3d8_renderchain_set_vertices(void *data, unsigned pass, tex_h = vert_height; vert[0].x = -1.0f; - vert[0].y = -1.0f; + vert[0].y = 1.0f; vert[0].z = 1.0f; vert[1].x = 1.0f; - vert[1].y = -1.0f; + vert[1].y = 1.0f; vert[1].z = 1.0f; vert[2].x = -1.0f; - vert[2].y = 1.0f; + vert[2].y = -1.0f; vert[2].z = 1.0f; vert[3].x = 1.0f; - vert[3].y = 1.0f; + vert[3].y = -1.0f; vert[3].z = 1.0f; #ifdef _XBOX @@ -152,19 +156,19 @@ static void d3d8_renderchain_set_vertices(void *data, unsigned pass, vert[3].u = 0.0f; vert[3].v = 0.0f; #else - vert[0].rhw = 1.0f; - vert[1].rhw = 1.0f; - vert[2].rhw = 1.0f; - vert[3].rhw = 1.0f; - vert[0].u = 0.0f; - vert[0].v = tex_w; - vert[1].u = 0.0f; - vert[1].v = tex_w; - vert[2].u = tex_h; - vert[2].v = 0.0f; - vert[3].u = tex_h; - vert[3].v = 0.0f; + vert[0].v = 0.0f; + vert[1].u = tex_w / chain->tex_w; + vert[1].v = 0.0f; + vert[2].u = 0.0f; + vert[2].v = tex_h / chain->tex_h; + vert[3].u = tex_w / chain->tex_w; + vert[3].v = tex_h / chain->tex_h; + + vert[0].color = 0xFFFFFFFF; + vert[1].color = 0xFFFFFFFF; + vert[2].color = 0xFFFFFFFF; + vert[3].color = 0xFFFFFFFF; #endif /* TODO/FIXME - might not need this for D3D8 */ @@ -295,30 +299,18 @@ static void d3d8_renderchain_render_pass( unsigned pass_index, unsigned rotation) { - D3DMATRIX proj, ortho, rot, matrix; - unsigned i; settings_t *settings = config_get_ptr(); - d3d_set_texture(d3dr, pass_index, chain->tex); - d3d_set_viewports(chain->dev, &d3d->final_viewport); + d3d_set_texture(d3dr, 0, chain->tex); d3d_set_sampler_magfilter(d3dr, pass_index, settings->bools.video_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_sampler_minfilter(d3dr, pass_index, settings->bools.video_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); - d3d_set_vertex_declaration(d3dr, chain->vertex_decl); - - for (i = 0; i < 4; i++) - d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); - - d3d_matrix_ortho_off_center_lh(&ortho, 0, d3d->final_viewport.Width, - 0, d3d->final_viewport.Height, 0, 1); - d3d_matrix_identity(&rot); - d3d_matrix_rotation_z(&rot, rotation * (M_PI / 2.0)); - d3d_matrix_multiply(&proj, &ortho, &rot); - d3d_matrix_transpose(&matrix, &proj); - d3d8_renderchain_set_mvp(d3d, chain, NULL, &matrix); - + d3d_set_viewports(chain->dev, &d3d->final_viewport); + d3d_set_vertex_shader(d3dr, D3DFVF_CUSTOMVERTEX, NULL); + d3d_set_stream_source(d3dr, 0, chain->vertex_buf, 0, sizeof(Vertex)); + d3d8_renderchain_set_mvp(d3d, chain, NULL, NULL); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); }