diff --git a/gfx/d3d9/render_chain.cpp b/gfx/d3d9/render_chain.cpp index a6f7ebf2f3..96834a9e16 100644 --- a/gfx/d3d9/render_chain.cpp +++ b/gfx/d3d9/render_chain.cpp @@ -20,8 +20,7 @@ static inline D3DTEXTUREFILTERTYPE translate_filter(unsigned type) { if (type == RARCH_FILTER_UNSPEC) return g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT; - else - return type == RARCH_FILTER_LINEAR ? D3DTEXF_LINEAR : D3DTEXF_POINT; + return type == RARCH_FILTER_LINEAR ? D3DTEXF_LINEAR : D3DTEXF_POINT; } static inline D3DTEXTUREFILTERTYPE translate_filter(bool smooth) @@ -106,13 +105,15 @@ void renderchain_clear(void *data) chain->luts.clear(); } -void renderchain_set_final_viewport(void *data, const D3DVIEWPORT *final_viewport) +void renderchain_set_final_viewport(void *data, + const D3DVIEWPORT *final_viewport) { renderchain_t *chain = (renderchain_t*)data; chain->final_viewport = (D3DVIEWPORT*)final_viewport; } -bool renderchain_set_pass_size(void *data, unsigned pass_index, unsigned width, unsigned height) +bool renderchain_set_pass_size(void *data, unsigned pass_index, + unsigned width, unsigned height) { renderchain_t *chain = (renderchain_t*)data; LPDIRECT3DDEVICE d3dr = chain->dev; @@ -125,7 +126,8 @@ bool renderchain_set_pass_size(void *data, unsigned pass_index, unsigned width, if (FAILED(d3dr->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, - chain->passes.back().info.pass->fbo.fp_fbo ? D3DFMT_A32B32G32R32F : D3DFMT_A8R8G8B8, + chain->passes.back().info.pass->fbo.fp_fbo ? + D3DFMT_A32B32G32R32F : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pass.tex, NULL))) return false; @@ -148,12 +150,15 @@ bool renderchain_add_pass(void *data, const LinkInfo *info) pass.last_width = 0; pass.last_height = 0; - renderchain_compile_shaders(chain, pass.fPrg, pass.vPrg, info->pass->source.path); + renderchain_compile_shaders(chain, pass.fPrg, + pass.vPrg, info->pass->source.path); + if (!renderchain_init_shader_fvf(chain, pass)) return false; if (FAILED(D3DDevice_CreateVertexBuffers(d3dr, 4 * sizeof(Vertex), - d3dr->GetSoftwareVertexProcessing() ? D3DUSAGE_SOFTWAREPROCESSING : 0, + d3dr->GetSoftwareVertexProcessing() + ? D3DUSAGE_SOFTWAREPROCESSING : 0, 0, D3DPOOL_DEFAULT, &pass.vertex_buf, @@ -162,7 +167,8 @@ bool renderchain_add_pass(void *data, const LinkInfo *info) if (FAILED(d3dr->CreateTexture(info->tex_w, info->tex_h, 1, D3DUSAGE_RENDERTARGET, - chain->passes.back().info.pass->fbo.fp_fbo ? D3DFMT_A32B32G32R32F : D3DFMT_A8R8G8B8, + chain->passes.back().info.pass->fbo.fp_fbo + ? D3DFMT_A32B32G32R32F : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pass.tex, NULL))) return false; @@ -251,7 +257,8 @@ bool renderchain_render(void *chain_data, const void *data, unsigned current_height = height; unsigned out_width = 0; unsigned out_height = 0; - renderchain_convert_geometry(chain, &chain->passes[0].info, out_width, out_height, + renderchain_convert_geometry(chain, &chain->passes[0].info, + out_width, out_height, current_width, current_height, chain->final_viewport); #ifdef _XBOX1 d3dr->SetFlickerFilter(g_extern.console.screen.flicker_filter_index); @@ -323,11 +330,13 @@ bool renderchain_render(void *chain_data, const void *data, renderchain_end_render(chain); renderchain_set_shaders(chain, chain->fStock, chain->vStock); - renderchain_set_mvp(chain, chain->vStock, chain->final_viewport->Width, chain->final_viewport->Height, 0); + renderchain_set_mvp(chain, chain->vStock, chain->final_viewport->Width, + chain->final_viewport->Height, 0); return true; } -bool renderchain_create_first_pass(void *data, const LinkInfo *info, PixelFormat fmt) +bool renderchain_create_first_pass(void *data, const LinkInfo *info, + PixelFormat fmt) { renderchain_t *chain = (renderchain_t*)data; D3DXMATRIX ident; @@ -349,32 +358,33 @@ bool renderchain_create_first_pass(void *data, const LinkInfo *info, PixelFormat if (FAILED(d3dr->CreateVertexBuffer( 4 * sizeof(Vertex), - d3dr->GetSoftwareVertexProcessing() ? D3DUSAGE_SOFTWAREPROCESSING : 0, + d3dr->GetSoftwareVertexProcessing() + ? D3DUSAGE_SOFTWAREPROCESSING : 0, 0, D3DPOOL_DEFAULT, &chain->prev.vertex_buf[i], NULL))) - { return false; - } if (FAILED(d3dr->CreateTexture(info->tex_w, info->tex_h, 1, 0, fmt == RGB565 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &chain->prev.tex[i], NULL))) - { return false; - } d3dr->SetTexture(0, chain->prev.tex[i]); - D3DDevice_SetSamplerState_MinFilter(d3dr, 0, translate_filter(info->pass->filter)); - D3DDevice_SetSamplerState_MagFilter(d3dr, 0, translate_filter(info->pass->filter)); + D3DDevice_SetSamplerState_MinFilter(d3dr, 0, + translate_filter(info->pass->filter)); + D3DDevice_SetSamplerState_MagFilter(d3dr, 0, + translate_filter(info->pass->filter)); D3DDevice_SetSamplerState_AddressU(d3dr, 0, D3DTADDRESS_BORDER); D3DDevice_SetSamplerState_AddressV(d3dr, 0, D3DTADDRESS_BORDER); d3dr->SetTexture(0, NULL); } - renderchain_compile_shaders(chain, pass.fPrg, pass.vPrg, info->pass->source.path); + renderchain_compile_shaders(chain, pass.fPrg, + pass.vPrg, info->pass->source.path); + if (!renderchain_init_shader_fvf(chain, pass)) return false; chain->passes.push_back(pass); @@ -431,7 +441,7 @@ void renderchain_set_vertices(void *data, Pass &pass, vert[2].lut_v = 1.0f; vert[3].lut_v = 1.0f; - // Align texels and vertices. + /* Align texels and vertices. */ for (unsigned i = 0; i < 4; i++) { vert[i].x -= 0.5f; @@ -524,7 +534,8 @@ void renderchain_blit_to_texture(void *data, const void *frame, Pass &first = chain->passes[0]; if (first.last_width != width || first.last_height != height) { - D3DTexture_LockRectClear(first, first.tex, 0, d3dlr, NULL, D3DLOCK_NOSYSLOCK); + D3DTexture_LockRectClear(first, first.tex, 0, d3dlr, + NULL, D3DLOCK_NOSYSLOCK); } D3DTexture_Blit(chain, desc, d3dlr, frame, width, height, pitch); @@ -537,8 +548,10 @@ void renderchain_render_pass(void *data, Pass &pass, unsigned pass_index) renderchain_set_shaders(chain, pass.fPrg, pass.vPrg); d3dr->SetTexture(0, pass.tex); - D3DDevice_SetSamplerState_MinFilter(d3dr, 0, translate_filter(pass.info.pass->filter)); - D3DDevice_SetSamplerState_MagFilter(d3dr, 0, translate_filter(pass.info.pass->filter)); + D3DDevice_SetSamplerState_MinFilter(d3dr, 0, + translate_filter(pass.info.pass->filter)); + D3DDevice_SetSamplerState_MagFilter(d3dr, 0, + translate_filter(pass.info.pass->filter)); #ifdef _XBOX1 d3dr->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1); @@ -547,7 +560,8 @@ void renderchain_render_pass(void *data, Pass &pass, unsigned pass_index) #endif for (unsigned i = 0; i < 4; i++) { - D3DDevice_SetStreamSources(d3dr, i, pass.vertex_buf, 0, sizeof(Vertex)); + D3DDevice_SetStreamSources(d3dr, i, + pass.vertex_buf, 0, sizeof(Vertex)); } renderchain_bind_orig(chain, pass); @@ -604,19 +618,24 @@ void renderchain_log_info(void *data, const LinkInfo *info) break; } - RARCH_LOG("\tBilinear filter: %s\n", info->pass->filter == RARCH_FILTER_LINEAR ? "true" : "false"); + RARCH_LOG("\tBilinear filter: %s\n", + info->pass->filter == RARCH_FILTER_LINEAR ? "true" : "false"); } void renderchain_unbind_all(void *data) { renderchain_t *chain = (renderchain_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)chain->dev; - // Have to be a bit anal about it. - // Render targets hate it when they have filters apparently. + + /* Have to be a bit anal about it. + * Render targets hate it when they have filters apparently. + */ for (unsigned i = 0; i < chain->bound_tex.size(); i++) { - D3DDevice_SetSamplerState_MinFilter(d3dr, chain->bound_tex[i], D3DTEXF_POINT); - D3DDevice_SetSamplerState_MagFilter(d3dr, chain->bound_tex[i], D3DTEXF_POINT); + D3DDevice_SetSamplerState_MinFilter(d3dr, + chain->bound_tex[i], D3DTEXF_POINT); + D3DDevice_SetSamplerState_MagFilter(d3dr, + chain->bound_tex[i], D3DTEXF_POINT); d3dr->SetTexture(chain->bound_tex[i], NULL); } diff --git a/gfx/d3d9/render_chain.hpp b/gfx/d3d9/render_chain.hpp index 268596f774..7f93d2e53f 100644 --- a/gfx/d3d9/render_chain.hpp +++ b/gfx/d3d9/render_chain.hpp @@ -101,61 +101,97 @@ typedef struct renderchain } renderchain_t; void renderchain_free(void *data); + bool renderchain_init(void *data, const video_info_t *video_info, LPDIRECT3DDEVICE dev_, CGcontext cgCtx_, const D3DVIEWPORT *final_viewport_, const LinkInfo *info, PixelFormat fmt); + void renderchain_clear(void *data); -void renderchain_set_final_viewport(void *data, const D3DVIEWPORT *final_viewport); -bool renderchain_set_pass_size(void *data, unsigned pass_index, unsigned width, unsigned height); + +void renderchain_set_final_viewport(void *data, + const D3DVIEWPORT *final_viewport); + +bool renderchain_set_pass_size(void *data, unsigned pass_index, + unsigned width, unsigned height); + bool renderchain_add_pass(void *data, const LinkInfo *info); + bool renderchain_add_lut(void *data, const std::string &id, const std::string &path, bool smooth); + void renderchain_add_state_tracker(void *data, state_tracker_t *tracker); + void renderchain_start_render(void *data); + void renderchain_end_render(void *data); + bool renderchain_render(void *chain_data, const void *data, unsigned width, unsigned height, unsigned pitch, unsigned rotation); + D3DTEXTUREFILTERTYPE renderchain_translate_filter(unsigned type); + D3DTEXTUREFILTERTYPE renderchain_translate_filter(bool smooth); -bool renderchain_create_first_pass(void *data, const LinkInfo *info, PixelFormat fmt); + +bool renderchain_create_first_pass(void *data, + const LinkInfo *info, PixelFormat fmt); + void renderchain_set_vertices(void *data, Pass &pass, unsigned width, unsigned height, unsigned out_width, unsigned out_height, unsigned vp_width, unsigned vp_height, unsigned rotation); + void renderchain_set_viewport(void *data, D3DVIEWPORT *vp); + void renderchain_set_mvp(void *data, CGprogram &vPrg, unsigned vp_width, unsigned vp_height, unsigned rotation); + void renderchain_convert_geometry(void *data, const LinkInfo *info, unsigned &out_width, unsigned &out_height, unsigned width, unsigned height, D3DVIEWPORT *final_viewport); + void renderchain_blit_to_texture(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch); + void renderchain_render_pass(void *data, Pass &pass, unsigned pass_index); + void renderchain_log_info(void *data, const LinkInfo *info); + void renderchain_unbind_all(void *data); -bool renderchain_compile_shaders(void *data, CGprogram &fPrg, CGprogram &vPrg, const std::string &shader); +bool renderchain_compile_shaders(void *data, CGprogram &fPrg, + CGprogram &vPrg, const std::string &shader); + void renderchain_set_shaders(void *data, CGprogram &fPrg, CGprogram &vPrg); + void renderchain_destroy_stock_shader(void *data); + void renderchain_destroy_shader(void *data, int i); + void renderchain_set_shader_mvp(void *data, CGprogram &vPrg, D3DXMATRIX &tmp); + void renderchain_set_shader_params(void *data, Pass &pass, unsigned video_w, unsigned video_h, unsigned tex_w, unsigned tex_h, unsigned viewport_w, unsigned viewport_h); + void renderchain_bind_tracker(void *data, Pass &pass, unsigned pass_index); + bool renderchain_init_shader_fvf(void *data, Pass &pass); + void renderchain_bind_orig(void *data, Pass &pass); + void renderchain_bind_prev(void *data, Pass &pass); + void renderchain_bind_luts(void *data, Pass &pass); + void renderchain_bind_pass(void *data, Pass &pass, unsigned pass_index); #endif diff --git a/gfx/d3d9/render_chain_cg.h b/gfx/d3d9/render_chain_cg.h index 016cf45c51..121cd0f4b2 100644 --- a/gfx/d3d9/render_chain_cg.h +++ b/gfx/d3d9/render_chain_cg.h @@ -47,13 +47,16 @@ static inline bool validate_param_name(const char *name) return true; } -static inline CGparameter find_param_from_semantic(CGparameter param, const std::string &sem) +static inline CGparameter find_param_from_semantic( + CGparameter param, const std::string &sem) { while (param) { if (cgGetParameterType(param) == CG_STRUCT) { - CGparameter ret = find_param_from_semantic(cgGetFirstStructParameter(param), sem); + CGparameter ret = find_param_from_semantic( + cgGetFirstStructParameter(param), sem); + if (ret) return ret; } @@ -72,12 +75,15 @@ static inline CGparameter find_param_from_semantic(CGparameter param, const std: return NULL; } -static inline CGparameter find_param_from_semantic(CGprogram prog, const std::string &sem) +static inline CGparameter find_param_from_semantic(CGprogram prog, + const std::string &sem) { - return find_param_from_semantic(cgGetFirstParameter(prog, CG_PROGRAM), sem); + return find_param_from_semantic(cgGetFirstParameter( + prog, CG_PROGRAM), sem); } -bool renderchain_compile_shaders(void *data, CGprogram &fPrg, CGprogram &vPrg, const std::string &shader) +bool renderchain_compile_shaders(void *data, CGprogram &fPrg, + CGprogram &vPrg, const std::string &shader) { renderchain_t *chain = (renderchain_t*)data; CGprofile vertex_profile = cgD3D9GetLatestVertexProfile(); @@ -204,12 +210,15 @@ void renderchain_bind_tracker(void *data, Pass &pass, unsigned pass_index) return; if (pass_index == 1) - chain->uniform_cnt = state_get_uniform(chain->tracker, chain->uniform_info, MAX_VARIABLES, chain->frame_count); + chain->uniform_cnt = state_get_uniform(chain->tracker, + chain->uniform_info, MAX_VARIABLES, chain->frame_count); for (unsigned i = 0; i < chain->uniform_cnt; i++) { - set_cg_param(pass.fPrg, chain->uniform_info[i].id, chain->uniform_info[i].value); - set_cg_param(pass.vPrg, chain->uniform_info[i].id, chain->uniform_info[i].value); + set_cg_param(pass.fPrg, chain->uniform_info[i].id, + chain->uniform_info[i].value); + set_cg_param(pass.vPrg, chain->uniform_info[i].id, + chain->uniform_info[i].value); } } @@ -423,7 +432,9 @@ void renderchain_bind_prev(void *data, Pass &pass) { unsigned index = cgGetParameterResourceIndex(param); - LPDIRECT3DTEXTURE tex = chain->prev.tex[(chain->prev.ptr - (i + 1)) & TEXTURESMASK]; + LPDIRECT3DTEXTURE tex = (LPDIRECT3DTEXTURE) + chain->prev.tex[(chain->prev.ptr - (i + 1)) & TEXTURESMASK]; + chain->dev->SetTexture(index, tex); chain->bound_tex.push_back(index); @@ -439,7 +450,8 @@ void renderchain_bind_prev(void *data, Pass &pass) if (param) { unsigned index = pass.attrib_map[cgGetParameterResourceIndex(param)]; - LPDIRECT3DVERTEXBUFFER vert_buf = chain->prev.vertex_buf[(chain->prev.ptr - (i + 1)) & TEXTURESMASK]; + LPDIRECT3DVERTEXBUFFER vert_buf = (LPDIRECT3DVERTEXBUFFER) + chain->prev.vertex_buf[(chain->prev.ptr - (i + 1)) & TEXTURESMASK]; chain->bound_vert.push_back(index); chain->dev->SetStreamSource(index, vert_buf, 0, sizeof(Vertex)); @@ -452,8 +464,10 @@ void renderchain_bind_luts(void *data, Pass &pass) renderchain_t *chain = (renderchain_t*)data; for (unsigned i = 0; i < chain->luts.size(); i++) { - CGparameter fparam = cgGetNamedParameter(pass.fPrg, chain->luts[i].id.c_str()); + CGparameter fparam = cgGetNamedParameter( + pass.fPrg, chain->luts[i].id.c_str()); int bound_index = -1; + if (fparam) { unsigned index = cgGetParameterResourceIndex(fparam); @@ -463,12 +477,16 @@ void renderchain_bind_luts(void *data, Pass &pass) translate_filter(chain->luts[i].smooth)); chain->dev->SetSamplerState(index, D3DSAMP_MINFILTER, translate_filter(chain->luts[i].smooth)); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, + D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, + D3DTADDRESS_BORDER); chain->bound_tex.push_back(index); } - CGparameter vparam = cgGetNamedParameter(pass.vPrg, chain->luts[i].id.c_str()); + CGparameter vparam = cgGetNamedParameter( + pass.vPrg, chain->luts[i].id.c_str()); + if (vparam) { unsigned index = cgGetParameterResourceIndex(vparam); @@ -479,8 +497,10 @@ void renderchain_bind_luts(void *data, Pass &pass) translate_filter(chain->luts[i].smooth)); chain->dev->SetSamplerState(index, D3DSAMP_MINFILTER, translate_filter(chain->luts[i].smooth)); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, + D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, + D3DTADDRESS_BORDER); chain->bound_tex.push_back(index); } } @@ -490,9 +510,12 @@ void renderchain_bind_luts(void *data, Pass &pass) void renderchain_bind_pass(void *data, Pass &pass, unsigned pass_index) { renderchain_t *chain = (renderchain_t*)data; - // We only bother binding passes which are two indices behind. + if (pass_index < 3) + { + /* We only bother binding passes which are two indices behind. */ return; + } for (unsigned i = 1; i < pass_index - 1; i++) { @@ -530,15 +553,18 @@ void renderchain_bind_pass(void *data, Pass &pass, unsigned pass_index) translate_filter(chain->passes[i].info.pass->filter)); chain->dev->SetSamplerState(index, D3DSAMP_MINFILTER, translate_filter(chain->passes[i].info.pass->filter)); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); - chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSU, + D3DTADDRESS_BORDER); + chain->dev->SetSamplerState(index, D3DSAMP_ADDRESSV, + D3DTADDRESS_BORDER); } param = cgGetNamedParameter(pass.vPrg, attr_tex_coord.c_str()); if (param) { unsigned index = pass.attrib_map[cgGetParameterResourceIndex(param)]; - chain->dev->SetStreamSource(index, chain->passes[i].vertex_buf, 0, sizeof(Vertex)); + chain->dev->SetStreamSource(index, chain->passes[i].vertex_buf, + 0, sizeof(Vertex)); chain->bound_vert.push_back(index); } }