vlc | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Wed Apr 5 19:06:29 2017 +0200| [67a73e86ca1a3e491256cb230a8214af20a52228] | committer: Hugo Beauzée-Luyssen
direct3d9: Group pool related functions together > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=67a73e86ca1a3e491256cb230a8214af20a52228 --- modules/video_output/win32/direct3d9.c | 269 ++++++++++++++++----------------- 1 file changed, 133 insertions(+), 136 deletions(-) diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index 48dcd74..2faf44d 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -406,8 +406,7 @@ static picture_pool_t *Direct3D9CreateDirectRenderingPool(vout_display_t *vd, un pool_cfg.picture = pictures; vd->sys->sys.pool = picture_pool_NewExtended( &pool_cfg ); - -error: + error: if (vd->sys->sys.pool == NULL && pictures) { for (unsigned i=0;i<picture_count; ++i) DestroyPicture(pictures[i]); @@ -415,6 +414,138 @@ error: free(pictures); return vd->sys->sys.pool; } +/** + * It locks the surface associated to the picture and get the surface + * descriptor which amongst other things has the pointer to the picture + * data and its pitch. + */ +static int Direct3D9LockSurface(picture_t *picture) +{ + /* Lock the surface to get a valid pointer to the picture buffer */ + D3DLOCKED_RECT d3drect; + HRESULT hr = IDirect3DSurface9_LockRect(picture->p_sys->surface, &d3drect, NULL, 0); + if (FAILED(hr)) { + //msg_Dbg(vd, "Failed IDirect3DSurface9_LockRect: 0x%0lx", hr); + return CommonUpdatePicture(picture, &picture->p_sys->fallback, NULL, 0); + } + + CommonUpdatePicture(picture, NULL, d3drect.pBits, d3drect.Pitch); + return VLC_SUCCESS; +} +/** + * It unlocks the surface associated to the picture. + */ +static void Direct3D9UnlockSurface(picture_t *picture) +{ + /* Unlock the Surface */ + HRESULT hr = IDirect3DSurface9_UnlockRect(picture->p_sys->surface); + if (FAILED(hr)) { + //msg_Dbg(vd, "Failed IDirect3DSurface9_UnlockRect: 0x%0lx", hr); + } +} + +/** + * It destroys the pool of picture and its resources. + */ +static void Direct3D9DestroyPool(vout_display_t *vd) +{ + vout_display_sys_t *sys = vd->sys; + + if (sys->sys.pool) { + picture_sys_t *picsys = sys->picsys; + if ( picsys != NULL ) { + IDirect3DSurface9_Release(picsys->surface); + if (picsys->fallback) + picture_Release(picsys->fallback); + } + picture_pool_Release(sys->sys.pool); + } + sys->sys.pool = NULL; +} + +/** + * It creates the pool of picture (only 1). + * + * Each picture has an associated offscreen surface in video memory + * depending on hardware capabilities the picture chroma will be as close + * as possible to the orginal render chroma to reduce CPU conversion overhead + * and delegate this work to video card GPU + */ +static picture_pool_t *Direct3D9CreateSimplePool(vout_display_t *vd, unsigned count) +{ + VLC_UNUSED(count); + vout_display_sys_t *sys = vd->sys; + video_format_t *fmt = &vd->fmt; + LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev; + + assert( is_d3d9_opaque(fmt->i_chroma) == false ); + if (sys->sys.pool) + return sys->sys.pool; + + /* We create one picture. + * It is useless to create more as we can't be used for direct rendering */ + + /* Create a surface */ + LPDIRECT3DSURFACE9 surface; + HRESULT hr = IDirect3DDevice9_CreateOffscreenPlainSurface(d3ddev, + fmt->i_width, + fmt->i_height, + sys->d3dtexture_format->format, + D3DPOOL_DEFAULT, + &surface, + NULL); + if (FAILED(hr)) { + msg_Err(vd, "Failed to create picture surface. (hr=0x%lx)", hr); + return NULL; + } + +#ifndef NDEBUG + msg_Dbg(vd, "Direct3D created offscreen surface: %ix%i", + fmt->i_width, fmt->i_height); +#endif + + /* fill surface with black color */ + IDirect3DDevice9_ColorFill(d3ddev, surface, NULL, D3DCOLOR_ARGB(0xFF, 0, 0, 0)); + + /* Create the associated picture */ + picture_sys_t *picsys = malloc(sizeof(*picsys)); + if (unlikely(picsys == NULL)) { + IDirect3DSurface9_Release(surface); + return NULL; + } + picsys->surface = surface; + picsys->fallback = NULL; + + picture_resource_t resource = { .p_sys = picsys }; + for (int i = 0; i < PICTURE_PLANE_MAX; i++) + resource.p[i].i_lines = fmt->i_height / (i > 0 ? 2 : 1); + + picture_t *picture = picture_NewFromResource(fmt, &resource); + if (!picture) { + msg_Err(vd, "Failed to create a picture from resources."); + IDirect3DSurface9_Release(surface); + free(picsys); + return NULL; + } + sys->picsys = picsys; + + /* Wrap it into a picture pool */ + picture_pool_configuration_t pool_cfg; + memset(&pool_cfg, 0, sizeof(pool_cfg)); + pool_cfg.picture_count = 1; + pool_cfg.picture = &picture; + pool_cfg.lock = Direct3D9LockSurface; + pool_cfg.unlock = Direct3D9UnlockSurface; + + sys->sys.pool = picture_pool_NewExtended(&pool_cfg); + if (!sys->sys.pool) { + picture_Release(picture); + IDirect3DSurface9_Release(surface); + } + msg_Err( vd, "Returning valid pool" ); + return sys->sys.pool; +} + static int Direct3D9LockSurface(picture_t *); static void Direct3D9UnlockSurface(picture_t *); @@ -956,8 +1087,6 @@ static int Direct3D9Reset(vout_display_t *vd) } /* */ -static void Direct3D9DestroyPool(vout_display_t *vd); - static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt); static void Direct3D9DestroyScene(vout_display_t *vd); @@ -1097,138 +1226,6 @@ static const d3d_format_t *Direct3DFindFormat(vout_display_t *vd, vlc_fourcc_t c } /** - * It locks the surface associated to the picture and get the surface - * descriptor which amongst other things has the pointer to the picture - * data and its pitch. - */ -static int Direct3D9LockSurface(picture_t *picture) -{ - /* Lock the surface to get a valid pointer to the picture buffer */ - D3DLOCKED_RECT d3drect; - HRESULT hr = IDirect3DSurface9_LockRect(picture->p_sys->surface, &d3drect, NULL, 0); - if (FAILED(hr)) { - //msg_Dbg(vd, "Failed IDirect3DSurface9_LockRect: 0x%0lx", hr); - return CommonUpdatePicture(picture, &picture->p_sys->fallback, NULL, 0); - } - - CommonUpdatePicture(picture, NULL, d3drect.pBits, d3drect.Pitch); - return VLC_SUCCESS; -} -/** - * It unlocks the surface associated to the picture. - */ -static void Direct3D9UnlockSurface(picture_t *picture) -{ - /* Unlock the Surface */ - HRESULT hr = IDirect3DSurface9_UnlockRect(picture->p_sys->surface); - if (FAILED(hr)) { - //msg_Dbg(vd, "Failed IDirect3DSurface9_UnlockRect: 0x%0lx", hr); - } -} - -/** - * It creates the pool of picture (only 1). - * - * Each picture has an associated offscreen surface in video memory - * depending on hardware capabilities the picture chroma will be as close - * as possible to the orginal render chroma to reduce CPU conversion overhead - * and delegate this work to video card GPU - */ -static picture_pool_t *Direct3D9CreateSimplePool(vout_display_t *vd, unsigned count) -{ - VLC_UNUSED(count); - vout_display_sys_t *sys = vd->sys; - video_format_t *fmt = &vd->fmt; - LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev; - - assert( is_d3d9_opaque(fmt->i_chroma) == false ); - if (sys->sys.pool) - return sys->sys.pool; - - /* We create one picture. - * It is useless to create more as we can't be used for direct rendering */ - - /* Create a surface */ - LPDIRECT3DSURFACE9 surface; - HRESULT hr = IDirect3DDevice9_CreateOffscreenPlainSurface(d3ddev, - fmt->i_width, - fmt->i_height, - sys->d3dtexture_format->format, - D3DPOOL_DEFAULT, - &surface, - NULL); - if (FAILED(hr)) { - msg_Err(vd, "Failed to create picture surface. (hr=0x%lx)", hr); - return NULL; - } - -#ifndef NDEBUG - msg_Dbg(vd, "Direct3D created offscreen surface: %ix%i", - fmt->i_width, fmt->i_height); -#endif - - /* fill surface with black color */ - IDirect3DDevice9_ColorFill(d3ddev, surface, NULL, D3DCOLOR_ARGB(0xFF, 0, 0, 0)); - - /* Create the associated picture */ - picture_sys_t *picsys = malloc(sizeof(*picsys)); - if (unlikely(picsys == NULL)) { - IDirect3DSurface9_Release(surface); - return NULL; - } - picsys->surface = surface; - picsys->fallback = NULL; - - picture_resource_t resource = { .p_sys = picsys }; - for (int i = 0; i < PICTURE_PLANE_MAX; i++) - resource.p[i].i_lines = fmt->i_height / (i > 0 ? 2 : 1); - - picture_t *picture = picture_NewFromResource(fmt, &resource); - if (!picture) { - msg_Err(vd, "Failed to create a picture from resources."); - IDirect3DSurface9_Release(surface); - free(picsys); - return NULL; - } - sys->picsys = picsys; - - /* Wrap it into a picture pool */ - picture_pool_configuration_t pool_cfg; - memset(&pool_cfg, 0, sizeof(pool_cfg)); - pool_cfg.picture_count = 1; - pool_cfg.picture = &picture; - pool_cfg.lock = Direct3D9LockSurface; - pool_cfg.unlock = Direct3D9UnlockSurface; - - sys->sys.pool = picture_pool_NewExtended(&pool_cfg); - if (!sys->sys.pool) { - picture_Release(picture); - IDirect3DSurface9_Release(surface); - } - msg_Err( vd, "Returning valid pool" ); - return sys->sys.pool; -} - -/** - * It destroys the pool of picture and its resources. - */ -static void Direct3D9DestroyPool(vout_display_t *vd) -{ - vout_display_sys_t *sys = vd->sys; - - if (sys->sys.pool) { - picture_sys_t *picsys = sys->picsys; - if ( picsys != NULL ) { - IDirect3DSurface9_Release(picsys->surface); - if (picsys->fallback) - picture_Release(picsys->fallback); - } - picture_pool_Release(sys->sys.pool); - } - sys->sys.pool = NULL; -} - -/** * It allocates and initializes the resources needed to render the scene. */ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
