Browse Source

d3d11: lock the device when creating the Video Processor

It doesn't seem to be thread safe.
pull/112/head
Steve Lhomme 6 years ago
parent
commit
ff39bd6121
  1. 4
      modules/hw/d3d11/d3d11_deinterlace.c
  2. 4
      modules/hw/d3d11/d3d11_filters.c
  3. 4
      modules/hw/d3d11/d3d11_surface.c

4
modules/hw/d3d11/d3d11_deinterlace.c

@ -251,6 +251,8 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
return VLC_ENOMEM;
memset(sys, 0, sizeof (*sys));
d3d11_device_lock(sys->d3d_dev);
d3d11_decoder_device_t *dev_sys = GetD3D11OpaqueContext( filter->vctx_in );
sys->d3d_dev = &dev_sys->d3d_dev;
if (D3D11_CreateProcessor(filter, sys->d3d_dev, D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST,
@ -343,6 +345,7 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
{
goto error;
}
d3d11_device_unlock(sys->d3d_dev);
filter->fmt_out.video = out_fmt;
filter->vctx_out = vlc_video_context_Hold(filter->vctx_in);
@ -353,6 +356,7 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
return VLC_SUCCESS;
error:
D3D11_ReleaseProcessor(&sys->d3d_proc);
d3d11_device_unlock(sys->d3d_dev);
free(sys);
return VLC_EGENERIC;

4
modules/hw/d3d11/d3d11_filters.c

@ -358,6 +358,8 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
sys->d3d_dev = &dev_sys->d3d_dev;
DXGI_FORMAT format = vtcx_sys->format;
d3d11_device_lock(sys->d3d_dev);
if (D3D11_CreateProcessor(filter, sys->d3d_dev, D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE,
&filter->fmt_out.video, &filter->fmt_out.video, &sys->d3d_proc) != VLC_SUCCESS)
goto error;
@ -509,6 +511,7 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
filter->pf_video_filter = Filter;
filter->p_sys = sys;
filter->vctx_out = vlc_video_context_Hold(filter->vctx_in);
d3d11_device_unlock(sys->d3d_dev);
return VLC_SUCCESS;
error:
@ -525,6 +528,7 @@ error:
if (sys->out[1].texture)
ID3D11Texture2D_Release(sys->out[1].texture);
D3D11_ReleaseProcessor(&sys->d3d_proc);
d3d11_device_unlock(sys->d3d_dev);
free(sys);
return VLC_EGENERIC;

4
modules/hw/d3d11/d3d11_surface.c

@ -83,6 +83,8 @@ static int SetupProcessor(filter_t *p_filter, d3d11_device_t *d3d_dev,
filter_sys_t *sys = p_filter->p_sys;
HRESULT hr;
d3d11_device_lock(sys->d3d_dev);
if (D3D11_CreateProcessor(p_filter, d3d_dev, D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE,
&p_filter->fmt_in.video, &p_filter->fmt_out.video, &sys->d3d_proc) != VLC_SUCCESS)
goto error;
@ -123,6 +125,7 @@ static int SetupProcessor(filter_t *p_filter, d3d11_device_t *d3d_dev,
msg_Err(p_filter, "Failed to create the processor output. (hr=0x%lX)", hr);
else
{
d3d11_device_unlock(sys->d3d_dev);
return VLC_SUCCESS;
}
}
@ -135,6 +138,7 @@ static int SetupProcessor(filter_t *p_filter, d3d11_device_t *d3d_dev,
error:
D3D11_ReleaseProcessor(&sys->d3d_proc);
d3d11_device_unlock(sys->d3d_dev);
return VLC_EGENERIC;
}
#endif

Loading…
Cancel
Save