summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Nevala <samuel.nevala@intopalo.com>2015-09-23 09:16:19 +0300
committerSamuel Nevala <samuel.nevala@intopalo.com>2015-09-29 15:42:31 +0000
commit572f3f80fc90e5d5a08208c1302416ce19ac0f06 (patch)
tree33bef2d8a21cf9bcd926c666abbd4f89e9c1aa92
parent83a68761f2374cd7f05bd8d256c7987caa17e230 (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.cpp38
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());