[vlc-devel] [vlc-commits] vout: direct3d11: clean the wait until all the commands are processed

Steve Lhomme robux4 at ycbcr.xyz
Wed Aug 5 14:03:07 CEST 2020


Reverted for now. Begin is not possible here.
I need to investigate more the influence of the unlock/lock and how it 
plays with the decoder(s).

On 2020-08-05 9:27, Steve Lhomme wrote:
> vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Wed Aug  5 09:25:31 2020 +0200| [972733ed991e7219d9c5615c633d35d1c40cb55b] | committer: Steve Lhomme
> 
> vout: direct3d11: clean the wait until all the commands are processed
> 
> We need to begin the commands we are monitoring. We need to unlock the device
> context while we wait until it's finished with our commands. The decoder may
> have a chance to send some decoding commands and we may wait longer when
> locking back the device context.
> 
> We don't need to lock the device context in PreparePicture, it's already locked.
> 
> Use a ID3D11Asynchronous pointer directly. We don't need to know the underlying
> type, except when creating it.
> 
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=972733ed991e7219d9c5615c633d35d1c40cb55b
> ---
> 
>   modules/video_output/win32/direct3d11.c | 19 ++++++++++++-------
>   1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
> index 47eecf9582..faa154ee04 100644
> --- a/modules/video_output/win32/direct3d11.c
> +++ b/modules/video_output/win32/direct3d11.c
> @@ -100,7 +100,7 @@ struct vout_display_sys_t
>       d3d11_shaders_t          shaders;
>       d3d_quad_t               picQuad;
>   
> -    ID3D11Query              *prepareWait;
> +    ID3D11Asynchronous       *prepareWait;
>   
>       picture_sys_d3d11_t      stagingSys;
>       plane_t                  stagingPlanes[PICTURE_PLANE_MAX];
> @@ -521,7 +521,10 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
>   {
>       vout_display_sys_t *sys = vd->sys;
>   
> -    d3d11_device_lock( sys->d3d_dev );
> +    if (sys->prepareWait)
> +    {
> +        ID3D11DeviceContext_Begin(sys->d3d_dev->d3dcontext, sys->prepareWait);
> +    }
>   
>       if (sys->picQuad.textureFormat->formatTexture == DXGI_FORMAT_UNKNOWN)
>       {
> @@ -664,15 +667,17 @@ static void PreparePicture(vout_display_t *vd, picture_t *picture, subpicture_t
>       if (sys->prepareWait)
>       {
>           int maxWait = 10;
> -        ID3D11DeviceContext_End(sys->d3d_dev->d3dcontext, (ID3D11Asynchronous*)sys->prepareWait);
> +        ID3D11DeviceContext_End(sys->d3d_dev->d3dcontext, sys->prepareWait);
>   
>           while (S_FALSE == ID3D11DeviceContext_GetData(sys->d3d_dev->d3dcontext,
> -                                                      (ID3D11Asynchronous*)sys->prepareWait, NULL, 0, 0)
> +                                                      sys->prepareWait, NULL, 0, 0)
>                  && --maxWait)
> +        {
> +            d3d11_device_unlock( sys->d3d_dev );
>               SleepEx(2, TRUE);
> +            d3d11_device_lock( sys->d3d_dev );
> +        }
>       }
> -
> -    d3d11_device_unlock( sys->d3d_dev );
>   }
>   
>   static void Prepare(vout_display_t *vd, picture_t *picture,
> @@ -1142,7 +1147,7 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
>   
>       D3D11_QUERY_DESC query = { 0 };
>       query.Query = D3D11_QUERY_EVENT;
> -    hr = ID3D11Device_CreateQuery(sys->d3d_dev->d3ddevice, &query, &sys->prepareWait);
> +    hr = ID3D11Device_CreateQuery(sys->d3d_dev->d3ddevice, &query, (ID3D11Query**)&sys->prepareWait);
>   
>       ID3D11BlendState *pSpuBlendState;
>       D3D11_BLEND_DESC spuBlendDesc = { 0 };
> 
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
> 


More information about the vlc-devel mailing list