mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-13 16:01:05 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
2474c20084
@ -878,16 +878,16 @@ static bool d3d_init_chain(d3d_video_t *d3d, const video_info_t *video_info)
|
||||
|
||||
RARCH_LOG("Renderchain driver: %s\n", d3d->renderchain_driver->ident);
|
||||
|
||||
if (!d3d->renderchain_driver->init_shader(d3d))
|
||||
if (!d3d->renderchain_driver->init_shader(d3d, d3d->renderchain_data))
|
||||
{
|
||||
RARCH_ERR("Failed to initialize shader subsystem.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef _XBOX
|
||||
if (!d3d->renderchain_driver->init(d3d, video_info,
|
||||
if (!d3d->renderchain_driver->init(d3d, &d3d->video_info,
|
||||
d3dr, &d3d->final_viewport, &link_info,
|
||||
video_info->rgb32 ?
|
||||
d3d->video_info.rgb32 ?
|
||||
RETRO_PIXEL_FORMAT_XRGB8888 : RETRO_PIXEL_FORMAT_RGB565))
|
||||
#else
|
||||
if (!d3d->renderchain_driver->init(d3d->renderchain_data, &d3d->video_info,
|
||||
@ -1233,8 +1233,7 @@ static void d3d_overlay_render(d3d_video_t *d3d, overlay_t *overlay)
|
||||
if (!overlay->vert_buf)
|
||||
{
|
||||
overlay->vert_buf = (LPDIRECT3DVERTEXBUFFER)d3d_vertex_buffer_new(
|
||||
d3d->dev, sizeof(vert), d3d->dev->GetSoftwareVertexProcessing() ?
|
||||
D3DUSAGE_SOFTWAREPROCESSING : 0, 0, D3DPOOL_MANAGED, NULL);
|
||||
d3d->dev, sizeof(vert), 0, 0, D3DPOOL_MANAGED, NULL);
|
||||
|
||||
if (!overlay->vert_buf)
|
||||
return;
|
||||
@ -1770,7 +1769,11 @@ static void d3d_set_menu_texture_frame(void *data,
|
||||
|
||||
d3d->menu->alpha_mod = alpha;
|
||||
|
||||
#ifdef _XBOX
|
||||
d3d->menu->tex->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
|
||||
#else
|
||||
if (SUCCEEDED(d3d->menu->tex->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK)))
|
||||
#endif
|
||||
{
|
||||
unsigned h, w;
|
||||
if (rgb32)
|
||||
|
@ -91,11 +91,18 @@ void d3d_texture_free(LPDIRECT3DTEXTURE tex)
|
||||
}
|
||||
|
||||
LPDIRECT3DVERTEXBUFFER d3d_vertex_buffer_new(LPDIRECT3DDEVICE dev,
|
||||
unsigned length, unsigned usage, unsigned fvf,
|
||||
D3DPOOL pool, void *handle)
|
||||
unsigned length, unsigned usage,
|
||||
unsigned fvf, D3DPOOL pool, void *handle)
|
||||
{
|
||||
HRESULT hr;
|
||||
LPDIRECT3DVERTEXBUFFER buf;
|
||||
#ifndef _XBOX
|
||||
if (usage == 0)
|
||||
{
|
||||
if (dev->GetSoftwareVertexProcessing())
|
||||
usage = D3DUSAGE_SOFTWAREPROCESSING;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_D3D8)
|
||||
hr = IDirect3DDevice8_CreateVertexBuffer(dev, length, usage, fvf, pool,
|
||||
@ -381,3 +388,18 @@ void d3d_disable_blend_func(void *data)
|
||||
|
||||
dev->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
|
||||
}
|
||||
|
||||
void d3d_set_vertex_declaration(void *data, void *vertex_data)
|
||||
{
|
||||
LPDIRECT3DDEVICE dev = (LPDIRECT3DDEVICE)data;
|
||||
#if defined(HAVE_D3D9)
|
||||
LPDIRECT3DVERTEXDECLARATION decl = (LPDIRECT3DVERTEXDECLARATION)vertex_data;
|
||||
#endif
|
||||
if (!dev)
|
||||
return;
|
||||
#ifdef _XBOX1
|
||||
d3d_set_vertex_shader(dev, D3DFVF_XYZ | D3DFVF_TEX1, NULL);
|
||||
#elif defined(HAVE_D3D9)
|
||||
dev->SetVertexDeclaration(decl);
|
||||
#endif
|
||||
}
|
||||
|
@ -87,4 +87,6 @@ void d3d_enable_blend_func(void *data);
|
||||
|
||||
void d3d_disable_blend_func(void *data);
|
||||
|
||||
void d3d_set_vertex_declaration(void *data, void *vertex_data);
|
||||
|
||||
#endif
|
||||
|
@ -42,9 +42,7 @@ struct Pass
|
||||
LPDIRECT3DVERTEXBUFFER vertex_buf;
|
||||
CGprogram vPrg, fPrg;
|
||||
unsigned last_width, last_height;
|
||||
#ifdef HAVE_D3D9
|
||||
LPDIRECT3DVERTEXDECLARATION vertex_decl;
|
||||
#endif
|
||||
std::vector<unsigned> attrib_map;
|
||||
};
|
||||
|
||||
@ -71,10 +69,9 @@ typedef struct cg_renderchain
|
||||
unsigned frame_count;
|
||||
std::vector<unsigned> bound_tex;
|
||||
std::vector<unsigned> bound_vert;
|
||||
CGcontext cgCtx;
|
||||
} cg_renderchain_t;
|
||||
|
||||
static CGcontext cgCtx;
|
||||
|
||||
static INLINE D3DTEXTUREFILTERTYPE translate_filter(unsigned type)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
@ -201,33 +198,33 @@ static bool renderchain_compile_shaders(void *data,
|
||||
if (shader.length() > 0)
|
||||
{
|
||||
RARCH_LOG("[D3D Cg]: Compiling shader: %s.\n", shader.c_str());
|
||||
*fPrg = cgCreateProgramFromFile(cgCtx, CG_SOURCE,
|
||||
*fPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
|
||||
shader.c_str(), fragment_profile, "main_fragment", fragment_opts);
|
||||
|
||||
if (cgGetLastListing(cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(cgCtx));
|
||||
if (cgGetLastListing(chain->cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(chain->cgCtx));
|
||||
|
||||
*vPrg = cgCreateProgramFromFile(cgCtx, CG_SOURCE,
|
||||
*vPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
|
||||
shader.c_str(), vertex_profile, "main_vertex", vertex_opts);
|
||||
|
||||
if (cgGetLastListing(cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(cgCtx));
|
||||
if (cgGetLastListing(chain->cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(chain->cgCtx));
|
||||
}
|
||||
else
|
||||
{
|
||||
RARCH_LOG("[D3D Cg]: Compiling stock shader.\n");
|
||||
|
||||
*fPrg = cgCreateProgram(cgCtx, CG_SOURCE, stock_program,
|
||||
*fPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_program,
|
||||
fragment_profile, "main_fragment", fragment_opts);
|
||||
|
||||
if (cgGetLastListing(cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(cgCtx));
|
||||
if (cgGetLastListing(chain->cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(chain->cgCtx));
|
||||
|
||||
*vPrg = cgCreateProgram(cgCtx, CG_SOURCE, stock_program,
|
||||
*vPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_program,
|
||||
vertex_profile, "main_vertex", vertex_opts);
|
||||
|
||||
if (cgGetLastListing(cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(cgCtx));
|
||||
if (cgGetLastListing(chain->cgCtx))
|
||||
RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(chain->cgCtx));
|
||||
}
|
||||
|
||||
if (!fPrg || !vPrg)
|
||||
@ -741,15 +738,16 @@ static void cg_d3d9_renderchain_clear(void *data)
|
||||
chain->luts.clear();
|
||||
}
|
||||
|
||||
static void cg_d3d9_renderchain_deinit_shader(void)
|
||||
static void cg_d3d9_renderchain_deinit_shader(void *data)
|
||||
{
|
||||
if (!cgCtx)
|
||||
cg_renderchain_t *chain = (cg_renderchain_t*)data;
|
||||
if (!chain->cgCtx)
|
||||
return;
|
||||
|
||||
cgD3D9UnloadAllPrograms();
|
||||
cgD3D9SetDevice(NULL);
|
||||
cgDestroyContext(cgCtx);
|
||||
cgCtx = NULL;
|
||||
cgDestroyContext(chain->cgCtx);
|
||||
chain->cgCtx = NULL;
|
||||
}
|
||||
|
||||
static void cg_d3d9_renderchain_deinit(void *data)
|
||||
@ -767,7 +765,7 @@ void cg_d3d9_renderchain_free(void *data)
|
||||
if (!chain)
|
||||
return;
|
||||
|
||||
cg_d3d9_renderchain_deinit_shader();
|
||||
cg_d3d9_renderchain_deinit_shader(chain);
|
||||
#if 0
|
||||
cg_d3d9_renderchain_clear(chain);
|
||||
cg_d3d9_renderchain_destroy_stock_shader(chain);
|
||||
@ -786,16 +784,17 @@ void *cg_d3d9_renderchain_new(void)
|
||||
return renderchain;
|
||||
}
|
||||
|
||||
|
||||
static bool cg_d3d9_renderchain_init_shader(void *data)
|
||||
static bool cg_d3d9_renderchain_init_shader(void *data,
|
||||
void *renderchain_data)
|
||||
{
|
||||
d3d_video_t *d3d = (d3d_video_t*)data;
|
||||
d3d_video_t *d3d = (d3d_video_t*)data;
|
||||
cg_renderchain_t *renderchain = (cg_renderchain_t*)renderchain_data;
|
||||
|
||||
if (!d3d)
|
||||
if (!d3d || !renderchain)
|
||||
return false;
|
||||
|
||||
cgCtx = cgCreateContext();
|
||||
if (!cgCtx)
|
||||
renderchain->cgCtx = cgCreateContext();
|
||||
if (!renderchain->cgCtx)
|
||||
return false;
|
||||
|
||||
RARCH_LOG("[D3D]: Created shader context.\n");
|
||||
@ -883,12 +882,7 @@ static bool renderchain_create_first_pass(void *data, const void *info_data,
|
||||
chain->prev.last_width[i] = 0;
|
||||
chain->prev.last_height[i] = 0;
|
||||
chain->prev.vertex_buf[i] = d3d_vertex_buffer_new(
|
||||
d3dr, 4 * sizeof(Vertex),
|
||||
d3dr->GetSoftwareVertexProcessing()
|
||||
? D3DUSAGE_SOFTWAREPROCESSING : 0,
|
||||
0,
|
||||
D3DPOOL_DEFAULT,
|
||||
NULL);
|
||||
d3dr, 4 * sizeof(Vertex), 0, 0, D3DPOOL_DEFAULT, NULL);
|
||||
|
||||
if (!chain->prev.vertex_buf[i])
|
||||
return false;
|
||||
@ -1103,8 +1097,7 @@ static bool cg_d3d9_renderchain_add_pass(void *data, const void *info_data)
|
||||
return false;
|
||||
|
||||
pass.vertex_buf = (LPDIRECT3DVERTEXBUFFER)d3d_vertex_buffer_new(d3dr, 4 * sizeof(Vertex),
|
||||
d3dr->GetSoftwareVertexProcessing() ? D3DUSAGE_SOFTWAREPROCESSING : 0,
|
||||
0, D3DPOOL_DEFAULT, NULL);
|
||||
0, 0, D3DPOOL_DEFAULT, NULL);
|
||||
|
||||
if (!pass.vertex_buf)
|
||||
return false;
|
||||
@ -1215,11 +1208,8 @@ static void renderchain_set_mvp(void *data, void *vertex_program,
|
||||
return;
|
||||
|
||||
D3DXMatrixOrthoOffCenterLH(&ortho, 0, vp_width, 0, vp_height, 0, 1);
|
||||
|
||||
if (rotation)
|
||||
D3DXMatrixRotationZ(&rot, rotation * (M_PI / 2.0));
|
||||
else
|
||||
D3DXMatrixIdentity(&rot);
|
||||
D3DXMatrixIdentity(&rot);
|
||||
D3DXMatrixRotationZ(&rot, rotation * (M_PI / 2.0));
|
||||
|
||||
D3DXMatrixMultiply(&proj, &ortho, &rot);
|
||||
D3DXMatrixTranspose(&tmp, &proj);
|
||||
@ -1374,11 +1364,7 @@ static void renderchain_render_pass(void *data, void *pass_data, unsigned pass_i
|
||||
d3d_set_sampler_magfilter(d3dr, 0,
|
||||
translate_filter(pass->info.pass->filter));
|
||||
|
||||
#ifdef _XBOX1
|
||||
d3d_set_vertex_shader(d3dr, D3DFVF_XYZ | D3DFVF_TEX1, NULL);
|
||||
#else
|
||||
d3dr->SetVertexDeclaration(pass->vertex_decl);
|
||||
#endif
|
||||
d3d_set_vertex_declaration(d3dr, pass->vertex_decl);
|
||||
for (i = 0; i < 4; i++)
|
||||
d3d_set_stream_source(d3dr, i,
|
||||
pass->vertex_buf, 0, sizeof(Vertex));
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "../video_state_tracker.h"
|
||||
#include "../video_shader_parse.h"
|
||||
#include "../../libretro.h"
|
||||
#include "d3d_defines.h"
|
||||
|
||||
struct LinkInfo
|
||||
{
|
||||
@ -39,7 +40,7 @@ typedef struct renderchain_driver
|
||||
{
|
||||
void (*chain_free)(void *data);
|
||||
void *(*chain_new)(void);
|
||||
bool (*init_shader)(void *data);
|
||||
bool (*init_shader)(void *data, void *renderchain_data);
|
||||
bool (*init_shader_fvf)(void *data, void *pass_data);
|
||||
bool (*reinit)(void *data, const void *info_data);
|
||||
bool (*init)(void *data,
|
||||
|
@ -27,14 +27,6 @@ static void null_renderchain_free(void *data)
|
||||
{
|
||||
}
|
||||
|
||||
static void null_renderchain_deinit(void *data)
|
||||
{
|
||||
null_renderchain_t *renderchain = (null_renderchain_t*)data;
|
||||
|
||||
if (renderchain)
|
||||
free(renderchain);
|
||||
}
|
||||
|
||||
static void *null_renderchain_new(void)
|
||||
{
|
||||
null_renderchain_t *renderchain = (null_renderchain_t*)calloc(1, sizeof(*renderchain));
|
||||
@ -44,7 +36,7 @@ static void *null_renderchain_new(void)
|
||||
return renderchain;
|
||||
}
|
||||
|
||||
static bool null_renderchain_init_shader(void *data)
|
||||
static bool null_renderchain_init_shader(void *data, void *renderchain_data)
|
||||
{
|
||||
(void)data;
|
||||
|
||||
|
@ -22,6 +22,8 @@ typedef struct xdk_renderchain
|
||||
{
|
||||
void *empty;
|
||||
unsigned pixel_size;
|
||||
LPDIRECT3DDEVICE dev;
|
||||
const video_info_t *video_info;
|
||||
LPDIRECT3DTEXTURE tex;
|
||||
LPDIRECT3DVERTEXBUFFER vertex_buf;
|
||||
unsigned last_width;
|
||||
@ -284,7 +286,7 @@ void *xdk_renderchain_new(void)
|
||||
return renderchain;
|
||||
}
|
||||
|
||||
static bool xdk_renderchain_init_shader(void *data)
|
||||
static bool xdk_renderchain_init_shader(void *data, void *renderchain_data)
|
||||
{
|
||||
const char *shader_path = NULL;
|
||||
d3d_video_t *d3d = (d3d_video_t*)data;
|
||||
@ -308,7 +310,7 @@ static bool xdk_renderchain_init_shader(void *data)
|
||||
}
|
||||
|
||||
static bool xdk_renderchain_init(void *data,
|
||||
const void *_info,
|
||||
const void *_video_info,
|
||||
void *dev_data,
|
||||
const void *final_viewport_data,
|
||||
const void *info_data,
|
||||
@ -318,18 +320,19 @@ static bool xdk_renderchain_init(void *data,
|
||||
d3d_video_t *chain = (d3d_video_t*)data;
|
||||
LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)chain->dev;
|
||||
global_t *global = global_get_ptr();
|
||||
const video_info_t *info = (const video_info_t*)_info;
|
||||
const video_info_t *video_info = (const video_info_t*)_video_info;
|
||||
const LinkInfo *link_info = (const LinkInfo*)info_data;
|
||||
chain->pixel_size = fmt ? sizeof(uint32_t) : sizeof(uint16_t);
|
||||
|
||||
(void)dev_data;
|
||||
(void)final_viewport_data;
|
||||
(void)fmt;
|
||||
|
||||
chain->dev = (LPDIRECT3DDEVICE)dev_data;
|
||||
//chain->video_info = video_info;
|
||||
chain->pixel_size = (fmt == RETRO_PIXEL_FORMAT_RGB565) ? 2 : 4;
|
||||
chain->tex_w = link_info->tex_w;
|
||||
chain->tex_h = link_info->tex_h;
|
||||
|
||||
if (!renderchain_create_first_pass(chain, info))
|
||||
if (!renderchain_create_first_pass(chain, video_info))
|
||||
return false;
|
||||
|
||||
if (global->console.screen.viewports.custom_vp.width == 0)
|
||||
@ -370,11 +373,7 @@ static bool xdk_renderchain_render(void *data, const void *frame,
|
||||
d3d_set_sampler_magfilter(d3dr, 0, settings->video.smooth ?
|
||||
D3DTEXF_LINEAR : D3DTEXF_POINT);
|
||||
|
||||
#if defined(_XBOX1)
|
||||
d3d_set_vertex_shader(d3dr, D3DFVF_XYZ | D3DFVF_TEX1, NULL);
|
||||
#elif defined(_XBOX360)
|
||||
D3DDevice_SetVertexDeclaration(d3dr, d3d->vertex_decl);
|
||||
#endif
|
||||
d3d_set_vertex_declaration(d3dr, d3d->vertex_decl);
|
||||
for (i = 0; i < 4; i++)
|
||||
d3d_set_stream_source(d3dr, i, d3d->vertex_buf, 0, sizeof(Vertex));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user