summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-19 09:31:02 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-19 09:31:02 +0000
commit0a194447967ddccfc82163bf9ba08034fc2aa95f (patch)
treec32254c5786b67dbe26c4cb4c26fb1cce5a5f6ae
parent872024d3fed1c0ebfb1de57e773615ab207ff005 (diff)
downloadmpv-0a194447967ddccfc82163bf9ba08034fc2aa95f.tar.bz2
mpv-0a194447967ddccfc82163bf9ba08034fc2aa95f.tar.xz
automatic vsync enabling for vo_gl.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16269 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--DOCS/man/en/mplayer.115
-rw-r--r--libvo/gl_common.c12
-rw-r--r--libvo/gl_common.h1
-rw-r--r--libvo/vo_gl.c9
4 files changed, 35 insertions, 2 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 0058a76bec..5ffd71da48 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -2678,10 +2678,14 @@ Please use \-dr if it works with your OpenGL implementation,
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 @@ borders in fullscreen mode.
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 @@ Select usage of rectangular textures (saves video RAM, but often slower).
.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
diff --git a/libvo/gl_common.c b/libvo/gl_common.c
index 4139bd9de0..2ea61d7079 100644
--- a/libvo/gl_common.c
+++ b/libvo/gl_common.c
@@ -22,6 +22,7 @@ void (APIENTRY *BindProgram)(GLenum, GLuint);
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 @@ static void getFunctions() {
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");
}
/**
diff --git a/libvo/gl_common.h b/libvo/gl_common.h
index 32b8ea8a27..0022379623 100644
--- a/libvo/gl_common.h
+++ b/libvo/gl_common.h
@@ -108,5 +108,6 @@ extern void (APIENTRY *BindProgram)(GLenum, GLuint);
extern void (APIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
extern void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
GLfloat, GLfloat);
+extern int (*SwapInterval)(int);
#endif
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 79add98e76..657f548718 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -62,6 +62,7 @@ static uint32_t image_width;
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 @@ static int initGl(uint32_t d_width, uint32_t d_height) {
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 @@ static opt_t subopts[] = {
{"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 @@ static int preinit(const char *arg)
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 @@ static int preinit(const char *arg)
" 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;
}