Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git xbmc/cores/VideoRenderers/WinRenderer.cpp xbmc/cores/VideoRenderers/WinRenderer.cpp
- index 4b0214f..9c4556f 100644
- --- xbmc/cores/VideoRenderers/WinRenderer.cpp
- +++ xbmc/cores/VideoRenderers/WinRenderer.cpp
- @@ -285,6 +285,19 @@ void CWinRenderer::Update(bool bPauseDrawing)
- ManageDisplay();
- }
- +void CWinRenderer::FlushGPU()
- +{
- + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice();
- + IDirect3DQuery9* pEvent = NULL;
- +
- + pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &pEvent);
- + if (pEvent != NULL)
- + {
- + pEvent->Issue(D3DISSUE_END);
- + while (S_FALSE == pEvent->GetData(NULL, 0, D3DGETDATA_FLUSH)) Sleep(1);
- + }
- +}
- +
- void CWinRenderer::RenderUpdate(bool clear, DWORD flags, DWORD alpha)
- {
- LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice();
- @@ -463,7 +476,15 @@ bool CWinRenderer::CreateIntermediateRenderTarget()
- CLog::Log(LOGDEBUG, __FUNCTION__": format %i", format);
- - if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, format, D3DPOOL_DEFAULT))
- + if (CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA)
- + {
- + if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT))
- + {
- + CLog::Log(LOGERROR, __FUNCTION__": Failed to create render target texture. Going back to DXVA hardware scaling.");
- + return false;
- + }
- + }
- + else if(!m_IntermediateTarget.Create(m_sourceWidth, m_sourceHeight, 1, usage, format, D3DPOOL_DEFAULT))
- {
- CLog::Log(LOGERROR, __FUNCTION__": render target creation failed. Going back to bilinear scaling.", format);
- return false;
- @@ -531,7 +552,21 @@ void CWinRenderer::SelectPSVideoFilter()
- bool scaleUp = (int)m_sourceHeight < g_graphicsContext.GetHeight() && (int)m_sourceWidth < g_graphicsContext.GetWidth();
- bool scaleFps = m_fps < (g_advancedSettings.m_videoAutoScaleMaxFps + 0.01f);
- - if (Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
- + if (CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA)
- + {
- + if (g_advancedSettings.m_DXVAEnableHQScalers && g_advancedSettings.m_DXVAPreferHQScalers
- + && Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
- + {
- + m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST;
- + m_bUseHQScaler = true;
- + }
- + else
- + {
- + m_scalingMethod = VS_SCALINGMETHOD_DXVA_HARDWARE;
- + m_bUseHQScaler = false;
- + }
- + }
- + else if (Supports(VS_SCALINGMETHOD_LANCZOS3_FAST) && scaleSD && scaleUp && scaleFps)
- {
- m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST;
- m_bUseHQScaler = true;
- @@ -567,25 +602,29 @@ void CWinRenderer::UpdatePSVideoFilter()
- BufferFormat format = BufferFormatFromFlags(m_flags);
- - if (m_bUseHQScaler)
- + // When using DXVA, we are already setup at this point, color shader is not needed
- + if (CONF_FLAGS_FORMAT_MASK(m_flags) != CONF_FLAGS_FORMAT_DXVA)
- {
- - m_colorShader = new CYUV2RGBShader();
- - if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
- + if (m_bUseHQScaler)
- {
- - // Try again after disabling the HQ scaler and freeing its resources
- - m_IntermediateTarget.Release();
- - SAFE_RELEASE(m_scalerShader);
- - SAFE_RELEASE(m_colorShader);
- - m_bUseHQScaler = false;
- + m_colorShader = new CYUV2RGBShader();
- + if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
- + {
- + // Try again after disabling the HQ scaler and freeing its resources
- + m_IntermediateTarget.Release();
- + SAFE_RELEASE(m_scalerShader);
- + SAFE_RELEASE(m_colorShader);
- + m_bUseHQScaler = false;
- + }
- }
- - }
- - if (!m_bUseHQScaler) //fallback from HQ scalers and multipass creation above
- - {
- - m_colorShader = new CYUV2RGBShader();
- - if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
- - SAFE_RELEASE(m_colorShader);
- - // we're in big trouble - should fallback on D3D accelerated or sw method
- + if (!m_bUseHQScaler) //fallback from HQ scalers and multipass creation above
- + {
- + m_colorShader = new CYUV2RGBShader();
- + if (!m_colorShader->Create(m_sourceWidth, m_sourceHeight, format))
- + SAFE_RELEASE(m_colorShader);
- + // we're in big trouble - should fallback on D3D accelerated or sw method
- + }
- }
- }
- @@ -612,14 +651,11 @@ void CWinRenderer::UpdateVideoFilter()
- break;
- case RENDER_PS:
- + case RENDER_DXVA:
- SelectPSVideoFilter();
- UpdatePSVideoFilter();
- break;
- - case RENDER_DXVA:
- - // Everything already setup, nothing to do.
- - break;
- -
- default:
- return;
- }
- @@ -661,6 +697,11 @@ void CWinRenderer::Render(DWORD flags)
- {
- if(CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA)
- {
- + if (g_advancedSettings.m_DXVAEnableHQScalers)
- + {
- + UpdateVideoFilter();
- + if (m_bUseHQScaler) FlushGPU();
- + }
- CWinRenderer::RenderProcessor(flags);
- return;
- }
- @@ -937,27 +978,47 @@ void CWinRenderer::Stage2()
- void CWinRenderer::RenderProcessor(DWORD flags)
- {
- CSingleLock lock(g_graphicsContext);
- - RECT rect;
- +
- HRESULT hr;
- - rect.top = m_destRect.y1;
- - rect.bottom = m_destRect.y2;
- - rect.left = m_destRect.x1;
- - rect.right = m_destRect.x2;
- + RECT rect;
- +
- + if (m_bUseHQScaler)
- + {
- + rect.top = 0.0f;
- + rect.bottom = m_sourceHeight;
- + rect.left = 0.0f;
- + rect.right = m_sourceWidth;
- + }
- + else
- + {
- + rect.top = m_destRect.y1;
- + rect.bottom = m_destRect.y2;
- + rect.left = m_destRect.x1;
- + rect.right = m_destRect.x2;
- + }
- DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer];
- if(image->proc == NULL)
- return;
- IDirect3DSurface9* target;
- - if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
- + if (m_bUseHQScaler)
- + m_IntermediateTarget.GetSurfaceLevel(0, &target);
- + else
- {
- - CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
- - return;
- + if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target)))
- + {
- + CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str());
- + return;
- + }
- }
- image->proc->Render(rect, target, image->id);
- target->Release();
- +
- + if (m_bUseHQScaler)
- + Stage2();
- }
- bool CWinRenderer::RenderCapture(CRenderCapture* capture)
- @@ -1069,17 +1130,17 @@ bool CWinRenderer::Supports(ERENDERFEATURE feature)
- bool CWinRenderer::Supports(ESCALINGMETHOD method)
- {
- - if (m_renderMethod == RENDER_DXVA)
- + if (m_renderMethod == RENDER_PS || m_renderMethod == RENDER_DXVA)
- {
- - if(method == VS_SCALINGMETHOD_DXVA_HARDWARE)
- + if(m_renderMethod == RENDER_DXVA && method == VS_SCALINGMETHOD_DXVA_HARDWARE)
- return true;
- - return false;
- - }
- - else if(m_renderMethod == RENDER_PS)
- - {
- +
- + if (m_renderMethod == RENDER_DXVA && !g_advancedSettings.m_DXVAEnableHQScalers)
- + return false;
- +
- if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)
- && ( method == VS_SCALINGMETHOD_AUTO
- - || method == VS_SCALINGMETHOD_LINEAR))
- + || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS) ))
- return true;
- if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0))
- diff --git xbmc/cores/VideoRenderers/WinRenderer.h xbmc/cores/VideoRenderers/WinRenderer.h
- index cccde7d..6a1351a 100644
- --- xbmc/cores/VideoRenderers/WinRenderer.h
- +++ xbmc/cores/VideoRenderers/WinRenderer.h
- @@ -213,6 +213,7 @@ public:
- static void CropSource(RECT& src, RECT& dst, const D3DSURFACE_DESC& desc);
- protected:
- + void FlushGPU();
- virtual void Render(DWORD flags);
- void RenderSW();
- void RenderPS();
- diff --git xbmc/settings/AdvancedSettings.cpp xbmc/settings/AdvancedSettings.cpp
- index 17b2476..f99236b 100644
- --- xbmc/settings/AdvancedSettings.cpp
- +++ xbmc/settings/AdvancedSettings.cpp
- @@ -93,6 +93,8 @@ void CAdvancedSettings::Initialize()
- m_videoAllowMpeg4VDPAU = false;
- m_DXVACheckCompatibility = false;
- m_DXVACheckCompatibilityPresent = false;
- + m_DXVAEnableHQScalers = false;
- + m_DXVAPreferHQScalers = false;
- m_musicUseTimeSeeking = true;
- m_musicTimeSeekForward = 10;
- @@ -512,7 +514,8 @@ bool CAdvancedSettings::Load()
- }
- m_DXVACheckCompatibilityPresent = XMLUtils::GetBoolean(pElement,"checkdxvacompatibility", m_DXVACheckCompatibility);
- -
- + XMLUtils::GetBoolean(pElement,"enabledxvahqscalers", m_DXVAEnableHQScalers);
- + XMLUtils::GetBoolean(pElement,"preferdxvahqscalers", m_DXVAPreferHQScalers);
- }
- pElement = pRootElement->FirstChildElement("musiclibrary");
- diff --git xbmc/settings/AdvancedSettings.h xbmc/settings/AdvancedSettings.h
- index acc92fa..c5770db 100644
- --- xbmc/settings/AdvancedSettings.h
- +++ xbmc/settings/AdvancedSettings.h
- @@ -126,6 +126,8 @@ class CAdvancedSettings : public virtual xbmcutil::Referenced
- std::vector<RefreshOverride> m_videoAdjustRefreshOverrides;
- bool m_DXVACheckCompatibility;
- bool m_DXVACheckCompatibilityPresent;
- + bool m_DXVAEnableHQScalers;
- + bool m_DXVAPreferHQScalers;
- CStdString m_videoDefaultPlayer;
- CStdString m_videoDefaultDVDPlayer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement