diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-04-23 12:40:11 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-04-24 11:48:43 +0000 |
commit | cebad2c2a97eb29b81664cd8027121642d0ec93b (patch) | |
tree | c98d3ba14396ca88329984b55c7ad1999305c82b | |
parent | b660ff21c6f07eb08b63ad10946326259353d864 (diff) | |
download | qtmultimedia-cebad2c2a97eb29b81664cd8027121642d0ec93b.tar.gz |
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 <oliver.wolff@qt.io>
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r-- | src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp | 19 |
1 files 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 <QVideoFrame> #include <d3d11.h> +#include <D3D11_1.h> #include <mfapi.h> #include <wrl.h> @@ -183,15 +184,18 @@ public: RETURN_VOID_IF_FAILED("Failed to create video output view"); } - ComPtr<IDXGIResource> sourceResource; + ComPtr<IDXGIResource1> 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<ID3D11Device1> dev; + hr = m_d3dDevice.As(&dev); + RETURN_VOID_IF_FAILED("Failed to cast from ID3D11Device to ID3D11Device1"); ComPtr<ID3D11Texture2D> 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<ID3D11VideoProcessorInputView> 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<ID3D11DeviceContext> context; |