changeset 16268:d7856c2232d0

automatic vsync enabling for vo_gl.
author reimar
date Fri, 19 Aug 2005 09:31:02 +0000
parents c2e581684e17
children 6a94def226d7
files DOCS/man/en/mplayer.1 libvo/gl_common.c libvo/gl_common.h libvo/vo_gl.c
diffstat 4 files changed, 35 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Thu Aug 18 20:00:57 2005 +0000
+++ b/DOCS/man/en/mplayer.1	Fri Aug 19 09:31:02 2005 +0000
@@ -2678,10 +2678,14 @@
 since for higher resolutions this provides a
 .B big
 speedup.
+The code is doing very little checks, so if a feature does not work, this
+might be because it is not supported by your card/OpenGL implementation
+even if you do not get any error message.
+Use glxinfo or a similar tool to display the supported OpenGL extensions.
 .PD 0
 .RSs
 .IPs (no)manyfmts
-Enables support for more (RGB and BGR) color formats.
+Enables support for more (RGB and BGR) color formats (default: enabled).
 Needs OpenGL version >= 1.2.
 .IPs slice-height=<0\-...>
 Number of lines copied to texture in one piece (default: 4).
@@ -2700,7 +2704,8 @@
 Enable or disable aspect scaling and pan-and-scan support (default: enabled).
 Disabling might increase speed.
 .IPs rectangle=<0,1,2>
-Select usage of rectangular textures (saves video RAM, but often slower).
+Select usage of rectangular textures which saves video RAM, but often is
+slower (default: 0).
 .RSss
 0: Use power-of-two textures (default).
 .br
@@ -2710,6 +2715,12 @@
 .IPs (no)glfinish
 Call glFinish() before swapping buffers.
 Slower but in some cases more correct output (default: disabled).
+.IPs  swapinterval=<n>
+Minimum interval in displayed frames between to buffer swaps (default: 1).
+1 is equivalent to enable VSYNC, 0 to disable VSYNC.
+This will limit the framerate to (horizontal refresh rate / n).
+Requires GLX_SGI_swap_control support to work.
+With some (most/all?) implementations this only works in fullscreen mode.
 .REss
 .RE
 .PD 1
--- a/libvo/gl_common.c	Thu Aug 18 20:00:57 2005 +0000
+++ b/libvo/gl_common.c	Fri Aug 19 09:31:02 2005 +0000
@@ -22,6 +22,7 @@
 void (APIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
 void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
                                        GLfloat, GLfloat);
+int (*SwapInterval)(int);
 
 /**
  * \brief adjusts the GL_UNPACK_ALGNMENT to fit the stride.
@@ -259,6 +260,17 @@
     ProgramEnvParameter4f = getProcAddress("glProgramEnvParameter4fARB");
   if (!ProgramEnvParameter4f)
     ProgramEnvParameter4f = getProcAddress("glProgramEnvParameter4fNV");
+  SwapInterval = getProcAddress("glXSwapInterval");
+  if (!SwapInterval)
+    SwapInterval = getProcAddress("glXSwapIntervalEXT");
+  if (!SwapInterval)
+    SwapInterval = getProcAddress("glXSwapIntervalSGI");
+  if (!SwapInterval)
+    SwapInterval = getProcAddress("wglSwapInterval");
+  if (!SwapInterval)
+    SwapInterval = getProcAddress("wglSwapIntervalEXT");
+  if (!SwapInterval)
+    SwapInterval = getProcAddress("wglSwapIntervalSGI");
 }
 
 /**
--- a/libvo/gl_common.h	Thu Aug 18 20:00:57 2005 +0000
+++ b/libvo/gl_common.h	Fri Aug 19 09:31:02 2005 +0000
@@ -108,5 +108,6 @@
 extern void (APIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
 extern void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
                                               GLfloat, GLfloat);
+extern int (*SwapInterval)(int);
 
 #endif
--- a/libvo/vo_gl.c	Thu Aug 18 20:00:57 2005 +0000
+++ b/libvo/vo_gl.c	Fri Aug 19 09:31:02 2005 +0000
@@ -62,6 +62,7 @@
 static uint32_t image_height;
 static int many_fmts;
 static int use_glFinish;
+static int swap_interval;
 static GLenum gl_target;
 static GLenum gl_texfmt;
 static GLenum gl_format;
@@ -149,6 +150,8 @@
 
   glClearColor( 0.0f,0.0f,0.0f,0.0f );
   glClear( GL_COLOR_BUFFER_BIT );
+  if (SwapInterval)
+    SwapInterval(swap_interval);
   gl_buffer = 0;
   gl_buffersize = 0;
   err_shown = 0;
@@ -519,6 +522,7 @@
   {"slice-height", OPT_ARG_INT,  &slice_height, (opt_test_f)int_non_neg},
   {"rectangle",    OPT_ARG_INT,  &use_rectangle,(opt_test_f)int_non_neg},
   {"glfinish",     OPT_ARG_BOOL, &use_glFinish, NULL},
+  {"swapinterval", OPT_ARG_INT,  &swap_interval,NULL},
   {NULL}
 };
 
@@ -531,6 +535,7 @@
     use_aspect = 1;
     use_rectangle = 0;
     use_glFinish = 0;
+    swap_interval = 1;
     slice_height = 4;
     if (subopt_parse(arg, subopts) != 0) {
       mp_msg(MSGT_VO, MSGL_FATAL,
@@ -551,6 +556,10 @@
               "    2: use texture_non_power_of_two\n"
               "  glfinish\n"
               "    Call glFinish() before swapping buffers\n"
+              "  swapinterval=<n>\n"
+              "    Interval in displayed frames between to buffer swaps.\n"
+              "    1 is equivalent to enable VSYNC, 0 to disable VSYNC.\n"
+              "    Requires GLX_SGI_swap_control support to work.\n"
               "\n" );
       return -1;
     }