static void menu_display_d3d9_clear_color( menu_display_ctx_clearcolor_t *clearcolor, video_frame_info_t *video_info) { LPDIRECT3DDEVICE9 dev; DWORD clear_color = 0; d3d9_video_t *d3d = video_info ? (d3d9_video_t*)video_info->userdata : NULL; if (!d3d || !clearcolor) return; dev = (LPDIRECT3DDEVICE9)d3d->dev; clear_color = D3DCOLOR_ARGB( BYTE_CLAMP(clearcolor->a * 255.0f), /* A */ BYTE_CLAMP(clearcolor->r * 255.0f), /* R */ BYTE_CLAMP(clearcolor->g * 255.0f), /* G */ BYTE_CLAMP(clearcolor->b * 255.0f) /* B */ ); d3d9_clear(dev, 0, NULL, D3D_COMM_CLEAR_TARGET, clear_color, 0, 0); }
static bool d3d9_cg_renderchain_render( d3d9_video_t *d3d, const video_frame_info_t *video_info, state_tracker_t *tracker, const void *frame_data, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { LPDIRECT3DSURFACE9 back_buffer, target; unsigned i, current_width, current_height, out_width = 0, out_height = 0; struct shader_pass *last_pass = NULL; struct shader_pass *first_pass = NULL; cg_renderchain_t *_chain = (cg_renderchain_t*)d3d->renderchain_data; d3d9_renderchain_t *chain = (d3d9_renderchain_t*)&_chain->chain; d3d9_renderchain_start_render(chain); current_width = width; current_height = height; first_pass = (struct shader_pass*)&chain->passes->data[0]; d3d9_convert_geometry( &first_pass->info, &out_width, &out_height, current_width, current_height, chain->final_viewport); d3d9_renderchain_blit_to_texture(first_pass->tex, frame_data, first_pass->info.tex_w, first_pass->info.tex_h, width, height, first_pass->last_width, first_pass->last_height, pitch, chain->pixel_size); /* Grab back buffer. */ d3d9_device_get_render_target(chain->dev, 0, (void**)&back_buffer); /* In-between render target passes. */ for (i = 0; i < chain->passes->count - 1; i++) { D3DVIEWPORT9 viewport = {0}; struct shader_pass *from_pass = (struct shader_pass*)&chain->passes->data[i]; struct shader_pass *to_pass = (struct shader_pass*)&chain->passes->data[i + 1]; d3d9_texture_get_surface_level(to_pass->tex, 0, (void**)&target); d3d9_device_set_render_target(chain->dev, 0, (void*)target); d3d9_convert_geometry(&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; d3d9_set_viewports(chain->dev, &viewport); d3d9_clear(chain->dev, 0, 0, D3DCLEAR_TARGET, 0, 1, 0); viewport.Width = out_width; viewport.Height = out_height; d3d9_set_viewports(chain->dev, &viewport); d3d9_cg_renderchain_set_vertices( chain, from_pass, current_width, current_height, out_width, out_height, out_width, out_height, 0); d3d9_cg_renderchain_render_pass(chain, from_pass, tracker, i + 1); current_width = out_width; current_height = out_height; d3d9_surface_free(target); } /* Final pass */ d3d9_device_set_render_target(chain->dev, 0, (void*)back_buffer); last_pass = (struct shader_pass*)&chain->passes-> data[chain->passes->count - 1]; d3d9_convert_geometry(&last_pass->info, &out_width, &out_height, current_width, current_height, chain->final_viewport); d3d9_set_viewports(chain->dev, chain->final_viewport); d3d9_cg_renderchain_set_vertices( chain, last_pass, current_width, current_height, out_width, out_height, chain->final_viewport->Width, chain->final_viewport->Height, rotation); d3d9_cg_renderchain_render_pass(chain, last_pass, tracker, chain->passes->count); chain->frame_count++; d3d9_surface_free(back_buffer); d3d9_renderchain_end_render(chain); d3d9_cg_bind_program(&_chain->stock_shader); d3d9_cg_renderchain_calc_and_set_shader_mvp( _chain->stock_shader.vprg, chain->final_viewport->Width, chain->final_viewport->Height, 0); return true; }