Advertisement
Guest User

XBMC DXVA+ HQ scalers

a guest
Mar 15th, 2011
613
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 9.37 KB | None | 0 0
  1. diff --git xbmc/cores/VideoRenderers/WinRenderer.cpp xbmc/cores/VideoRenderers/WinRenderer.cpp
  2. index 4b0214f..9c4556f 100644
  3. --- xbmc/cores/VideoRenderers/WinRenderer.cpp
  4. +++ xbmc/cores/VideoRenderers/WinRenderer.cpp
  5. @@ -285,6 +285,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. @@ -463,7 +476,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 (CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_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. @@ -531,7 +552,21 @@ 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 (CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA)
  48. +    {
  49. +      if (g_advancedSettings.m_DXVAEnableHQScalers && g_advancedSettings.m_DXVAPreferHQScalers
  50. +       && Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
  51. +      {
  52. +        m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST;
  53. +        m_bUseHQScaler = true;
  54. +      }
  55. +      else
  56. +      {
  57. +        m_scalingMethod = VS_SCALINGMETHOD_DXVA_HARDWARE;
  58. +        m_bUseHQScaler = false;
  59. +      }
  60. +    }
  61. +    else if (Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
  62.      {
  63.        m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST;
  64.        m_bUseHQScaler = true;
  65. @@ -567,25 +602,29 @@ void CWinRenderer::UpdatePSVideoFilter()
  66.  
  67.    BufferFormat format = BufferFormatFromFlags(m_flags);
  68.  
  69. -  if (m_bUseHQScaler)
  70. +  // When using DXVA, we are already setup at this point, color shader is not needed
  71. +  if (CONF_FLAGS_FORMAT_MASK(m_flags) != CONF_FLAGS_FORMAT_DXVA)
  72.    {
  73. -    m_colorShader = new CYUV2RGBShader();
  74. -    if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
  75. +    if (m_bUseHQScaler)
  76.      {
  77. -      // Try again after disabling the HQ scaler and freeing its resources
  78. -      m_IntermediateTarget.Release();
  79. -      SAFE_RELEASE(m_scalerShader);
  80. -      SAFE_RELEASE(m_colorShader);
  81. -      m_bUseHQScaler = false;
  82. +      m_colorShader = new CYUV2RGBShader();
  83. +      if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
  84. +      {
  85. +        // Try again after disabling the HQ scaler and freeing its resources
  86. +        m_IntermediateTarget.Release();
  87. +        SAFE_RELEASE(m_scalerShader);
  88. +        SAFE_RELEASE(m_colorShader);
  89. +        m_bUseHQScaler = false;
  90. +      }
  91.      }
  92. -  }
  93.  
  94. -  if (!m_bUseHQScaler) //fallback from HQ scalers and multipass creation above
  95. -  {
  96. -    m_colorShader = new CYUV2RGBShader();
  97. -    if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
  98. -      SAFE_RELEASE(m_colorShader);
  99. -    // we're in big trouble - should fallback on D3D accelerated or sw method
  100. +    if (!m_bUseHQScaler) //fallback from HQ scalers and multipass creation above
  101. +    {
  102. +      m_colorShader = new CYUV2RGBShader();
  103. +      if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
  104. +        SAFE_RELEASE(m_colorShader);
  105. +      // we're in big trouble - should fallback on D3D accelerated or sw method
  106. +    }
  107.    }
  108.  }
  109.  
  110. @@ -612,14 +651,11 @@ void CWinRenderer::UpdateVideoFilter()
  111.      break;
  112.  
  113.    case RENDER_PS:
  114. +  case RENDER_DXVA:
  115.      SelectPSVideoFilter();
  116.      UpdatePSVideoFilter();
  117.      break;
  118.  
  119. -  case RENDER_DXVA:
  120. -    // Everything already setup, nothing to do.
  121. -    break;
  122. -
  123.    default:
  124.      return;
  125.    }
  126. @@ -661,6 +697,11 @@ void CWinRenderer::Render(DWORD flags)
  127.  {
  128.    if(CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA)
  129.    {
  130. +    if (g_advancedSettings.m_DXVAEnableHQScalers)
  131. +    {
  132. +      UpdateVideoFilter();
  133. +      if (m_bUseHQScaler) FlushGPU();
  134. +    }
  135.      CWinRenderer::RenderProcessor(flags);
  136.      return;
  137.    }
  138. @@ -937,27 +978,47 @@ void CWinRenderer::Stage2()
  139.  void CWinRenderer::RenderProcessor(DWORD flags)
  140.  {
  141.    CSingleLock lock(g_graphicsContext);
  142. -  RECT rect;
  143. +
  144.    HRESULT hr;
  145. -  rect.top    = m_destRect.y1;
  146. -  rect.bottom = m_destRect.y2;
  147. -  rect.left   = m_destRect.x1;
  148. -  rect.right  = m_destRect.x2;
  149. +  RECT rect;
  150. +
  151. +  if (m_bUseHQScaler)
  152. +  {
  153. +    rect.top    = 0.0f;
  154. +    rect.bottom = m_sourceHeight;
  155. +    rect.left   = 0.0f;
  156. +    rect.right  = m_sourceWidth;
  157. +  }
  158. +  else
  159. +  {
  160. +    rect.top    = m_destRect.y1;
  161. +    rect.bottom = m_destRect.y2;
  162. +    rect.left   = m_destRect.x1;
  163. +    rect.right  = m_destRect.x2;
  164. +  }
  165.  
  166.    DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer];
  167.    if(image->proc == NULL)
  168.      return;
  169.  
  170.    IDirect3DSurface9* target;
  171. -  if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
  172. +  if (m_bUseHQScaler)
  173. +    m_IntermediateTarget.GetSurfaceLevel(0, &target);
  174. +  else
  175.    {
  176. -    CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
  177. -    return;
  178. +    if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
  179. +    {
  180. +      CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
  181. +      return;
  182. +    }
  183.    }
  184.  
  185.    image->proc->Render(rect, target, image->id);
  186.  
  187.    target->Release();
  188. +
  189. +  if (m_bUseHQScaler)
  190. +    Stage2();
  191.  }
  192.  
  193.  bool CWinRenderer::RenderCapture(CRenderCapture* capture)
  194. @@ -1069,17 +1130,17 @@ bool CWinRenderer::Supports(ERENDERFEATURE feature)
  195.  
  196.  bool CWinRenderer::Supports(ESCALINGMETHOD method)
  197.  {
  198. -  if (m_renderMethod == RENDER_DXVA)
  199. +  if (m_renderMethod == RENDER_PS || m_renderMethod == RENDER_DXVA)
  200.    {
  201. -    if(method == VS_SCALINGMETHOD_DXVA_HARDWARE)
  202. +    if(m_renderMethod == RENDER_DXVA && method == VS_SCALINGMETHOD_DXVA_HARDWARE)
  203.        return true;
  204. -    return false;
  205. -  }
  206. -  else if(m_renderMethod == RENDER_PS)
  207. -  {
  208. +
  209. +    if (m_renderMethod == RENDER_DXVA && !g_advancedSettings.m_DXVAEnableHQScalers)
  210. +      return false;
  211. +
  212.      if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)
  213.      && (   method == VS_SCALINGMETHOD_AUTO
  214. -        || method == VS_SCALINGMETHOD_LINEAR))
  215. +       || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS) ))
  216.          return true;
  217.  
  218.      if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0))
  219. diff --git xbmc/cores/VideoRenderers/WinRenderer.h xbmc/cores/VideoRenderers/WinRenderer.h
  220. index cccde7d..6a1351a 100644
  221. --- xbmc/cores/VideoRenderers/WinRenderer.h
  222. +++ xbmc/cores/VideoRenderers/WinRenderer.h
  223. @@ -213,6 +213,7 @@ public:
  224.    static void          CropSource(RECT& src, RECT& dst, const D3DSURFACE_DESC& desc);
  225.  
  226.  protected:
  227. +  void         FlushGPU();
  228.    virtual void Render(DWORD flags);
  229.    void         RenderSW();
  230.    void         RenderPS();
  231. diff --git xbmc/settings/AdvancedSettings.cpp xbmc/settings/AdvancedSettings.cpp
  232. index 17b2476..f99236b 100644
  233. --- xbmc/settings/AdvancedSettings.cpp
  234. +++ xbmc/settings/AdvancedSettings.cpp
  235. @@ -93,6 +93,8 @@ void CAdvancedSettings::Initialize()
  236.    m_videoAllowMpeg4VDPAU = false;
  237.    m_DXVACheckCompatibility = false;
  238.    m_DXVACheckCompatibilityPresent = false;
  239. +  m_DXVAEnableHQScalers = false;
  240. +  m_DXVAPreferHQScalers = false;
  241.  
  242.    m_musicUseTimeSeeking = true;
  243.    m_musicTimeSeekForward = 10;
  244. @@ -512,7 +514,8 @@ bool CAdvancedSettings::Load()
  245.      }
  246.  
  247.      m_DXVACheckCompatibilityPresent = XMLUtils::GetBoolean(pElement,"checkdxvacompatibility", m_DXVACheckCompatibility);
  248. -
  249. +    XMLUtils::GetBoolean(pElement,"enabledxvahqscalers", m_DXVAEnableHQScalers);
  250. +    XMLUtils::GetBoolean(pElement,"preferdxvahqscalers", m_DXVAPreferHQScalers);
  251.    }
  252.  
  253.    pElement = pRootElement->FirstChildElement("musiclibrary");
  254. diff --git xbmc/settings/AdvancedSettings.h xbmc/settings/AdvancedSettings.h
  255. index acc92fa..c5770db 100644
  256. --- xbmc/settings/AdvancedSettings.h
  257. +++ xbmc/settings/AdvancedSettings.h
  258. @@ -126,6 +126,8 @@ class CAdvancedSettings : public virtual xbmcutil::Referenced
  259.      std::vector<RefreshOverride> m_videoAdjustRefreshOverrides;
  260.      bool m_DXVACheckCompatibility;
  261.      bool m_DXVACheckCompatibilityPresent;
  262. +    bool m_DXVAEnableHQScalers;
  263. +    bool m_DXVAPreferHQScalers;
  264.  
  265.      CStdString m_videoDefaultPlayer;
  266.      CStdString m_videoDefaultDVDPlayer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement