static void d3d_recompute_pass_sizes(d3d_video_t *d3d) { unsigned i; LinkInfo link_info = {0}; link_info.pass = &d3d->shader.pass[0]; link_info.tex_w = link_info.tex_h = d3d->video_info.input_scale * RARCH_SCALE_BASE; unsigned current_width = link_info.tex_w; unsigned current_height = link_info.tex_h; unsigned out_width = 0; unsigned out_height = 0; if (!renderchain_set_pass_size(d3d->chain, 0, current_width, current_height)) { RARCH_ERR("[D3D]: Failed to set pass size.\n"); return; } for (i = 1; i < d3d->shader.passes; i++) { renderchain_convert_geometry(d3d->chain, &link_info, out_width, out_height, current_width, current_height, &d3d->final_viewport); link_info.tex_w = next_pow2(out_width); link_info.tex_h = next_pow2(out_height); if (!renderchain_set_pass_size(d3d->chain, i, link_info.tex_w, link_info.tex_h)) { RARCH_ERR("[D3D]: Failed to set pass size.\n"); return; } current_width = out_width; current_height = out_height; link_info.pass = &d3d->shader.pass[i]; } }
bool d3d_init_chain(void *data, const video_info_t *video_info) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; // Setup information for first pass. LinkInfo link_info = {0}; link_info.pass = &d3d->shader.pass[0]; link_info.tex_w = link_info.tex_h = video_info->input_scale * RARCH_SCALE_BASE; d3d_deinit_chain(d3d); d3d->chain = new renderchain_t(); if (!d3d->chain) return false; if (!renderchain_init(d3d->chain, &d3d->video_info, d3dr, d3d->cgCtx, &d3d->final_viewport, &link_info, d3d->video_info.rgb32 ? ARGB : RGB565)) { RARCH_ERR("[D3D9]: Failed to init render chain.\n"); return false; } unsigned current_width = link_info.tex_w; unsigned current_height = link_info.tex_h; unsigned out_width = 0; unsigned out_height = 0; for (unsigned i = 1; i < d3d->shader.passes; i++) { renderchain_convert_geometry(d3d->chain, &link_info, out_width, out_height, current_width, current_height, &d3d->final_viewport); link_info.pass = &d3d->shader.pass[i]; link_info.tex_w = next_pow2(out_width); link_info.tex_h = next_pow2(out_height); current_width = out_width; current_height = out_height; if (!renderchain_add_pass(d3d->chain, &link_info)) { RARCH_ERR("[D3D9]: Failed to add pass.\n"); return false; } } if (!d3d_init_luts(d3d)) { RARCH_ERR("[D3D9]: Failed to init LUTs.\n"); return false; } #ifndef DONT_HAVE_STATE_TRACKER if (!d3d_init_imports(d3d)) { RARCH_ERR("[D3D9]: Failed to init imports.\n"); return false; } #endif return true; }
bool renderchain_render(void *chain_data, const void *data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { renderchain_t *chain = (renderchain_t*)chain_data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)chain->dev; renderchain_start_render(chain); unsigned current_width = width; unsigned current_height = height; unsigned out_width = 0; unsigned out_height = 0; 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); d3dr->SetSoftDisplayFilter(g_extern.lifecycle_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE)); #endif renderchain_blit_to_texture(chain, data, width, height, pitch); // Grab back buffer. LPDIRECT3DSURFACE back_buffer; d3dr->GetRenderTarget(0, &back_buffer); // In-between render target passes. for (unsigned i = 0; i < chain->passes.size() - 1; i++) { Pass &from_pass = chain->passes[i]; Pass &to_pass = chain->passes[i + 1]; LPDIRECT3DSURFACE target; to_pass.tex->GetSurfaceLevel(0, &target); d3dr->SetRenderTarget(0, target); renderchain_convert_geometry(chain, &from_pass.info, out_width, out_height, current_width, current_height, chain->final_viewport); // Clear out whole FBO. D3DVIEWPORT viewport = {0}; viewport.Width = to_pass.info.tex_w; viewport.Height = to_pass.info.tex_h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; d3dr->SetViewport(&viewport); d3dr->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0); viewport.Width = out_width; viewport.Height = out_height; renderchain_set_viewport(chain, &viewport); renderchain_set_vertices(chain, from_pass, current_width, current_height, out_width, out_height, out_width, out_height, 0); renderchain_render_pass(chain, from_pass, i + 1); current_width = out_width; current_height = out_height; target->Release(); } // Final pass d3dr->SetRenderTarget(0, back_buffer); Pass &last_pass = chain->passes.back(); renderchain_convert_geometry(chain, &last_pass.info, out_width, out_height, current_width, current_height, chain->final_viewport); renderchain_set_viewport(chain, chain->final_viewport); renderchain_set_vertices(chain, last_pass, current_width, current_height, out_width, out_height, chain->final_viewport->Width, chain->final_viewport->Height, rotation); renderchain_render_pass(chain, last_pass, chain->passes.size()); chain->frame_count++; back_buffer->Release(); 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); return true; }