diff options
author | Anton Fedchin <afedchin@ruswizards.com> | 2015-10-23 15:59:23 +0300 |
---|---|---|
committer | Anton Fedchin <afedchin@ruswizards.com> | 2015-10-28 18:24:06 +0300 |
commit | be97e1781457047e469e57f50f7b4c0295b6f280 (patch) | |
tree | 5f52f20d60c302f6ae0065845fd94672ed66a73d | |
parent | e83e2f946c10b3e0b4a7990e37717aa694368304 (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.cpp | 70 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/WinRenderer.cpp | 48 |
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) |