aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <anightik@gmail.com>2016-09-21 18:35:56 +0300
committerAnton Fedchin <anightik@gmail.com>2016-09-22 12:03:44 +0300
commitab0ad7697798b4204017c3a205c5811426366dab (patch)
tree9d727e389abc2358390191a719e91bf273de994e
parentaac95f037f64f128e99df0bcd731783e3d072a63 (diff)
[VideoPlayer] RenderCaptureDX: fixed HRESULT handling, event improvements, speedup memcpy with aligned dst + cosmetics.
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp86
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;