summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2018-04-23 12:40:11 +0200
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2018-04-24 11:48:43 +0000
commitcebad2c2a97eb29b81664cd8027121642d0ec93b (patch)
treec98d3ba14396ca88329984b55c7ad1999305c82b
parentb660ff21c6f07eb08b63ad10946326259353d864 (diff)
downloadqtmultimedia-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.cpp19
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;