From cebad2c2a97eb29b81664cd8027121642d0ec93b Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Mon, 23 Apr 2018 12:40:11 +0200 Subject: WinRT: Fix white screen for camera output Starting with Direct3D 11.1 GetSharedHandle is not recommended to be used. Instead IDXGIResource1::CreateSharedHandle should be used to get a handle for sharing. It returns NT handle and needs to call CloseHandle. GetSharedHandle fails with E_INVALIDARG seems due to a handle is not shared. Task-number: QTBUG-67417 Change-Id: Ib28acb8edbf737e84f5eef91e7a3a88b2f022bcb Reviewed-by: Oliver Wolff Reviewed-by: Maurice Kalinowski --- .../winrt/qwinrtcameravideorenderercontrol.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index 0a5ae46fa..03d107ae8 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp @@ -46,6 +46,7 @@ #include #include +#include #include #include @@ -183,15 +184,18 @@ public: RETURN_VOID_IF_FAILED("Failed to create video output view"); } - ComPtr sourceResource; + ComPtr sourceResource; hr = texture->QueryInterface(IID_PPV_ARGS(&sourceResource)); - Q_ASSERT_SUCCEEDED(hr); - HANDLE sharedHandle; - hr = sourceResource->GetSharedHandle(&sharedHandle); - Q_ASSERT_SUCCEEDED(hr); + RETURN_VOID_IF_FAILED("Failed to query interface IDXGIResource1"); + HANDLE sharedHandle = NULL; + hr = sourceResource->CreateSharedHandle(NULL, DXGI_SHARED_RESOURCE_READ, NULL, &sharedHandle); + RETURN_VOID_IF_FAILED("Failed to create shared handle"); + ComPtr dev; + hr = m_d3dDevice.As(&dev); + RETURN_VOID_IF_FAILED("Failed to cast from ID3D11Device to ID3D11Device1"); ComPtr sharedTexture; - hr = m_d3dDevice->OpenSharedResource(sharedHandle, IID_PPV_ARGS(&sharedTexture)); - Q_ASSERT_SUCCEEDED(hr); + hr = dev->OpenSharedResource1(sharedHandle, IID_PPV_ARGS(&sharedTexture)); + RETURN_VOID_IF_FAILED("Failed to open shared resource"); D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = { 0, D3D11_VPIV_DIMENSION_TEXTURE2D, { 0, 0 } @@ -199,6 +203,7 @@ public: ComPtr inputView; hr = m_videoDevice->CreateVideoProcessorInputView( sharedTexture.Get(), m_videoEnumerator.Get(), &inputViewDesc, &inputView); + CloseHandle(sharedHandle); RETURN_VOID_IF_FAILED("Failed to create video input view"); ComPtr context; -- cgit v1.2.1