Merge pull request #6128 from aliaspider/master

(D3D8) can now render content frame, rgui and overlays.
This commit is contained in:
Twinaphex 2018-01-17 07:15:31 +01:00 committed by GitHub
commit e1b1a1b07b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 89 deletions

View File

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

View File

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

View File

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

View File

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

View File

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