mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
Merge pull request #6128 from aliaspider/master
(D3D8) can now render content frame, rgui and overlays.
This commit is contained in:
commit
e1b1a1b07b
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user