aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <afedchin@ruswizards.com>2015-10-23 15:59:23 +0300
committerAnton Fedchin <afedchin@ruswizards.com>2015-10-28 18:24:06 +0300
commitbe97e1781457047e469e57f50f7b4c0295b6f280 (patch)
tree5f52f20d60c302f6ae0065845fd94672ed66a73d
parente83e2f946c10b3e0b4a7990e37717aa694368304 (diff)
[WinRenderer] Fix HQ scallers, to avoid unnecessary scaling at Stage1 (with DXVA processor and color shader). This also fixes HQ scallers for TAB/SBS modes.
-rw-r--r--xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp70
-rw-r--r--xbmc/cores/VideoRenderers/WinRenderer.cpp48
2 files changed, 50 insertions, 68 deletions
diff --git a/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp b/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
index 133a5937cd..73c2a2e3b3 100644
--- a/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
+++ b/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
@@ -20,16 +20,17 @@
#ifdef HAS_DX
-#include <DirectXPackedVector.h>
#include "WinVideoFilter.h"
-#include "windowing/WindowingFactory.h"
-#include "../../../utils/log.h"
-#include "../../../FileSystem/File.h"
-#include <map>
#include "ConvolutionKernels.h"
-#include "YUV2RGBShader.h"
-#include "win32/WIN32Util.h"
+#include <DirectXPackedVector.h>
+#include "FileSystem/File.h"
+#include "guilib/GraphicContext.h"
#include "Util.h"
+#include "utils/log.h"
+#include "win32/WIN32Util.h"
+#include "windowing/WindowingFactory.h"
+#include "YUV2RGBShader.h"
+#include <map>
using namespace DirectX::PackedVector;
@@ -844,48 +845,57 @@ void CConvolutionShaderSeparable::SetShaderParameters(CD3DTexture &sourceTexture
void CConvolutionShaderSeparable::SetStepParams(UINT iPass)
{
- float viewPortWidth = 0.0f, viewPortHeight = 0.0f;
+ CD3D11_VIEWPORT viewPort(.0f, .0f, .0f, .0f);
ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
if (iPass == 0)
{
// store old RT
pContext->OMGetRenderTargets(1, &m_oldRenderTarget, nullptr);
- viewPortWidth = (float)m_IntermediateTarget.GetWidth();
- viewPortHeight = (float)m_IntermediateTarget.GetHeight();
-
// setting new RT
ID3D11RenderTargetView* newRT = m_IntermediateTarget.GetRenderTarget();
pContext->OMSetRenderTargets(1, &newRT, nullptr);
+ // new viewport
+ viewPort = CD3D11_VIEWPORT(0.0f, 0.0f,
+ static_cast<float>(m_IntermediateTarget.GetWidth()),
+ static_cast<float>(m_IntermediateTarget.GetHeight()));
+ // reset scissor
+ g_Windowing.ResetScissors();
}
else if (iPass == 1)
{
- // get dimention of old render target
- ID3D11Resource* rtResource = nullptr;
- m_oldRenderTarget->GetResource(&rtResource);
- ID3D11Texture2D* rtTexture = nullptr;
- HRESULT hr = rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture));
-
- if (S_OK == hr && rtTexture)
+ if (m_oldRenderTarget)
{
- D3D11_TEXTURE2D_DESC rtDescr = {};
- rtTexture->GetDesc(&rtDescr);
- viewPortWidth = static_cast<float>(rtDescr.Width);
- viewPortHeight = static_cast<float>(rtDescr.Height);
+ // get dimention of old render target
+ ID3D11Resource* rtResource = nullptr;
+ m_oldRenderTarget->GetResource(&rtResource);
+ ID3D11Texture2D* rtTexture = nullptr;
+ if (SUCCEEDED(rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture))))
+ {
+ D3D11_TEXTURE2D_DESC rtDescr = {};
+ rtTexture->GetDesc(&rtDescr);
+ viewPort = CD3D11_VIEWPORT(0.0f, 0.0f,
+ static_cast<float>(rtDescr.Width),
+ static_cast<float>(rtDescr.Height));
+ }
+ SAFE_RELEASE(rtTexture);
+ SAFE_RELEASE(rtResource);
+ }
+ else
+ {
+ // current RT is null so try to restore viewport
+ CRect winViewPort;
+ g_Windowing.GetViewPort(winViewPort);
+ viewPort = CD3D11_VIEWPORT(winViewPort.x1, winViewPort.y1, winViewPort.Width(), winViewPort.Height());
}
-
- SAFE_RELEASE(rtTexture);
- SAFE_RELEASE(rtResource);
-
pContext->OMSetRenderTargets(1, &m_oldRenderTarget, nullptr);
SAFE_RELEASE(m_oldRenderTarget);
-
// at the second pass m_IntermediateTarget is a source of data
m_effect.SetTexture("g_Texture", m_IntermediateTarget);
+ // restore scissor
+ g_Windowing.SetScissors(g_graphicsContext.StereoCorrection(g_graphicsContext.GetScissors()));
}
-
- // setting view port to the full size of the current render target
- CD3D11_VIEWPORT viewPort(0.0f, 0.0f, viewPortWidth, viewPortHeight);
+ // seting view port
pContext->RSSetViewports(1, &viewPort);
// pass viewport dimention to the shaders
m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2);
diff --git a/xbmc/cores/VideoRenderers/WinRenderer.cpp b/xbmc/cores/VideoRenderers/WinRenderer.cpp
index 1dea24febb..7204383786 100644
--- a/xbmc/cores/VideoRenderers/WinRenderer.cpp
+++ b/xbmc/cores/VideoRenderers/WinRenderer.cpp
@@ -815,7 +815,6 @@ void CWinRenderer::RenderPS()
void CWinRenderer::Stage1()
{
ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
- g_Windowing.ResetScissors();
// Store current render target and depth view.
ID3D11RenderTargetView *oldRT = nullptr; ID3D11DepthStencilView* oldDS = nullptr;
@@ -846,13 +845,10 @@ void CWinRenderer::Stage1()
// Switch the render target to the temporary destination
pContext->OMSetRenderTargets(1, &newRT, nullptr);
- CRect srcRect(0.0f, 0.0f, static_cast<float>(m_sourceWidth), static_cast<float>(m_sourceHeight));
-
- m_colorShader->Render(srcRect, srcRect,
+ m_colorShader->Render(m_sourceRect, m_sourceRect,
CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
-
// Restore our view port.
g_Windowing.RestoreViewPort();
}
@@ -865,41 +861,14 @@ void CWinRenderer::Stage1()
void CWinRenderer::Stage2()
{
- g_Windowing.ResetScissors();
-
- CRect sourceRect;
-
- // fixup stereo+dxva+hq scaling issue
- if (m_renderMethod == RENDER_DXVA)
- {
- sourceRect.y1 = 0.0f;
- sourceRect.y2 = static_cast<float>(m_sourceHeight);
- sourceRect.x1 = 0.0f;
- sourceRect.x2 = static_cast<float>(m_sourceWidth);
- }
- else
- sourceRect = m_sourceRect;
-
- m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight, sourceRect, g_graphicsContext.StereoCorrection(m_destRect));
+ m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight, m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect));
}
void CWinRenderer::RenderProcessor(DWORD flags)
{
CSingleLock lock(g_graphicsContext);
- CRect destRect;
-
- if (m_bUseHQScaler)
- {
- destRect.y1 = 0.0f;
- destRect.y2 = static_cast<float>(m_sourceHeight);
- destRect.x1 = 0.0f;
- destRect.x2 = static_cast<float>(m_sourceWidth);
- }
- else
- destRect = g_graphicsContext.StereoCorrection(m_destRect);
-
+ CRect destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect);
DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer];
-
if (!image->pic)
return;
@@ -911,14 +880,17 @@ void CWinRenderer::RenderProcessor(DWORD flags)
|| true /* workaround for some GPUs */)
{
target = m_IntermediateTarget.Get();
- //target->AddRef(); // uncomment when workaround removed
+ target->AddRef();
}
else // dead code.
{
ID3D11RenderTargetView* rtv = nullptr;
g_Windowing.Get3D11Context()->OMGetRenderTargets(1, &rtv, nullptr);
- rtv->GetResource(&target);
- rtv->Release();
+ if (rtv)
+ {
+ rtv->GetResource(&target);
+ rtv->Release();
+ }
}
int past = 0;
@@ -964,7 +936,6 @@ void CWinRenderer::RenderProcessor(DWORD flags)
}
m_processor->Render(m_sourceRect, destRect, target, views, flags, image->frameIdx);
- //target->Release(); // uncomment when workaround removed
if (m_bUseHQScaler)
{
@@ -979,6 +950,7 @@ void CWinRenderer::RenderProcessor(DWORD flags)
CRect tu = { destRect.x1 / m_destWidth, destRect.y1 / m_destHeight, destRect.x2 / m_destWidth, destRect.y2 / m_destHeight };
CD3DTexture::DrawQuad(m_destRect, 0, &m_IntermediateTarget, &tu, SHADER_METHOD_RENDER_TEXTURE_NOBLEND);
}
+ SAFE_RELEASE(target);
}
bool CWinRenderer::RenderCapture(CRenderCapture* capture)