diff options
author | Anton Fedchin <anightik@gmail.com> | 2016-09-21 18:35:56 +0300 |
---|---|---|
committer | Anton Fedchin <anightik@gmail.com> | 2016-09-22 12:03:44 +0300 |
commit | ab0ad7697798b4204017c3a205c5811426366dab (patch) | |
tree | 9d727e389abc2358390191a719e91bf273de994e | |
parent | aac95f037f64f128e99df0bcd731783e3d072a63 (diff) |
[VideoPlayer] RenderCaptureDX: fixed HRESULT handling, event improvements, speedup memcpy with aligned dst + cosmetics.
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp | 86 |
1 files changed, 25 insertions, 61 deletions
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp index baad1aa6e6..a50e9b170e 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp @@ -23,6 +23,9 @@ #include "windowing/WindowingFactory.h" #include "settings/AdvancedSettings.h" #include "cores/IPlayer.h" +extern "C" { +#include "libavutil/mem.h" +} CRenderCaptureBase::CRenderCaptureBase() { @@ -325,7 +328,7 @@ CRenderCaptureDX::CRenderCaptureDX() CRenderCaptureDX::~CRenderCaptureDX() { CleanupDX(); - delete[] m_pixels; + av_freep(&m_pixels); g_Windowing.Unregister(this); } @@ -339,11 +342,11 @@ void CRenderCaptureDX::BeginRender() { ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_OCCLUSION); + CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_EVENT); if (!m_asyncChecked) { - m_asyncSupported = S_OK == pDevice->CreateQuery(&queryDesc, nullptr); + m_asyncSupported = SUCCEEDED(pDevice->CreateQuery(&queryDesc, nullptr)); if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_asyncSupported) @@ -351,7 +354,6 @@ void CRenderCaptureDX::BeginRender() if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION disabled, performance might suffer"); } - m_asyncChecked = true; } @@ -359,21 +361,12 @@ void CRenderCaptureDX::BeginRender() if (m_surfaceWidth != m_width || m_surfaceHeight != m_height) { - if (m_renderSurface) - { - while(m_renderSurface->Release() > 0) {} - m_renderSurface = nullptr; - } - - if (m_copySurface) - { - while (m_copySurface->Release() > 0) {} - m_copySurface = nullptr; - } + SAFE_RELEASE(m_renderSurface); + SAFE_RELEASE(m_copySurface); CD3D11_TEXTURE2D_DESC texDesc(DXGI_FORMAT_B8G8R8A8_UNORM, m_width, m_height, 1, 1, D3D11_BIND_RENDER_TARGET); result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_renderTexture); - if (S_OK != result) + if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (RENDER_TARGET) failed %s", g_Windowing.GetErrorDescription(result).c_str()); @@ -383,7 +376,7 @@ void CRenderCaptureDX::BeginRender() CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2D); result = pDevice->CreateRenderTargetView(m_renderTexture, &rtDesc, &m_renderSurface); - if (S_OK != result) + if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTargetView failed %s", g_Windowing.GetErrorDescription(result).c_str()); @@ -396,7 +389,7 @@ void CRenderCaptureDX::BeginRender() texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_copySurface); - if (S_OK != result) + if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (USAGE_STAGING) failed %s", g_Windowing.GetErrorDescription(result).c_str()); @@ -411,8 +404,8 @@ void CRenderCaptureDX::BeginRender() if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; - delete[] m_pixels; - m_pixels = new uint8_t[m_bufferSize]; + av_freep(&m_pixels); + m_pixels = (uint8_t*)av_malloc(m_bufferSize); } pContext->OMSetRenderTargets(1, &m_renderSurface, nullptr); @@ -423,35 +416,25 @@ void CRenderCaptureDX::BeginRender() if (!m_query) { result = pDevice->CreateQuery(&queryDesc, &m_query); - if (S_OK != result) + if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateQuery failed %s", g_Windowing.GetErrorDescription(result).c_str()); m_asyncSupported = false; - if (m_query) - { - while (m_query->Release() > 0) {} - m_query = nullptr; - } + SAFE_RELEASE(m_query); } } } else { //don't use an occlusion query, clean up any old one - if (m_query) - { - while (m_query->Release() > 0) {} - m_query = nullptr; - } + SAFE_RELEASE(m_query); } - - if (m_query) - g_Windowing.GetImmediateContext()->Begin(m_query); } void CRenderCaptureDX::EndRender() { + // send commands to the GPU queue g_Windowing.FinishCommandList(); ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); @@ -460,7 +443,6 @@ void CRenderCaptureDX::EndRender() if (m_query) { pContext->End(m_query); - pContext->GetData(m_query, nullptr, 0, 0); //flush the query request } if (m_flags & CAPTUREFLAG_IMMEDIATELY) @@ -475,11 +457,12 @@ void CRenderCaptureDX::ReadOut() { //if the result of the occlusion query is available, the data is probably also written into m_copySurface HRESULT result = g_Windowing.GetImmediateContext()->GetData(m_query, nullptr, 0, 0); - if (S_OK == result) + if (SUCCEEDED(result)) { - SurfaceToBuffer(); + if (S_OK == result) + SurfaceToBuffer(); } - else if (S_FALSE != result) + else { CLog::Log(LOGERROR, "CRenderCaptureDX::ReadOut: GetData failed"); SurfaceToBuffer(); @@ -532,29 +515,10 @@ void CRenderCaptureDX::OnDestroyDevice() void CRenderCaptureDX::CleanupDX() { - if (m_renderSurface) - { - while (m_renderSurface->Release() > 0) {} - m_renderSurface = nullptr; - } - - if (m_renderTexture) - { - while (m_renderTexture->Release() > 0) {} - m_renderTexture = nullptr; - } - - if (m_copySurface) - { - while (m_copySurface->Release() > 0) {} - m_copySurface = nullptr; - } - - if (m_query) - { - while (m_query->Release() > 0) {} - m_query = nullptr; - } + SAFE_RELEASE(m_renderSurface); + SAFE_RELEASE(m_renderTexture); + SAFE_RELEASE(m_copySurface); + SAFE_RELEASE(m_query); m_surfaceWidth = 0; m_surfaceHeight = 0; |