vlc | branch: master | Steve Lhomme <rob...@videolabs.io> | Wed Nov 22 18:18:36 2017 +0100| [77ee35a70adb2176ede021b634e40ebf5348b5ff] | committer: Jean-Baptiste Kempf
hw:d3d11: make use of D3D11_FilterHoldInstance() Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=77ee35a70adb2176ede021b634e40ebf5348b5ff --- modules/hw/d3d11/d3d11_deinterlace.c | 25 ++++++++----------------- modules/hw/d3d11/d3d11_filters.c | 25 ++++++++----------------- modules/hw/d3d11/d3d11_surface.c | 16 +++++----------- 3 files changed, 21 insertions(+), 45 deletions(-) diff --git a/modules/hw/d3d11/d3d11_deinterlace.c b/modules/hw/d3d11/d3d11_deinterlace.c index 9d466ef78e..f0b087af40 100644 --- a/modules/hw/d3d11/d3d11_deinterlace.c +++ b/modules/hw/d3d11/d3d11_deinterlace.c @@ -298,21 +298,15 @@ int D3D11OpenDeinterlace(vlc_object_t *obj) return VLC_ENOMEM; memset(sys, 0, sizeof (*sys)); - picture_t *dst = filter_NewPicture(filter); - if (dst == NULL) - return VLC_EGENERIC; - if (!dst->p_sys) + D3D11_TEXTURE2D_DESC dstDesc; + D3D11_FilterHoldInstance(filter, &sys->d3d_dev, &dstDesc); + if (unlikely(sys->d3d_dev.d3dcontext==NULL)) { - msg_Dbg(filter, "D3D11 opaque without a texture"); - picture_Release(dst); - return VLC_EGENERIC; + msg_Dbg(filter, "Filter without a context"); + free(sys); + return VLC_ENOOBJ; } - 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); - 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); @@ -493,11 +487,8 @@ int D3D11OpenDeinterlace(vlc_object_t *obj) filter->pf_flush = Flush; filter->p_sys = sys; - picture_Release(dst); return VLC_SUCCESS; error: - picture_Release(dst); - if (sys->outTexture) ID3D11Texture2D_Release(sys->outTexture); if (sys->videoProcessor) @@ -509,7 +500,7 @@ error: if (sys->d3dviddev) ID3D11VideoDevice_Release(sys->d3dviddev); if (sys->d3d_dev.d3dcontext) - D3D11_ReleaseDevice(&sys->d3d_dev); + D3D11_FilterReleaseInstance(&sys->d3d_dev); return VLC_EGENERIC; } @@ -525,7 +516,7 @@ void D3D11CloseDeinterlace(vlc_object_t *obj) ID3D11VideoProcessorEnumerator_Release(sys->procEnumerator); ID3D11VideoContext_Release(sys->d3dvidctx); ID3D11VideoDevice_Release(sys->d3dviddev); - D3D11_ReleaseDevice(&sys->d3d_dev); + D3D11_FilterReleaseInstance(&sys->d3d_dev); free(sys); } diff --git a/modules/hw/d3d11/d3d11_filters.c b/modules/hw/d3d11/d3d11_filters.c index de97ee2582..8b5a448ce0 100644 --- a/modules/hw/d3d11/d3d11_filters.c +++ b/modules/hw/d3d11/d3d11_filters.c @@ -342,21 +342,15 @@ static int D3D11OpenAdjust(vlc_object_t *obj) return VLC_ENOMEM; memset(sys, 0, sizeof (*sys)); - picture_t *dst = filter_NewPicture(filter); - if (dst == NULL) - return VLC_EGENERIC; - if (!dst->p_sys) + D3D11_TEXTURE2D_DESC dstDesc; + D3D11_FilterHoldInstance(filter, &sys->d3d_dev, &dstDesc); + if (unlikely(sys->d3d_dev.d3dcontext==NULL)) { - msg_Dbg(filter, "D3D11 opaque without a texture"); - picture_Release(dst); - return VLC_EGENERIC; + msg_Dbg(filter, "Filter without a context"); + free(sys); + return VLC_ENOOBJ; } - 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); - 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); @@ -556,11 +550,8 @@ static int D3D11OpenAdjust(vlc_object_t *obj) filter->pf_video_filter = Filter; filter->p_sys = sys; - picture_Release(dst); return VLC_SUCCESS; error: - picture_Release(dst); - for (int i=0; i<PROCESSOR_SLICES; i++) { if (sys->procInput[i]) @@ -582,7 +573,7 @@ error: if (sys->d3dviddev) ID3D11VideoDevice_Release(sys->d3dviddev); if (sys->d3d_dev.d3dcontext) - D3D11_ReleaseDevice(&sys->d3d_dev); + D3D11_FilterReleaseInstance(&sys->d3d_dev); return VLC_EGENERIC; } @@ -612,7 +603,7 @@ static void D3D11CloseAdjust(vlc_object_t *obj) ID3D11VideoContext_Release(sys->d3dvidctx); ID3D11VideoDevice_Release(sys->d3dviddev); - D3D11_ReleaseDevice(&sys->d3d_dev); + D3D11_FilterReleaseInstance(&sys->d3d_dev); free(sys); } diff --git a/modules/hw/d3d11/d3d11_surface.c b/modules/hw/d3d11/d3d11_surface.c index b946c3acbb..73a5d7c786 100644 --- a/modules/hw/d3d11/d3d11_surface.c +++ b/modules/hw/d3d11/d3d11_surface.c @@ -701,19 +701,15 @@ int D3D11OpenCPUConverter( vlc_object_t *obj ) d3d11_device_t d3d_dev; D3D11_TEXTURE2D_DESC texDesc; - picture_t *peek = filter_NewPicture(p_filter); - if (peek == NULL) - return VLC_EGENERIC; - if (!peek->p_sys) + D3D11_FilterHoldInstance(p_filter, &d3d_dev, &texDesc); + if (unlikely(!d3d_dev.d3dcontext)) { msg_Dbg(p_filter, "D3D11 opaque without a texture"); - picture_Release(peek); return VLC_EGENERIC; } video_format_Init(&fmt_staging, 0); - ID3D11Texture2D_GetDesc( peek->p_sys->texture[KNOWN_DXGI_INDEX], &texDesc); vlc_fourcc_t d3d_fourcc = DxgiFormatFourcc(texDesc.Format); if (d3d_fourcc == 0) goto done; @@ -725,7 +721,7 @@ int D3D11OpenCPUConverter( vlc_object_t *obj ) err = VLC_ENOMEM; goto done; } - res.p_sys->context = d3d_dev.d3dcontext = peek->p_sys->context; + res.p_sys->context = d3d_dev.d3dcontext; res.p_sys->formatTexture = texDesc.Format; video_format_Copy(&fmt_staging, &p_filter->fmt_out.video); @@ -749,7 +745,6 @@ int D3D11OpenCPUConverter( vlc_object_t *obj ) texDesc.BindFlags = 0; texDesc.Height = p_dst->format.i_height; /* make sure we match picture_Setup() */ - 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 ); @@ -785,14 +780,13 @@ int D3D11OpenCPUConverter( vlc_object_t *obj ) done: video_format_Clean(&fmt_staging); - picture_Release(peek); if (err != VLC_SUCCESS) { if (p_cpu_filter) DeleteFilter( p_cpu_filter ); if (texture) ID3D11Texture2D_Release(texture); - D3D11_ReleaseDevice(&d3d_dev); + D3D11_FilterReleaseInstance(&p_sys->d3d_dev); free(p_sys); } else @@ -820,7 +814,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_FilterReleaseInstance(&p_sys->d3d_dev); D3D11_Destroy(&p_sys->hd3d); free( p_sys ); p_filter->p_sys = NULL; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits