[WinRenderer] Fixed HQ scalers again.
authorAnton Fedchin <afedchin@ruswizards.com>
Fri, 30 Oct 2015 19:45:58 +0000 (22:45 +0300)
committerAnton Fedchin <afedchin@ruswizards.com>
Fri, 30 Oct 2015 19:45:58 +0000 (22:45 +0300)
xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
xbmc/cores/VideoRenderers/WinRenderer.cpp

index 73c2a2e..2aafd0e 100644 (file)
@@ -315,10 +315,6 @@ void CYUV2RGBShader::Render(CRect sourceRect, CRect destRect,
                     contrast, brightness, flags);
   SetShaderParameters(YUVbuf);
   Execute(nullptr, 4);
-
-  // we changed view port, so we need to restore our real viewport.
-  g_Windowing.RestoreViewPort();
-
 }
 
 CYUV2RGBShader::~CYUV2RGBShader()
@@ -391,32 +387,9 @@ void CYUV2RGBShader::SetShaderParameters(YUVBuffer* YUVbuf)
     m_effect.SetTexture("g_VTexture", YUVbuf->planes[2].texture);
   m_effect.SetFloatArray("g_StepXY", m_texSteps, ARRAY_SIZE(m_texSteps));
 
-  // we need to set view port to the full size of current render target
-  ID3D11RenderTargetView* rtView = nullptr;
-  g_Windowing.Get3D11Context()->OMGetRenderTargets(1, &rtView, nullptr);
-
-  // get dimention of render target
-  ID3D11Resource* rtResource = nullptr;
-  rtView->GetResource(&rtResource);
-  ID3D11Texture2D* rtTexture = nullptr;
-  HRESULT hr = rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture));
-
-  float viewPortWidth = 0.0f, viewPortHeight = 0.0f;
-
-  if (S_OK == hr && rtTexture)
-  {
-    D3D11_TEXTURE2D_DESC rtDescr = {};
-    rtTexture->GetDesc(&rtDescr);
-    viewPortWidth = static_cast<float>(rtDescr.Width);
-    viewPortHeight = static_cast<float>(rtDescr.Height);
-  }
-
-  SAFE_RELEASE(rtTexture);
-  SAFE_RELEASE(rtResource);
-  SAFE_RELEASE(rtView);
-
-  D3D11_VIEWPORT viewPort = { 0.0f, 0.0f, viewPortWidth, viewPortHeight, 0.0, 1.0f };
-  g_Windowing.Get3D11Context()->RSSetViewports(1, &viewPort);
+  UINT numPorts = 1;
+  D3D11_VIEWPORT viewPort;
+  g_Windowing.Get3D11Context()->RSGetViewports(&numPorts, &viewPort);
   m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2);
 }
 
index 7204383..f16ce04 100644 (file)
@@ -814,49 +814,50 @@ void CWinRenderer::RenderPS()
 
 void CWinRenderer::Stage1()
 {
+  CD3D11_VIEWPORT viewPort(0.0f, 0.0f, 0.0f, 0.0f);
   ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
 
-  // Store current render target and depth view.
-  ID3D11RenderTargetView *oldRT = nullptr; ID3D11DepthStencilView* oldDS = nullptr;
-  pContext->OMGetRenderTargets(1, &oldRT, &oldDS);
-
-  if (!m_bUseHQScaler)
-  {
-    // disable depth
-    pContext->OMSetRenderTargets(1, &oldRT, nullptr);
-    // render video frame
-    m_colorShader->Render(m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect),
-                            CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
-                            CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
-                            m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
-  }
-  else
+  // store current render target and depth view.
+  ID3D11RenderTargetView *oldRTView = nullptr; ID3D11DepthStencilView* oldDSView = nullptr;
+  pContext->OMGetRenderTargets(1, &oldRTView, &oldDSView);
+  // select destination rectangle 
+  CRect destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect);
+  // select target view 
+  ID3D11RenderTargetView* pRTView = m_bUseHQScaler ? m_IntermediateTarget.GetRenderTarget() : oldRTView;
+  // set destination render target
+  pContext->OMSetRenderTargets(1, &pRTView, nullptr);
+  // get rendertarget's dimension
+  if (pRTView)
   {
-    // At DX9 setting a new render target will cause the viewport 
-    // to be set to the full size of the new render target.
-    // In DX11 we should do this manualy
-    CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast<float>(m_IntermediateTarget.GetWidth()), static_cast<float>(m_IntermediateTarget.GetHeight()));
-    pContext->RSSetViewports(1, &viewPort);
-
-    ID3D11RenderTargetView *newRT = m_IntermediateTarget.GetRenderTarget();
-
-    // this needs to avoid binding m_IntermediateTarget as shader resource and as render target at the same time
-    CD3DHelper::PSClearShaderResources(pContext);
-    // Switch the render target to the temporary destination
-    pContext->OMSetRenderTargets(1, &newRT, nullptr);
-
-    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();
-  }
+    ID3D11Resource* pResource = nullptr;
+    ID3D11Texture2D* pTexture = nullptr;
 
+    pRTView->GetResource(&pResource);
+    if (SUCCEEDED(pResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pTexture))))
+    {
+      D3D11_TEXTURE2D_DESC desc;
+      pTexture->GetDesc(&desc);
+      viewPort = CD3D11_VIEWPORT(0.0f, 0.0f, desc.Width, desc.Height);
+    }
+    SAFE_RELEASE(pResource);
+    SAFE_RELEASE(pTexture);
+  }
+  // reset scissors for HQ scaler
+  if (m_bUseHQScaler)
+    g_Windowing.ResetScissors();
+  // reset view port
+  pContext->RSSetViewports(1, &viewPort);
+  // render video frame
+  m_colorShader->Render(m_sourceRect, destRect,
+                        CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
+                        CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
+                        m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
+  // Restore our view port.
+  g_Windowing.RestoreViewPort();
   // Restore the render target and depth view.
-  pContext->OMSetRenderTargets(1, &oldRT, oldDS);
-  SAFE_RELEASE(oldRT);
-  SAFE_RELEASE(oldDS);
+  pContext->OMSetRenderTargets(1, &oldRTView, oldDSView);
+  SAFE_RELEASE(oldRTView);
+  SAFE_RELEASE(oldDSView);
 }
 
 void CWinRenderer::Stage2()