mirror of
https://github.com/libretro/RetroArch
synced 2025-04-18 14:42:30 +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_starts_with_size(video_driver, "d3d", STRLEN_CONST("d3d")))
|
||||||
if (
|
if (
|
||||||
string_is_equal(video_driver, "d3d9_hlsl") ||
|
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, "d3d10") ||
|
||||||
string_is_equal(video_driver, "d3d11") ||
|
string_is_equal(video_driver, "d3d11") ||
|
||||||
string_is_equal(video_driver, "d3d12")
|
string_is_equal(video_driver, "d3d12")
|
||||||
|
@ -74,14 +74,6 @@ struct shader_pass
|
|||||||
#undef VECTOR_LIST_TYPE
|
#undef VECTOR_LIST_TYPE
|
||||||
#undef VECTOR_LIST_NAME
|
#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
|
typedef struct d3d9_renderchain
|
||||||
{
|
{
|
||||||
unsigned pixel_size;
|
unsigned pixel_size;
|
||||||
|
@ -72,11 +72,20 @@
|
|||||||
#error "UWP does not support D3D9"
|
#error "UWP does not support D3D9"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "d3d_shaders/opaque.cg.d3d9.h"
|
||||||
#include "d3d9_renderchain.h"
|
#include "d3d9_renderchain.h"
|
||||||
|
|
||||||
/* TODO/FIXME - Temporary workaround for D3D9 not being able to poll flags during init */
|
/* TODO/FIXME - Temporary workaround for D3D9 not being able to poll flags during init */
|
||||||
static gfx_ctx_driver_t d3d9_cg_fake_context;
|
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
|
#ifdef _MSC_VER
|
||||||
#pragma comment(lib, "cgd3d9")
|
#pragma comment(lib, "cgd3d9")
|
||||||
#endif
|
#endif
|
||||||
@ -488,7 +497,7 @@ static void d3d9_cg_renderchain_bind_orig(
|
|||||||
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||||
|
|
||||||
d3d9_set_stream_source(chain->dev, index,
|
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);
|
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)];
|
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||||
|
|
||||||
d3d9_set_stream_source(chain->dev, index,
|
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);
|
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)];
|
unsigned index = attrib_map->data[cgGetParameterResourceIndex(param)];
|
||||||
|
|
||||||
d3d9_set_stream_source(chain->dev, index, curr_pass->vertex_buf,
|
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);
|
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.last_height[i] = 0;
|
||||||
chain->prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9)
|
chain->prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9)
|
||||||
d3d9_vertex_buffer_new(
|
d3d9_vertex_buffer_new(
|
||||||
chain->dev, 4 * sizeof(struct D3D9Vertex),
|
chain->dev, 4 * sizeof(struct D3D9CGVertex),
|
||||||
D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL);
|
D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL);
|
||||||
|
|
||||||
if (!chain->prev.vertex_buf[i])
|
if (!chain->prev.vertex_buf[i])
|
||||||
@ -914,59 +923,75 @@ static INLINE void d3d9_cg_renderchain_set_vertices_on_change(
|
|||||||
unsigned rotation
|
unsigned rotation
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct Vertex vert[4];
|
struct D3D9CGVertex vert[4];
|
||||||
void *verts = NULL;
|
unsigned i;
|
||||||
|
void* verts = NULL;
|
||||||
const struct
|
const struct
|
||||||
LinkInfo *info = (const struct LinkInfo*)&pass->info;
|
LinkInfo* info = (const struct LinkInfo*)&pass->info;
|
||||||
float _u = (float)(width) / info->tex_w;
|
float _u = (float)(width) / info->tex_w;
|
||||||
float _v = (float)(height) / info->tex_h;
|
float _v = (float)(height) / info->tex_h;
|
||||||
|
|
||||||
pass->last_width = width;
|
pass->last_width = width;
|
||||||
pass->last_height = height;
|
pass->last_height = height;
|
||||||
|
|
||||||
/* Copied from d3d8 driver */
|
|
||||||
vert[0].x = 0.0f;
|
vert[0].x = 0.0f;
|
||||||
vert[0].y = 1.0f;
|
vert[0].y = out_height;
|
||||||
vert[0].z = 1.0f;
|
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].x = out_width;
|
||||||
vert[1].y = 1.0f;
|
vert[1].y = out_height;
|
||||||
vert[1].z = 1.0f;
|
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].x = 0.0f;
|
||||||
vert[2].y = 0.0f;
|
vert[2].y = 0.0f;
|
||||||
vert[2].z = 1.0f;
|
vert[2].z = 0.5f;
|
||||||
|
|
||||||
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[2].u = 0.0f;
|
||||||
vert[1].u = _u;
|
|
||||||
vert[2].v = _v;
|
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 = out_width;
|
||||||
|
vert[3].y = 0.0f;
|
||||||
|
vert[3].z = 0.5f;
|
||||||
vert[3].u = _u;
|
vert[3].u = _u;
|
||||||
vert[3].v = _v;
|
vert[3].v = _v;
|
||||||
|
vert[3].lut_u = 1.0f;
|
||||||
vert[0].color = 0xFFFFFFFF;
|
vert[3].lut_v = 1.0f;
|
||||||
vert[1].color = 0xFFFFFFFF;
|
vert[3].r = 1.0f;
|
||||||
vert[2].color = 0xFFFFFFFF;
|
vert[3].g = 1.0f;
|
||||||
vert[3].color = 0xFFFFFFFF;
|
vert[3].b = 1.0f;
|
||||||
|
vert[3].a = 1.0f;
|
||||||
|
|
||||||
/* Align texels and vertices.
|
/* Align texels and vertices.
|
||||||
*
|
*
|
||||||
* Fixes infamous 'half-texel offset' issue of D3D9
|
* Fixes infamous 'half-texel offset' issue of D3D9
|
||||||
* http://msdn.microsoft.com/en-us/library/bb219690%28VS.85%29.aspx.
|
* 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++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
vert[i].x -= 0.5f;
|
vert[i].x -= 0.5f;
|
||||||
vert[i].y += 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));
|
memcpy(verts, vert, sizeof(vert));
|
||||||
@ -1014,7 +1039,7 @@ static void d3d9_cg_renderchain_render_pass(
|
|||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
d3d9_set_stream_source(chain->dev, i,
|
d3d9_set_stream_source(chain->dev, i,
|
||||||
pass->vertex_buf, 0,
|
pass->vertex_buf, 0,
|
||||||
sizeof(struct D3D9Vertex));
|
sizeof(struct D3D9CGVertex));
|
||||||
|
|
||||||
/* Set orig texture. */
|
/* Set orig texture. */
|
||||||
d3d9_cg_renderchain_bind_orig(chain, chain->dev, pass);
|
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_width = out_width;
|
||||||
current_height = out_height;
|
current_height = out_height;
|
||||||
|
|
||||||
if (!d3d_cg_renderchain_add_pass(
|
if (!d3d9_cg_renderchain_add_pass(
|
||||||
d3d->renderchain_data, &link_info))
|
d3d->renderchain_data, &link_info))
|
||||||
{
|
{
|
||||||
RARCH_ERR("[D3D9]: Failed to add pass.\n");
|
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,
|
IDirect3DDevice9_Clear(d3d->dev, 0, 0, D3DCLEAR_TARGET,
|
||||||
0, 1, 0);
|
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(
|
if (!d3d9_cg_renderchain_render(
|
||||||
d3d, frame, frame_width, frame_height,
|
d3d, frame, frame_width, frame_height,
|
||||||
pitch, d3d->dev_rotation))
|
pitch, d3d->dev_rotation))
|
||||||
@ -1794,7 +1819,7 @@ static bool d3d9_cg_frame(void *data, const void *frame,
|
|||||||
#ifdef HAVE_OVERLAY
|
#ifdef HAVE_OVERLAY
|
||||||
if (d3d->overlays_enabled && overlay_behind_menu)
|
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++)
|
for (i = 0; i < d3d->overlays_size; i++)
|
||||||
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
|
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)
|
if (d3d->menu && d3d->menu->enabled)
|
||||||
{
|
{
|
||||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
|
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);
|
d3d9_overlay_render(d3d, width, height, d3d->menu, false);
|
||||||
|
|
||||||
d3d->menu_display.offset = 0;
|
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)
|
if (d3d->overlays_enabled && !overlay_behind_menu)
|
||||||
{
|
{
|
||||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const
|
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++)
|
for (i = 0; i < d3d->overlays_size; i++)
|
||||||
d3d9_overlay_render(d3d, width, height, &d3d->overlays[i], true);
|
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);
|
0);
|
||||||
matrix_4x4_multiply(m1, mop, m2);
|
matrix_4x4_multiply(m1, mop, m2);
|
||||||
matrix_4x4_multiply(m2, d3d->mvp_transposed, m1);
|
matrix_4x4_multiply(m2, d3d->mvp_transposed, m1);
|
||||||
|
d3d_matrix_transpose(&m1, &m2);
|
||||||
|
|
||||||
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&m2, 4);
|
d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)&m1, 4);
|
||||||
|
|
||||||
if (draw && draw->texture)
|
if (draw && draw->texture)
|
||||||
gfx_display_d3d9_cg_bind_texture(draw, d3d);
|
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,
|
void **font_handle, void *video_data,
|
||||||
const char *font_path, float menu_font_size,
|
const char *font_path, float menu_font_size,
|
||||||
bool is_threaded)
|
bool is_threaded)
|
||||||
@ -314,7 +315,7 @@ void gfx_display_d3d9_cg_scissor_end(void *data,
|
|||||||
IDirect3DDevice9_SetScissorRect(d3d9->dev, &rect);
|
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,
|
||||||
gfx_display_d3d9_cg_draw_pipeline,
|
gfx_display_d3d9_cg_draw_pipeline,
|
||||||
gfx_display_d3d9_cg_blend_begin,
|
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_mvp,
|
||||||
gfx_display_d3d9_cg_get_default_vertices,
|
gfx_display_d3d9_cg_get_default_vertices,
|
||||||
gfx_display_d3d9_cg_get_default_tex_coords,
|
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,
|
GFX_VIDEO_DRIVER_DIRECT3D9_CG,
|
||||||
"d3d9_cg",
|
"d3d9_cg",
|
||||||
false,
|
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,
|
void **font_handle, void *video_data,
|
||||||
const char *font_path, float menu_font_size,
|
const char *font_path, float menu_font_size,
|
||||||
bool is_threaded)
|
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_mvp,
|
||||||
gfx_display_d3d9_hlsl_get_default_vertices,
|
gfx_display_d3d9_hlsl_get_default_vertices,
|
||||||
gfx_display_d3d9_hlsl_get_default_tex_coords,
|
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,
|
GFX_VIDEO_DRIVER_DIRECT3D9_HLSL,
|
||||||
"d3d9_hlsl",
|
"d3d9_hlsl",
|
||||||
false,
|
false,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user