Commit fc35b698 authored by Steve Lhomme's avatar Steve Lhomme Committed by Jean-Baptiste Kempf

hw:d3d11: use d3d11_device_t instead of ID3D11Device

Keep the device for the lifetime of the filter
Signed-off-by: Jean-Baptiste Kempf's avatarJean-Baptiste Kempf <jb@videolan.org>
parent 00022da0
......@@ -51,6 +51,7 @@ typedef UINT D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS;
struct filter_sys_t
{
d3d11_device_t d3d_dev;
ID3D11VideoDevice *d3dviddev;
ID3D11VideoContext *d3dvidctx;
ID3D11VideoProcessor *videoProcessor;
......@@ -285,7 +286,6 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
HRESULT hr;
ID3D11Device *d3ddevice = NULL;
ID3D11VideoProcessorEnumerator *processorEnumerator = NULL;
if (!is_d3d11_opaque(filter->fmt_in.video.i_chroma))
......@@ -293,6 +293,11 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video))
return VLC_EGENERIC;
filter_sys_t *sys = malloc(sizeof (*sys));
if (unlikely(sys == NULL))
return VLC_ENOMEM;
memset(sys, 0, sizeof (*sys));
picture_t *dst = filter_NewPicture(filter);
if (dst == NULL)
return VLC_EGENERIC;
......@@ -305,21 +310,16 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
D3D11_TEXTURE2D_DESC dstDesc;
ID3D11Texture2D_GetDesc(dst->p_sys->texture[KNOWN_DXGI_INDEX], &dstDesc);
sys->d3d_dev.d3dcontext = dst->p_sys->context;
ID3D11DeviceContext_GetDevice(sys->d3d_dev.d3dcontext, &sys->d3d_dev.d3ddevice);
filter_sys_t *sys = malloc(sizeof (*sys));
if (unlikely(sys == NULL))
goto error;
memset(sys, 0, sizeof (*sys));
ID3D11DeviceContext_GetDevice(dst->p_sys->context, &d3ddevice);
hr = ID3D11Device_QueryInterface(d3ddevice, &IID_ID3D11VideoDevice, (void **)&sys->d3dviddev);
hr = ID3D11Device_QueryInterface(sys->d3d_dev.d3ddevice, &IID_ID3D11VideoDevice, (void **)&sys->d3dviddev);
if (FAILED(hr)) {
msg_Err(filter, "Could not Query ID3D11VideoDevice Interface. (hr=0x%lX)", hr);
goto error;
}
hr = ID3D11DeviceContext_QueryInterface(dst->p_sys->context, &IID_ID3D11VideoContext, (void **)&sys->d3dvidctx);
hr = ID3D11DeviceContext_QueryInterface(sys->d3d_dev.d3dcontext, &IID_ID3D11VideoContext, (void **)&sys->d3dvidctx);
if (FAILED(hr)) {
msg_Err(filter, "Could not Query ID3D11VideoContext Interface from the picture. (hr=0x%lX)", hr);
goto error;
......@@ -327,7 +327,7 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
HANDLE context_lock = INVALID_HANDLE_VALUE;
UINT dataSize = sizeof(context_lock);
hr = ID3D11Device_GetPrivateData(d3ddevice, &GUID_CONTEXT_MUTEX, &dataSize, &context_lock);
hr = ID3D11Device_GetPrivateData(sys->d3d_dev.d3ddevice, &GUID_CONTEXT_MUTEX, &dataSize, &context_lock);
if (FAILED(hr))
msg_Warn(filter, "No mutex found to lock the decoder");
sys->context_mutex = context_lock;
......@@ -442,7 +442,7 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
texDesc.Height = dstDesc.Height;
texDesc.Width = dstDesc.Width;
hr = ID3D11Device_CreateTexture2D( d3ddevice, &texDesc, NULL, &sys->outTexture );
hr = ID3D11Device_CreateTexture2D( sys->d3d_dev.d3ddevice, &texDesc, NULL, &sys->outTexture );
if (FAILED(hr)) {
msg_Err(filter, "CreateTexture2D failed. (hr=0x%0lx)", hr);
goto error;
......@@ -493,12 +493,9 @@ int D3D11OpenDeinterlace(vlc_object_t *obj)
filter->pf_flush = Flush;
filter->p_sys = sys;
ID3D11Device_Release(d3ddevice);
picture_Release(dst);
return VLC_SUCCESS;
error:
if (d3ddevice)
ID3D11Device_Release(d3ddevice);
picture_Release(dst);
if (sys->outTexture)
......@@ -511,6 +508,8 @@ error:
ID3D11VideoContext_Release(sys->d3dvidctx);
if (sys->d3dviddev)
ID3D11VideoDevice_Release(sys->d3dviddev);
if (sys->d3d_dev.d3dcontext)
D3D11_ReleaseDevice(&sys->d3d_dev);
return VLC_EGENERIC;
}
......@@ -526,6 +525,7 @@ void D3D11CloseDeinterlace(vlc_object_t *obj)
ID3D11VideoProcessorEnumerator_Release(sys->procEnumerator);
ID3D11VideoContext_Release(sys->d3dvidctx);
ID3D11VideoDevice_Release(sys->d3dviddev);
D3D11_ReleaseDevice(&sys->d3d_dev);
free(sys);
}
......
......@@ -69,6 +69,7 @@ struct filter_sys_t
struct filter_level Hue;
struct filter_level Saturation;
d3d11_device_t d3d_dev;
ID3D11VideoDevice *d3dviddev;
ID3D11VideoContext *d3dvidctx;
ID3D11VideoProcessor *videoProcessor;
......@@ -329,7 +330,6 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
HRESULT hr;
ID3D11Device *d3ddevice = NULL;
ID3D11VideoProcessorEnumerator *processorEnumerator = NULL;
if (!is_d3d11_opaque(filter->fmt_in.video.i_chroma))
......@@ -337,6 +337,11 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video))
return VLC_EGENERIC;
filter_sys_t *sys = malloc(sizeof (*sys));
if (unlikely(sys == NULL))
return VLC_ENOMEM;
memset(sys, 0, sizeof (*sys));
picture_t *dst = filter_NewPicture(filter);
if (dst == NULL)
return VLC_EGENERIC;
......@@ -349,21 +354,16 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
D3D11_TEXTURE2D_DESC dstDesc;
ID3D11Texture2D_GetDesc(dst->p_sys->texture[KNOWN_DXGI_INDEX], &dstDesc);
sys->d3d_dev.d3dcontext = dst->p_sys->context;
ID3D11DeviceContext_GetDevice(sys->d3d_dev.d3dcontext, &sys->d3d_dev.d3ddevice);
filter_sys_t *sys = malloc(sizeof (*sys));
if (unlikely(sys == NULL))
goto error;
memset(sys, 0, sizeof (*sys));
ID3D11DeviceContext_GetDevice(dst->p_sys->context, &d3ddevice);
hr = ID3D11Device_QueryInterface(d3ddevice, &IID_ID3D11VideoDevice, (void **)&sys->d3dviddev);
hr = ID3D11Device_QueryInterface(sys->d3d_dev.d3ddevice, &IID_ID3D11VideoDevice, (void **)&sys->d3dviddev);
if (FAILED(hr)) {
msg_Err(filter, "Could not Query ID3D11VideoDevice Interface. (hr=0x%lX)", hr);
goto error;
}
hr = ID3D11DeviceContext_QueryInterface(dst->p_sys->context, &IID_ID3D11VideoContext, (void **)&sys->d3dvidctx);
hr = ID3D11DeviceContext_QueryInterface(sys->d3d_dev.d3dcontext, &IID_ID3D11VideoContext, (void **)&sys->d3dvidctx);
if (FAILED(hr)) {
msg_Err(filter, "Could not Query ID3D11VideoContext Interface from the picture. (hr=0x%lX)", hr);
goto error;
......@@ -371,7 +371,7 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
HANDLE context_lock = INVALID_HANDLE_VALUE;
UINT dataSize = sizeof(context_lock);
hr = ID3D11Device_GetPrivateData(d3ddevice, &GUID_CONTEXT_MUTEX, &dataSize, &context_lock);
hr = ID3D11Device_GetPrivateData(sys->d3d_dev.d3ddevice, &GUID_CONTEXT_MUTEX, &dataSize, &context_lock);
if (FAILED(hr))
msg_Warn(filter, "No mutex found to lock the decoder");
sys->context_mutex = context_lock;
......@@ -501,12 +501,12 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
texDesc.Height = dstDesc.Height;
texDesc.Width = dstDesc.Width;
hr = ID3D11Device_CreateTexture2D( d3ddevice, &texDesc, NULL, &sys->out[0].texture );
hr = ID3D11Device_CreateTexture2D( sys->d3d_dev.d3ddevice, &texDesc, NULL, &sys->out[0].texture );
if (FAILED(hr)) {
msg_Err(filter, "CreateTexture2D failed. (hr=0x%0lx)", hr);
goto error;
}
hr = ID3D11Device_CreateTexture2D( d3ddevice, &texDesc, NULL, &sys->out[1].texture );
hr = ID3D11Device_CreateTexture2D( sys->d3d_dev.d3ddevice, &texDesc, NULL, &sys->out[1].texture );
if (FAILED(hr)) {
ID3D11Texture2D_Release(sys->out[0].texture);
msg_Err(filter, "CreateTexture2D failed. (hr=0x%0lx)", hr);
......@@ -556,12 +556,9 @@ static int D3D11OpenAdjust(vlc_object_t *obj)
filter->pf_video_filter = Filter;
filter->p_sys = sys;
ID3D11Device_Release(d3ddevice);
picture_Release(dst);
return VLC_SUCCESS;
error:
if (d3ddevice)
ID3D11Device_Release(d3ddevice);
picture_Release(dst);
for (int i=0; i<PROCESSOR_SLICES; i++)
......@@ -584,6 +581,8 @@ error:
ID3D11VideoContext_Release(sys->d3dvidctx);
if (sys->d3dviddev)
ID3D11VideoDevice_Release(sys->d3dviddev);
if (sys->d3d_dev.d3dcontext)
D3D11_ReleaseDevice(&sys->d3d_dev);
return VLC_EGENERIC;
}
......@@ -613,6 +612,8 @@ static void D3D11CloseAdjust(vlc_object_t *obj)
ID3D11VideoContext_Release(sys->d3dvidctx);
ID3D11VideoDevice_Release(sys->d3dviddev);
D3D11_ReleaseDevice(&sys->d3d_dev);
free(sys);
}
......
......@@ -70,6 +70,7 @@ struct filter_sys_t {
ID3D11VideoProcessorEnumerator *procEnumerator;
ID3D11VideoProcessor *videoProcessor;
#endif
d3d11_device_t d3d_dev;
/* CPU to GPU */
filter_t *filter;
......@@ -698,6 +699,8 @@ int D3D11OpenCPUConverter( vlc_object_t *obj )
return VLC_EGENERIC;
}
d3d11_device_t d3d_dev;
D3D11_TEXTURE2D_DESC texDesc;
picture_t *peek = filter_NewPicture(p_filter);
if (peek == NULL)
return VLC_EGENERIC;
......@@ -710,7 +713,6 @@ int D3D11OpenCPUConverter( vlc_object_t *obj )
video_format_Init(&fmt_staging, 0);
D3D11_TEXTURE2D_DESC texDesc;
ID3D11Texture2D_GetDesc( peek->p_sys->texture[KNOWN_DXGI_INDEX], &texDesc);
vlc_fourcc_t d3d_fourcc = DxgiFormatFourcc(texDesc.Format);
if (d3d_fourcc == 0)
......@@ -723,7 +725,7 @@ int D3D11OpenCPUConverter( vlc_object_t *obj )
err = VLC_ENOMEM;
goto done;
}
res.p_sys->context = peek->p_sys->context;
res.p_sys->context = d3d_dev.d3dcontext = peek->p_sys->context;
res.p_sys->formatTexture = texDesc.Format;
video_format_Copy(&fmt_staging, &p_filter->fmt_out.video);
......@@ -747,10 +749,8 @@ int D3D11OpenCPUConverter( vlc_object_t *obj )
texDesc.BindFlags = 0;
texDesc.Height = p_dst->format.i_height; /* make sure we match picture_Setup() */
ID3D11Device *p_device;
ID3D11DeviceContext_GetDevice(peek->p_sys->context, &p_device);
HRESULT hr = ID3D11Device_CreateTexture2D( p_device, &texDesc, NULL, &texture);
ID3D11Device_Release(p_device);
ID3D11DeviceContext_GetDevice(peek->p_sys->context, &d3d_dev.d3ddevice);
HRESULT hr = ID3D11Device_CreateTexture2D( d3d_dev.d3ddevice, &texDesc, NULL, &texture);
if (FAILED(hr)) {
msg_Err(p_filter, "Failed to create a %s staging texture to extract surface pixels (hr=0x%0lx)", DxgiFormatToStr(texDesc.Format), hr );
goto done;
......@@ -792,8 +792,13 @@ done:
DeleteFilter( p_cpu_filter );
if (texture)
ID3D11Texture2D_Release(texture);
D3D11_ReleaseDevice(&d3d_dev);
free(p_sys);
}
else
{
p_sys->d3d_dev = d3d_dev;
}
return err;
}
......@@ -815,6 +820,7 @@ void D3D11CloseConverter( vlc_object_t *obj )
vlc_mutex_destroy(&p_sys->staging_lock);
if (p_sys->staging)
ID3D11Texture2D_Release(p_sys->staging);
D3D11_ReleaseDevice(&p_sys->d3d_dev);
D3D11_Destroy(&p_sys->hd3d);
free( p_sys );
p_filter->p_sys = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment