static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture) { vout_display_sys_t *sys = vd->sys; LPDIRECT3DSURFACE9 surface = picture->p_sys->surface; #if 0 picture_Release(picture); VLC_UNUSED(subpicture); #else /* FIXME it is a bit ugly, we need the surface to be unlocked for * rendering. * The clean way would be to release the picture (and ensure that * the vout doesn't keep a reference). But because of the vout * wrapper, we can't */ Direct3DUnlockSurface(picture); VLC_UNUSED(subpicture); #endif /* check if device is still available */ HRESULT hr = IDirect3DDevice9_TestCooperativeLevel(sys->d3ddev); if (FAILED(hr)) { if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) { vout_display_SendEventPicturesInvalid(vd); sys->reset_device = true; sys->lost_not_ready = false; } if (hr == D3DERR_DEVICELOST && !sys->lost_not_ready) { /* Device is lost but not yet ready for reset. */ sys->lost_not_ready = true; } return; } d3d_region_t picture_region; if (!Direct3DImportPicture(vd, &picture_region, surface)) { int subpicture_region_count = 0; d3d_region_t *subpicture_region = NULL; if (subpicture) Direct3DImportSubpicture(vd, &subpicture_region_count, &subpicture_region, subpicture); Direct3DRenderScene(vd, &picture_region, subpicture_region_count, subpicture_region); Direct3DDeleteRegions(sys->d3dregion_count, sys->d3dregion); sys->d3dregion_count = subpicture_region_count; sys->d3dregion = subpicture_region; } }
/** * It releases the scene resources. */ static void Direct3DDestroyScene(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; Direct3DDeleteRegions(sys->d3dregion_count, sys->d3dregion); LPDIRECT3DVERTEXBUFFER9 d3dvtc = sys->d3dvtc; if (d3dvtc) IDirect3DVertexBuffer9_Release(d3dvtc); LPDIRECT3DTEXTURE9 d3dtex = sys->d3dtex; if (d3dtex) IDirect3DTexture9_Release(d3dtex); sys->d3dvtc = NULL; sys->d3dtex = NULL; sys->d3dregion_count = 0; sys->d3dregion = NULL; msg_Dbg(vd, "Direct3D scene released successfully"); }