void CWinRenderer::SelectRenderMethod() { if (CONF_FLAGS_FORMAT_MASK(m_flags) == CONF_FLAGS_FORMAT_DXVA) { m_renderMethod = RENDER_DXVA; } else { int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod"); CLog::Log(LOGDEBUG, __FUNCTION__": Requested render method: %d", requestedMethod); switch(requestedMethod) { case RENDER_METHOD_AUTO: case RENDER_METHOD_D3D_PS: // Try the pixel shaders support if (m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)) { CTestShader* shader = new CTestShader; if (shader->Create()) { m_renderMethod = RENDER_PS; shader->Release(); break; } else { CLog::Log(LOGNOTICE, "D3D: unable to load test shader - D3D installation is most likely incomplete"); g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Warning, "DirectX", g_localizeStrings.Get(2101)); shader->Release(); } } else { CLog::Log(LOGNOTICE, "D3D: graphics adapter does not support Pixel Shaders 2.0"); } CLog::Log(LOGNOTICE, "D3D: falling back to SW mode"); // drop through to software case RENDER_METHOD_SOFTWARE: default: // So we'll do the color conversion in software. m_renderMethod = RENDER_SW; break; } } RenderMethodDetail *rmdet = FindRenderMethod(m_renderMethod); CLog::Log(LOGDEBUG, __FUNCTION__": Selected render method %d: %s", m_renderMethod, rmdet != NULL ? rmdet->name : "unknown"); }
void CWinRenderer::SelectRenderMethod() { EBufferFormat dxFormat = SelectBufferFormat(m_format, RENDER_DXVA); EBufferFormat psFormat = SelectBufferFormat(m_format, RENDER_PS); // modern drivers allow using HW pic in shaders bool allowChangeMethod = dxFormat == psFormat && m_iRequestedMethod != RENDER_SW; // old drivers + HW decoded picture -> we must force DXVA render method if (!allowChangeMethod && m_format == AV_PIX_FMT_D3D11VA_VLD) { CLog::Log(LOGNOTICE, "%s: rendering method forced to DXVA processor.", __FUNCTION__); m_renderMethod = RENDER_DXVA; if (!m_processor || !m_processor->Open(m_sourceWidth, m_sourceHeight)) { CLog::Log(LOGNOTICE, "%s: unable to open DXVA processor.", __FUNCTION__); if (m_processor) m_processor->Close(); m_renderMethod = RENDER_INVALID; } } else { CLog::Log(LOGDEBUG, "%s: requested render method: %d", __FUNCTION__, m_iRequestedMethod); switch (m_iRequestedMethod) { case RENDER_METHOD_DXVA: { // skip if format isn't DXVA compatible. if (dxFormat >= BUFFER_FMT_D3D11_BYPASS) { if (m_processor && m_processor->Open(m_sourceWidth, m_sourceHeight)) { m_renderMethod = RENDER_DXVA; break; } allowChangeMethod = false; CLog::Log(LOGNOTICE, "%s: unable to open DXVA processor.", __FUNCTION__); if (m_processor) m_processor->Close(); } } // fallback to auto case RENDER_METHOD_AUTO: if (allowChangeMethod) { // for modern drivers select method depends on input // for HW decoded or interlaced picture prefer DXVA method. if (m_format == AV_PIX_FMT_D3D11VA_VLD || m_iFlags & DVP_FLAG_INTERLACED) { if (m_processor && m_processor->Open(m_sourceWidth, m_sourceHeight)) { m_renderMethod = RENDER_DXVA; break; } CLog::Log(LOGNOTICE, "%s: unable to open DXVA processor", __FUNCTION__); if (m_processor) m_processor->Close(); } } // drop through to pixel shader case RENDER_METHOD_D3D_PS: { CTestShader shader; if (shader.Create()) { m_renderMethod = RENDER_PS; break; } // this is something out of the ordinary CLog::Log(LOGNOTICE, "%s: unable to load test shader - D3D installation is most likely incomplete, falling back to SW mode.", __FUNCTION__); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, "DirectX", g_localizeStrings.Get(2101)); } // drop through to software case RENDER_METHOD_SOFTWARE: default: // so we'll do the color conversion in software. m_renderMethod = RENDER_SW; break; } } m_bufferFormat = SelectBufferFormat(m_format, m_renderMethod); m_frameIdx = 0; RenderMethodDetail *rmdet = FindRenderMethod(m_renderMethod); CLog::Log(LOGDEBUG, "%s: selected render method %d: %s", __FUNCTION__, m_renderMethod, rmdet != nullptr ? rmdet->name : "unknown"); CLog::Log(LOGDEBUG, "%s: selected buffer format %d", __FUNCTION__, m_bufferFormat); }