Advertisement
Guest User

Untitled

a guest
Apr 8th, 2013
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.69 KB | None | 0 0
  1. diff --git a/xbmc/cores/VideoRenderers/WinRenderer.cpp b/xbmc/cores/VideoRenderers/WinRenderer.cpp
  2. index 7842089..28c0961 100644
  3. --- a/xbmc/cores/VideoRenderers/WinRenderer.cpp
  4. +++ b/xbmc/cores/VideoRenderers/WinRenderer.cpp
  5. @@ -314,6 +314,19 @@ void CWinRenderer::Update(bool bPauseDrawing)
  6.    ManageDisplay();
  7.  }
  8.  
  9. +void CWinRenderer::FlushGPU()
  10. +{
  11. +  LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice();
  12. +  IDirect3DQuery9* pEvent = NULL;
  13. +
  14. +  pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &pEvent);
  15. +  if (pEvent != NULL)
  16. +  {
  17. +    pEvent->Issue(D3DISSUE_END);
  18. +    while (S_FALSE == pEvent->GetData(NULL, 0, D3DGETDATA_FLUSH)) Sleep(1);
  19. +  }
  20. +}
  21. +
  22.  void CWinRenderer::RenderUpdate(bool clear, DWORD flags, DWORD alpha)
  23.  {
  24.    LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice();
  25. @@ -440,7 +453,15 @@ bool CWinRenderer::CreateIntermediateRenderTarget()
  26.  
  27.    CLog::Log(LOGDEBUG, __FUNCTION__": format %i", format);
  28.  
  29. -  if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, format, D3DPOOL_DEFAULT))
  30. +  if (m_renderMethod == RENDER_DXVA)
  31. +  {
  32. +    if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT))
  33. +    {
  34. +      CLog::Log(LOGERROR, __FUNCTION__": Failed to create render target texture. Going back to DXVA hardware scaling.");
  35. +      return false;
  36. +    }
  37. +  }
  38. +  else if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, format, D3DPOOL_DEFAULT))
  39.    {
  40.      CLog::Log(LOGERROR, __FUNCTION__": render target creation failed. Going back to bilinear scaling.", format);
  41.      return false;
  42. @@ -510,7 +531,12 @@ void CWinRenderer::SelectPSVideoFilter()
  43.      bool scaleUp = (int)m_sourceHeight < g_graphicsContext.GetHeight() && (int)m_sourceWidth < g_graphicsContext.GetWidth();
  44.      bool scaleFps = m_fps < (g_advancedSettings.m_videoAutoScaleMaxFps + 0.01f);
  45.  
  46. -    if (Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
  47. +    if (m_renderMethod == RENDER_DXVA)
  48. +    {
  49. +      m_scalingMethod = VS_SCALINGMETHOD_DXVA_HARDWARE;
  50. +      m_bUseHQScaler = false;
  51. +    }
  52. +    else if (Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
  53.      {
  54.        m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST;
  55.        m_bUseHQScaler = true;
  56. @@ -558,6 +584,10 @@ void CWinRenderer::UpdatePSVideoFilter()
  57.  
  58.    SAFE_DELETE(m_colorShader);
  59.  
  60. +  // When using DXVA, we are already setup at this point, color shader is not needed
  61. +  if (m_renderMethod == RENDER_DXVA)
  62. +    return;
  63. +
  64.    if (m_bUseHQScaler)
  65.    {
  66.      m_colorShader = new CYUV2RGBShader();
  67. @@ -603,14 +633,11 @@ void CWinRenderer::UpdateVideoFilter()
  68.      break;
  69.  
  70.    case RENDER_PS:
  71. +  case RENDER_DXVA:
  72.      SelectPSVideoFilter();
  73.      UpdatePSVideoFilter();
  74.      break;
  75.  
  76. -  case RENDER_DXVA:
  77. -    // Everything already setup, nothing to do.
  78. -    break;
  79. -
  80.    default:
  81.      return;
  82.    }
  83. @@ -620,6 +647,9 @@ void CWinRenderer::Render(DWORD flags)
  84.  {
  85.    if (m_renderMethod == RENDER_DXVA)
  86.    {
  87. +    UpdateVideoFilter();
  88. +    if (m_bUseHQScaler)
  89. +      FlushGPU();
  90.      CWinRenderer::RenderProcessor(flags);
  91.      return;
  92.    }
  93. @@ -901,19 +931,38 @@ void CWinRenderer::RenderProcessor(DWORD flags)
  94.  {
  95.    CSingleLock lock(g_graphicsContext);
  96.    HRESULT hr;
  97. +  CRect destRect;
  98. +
  99. +  if (m_bUseHQScaler)
  100. +  {
  101. +    destRect.y1 = 0.0f;
  102. +    destRect.y2 = m_sourceHeight;
  103. +    destRect.x1 = 0.0f;
  104. +    destRect.x2 = m_sourceWidth;
  105. +  }
  106. +  else
  107. +    destRect = m_destRect;
  108.  
  109.    DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer];
  110.  
  111.    IDirect3DSurface9* target;
  112. -  if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
  113. +  if (m_bUseHQScaler)
  114. +    m_IntermediateTarget.GetSurfaceLevel(0, &target);
  115. +  else
  116.    {
  117. -    CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
  118. -    return;
  119. +    if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
  120. +    {
  121. +      CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
  122. +      return;
  123. +    }
  124.    }
  125.  
  126. -  m_processor.Render(m_sourceRect, m_destRect, target, image->id, flags);
  127. +  m_processor.Render(m_sourceRect, destRect, target, image->id, flags);
  128.  
  129.    target->Release();
  130. +
  131. +  if (m_bUseHQScaler)
  132. +    Stage2();
  133.  }
  134.  
  135.  bool CWinRenderer::RenderCapture(CRenderCapture* capture)
  136. @@ -1051,17 +1100,14 @@ bool CWinRenderer::Supports(ERENDERFEATURE feature)
  137.  
  138.  bool CWinRenderer::Supports(ESCALINGMETHOD method)
  139.  {
  140. -  if (m_renderMethod == RENDER_DXVA)
  141. +  if (m_renderMethod == RENDER_PS || m_renderMethod == RENDER_DXVA)
  142.    {
  143. -    if(method == VS_SCALINGMETHOD_DXVA_HARDWARE)
  144. +    if(m_renderMethod == RENDER_DXVA && method == VS_SCALINGMETHOD_DXVA_HARDWARE)
  145.        return true;
  146. -    return false;
  147. -  }
  148. -  else if(m_renderMethod == RENDER_PS)
  149. -  {
  150. +
  151.      if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)
  152.      && (   method == VS_SCALINGMETHOD_AUTO
  153. -        || method == VS_SCALINGMETHOD_LINEAR))
  154. +       || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS) ))
  155.          return true;
  156.  
  157.      if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0))
  158. diff --git a/xbmc/cores/VideoRenderers/WinRenderer.h b/xbmc/cores/VideoRenderers/WinRenderer.h
  159. index 2ab5684..13a42c5 100644
  160. --- a/xbmc/cores/VideoRenderers/WinRenderer.h
  161. +++ b/xbmc/cores/VideoRenderers/WinRenderer.h
  162. @@ -178,6 +178,7 @@ public:
  163.    virtual unsigned int GetProcessorSize() { return m_processor.Size(); }
  164.  
  165.  protected:
  166. +  void         FlushGPU();
  167.    virtual void Render(DWORD flags);
  168.    void         RenderSW();
  169.    void         RenderPS();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement