[vlc-devel] [vlc-commits] direct3d9: Group pool related functions together

Hugo Beauzée-Luyssen hugo at beauzee.fr
Wed Apr 5 19:34:11 CEST 2017


On Wed, Apr 5, 2017, at 07:31 PM, Hugo Beauzée-Luyssen wrote:
> vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | 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
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits

Sorry this wasn't meant to be commited, I screwed up during rebasing.
It's been alt-commited.

-- 
  Hugo Beauzée-Luyssen
  hugo at beauzee.fr


More information about the vlc-devel mailing list