changeset 30719:6f9652891876

Only prefer -vo gl over -vo x11 if hardware acceleration is available.
author reimar
date Sat, 27 Feb 2010 18:16:41 +0000
parents 4993c3f12cc0
children 1547f30c53b0
files libvo/video_out.c libvo/vo_gl.c
diffstat 2 files changed, 40 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/video_out.c	Sat Feb 27 17:55:57 2010 +0000
+++ b/libvo/video_out.c	Sat Feb 27 18:16:41 2010 +0000
@@ -94,6 +94,7 @@
 extern vo_functions_t video_out_xvmc;
 extern vo_functions_t video_out_vdpau;
 extern vo_functions_t video_out_xv;
+extern vo_functions_t video_out_gl_nosw;
 extern vo_functions_t video_out_gl;
 extern vo_functions_t video_out_gl2;
 extern vo_functions_t video_out_matrixview;
@@ -186,14 +187,15 @@
 #ifdef CONFIG_XV
         &video_out_xv,
 #endif
+#ifdef CONFIG_X11
 #ifdef CONFIG_GL
-        &video_out_gl,
+        &video_out_gl_nosw,
 #endif
-#ifdef CONFIG_X11
         &video_out_x11,
         &video_out_xover,
 #endif
 #ifdef CONFIG_GL
+        &video_out_gl,
         &video_out_gl2,
 #endif
 #ifdef CONFIG_DGA
--- a/libvo/vo_gl.c	Sat Feb 27 17:55:57 2010 +0000
+++ b/libvo/vo_gl.c	Sat Feb 27 18:16:41 2010 +0000
@@ -47,6 +47,21 @@
 
 const LIBVO_EXTERN(gl)
 
+
+static const vo_info_t info_nosw =
+{
+  "X11 (OpenGL) no software rendering",
+  "gl_nosw",
+  "Arpad Gereoffy <arpi@esp-team.scene.hu>",
+  ""
+};
+static int preinit_nosw(const char *arg);
+#define info info_nosw
+#define preinit preinit_nosw
+const LIBVO_EXTERN(gl_nosw)
+#undef info
+#undef preinit
+
 #ifdef CONFIG_GL_X11
 static int                  wsGLXAttrib[] = { GLX_RGBA,
                                        GLX_RED_SIZE,1,
@@ -444,6 +459,13 @@
   err_shown = 0;
 }
 
+static int isSoftwareGl(void)
+{
+  const char *renderer = GetString(GL_RENDERER);
+renderer = "Software Rasterizer";
+  return strcmp(renderer, "Software Rasterizer") == 0;
+}
+
 static void autodetectGlExtensions(void) {
   const char *extensions = GetString(GL_EXTENSIONS);
   const char *vendor     = GetString(GL_VENDOR);
@@ -1052,7 +1074,7 @@
   {NULL}
 };
 
-static int preinit(const char *arg)
+static int preinit_internal(const char *arg, int allow_sw)
 {
     enum MPGLType gltype = GLTYPE_X11;
     // set defaults
@@ -1161,11 +1183,13 @@
     }
     if (!init_mpglcontext(&glctx, gltype))
       goto err_out;
-    if (use_yuv == -1) {
+    if (use_yuv == -1 || !allow_sw) {
       if (create_window(320, 200, VOFLAG_HIDDEN, NULL) < 0)
         goto err_out;
       if (glctx.setGlWindow(&glctx) == SET_WINDOW_FAILED)
         goto err_out;
+      if (!allow_sw && isSoftwareGl())
+        goto err_out;
       autodetectGlExtensions();
     }
     if (many_fmts)
@@ -1181,6 +1205,16 @@
     return -1;
 }
 
+static int preinit(const char *arg)
+{
+    return preinit_internal(arg, 1);
+}
+
+static int preinit_nosw(const char *arg)
+{
+    return preinit_internal(arg, 0);
+}
+
 static const struct {
   const char *name;
   int *value;