From ccb6675fbd6a757790bbfa3212bcf28c240dd4d9 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 5 Jul 2010 19:19:56 +0000 Subject: vo_gl: Add initial stereo support git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31633 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/gl_common.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ libvo/gl_common.h | 9 ++++++ libvo/vo_gl.c | 24 ++++++++++++++++ 3 files changed, 118 insertions(+) (limited to 'libvo') diff --git a/libvo/gl_common.c b/libvo/gl_common.c index c28632e0c0..e455acc213 100644 --- a/libvo/gl_common.c +++ b/libvo/gl_common.c @@ -93,6 +93,7 @@ void (GLAPIENTRY *mpglLightfv)(GLenum, GLenum, const GLfloat *); void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum); void (GLAPIENTRY *mpglShadeModel)(GLenum); void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *); +void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean); /** * \defgroup glextfunctions OpenGL extension functions @@ -437,6 +438,7 @@ static const extfunc_desc_t extfuncs[] = { DEF_FUNC_DESC(ColorMaterial), DEF_FUNC_DESC(ShadeModel), DEF_FUNC_DESC(GetIntegerv), + DEF_FUNC_DESC(ColorMask), // here start the real extensions {&mpglGenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}}, @@ -1543,6 +1545,89 @@ void glDisableYUVConversion(GLenum target, int type) { } } +void glEnable3DLeft(int type) { + GLint buffer; + switch (type) { + case GL_3D_RED_CYAN: + mpglColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); + break; + case GL_3D_GREEN_MAGENTA: + mpglColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE); + break; + case GL_3D_QUADBUFFER: + mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); + switch (buffer) { + case GL_FRONT: + case GL_FRONT_LEFT: + case GL_FRONT_RIGHT: + buffer = GL_FRONT_LEFT; + break; + case GL_BACK: + case GL_BACK_LEFT: + case GL_BACK_RIGHT: + buffer = GL_BACK_LEFT; + break; + } + mpglDrawBuffer(buffer); + break; + } +} + +void glEnable3DRight(int type) { + GLint buffer; + switch (type) { + case GL_3D_RED_CYAN: + mpglColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); + break; + case GL_3D_GREEN_MAGENTA: + mpglColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); + break; + case GL_3D_QUADBUFFER: + mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); + switch (buffer) { + case GL_FRONT: + case GL_FRONT_LEFT: + case GL_FRONT_RIGHT: + buffer = GL_FRONT_RIGHT; + break; + case GL_BACK: + case GL_BACK_LEFT: + case GL_BACK_RIGHT: + buffer = GL_BACK_RIGHT; + break; + } + mpglDrawBuffer(buffer); + break; + } +} + +void glDisable3D(int type) { + GLint buffer; + switch (type) { + case GL_3D_RED_CYAN: + case GL_3D_GREEN_MAGENTA: + mpglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + break; + case GL_3D_QUADBUFFER: + mpglDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT); + mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); + switch (buffer) { + case GL_FRONT: + case GL_FRONT_LEFT: + case GL_FRONT_RIGHT: + buffer = GL_FRONT; + break; + case GL_BACK: + case GL_BACK_LEFT: + case GL_BACK_RIGHT: + buffer = GL_BACK; + break; + } + mpglDrawBuffer(buffer); + break; + } +} + /** * \brief draw a texture part at given 2D coordinates * \param x screen top coordinate diff --git a/libvo/gl_common.h b/libvo/gl_common.h index 53b2ed41d4..91884e39d2 100644 --- a/libvo/gl_common.h +++ b/libvo/gl_common.h @@ -365,6 +365,14 @@ void glSetupYUVConversion(gl_conversion_params_t *params); void glEnableYUVConversion(GLenum target, int type); void glDisableYUVConversion(GLenum target, int type); +#define GL_3D_RED_CYAN 1 +#define GL_3D_GREEN_MAGENTA 2 +#define GL_3D_QUADBUFFER 3 + +void glEnable3DLeft(int type); +void glEnable3DRight(int type); +void glDisable3D(int type); + /** \addtogroup glcontext * \{ */ //! could not set new window, will continue drawing into the old one. @@ -462,6 +470,7 @@ extern void (GLAPIENTRY *mpglLightfv)(GLenum, GLenum, const GLfloat *); extern void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum); extern void (GLAPIENTRY *mpglShadeModel)(GLenum); extern void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *); +extern void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean); extern void (GLAPIENTRY *mpglGenBuffers)(GLsizei, GLuint *); extern void (GLAPIENTRY *mpglDeleteBuffers)(GLsizei, const GLuint *); diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 3bb5834be4..073ef90815 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -174,6 +174,7 @@ static char *custom_tex; static int custom_tlin; static int custom_trect; static int mipmap_gen; +static int stereo_mode; static int int_pause; static int eq_bri = 0; @@ -807,11 +808,27 @@ static void do_render(void) { mpglColor3f(1,1,1); if (is_yuv || custom_prog) glEnableYUVConversion(gl_target, yuvconvtype); + if (stereo_mode) { + glEnable3DLeft(stereo_mode); + glDrawTex(0, 0, image_width, image_height, + 0, 0, image_width >> 1, image_height, + texture_width, texture_height, + use_rectangle == 1, is_yuv, + mpi_flipped ^ vo_flipped); + glEnable3DRight(stereo_mode); + glDrawTex(0, 0, image_width, image_height, + image_width >> 1, 0, image_width >> 1, image_height, + texture_width, texture_height, + use_rectangle == 1, is_yuv, + mpi_flipped ^ vo_flipped); + glDisable3D(stereo_mode); + } else { glDrawTex(0, 0, image_width, image_height, 0, 0, image_width, image_height, texture_width, texture_height, use_rectangle == 1, is_yuv, mpi_flipped ^ vo_flipped); + } if (is_yuv || custom_prog) glDisableYUVConversion(gl_target, yuvconvtype); } @@ -1117,6 +1134,7 @@ static const opt_t subopts[] = { {"customtrect", OPT_ARG_BOOL, &custom_trect, NULL}, {"mipmapgen", OPT_ARG_BOOL, &mipmap_gen, NULL}, {"osdcolor", OPT_ARG_INT, &osd_color, NULL}, + {"stereo", OPT_ARG_INT, &stereo_mode, NULL}, {NULL} }; @@ -1148,6 +1166,7 @@ static int preinit_internal(const char *arg, int allow_sw) custom_trect = 0; mipmap_gen = 0; osd_color = 0xffffff; + stereo_mode = 0; if (subopt_parse(arg, subopts) != 0) { mp_msg(MSGT_VO, MSGL_FATAL, "\n-vo gl command line help:\n" @@ -1221,6 +1240,11 @@ static int preinit_internal(const char *arg, int allow_sw) " generate mipmaps for the video image (use with TXB in customprog)\n" " osdcolor=<0xAARRGGBB>\n" " use the given color for the OSD\n" + " stereo=\n" + " 0: normal display\n" + " 1: side-by-side to red-cyan stereo\n" + " 2: side-by-side to green-magenta stereo\n" + " 3: side-by-side to quadbuffer stereo (broken?)\n" "\n" ); return -1; } -- cgit v1.2.3