mirror of
https://github.com/libretro/RetroArch
synced 2025-03-30 07:20:36 +00:00
Fixes the d3d9cg driver (#13870)
This commit is contained in:
parent
6f0bef6b7b
commit
2f0bdac2f5
@ -2995,6 +2995,7 @@ static bool check_menu_driver_compatibility(settings_t *settings)
|
||||
if (string_starts_with_size(video_driver, "d3d", STRLEN_CONST("d3d")))
|
||||
if (
|
||||
string_is_equal(video_driver, "d3d9_hlsl") ||
|
||||
string_is_equal(video_driver, "d3d9_cg") ||
|
||||
string_is_equal(video_driver, "d3d10") ||
|
||||
string_is_equal(video_driver, "d3d11") ||
|
||||
string_is_equal(video_driver, "d3d12")
|
||||
|
@ -74,14 +74,6 @@ struct shader_pass
|
||||
#undef VECTOR_LIST_TYPE
|
||||
#undef VECTOR_LIST_NAME
|
||||
|
||||
struct D3D9Vertex
|
||||
{
|
||||
float x, y, z;
|
||||
float u, v;
|
||||
float lut_u, lut_v;
|
||||
float r, g, b, a;
|
||||
};
|
||||
|
||||
typedef struct d3d9_renderchain
|
||||
{
|
||||
unsigned pixel_size;
|
||||
|
@ -72,11 +72,20 @@
|
||||
#error "UWP does not support D3D9"
|
||||
#endif
|
||||
|
||||
#include "d3d_shaders/opaque.cg.d3d9.h"
|
||||
#include "d3d9_renderchain.h"
|
||||
|
||||
/* TODO/FIXME - Temporary workaround for D3D9 not being able to poll flags during init */
|
||||
static gfx_ctx_driver_t d3d9_cg_fake_context;
|
||||
|
||||
struct D3D9CGVertex
|
||||
{
|
||||
float x, y, z;
|
||||
float u, v;
|
||||
float lut_u, lut_v;
|
||||
float r, g, b, a;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib, "cgd3d9")
|
||||
#endif
|
||||
@ -488,7 +497,7 @@ static void d3d9_cg_renderchain_bind_orig(
|
||||
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||
|
||||
d3d9_set_stream_source(chain->dev, index,
|
||||
vert_buf, 0, sizeof(struct D3D9Vertex));
|
||||
vert_buf, 0, sizeof(struct D3D9CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
}
|
||||
}
|
||||
@ -565,7 +574,7 @@ static void d3d9_cg_renderchain_bind_prev(d3d9_renderchain_t *chain,
|
||||
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||
|
||||
d3d9_set_stream_source(chain->dev, index,
|
||||
vert_buf, 0, sizeof(struct D3D9Vertex));
|
||||
vert_buf, 0, sizeof(struct D3D9CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
}
|
||||
}
|
||||
@ -629,7 +638,7 @@ static void d3d9_cg_renderchain_bind_pass(
|
||||
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||
|
||||
d3d9_set_stream_source(chain->dev, index, curr_pass->vertex_buf,
|
||||
0, sizeof(struct D3D9Vertex));
|
||||
0, sizeof(struct D3D9CGVertex));
|
||||
unsigned_vector_list_append(chain->bound_vert, index);
|
||||
}
|
||||
}
|
||||
@ -776,7 +785,7 @@ static bool d3d9_cg_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 D3D9CGVertex),
|
||||
D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL);
|
||||
|
||||
if (!chain->prev.vertex_buf[i])
|
||||
@ -914,61 +923,77 @@ static INLINE void d3d9_cg_renderchain_set_vertices_on_change(
|
||||
unsigned rotation
|
||||
)
|
||||
{
|
||||
struct Vertex vert[4];
|
||||
void *verts = NULL;
|
||||
struct D3D9CGVertex vert[4];
|
||||
unsigned i;
|
||||
void* verts = NULL;
|
||||
const struct
|
||||
LinkInfo *info = (const struct LinkInfo*)&pass->info;
|
||||
float _u = (float)(width) / info->tex_w;
|
||||
float _v = (float)(height) / info->tex_h;
|
||||
LinkInfo* info = (const struct LinkInfo*)&pass->info;
|
||||
float _u = (float)(width) / info->tex_w;
|
||||
float _v = (float)(height) / info->tex_h;
|
||||
|
||||
pass->last_width = width;
|
||||
pass->last_width = width;
|
||||
pass->last_height = height;
|
||||
|
||||
/* Copied from d3d8 driver */
|
||||
vert[0].x = 0.0f;
|
||||
vert[0].y = 1.0f;
|
||||
vert[0].z = 1.0f;
|
||||
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;
|
||||
|
||||
vert[1].x = 1.0f;
|
||||
vert[1].y = 1.0f;
|
||||
vert[1].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[2].x = 0.0f;
|
||||
vert[2].y = 0.0f;
|
||||
vert[2].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[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;
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
vert[i].x -= 0.5f;
|
||||
vert[i].y += 0.5f;
|
||||
}
|
||||
*/
|
||||
|
||||
verts = d3d9_vertex_buffer_lock(pass->vertex_buf);
|
||||
verts = d3d9_vertex_buffer_lock(pass->vertex_buf);
|
||||
memcpy(verts, vert, sizeof(vert));
|
||||
d3d9_vertex_buffer_unlock(pass->vertex_buf);
|
||||
}
|
||||
@ -1014,7 +1039,7 @@ static void d3d9_cg_renderchain_render_pass(
|
||||
for (i = 0; i < 4; i++)
|
||||
d3d9_set_stream_source(chain->dev, i,
|
||||
pass->vertex_buf, 0,
|
||||
sizeof(struct D3D9Vertex));
|
||||
sizeof(struct D3D9CGVertex));
|
||||
|
||||
/* Set orig texture. */
|
||||
d3d9_cg_renderchain_bind_orig(chain, chain->dev, pass);
|
||||
@ -1326,7 +1351,7 @@ static bool d3d9_cg_init_chain(d3d9_video_t *d3d,
|
||||
current_width = out_width;
|
||||
current_height = out_height;
|
||||
|
||||
if (!d3d_cg_renderchain_add_pass(
|
||||
if (!d3d9_cg_renderchain_add_pass(
|
||||
d3d->renderchain_data, &link_info))
|
||||
{
|
||||
RARCH_ERR("[D3D9]: Failed to add pass.\n");
|
||||
@ -1768,7 +1793,7 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
IDirect3DDevice9_Clear(d3d->dev, 0, 0, D3DCLEAR_TARGET,
|
||||
0, 1, 0);
|
||||
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp_transposed, 4);
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp, 4);
|
||||
if (!d3d9_cg_renderchain_render(
|
||||
d3d, frame, frame_width, frame_height,
|
||||
pitch, d3d->dev_rotation))
|
||||
@ -1794,7 +1819,7 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
#ifdef HAVE_OVERLAY
|
||||
if (d3d->overlays_enabled && overlay_behind_menu)
|
||||
{
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp_transposed, 4);
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&d3d->mvp, 4);
|
||||
for (i = 0; i < d3d->overlays_size; i++)
|
||||
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
|
||||
}
|
||||
@ -1804,7 +1829,7 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
if (d3d->menu && d3d->menu->enabled)
|
||||
{
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
|
||||
float*)&d3d->mvp_transposed, 4);
|
||||
float*)&d3d->mvp, 4);
|
||||
d3d9_overlay_render(d3d, width, height, d3d->menu, false);
|
||||
|
||||
d3d->menu_display.offset = 0;
|
||||
@ -1831,7 +1856,7 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
||||
if (d3d->overlays_enabled && !overlay_behind_menu)
|
||||
{
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
|
||||
float*)&d3d->mvp_transposed, 4);
|
||||
float*)&d3d->mvp, 4);
|
||||
for (i = 0; i < d3d->overlays_size; i++)
|
||||
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
|
||||
}
|
||||
|
@ -204,8 +204,9 @@ static void gfx_display_d3d9_cg_draw(gfx_display_ctx_draw_t *draw,
|
||||
0);
|
||||
matrix_4x4_multiply(m1, mop, m2);
|
||||
matrix_4x4_multiply(m2, d3d->mvp_transposed, m1);
|
||||
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&m2, 4);
|
||||
d3d_matrix_transpose(&m1, &m2);
|
||||
|
||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&m1, 4);
|
||||
|
||||
if (draw && draw->texture)
|
||||
gfx_display_d3d9_cg_bind_texture(draw, d3d);
|
||||
@ -264,7 +265,7 @@ static void gfx_display_d3d9_cg_draw_pipeline(gfx_display_ctx_draw_t *draw,
|
||||
}
|
||||
}
|
||||
|
||||
static bool gfx_display_d3d9_font_init_first(
|
||||
static bool gfx_display_d3d9_cg_font_init_first(
|
||||
void **font_handle, void *video_data,
|
||||
const char *font_path, float menu_font_size,
|
||||
bool is_threaded)
|
||||
@ -314,7 +315,7 @@ void gfx_display_d3d9_cg_scissor_end(void *data,
|
||||
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
|
||||
}
|
||||
|
||||
gfx_display_ctx_driver_t gfx_display_ctx_d3d9 = {
|
||||
gfx_display_ctx_driver_t gfx_display_ctx_d3d9_cg = {
|
||||
gfx_display_d3d9_cg_draw,
|
||||
gfx_display_d3d9_cg_draw_pipeline,
|
||||
gfx_display_d3d9_cg_blend_begin,
|
||||
@ -322,7 +323,7 @@ gfx_display_ctx_driver_t gfx_display_ctx_d3d9 = {
|
||||
gfx_display_d3d9_cg_get_default_mvp,
|
||||
gfx_display_d3d9_cg_get_default_vertices,
|
||||
gfx_display_d3d9_cg_get_default_tex_coords,
|
||||
gfx_display_d3d9_font_init_first,
|
||||
gfx_display_d3d9_cg_font_init_first,
|
||||
GFX_VIDEO_DRIVER_DIRECT3D9_CG,
|
||||
"d3d9_cg",
|
||||
false,
|
||||
|
@ -267,7 +267,7 @@ static void gfx_display_d3d9_hlsl_draw_pipeline(
|
||||
}
|
||||
}
|
||||
|
||||
static bool gfx_display_d3d9_font_init_first(
|
||||
static bool gfx_display_d3d9_hlsl_font_init_first(
|
||||
void **font_handle, void *video_data,
|
||||
const char *font_path, float menu_font_size,
|
||||
bool is_threaded)
|
||||
@ -325,7 +325,7 @@ gfx_display_ctx_driver_t gfx_display_ctx_d3d9_hlsl = {
|
||||
gfx_display_d3d9_hlsl_get_default_mvp,
|
||||
gfx_display_d3d9_hlsl_get_default_vertices,
|
||||
gfx_display_d3d9_hlsl_get_default_tex_coords,
|
||||
gfx_display_d3d9_font_init_first,
|
||||
gfx_display_d3d9_hlsl_font_init_first,
|
||||
GFX_VIDEO_DRIVER_DIRECT3D9_HLSL,
|
||||
"d3d9_hlsl",
|
||||
false,
|
||||
|
Loading…
x
Reference in New Issue
Block a user