diff options
author | Samuel Nevala <samuel.nevala@intopalo.com> | 2015-09-23 09:16:19 +0300 |
---|---|---|
committer | Samuel Nevala <samuel.nevala@intopalo.com> | 2015-09-29 15:42:31 +0000 |
commit | 572f3f80fc90e5d5a08208c1302416ce19ac0f06 (patch) | |
tree | 33bef2d8a21cf9bcd926c666abbd4f89e9c1aa92 | |
parent | 83a68761f2374cd7f05bd8d256c7987caa17e230 (diff) |
winrt: Optimize camera viewfinder pipeline.
Move blitting from the camera device to render side device.
Change-Id: Iadb89f4285f1fc242dbd825e60e258e7a9cfba58
Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com>
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
-rw-r--r-- | src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index d42cc5779..177d05ebe 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<IDXGIResource> 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<IDXGIResource> sourceResource; + hr = texture->QueryInterface(IID_PPV_ARGS(&sourceResource)); + Q_ASSERT_SUCCEEDED(hr); + HANDLE sharedHandle; + hr = sourceResource->GetSharedHandle(&sharedHandle); + Q_ASSERT_SUCCEEDED(hr); + ComPtr<ID3D11Texture2D> 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<ID3D11VideoProcessorInputView> 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<ID3D11DeviceContext> context; @@ -182,7 +187,6 @@ public: private: ComPtr<ID3D11Device> m_d3dDevice; - ComPtr<ID3D11Texture2D> m_targetTexture; ID3D11Texture2D *m_target; ComPtr<ID3D11VideoDevice> m_videoDevice; ComPtr<ID3D11VideoProcessorEnumerator> m_videoEnumerator; @@ -277,10 +281,8 @@ bool QWinRTCameraVideoRendererControl::render(ID3D11Texture2D *target) return false; } - ComPtr<ID3D11Device> 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()); |