From 572f3f80fc90e5d5a08208c1302416ce19ac0f06 Mon Sep 17 00:00:00 2001 From: Samuel Nevala Date: Wed, 23 Sep 2015 09:16:19 +0300 Subject: [PATCH] winrt: Optimize camera viewfinder pipeline. Move blitting from the camera device to render side device. Change-Id: Iadb89f4285f1fc242dbd825e60e258e7a9cfba58 Reviewed-by: Oliver Wolff Reviewed-by: Andrew Knight --- .../qwinrtcameravideorenderercontrol.cpp | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index d42cc577..177d05eb 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp @@ -105,18 +105,13 @@ private: class D3DVideoBlitter { public: - D3DVideoBlitter(ID3D11Device *device, ID3D11Texture2D *target) - : m_d3dDevice(device), m_target(target) + D3DVideoBlitter(ID3D11Texture2D *target) + : m_target(target) { + Q_ASSERT(target); + target->GetDevice(&m_d3dDevice); + Q_ASSERT(m_d3dDevice); HRESULT hr; - ComPtr targetResource; - hr = target->QueryInterface(IID_PPV_ARGS(&targetResource)); - Q_ASSERT_SUCCEEDED(hr); - HANDLE sharedHandle; - hr = targetResource->GetSharedHandle(&sharedHandle); - Q_ASSERT_SUCCEEDED(hr); - hr = m_d3dDevice->OpenSharedResource(sharedHandle, IID_PPV_ARGS(&m_targetTexture)); - Q_ASSERT_SUCCEEDED(hr); hr = m_d3dDevice.As(&m_videoDevice); Q_ASSERT_SUCCEEDED(hr); } @@ -141,7 +136,7 @@ public: D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE, { 0 }, desc.Width, desc.Height, { 0 }, desc.Width, desc.Height, - D3D11_VIDEO_USAGE_PLAYBACK_NORMAL + D3D11_VIDEO_USAGE_OPTIMAL_SPEED }; hr = m_videoDevice->CreateVideoProcessorEnumerator(&videoProcessorDesc, &m_videoEnumerator); RETURN_VOID_IF_FAILED("Failed to create video enumerator"); @@ -155,16 +150,26 @@ public: if (!m_outputView) { D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputDesc = { D3D11_VPOV_DIMENSION_TEXTURE2D }; hr = m_videoDevice->CreateVideoProcessorOutputView( - m_targetTexture.Get(), m_videoEnumerator.Get(), &outputDesc, &m_outputView); + m_target, m_videoEnumerator.Get(), &outputDesc, &m_outputView); RETURN_VOID_IF_FAILED("Failed to create video output view"); } + ComPtr sourceResource; + hr = texture->QueryInterface(IID_PPV_ARGS(&sourceResource)); + Q_ASSERT_SUCCEEDED(hr); + HANDLE sharedHandle; + hr = sourceResource->GetSharedHandle(&sharedHandle); + Q_ASSERT_SUCCEEDED(hr); + ComPtr sharedTexture; + hr = m_d3dDevice->OpenSharedResource(sharedHandle, IID_PPV_ARGS(&sharedTexture)); + Q_ASSERT_SUCCEEDED(hr); + D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = { 0, D3D11_VPIV_DIMENSION_TEXTURE2D, { 0, 0 } }; ComPtr inputView; hr = m_videoDevice->CreateVideoProcessorInputView( - texture, m_videoEnumerator.Get(), &inputViewDesc, &inputView); + sharedTexture.Get(), m_videoEnumerator.Get(), &inputViewDesc, &inputView); RETURN_VOID_IF_FAILED("Failed to create video input view"); ComPtr context; @@ -182,7 +187,6 @@ public: private: ComPtr m_d3dDevice; - ComPtr m_targetTexture; ID3D11Texture2D *m_target; ComPtr m_videoDevice; ComPtr m_videoEnumerator; @@ -277,10 +281,8 @@ bool QWinRTCameraVideoRendererControl::render(ID3D11Texture2D *target) return false; } - ComPtr device; - sourceTexture->GetDevice(&device); - if (!d->blitter || d->blitter->device() != device.Get() || d->blitter->target() != target) - d->blitter.reset(new D3DVideoBlitter(device.Get(), target)); + if (!d->blitter || d->blitter->target() != target) + d->blitter.reset(new D3DVideoBlitter(target)); d->blitter->blit(sourceTexture.Get());