Merge remote-tracking branch 'upstream/master'

This commit is contained in:
radius 2015-04-06 20:52:03 -05:00
commit 2474c20084
7 changed files with 78 additions and 73 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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