[vlc-devel] [PATCH] direct3d11: always use a mutex to protect the context with hardware decoding
Steve Lhomme
robux4 at videolabs.io
Mon Aug 1 09:12:15 CEST 2016
Even when using a single thread for decoding it's still not in the same thread
as the vout so we must protect it anyway.
--
I thought I did this before but it seems not
---
modules/codec/avcodec/d3d11va.c | 12 ++++--------
modules/video_output/win32/common.h | 5 +++--
modules/video_output/win32/direct3d11.c | 18 ++++++++----------
3 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index d403819..294587d 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -116,7 +116,7 @@ struct vlc_va_sys_t
DXGI_FORMAT render;
ID3D11DeviceContext *d3dctx;
-#if VLC_WINSTORE_APP && LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
+#if LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
HANDLE context_mutex;
#endif
@@ -182,11 +182,7 @@ void SetupAVCodecContext(vlc_va_t *va)
sys->hw.surface_count = dx_sys->surface_count;
sys->hw.surface = (ID3D11VideoDecoderOutputView**) dx_sys->hw_surface;
#if LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
-#if VLC_WINSTORE_APP
sys->hw.context_mutex = sys->context_mutex;
-#else
- sys->hw.context_mutex = INVALID_HANDLE_VALUE;
-#endif
#endif
if (IsEqualGUID(&dx_sys->input, &DXVA_Intel_H264_NoFGT_ClearVideo))
@@ -265,7 +261,7 @@ static int Extract(vlc_va_t *va, picture_t *output, uint8_t *data)
assert(p_sys_out->texture != NULL);
assert(p_sys_in->decoder == src);
-#if VLC_WINSTORE_APP && LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
+#if LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
if( sys->context_mutex > 0 ) {
WaitForSingleObjectEx( sys->context_mutex, INFINITE, FALSE );
}
@@ -337,7 +333,7 @@ static int Extract(vlc_va_t *va, picture_t *output, uint8_t *data)
done:
-#if VLC_WINSTORE_APP && LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
+#if LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
if( sys->context_mutex > 0 ) {
ReleaseMutex( sys->context_mutex );
}
@@ -449,7 +445,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
msg_Err(va, "Could not Query ID3D11VideoDevice Interface from the picture. (hr=0x%lX)", hr);
} else {
ID3D11DeviceContext_GetDevice( p_sys->context, (ID3D11Device**) &dx_sys->d3ddev );
-#if VLC_WINSTORE_APP && LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
+#if LIBAVCODEC_VERSION_CHECK(57, 2, 0, 3, 100)
HANDLE context_lock = INVALID_HANDLE_VALUE;
UINT dataSize = sizeof(context_lock);
hr = ID3D11Device_GetPrivateData((ID3D11Device*)dx_sys->d3ddev, &GUID_CONTEXT_MUTEX, &dataSize, &context_lock);
diff --git a/modules/video_output/win32/common.h b/modules/video_output/win32/common.h
index 0e654e0..e626035 100644
--- a/modules/video_output/win32/common.h
+++ b/modules/video_output/win32/common.h
@@ -177,9 +177,10 @@ struct vout_display_sys_t
PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN OurD3D11CreateDeviceAndSwapChain;
PFN_D3D11_CREATE_DEVICE OurD3D11CreateDevice;
pD3DCompile OurD3DCompile;
-#else
+#endif
+#if defined(HAVE_ID3D11VIDEODECODER)
HANDLE context_lock; /* D3D11 Context lock necessary
- for hw decoding on WinRT */
+ for hw decoding */
#endif
IDXGISwapChain1 *dxgiswapChain; /* DXGI 1.1 swap chain */
ID3D11Device *d3ddevice; /* D3D device */
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index d359650..4a05c7b 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -793,7 +793,7 @@ static void Manage(vout_display_t *vd)
if (RECTWidth(size_before) != RECTWidth(sys->rect_dest_clipped) ||
RECTHeight(size_before) != RECTHeight(sys->rect_dest_clipped))
{
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
WaitForSingleObjectEx( sys->context_lock, INFINITE, FALSE );
@@ -805,7 +805,7 @@ static void Manage(vout_display_t *vd)
UpdateBackBuffer(vd);
UpdatePicQuadPosition(vd);
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
ReleaseMutex( sys->context_lock );
@@ -846,12 +846,10 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
#ifdef HAVE_ID3D11VIDEODECODER
if (is_d3d11_opaque(picture->format.i_chroma)) {
-#if VLC_WINSTORE_APP
if( sys->context_lock > 0 )
{
WaitForSingleObjectEx( sys->context_lock, INFINITE, FALSE );
}
-#endif
D3D11_BOX box;
box.left = picture->format.i_x_offset;
box.right = picture->format.i_x_offset + picture->format.i_visible_width;
@@ -930,7 +928,7 @@ static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
{
/* TODO device lost */
}
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( is_d3d11_opaque(picture->format.i_chroma) && sys->context_lock > 0) {
ReleaseMutex( sys->context_lock );
}
@@ -1299,14 +1297,14 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
UpdateRects(vd, NULL, NULL, true);
UncropStagingFormat( vd, &core_source );
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
WaitForSingleObjectEx( sys->context_lock, INFINITE, FALSE );
}
#endif
if (Direct3D11CreateResources(vd, fmt)) {
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
ReleaseMutex( sys->context_lock );
@@ -1316,7 +1314,7 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
Direct3D11DestroyResources(vd);
return VLC_EGENERIC;
}
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
ReleaseMutex( sys->context_lock );
@@ -1389,7 +1387,7 @@ static int Direct3D11CreateResources(vout_display_t *vd, video_format_t *fmt)
vout_display_sys_t *sys = vd->sys;
HRESULT hr;
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
sys->context_lock = CreateMutexEx( NULL, NULL, 0, SYNCHRONIZE );
ID3D11Device_SetPrivateData( sys->d3ddevice, &GUID_CONTEXT_MUTEX, sizeof( sys->context_lock ), &sys->context_lock );
#endif
@@ -1848,7 +1846,7 @@ static void Direct3D11DestroyResources(vout_display_t *vd)
ID3D11VertexShader_Release(sys->pSPUPixelShader);
sys->pSPUPixelShader = NULL;
}
-#if defined(HAVE_ID3D11VIDEODECODER) && VLC_WINSTORE_APP
+#if defined(HAVE_ID3D11VIDEODECODER)
if( sys->context_lock > 0 )
{
CloseHandle( sys->context_lock );
--
2.8.2
More information about the vlc-devel
mailing list