static bool xdk_renderchain_render(void *data, const void *frame, unsigned frame_width, unsigned frame_height, unsigned pitch, unsigned rotation) { unsigned i; unsigned width, height; uint64_t *frame_count = NULL; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; settings_t *settings = config_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); video_driver_get_size(&width, &height); renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); renderchain_set_vertices(d3d, 1, frame_width, frame_height, *frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); d3d_set_sampler_minfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_sampler_magfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_vertex_declaration(d3dr, chain->vertex_decl); for (i = 0; i < 4; i++) d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); return true; }
static bool xdk_renderchain_render(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { unsigned i; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; renderchain_blit_to_texture(chain, frame, width, height, pitch); renderchain_set_vertices(d3d, 1, width, height); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewport(chain->dev, &d3d->final_viewport); d3d_set_sampler_minfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_sampler_magfilter(d3dr, 0, settings->video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); d3d_set_vertex_declaration(d3dr, chain->vertex_decl); for (i = 0; i < 4; i++) d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); renderchain_set_mvp(d3d, global->video_data.width, global->video_data.height, d3d->dev_rotation); return true; }
static bool cg_d3d9_renderchain_render( void *data, const void *frame_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { Pass *last_pass; LPDIRECT3DDEVICE d3dr; LPDIRECT3DSURFACE back_buffer, target; unsigned i, current_width, current_height, out_width = 0, out_height = 0; d3d_video_t *d3d = (d3d_video_t*)data; cg_renderchain_t *chain = d3d ? (cg_renderchain_t*)d3d->renderchain_data : NULL; if (chain) d3dr = (LPDIRECT3DDEVICE)chain->dev; renderchain_start_render(chain); current_width = width; current_height = height; cg_d3d9_renderchain_convert_geometry(chain, &chain->passes[0].info, &out_width, &out_height, current_width, current_height, chain->final_viewport); renderchain_blit_to_texture(chain, frame_data, width, height, pitch); /* Grab back buffer. */ d3dr->GetRenderTarget(0, &back_buffer); /* In-between render target passes. */ for (i = 0; i < chain->passes.size() - 1; i++) { D3DVIEWPORT viewport = {0}; Pass *from_pass = (Pass*)&chain->passes[i]; Pass *to_pass = (Pass*)&chain->passes[i + 1]; to_pass->tex->GetSurfaceLevel(0, &target); d3dr->SetRenderTarget(0, target); cg_d3d9_renderchain_convert_geometry(chain, &from_pass->info, &out_width, &out_height, current_width, current_height, chain->final_viewport); /* Clear out whole FBO. */ viewport.Width = to_pass->info.tex_w; viewport.Height = to_pass->info.tex_h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; d3d_set_viewports(d3dr, &viewport); d3d_clear(d3dr, 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); last_pass = (Pass*)&chain->passes.back(); cg_d3d9_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->fStock, chain->vStock); renderchain_set_mvp(chain, chain->vStock, chain->final_viewport->Width, chain->final_viewport->Height, 0); 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; }