refactor choosing renderer so we fallback from glsl -> arb -> sw correctly
authordavilla <davilla@svn>
Fri, 7 May 2010 17:50:59 +0000 (17:50 +0000)
committerdavilla <davilla@svn>
Fri, 7 May 2010 17:50:59 +0000 (17:50 +0000)
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@29896 568bbfeb-2a22-0410-94d2-cc84cf5bfa90

xbmc/cores/VideoRenderers/LinuxRendererGL.cpp

index bd740d3..f02f1a2 100644 (file)
@@ -1066,7 +1066,6 @@ void CLinuxRendererGL::LoadShaders(int field)
 {
   int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod");
   CLog::Log(LOGDEBUG, "GL: Requested render method: %d", requestedMethod);
-  bool err = false;
 
   if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU)
   {
@@ -1080,97 +1079,84 @@ void CLinuxRendererGL::LoadShaders(int field)
   }
   else
   {
-    /*
-      Try GLSL shaders if they're supported and if the user has
-      requested for it. (settings -> video -> player -> rendermethod)
-     */
-    if (glCreateProgram // TODO: proper check
-        && (requestedMethod==RENDER_METHOD_AUTO || requestedMethod==RENDER_METHOD_GLSL))
+    switch(requestedMethod)
     {
-      if (m_pYUVShader)
+      case RENDER_METHOD_AUTO:
+      case RENDER_METHOD_GLSL:
+      // Try GLSL shaders if supported and user requested auto or GLSL.
+      if (glCreateProgram)
       {
-        m_pYUVShader->Free();
-        delete m_pYUVShader;
-        m_pYUVShader = NULL;
-      }
+        if (m_pYUVShader)
+        {
+          m_pYUVShader->Free();
+          delete m_pYUVShader;
+          m_pYUVShader = NULL;
+        }
 
-      bool nonLinStretch = m_nonLinStretch && (m_pixelRatio > 1.001f || m_pixelRatio < 0.999f)
-                           && m_renderQuality == RQ_SINGLEPASS && m_textureTarget != GL_TEXTURE_RECTANGLE_ARB;
+        bool nonLinStretch = m_nonLinStretch && (m_pixelRatio > 1.001f || m_pixelRatio < 0.999f)
+                             && m_renderQuality == RQ_SINGLEPASS && m_textureTarget != GL_TEXTURE_RECTANGLE_ARB;
 
-      // create regular progressive scan shader
-      m_pYUVShader = new YUV2RGBProgressiveShader(m_textureTarget==GL_TEXTURE_RECTANGLE_ARB, m_iFlags, nonLinStretch);
+        // create regular progressive scan shader
+        m_pYUVShader = new YUV2RGBProgressiveShader(m_textureTarget==GL_TEXTURE_RECTANGLE_ARB, m_iFlags, nonLinStretch);
 
-      CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
+        CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
 
-      if (m_pYUVShader && m_pYUVShader->CompileAndLink())
-      {
-        m_renderMethod = RENDER_GLSL;
-        UpdateVideoFilter();
-      }
-      else
-      {
-        m_pYUVShader->Free();
-        delete m_pYUVShader;
-        m_pYUVShader = NULL;
-        err = true;
-        CLog::Log(LOGERROR, "GL: Error enabling YUV2RGB GLSL shader");
+        if (m_pYUVShader && m_pYUVShader->CompileAndLink())
+        {
+          m_renderMethod = RENDER_GLSL;
+          UpdateVideoFilter();
+          break;
+        }
+        else
+        {
+          m_pYUVShader->Free();
+          delete m_pYUVShader;
+          m_pYUVShader = NULL;
+          CLog::Log(LOGERROR, "GL: Error enabling YUV2RGB GLSL shader");
+          // drop through and try ARB
+        }
       }
-    }
-
-    /*
-      Try ARB shaders if the extension is supported AND either:
-        1) user requested it
-        2) or GLSL shaders failed and user selected AUTO
-     */
-    else if (glewIsSupported("GL_ARB_fragment_program")
-             && ((requestedMethod==RENDER_METHOD_AUTO || requestedMethod==RENDER_METHOD_ARB)
-             || err))
-    {
-      err = false;
-      CLog::Log(LOGNOTICE, "GL: ARB shaders support detected");
-      m_renderMethod = RENDER_ARB ;
-      if (m_pYUVShader)
+      case RENDER_METHOD_ARB:
+      // Try ARB shaders if supported and user requested it or GLSL shaders failed.
+      if (glewIsSupported("GL_ARB_fragment_program"))
       {
-        m_pYUVShader->Free();
-        delete m_pYUVShader;
-        m_pYUVShader = NULL;
-      }
+        CLog::Log(LOGNOTICE, "GL: ARB shaders support detected");
+        m_renderMethod = RENDER_ARB ;
+        if (m_pYUVShader)
+        {
+          m_pYUVShader->Free();
+          delete m_pYUVShader;
+          m_pYUVShader = NULL;
+        }
 
-      // create regular progressive scan shader
-      m_pYUVShader = new YUV2RGBProgressiveShaderARB(m_textureTarget==GL_TEXTURE_RECTANGLE_ARB, m_iFlags);
-      CLog::Log(LOGNOTICE, "GL: Selecting Single Pass ARB YUV2RGB shader");
+        // create regular progressive scan shader
+        m_pYUVShader = new YUV2RGBProgressiveShaderARB(m_textureTarget==GL_TEXTURE_RECTANGLE_ARB, m_iFlags);
+        CLog::Log(LOGNOTICE, "GL: Selecting Single Pass ARB YUV2RGB shader");
 
-      if (m_pYUVShader && m_pYUVShader->CompileAndLink())
-      {
-        m_renderMethod = RENDER_ARB;
-        UpdateVideoFilter();
+        if (m_pYUVShader && m_pYUVShader->CompileAndLink())
+        {
+          m_renderMethod = RENDER_ARB;
+          UpdateVideoFilter();
+          break;
+        }
+        else
+        {
+          m_pYUVShader->Free();
+          delete m_pYUVShader;
+          m_pYUVShader = NULL;
+          CLog::Log(LOGERROR, "GL: Error enabling YUV2RGB ARB shader");
+          // drop through and use SW
+        }
       }
-      else
+      case RENDER_METHOD_SOFTWARE:
+      default:
+      // Use software YUV 2 RGB conversion if user requested it or GLSL and/or ARB shaders failed
       {
-        m_pYUVShader->Free();
-        delete m_pYUVShader;
-        m_pYUVShader = NULL;
-        err = true;
-        CLog::Log(LOGERROR, "GL: Error enabling YUV2RGB ARB shader");
+        m_renderMethod = RENDER_SW ;
+        CLog::Log(LOGNOTICE, "GL: Shaders support not present, falling back to SW mode");
+        break;
       }
     }
-
-    /*
-      Fall back to software YUV 2 RGB conversion if
-        1) user requested it
-        2) or GLSL and/or ARB shaders failed
-     */
-    else
-    {
-      m_renderMethod = RENDER_SW ;
-      CLog::Log(LOGNOTICE, "GL: Shaders support not present, falling back to SW mode");
-    }
-  }
-
-  if (err==true)
-  {
-    CLog::Log(LOGERROR, "GL: Falling back to Software YUV2RGB");
-    m_renderMethod = RENDER_SW;
   }
 
   // determine whether GPU supports NPOT textures