vlc | branch: master | Ilkka Ollakka <[email protected]> | Wed Mar 21 17:07:52 2012 +0200| [3ef9d0a7912fbf871d50c44d4d2c7def55c34756] | committer: Ilkka Ollakka
opengl: use vertex/texture array instead of glBegin/glEnd > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3ef9d0a7912fbf871d50c44d4d2c7def55c34756 --- modules/video_output/opengl.c | 106 +++++++++++++++++++++++------------------ 1 files changed, 59 insertions(+), 47 deletions(-) diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c index 110d480..1bbf70b 100644 --- a/modules/video_output/opengl.c +++ b/modules/video_output/opengl.c @@ -43,7 +43,7 @@ # define PFNGLDELETEPROGRAMSARBPROC typeof(glDeleteProgramsARB)* # define PFNGLPROGRAMLOCALPARAMETER4FVARBPROC typeof(glProgramLocalParameter4fvARB)* # define PFNGLACTIVETEXTUREARBPROC typeof(glActiveTextureARB)* -# define PFNGLMULTITEXCOORD2FARBPROC typeof(glMultiTexCoord2fARB)* +# define PFNGLCLIENTACTIVETEXTUREARBPROC typeof(glClientActiveTextureARB)* #endif /* RV16 */ @@ -118,7 +118,7 @@ struct vout_display_opengl_t { /* multitexture */ bool use_multitexture; PFNGLACTIVETEXTUREARBPROC ActiveTextureARB; - PFNGLMULTITEXCOORD2FARBPROC MultiTexCoord2fARB; + PFNGLCLIENTACTIVETEXTUREARBPROC ClientActiveTextureARB; }; static inline int GetAlignedSize(unsigned size) @@ -188,13 +188,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, if (HasExtension(extensions, "GL_ARB_multitexture")) { #if !defined(MACOS_OPENGL) vgl->ActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)vlc_gl_GetProcAddress(vgl->gl, "glActiveTextureARB"); - vgl->MultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)vlc_gl_GetProcAddress(vgl->gl, "glMultiTexCoord2fARB"); + vgl->ClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)vlc_gl_GetProcAddress(vgl->gl, "glClientActiveTextureARB"); #else vgl->ActiveTextureARB = glActiveTextureARB; - vgl->MultiTexCoord2fARB = glMultiTexCoord2fARB; + vgl->ClientActiveTextureARB = glClientActiveTextureARB; #endif supports_multitexture = vgl->ActiveTextureARB && - vgl->MultiTexCoord2fARB; + vgl->ClientActiveTextureARB; if (supports_multitexture) glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &max_texture_units); } @@ -669,35 +669,45 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl, glTexCoordPointer(2, GL_FLOAT, 0, textureCoord); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -#else - for (unsigned j = 0; j < vgl->chroma->plane_count; j++) { - if (vgl->use_multitexture) - vgl->ActiveTextureARB(GL_TEXTURE0_ARB + j); - glBindTexture(vgl->tex_target, vgl->texture[0][j]); - } - glBegin(GL_POLYGON); - glTexCoord2f(left[0], top[0]); - for (unsigned j = 1; j < vgl->chroma->plane_count; j++) - vgl->MultiTexCoord2fARB(GL_TEXTURE0_ARB + j, left[j], top[j]); - glVertex2f(-1.0, 1.0); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); +#else - glTexCoord2f(right[0], top[0]); - for (unsigned j = 1; j < vgl->chroma->plane_count; j++) - vgl->MultiTexCoord2fARB(GL_TEXTURE0_ARB + j, right[j], top[j]); - glVertex2f( 1.0, 1.0); + const GLfloat vertexCoord[] = { + -1.0, 1.0, + -1.0, -1.0, + 1.0, 1.0, + 1.0, -1.0, + }; - glTexCoord2f(right[0], bottom[0]); - for (unsigned j = 1; j < vgl->chroma->plane_count; j++) - vgl->MultiTexCoord2fARB(GL_TEXTURE0_ARB + j, right[j], bottom[j]); - glVertex2f( 1.0, -1.0); + for( unsigned j = 0; j < vgl->chroma->plane_count; j++) + { + const GLfloat texCoord[] = { + left[j], top[j], + left[j], bottom[j], + right[j], top[j], + right[j], bottom[j], + }; + vgl->ActiveTextureARB( GL_TEXTURE0_ARB+j); + vgl->ClientActiveTextureARB( GL_TEXTURE0_ARB+j); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glBindTexture(vgl->tex_target, vgl->texture[0][j]); + glTexCoordPointer(2, GL_FLOAT, 0, texCoord); + } + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, vertexCoord); + glDrawArrays( GL_TRIANGLE_STRIP, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); + + for( int j = vgl->chroma->plane_count; j >= 0;j--) + { + vgl->ActiveTextureARB( GL_TEXTURE0_ARB+j); + vgl->ClientActiveTextureARB( GL_TEXTURE0_ARB+j); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } - glTexCoord2f(left[0], bottom[0]); - for (unsigned j = 1; j < vgl->chroma->plane_count; j++) - vgl->MultiTexCoord2fARB(GL_TEXTURE0_ARB + j, left[j], bottom[j]); - glVertex2f(-1.0, -1.0); - glEnd(); #endif if (vgl->program) @@ -711,29 +721,31 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl, glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnableClientState(GL_VERTEX_ARRAY); + const GLfloat textureCoord[] = { + 0.0, 0.0, + 0.0, 1.0, + 1.0, 0.0, + 1.0, 1.0, + }; for (int i = 0; i < vgl->region_count; i++) { gl_region_t *glr = &vgl->region[i]; + const GLfloat vertexCoord[] = { + glr->left, glr->top, + glr->left, glr->bottom, + glr->right, glr->top, + glr->right,glr->bottom, + }; + glColor4f(1.0f, 1.0f, 1.0f, glr->alpha); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D, glr->texture); - - glBegin(GL_POLYGON); - - glColor4f(1.0, 1.0, 1.0, glr->alpha); - - glTexCoord2f(0.0, 0.0); - glVertex2f(glr->left, glr->top); - - glTexCoord2f(1.0, 0.0); - glVertex2f(glr->right, glr->top); - - glTexCoord2f(1.0, 1.0); - glVertex2f(glr->right, glr->bottom); - - glTexCoord2f(0.0, 1.0); - glVertex2f(glr->left, glr->bottom); - - glEnd(); + glVertexPointer(2, GL_FLOAT, 0, vertexCoord); + glTexCoordPointer(2, GL_FLOAT, 0, textureCoord); + glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); } + glDisableClientState(GL_VERTEX_ARRAY); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); #endif _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
