diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-09-22 20:23:17 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-09-22 20:23:17 +0000 |
commit | 40dad6e2665b397616e6ddb889f008b9a318f609 (patch) | |
tree | 832e7af1bb5c86e986c73881d7ca37b232adaab7 /libvo | |
parent | 7da0bb114d45b7e6748b4a08f05b3f33988e6761 (diff) | |
download | mpv-40dad6e2665b397616e6ddb889f008b9a318f609.tar.bz2 mpv-40dad6e2665b397616e6ddb889f008b9a318f609.tar.xz |
Aggregate multiple small EOSD textures into one large since hundreds of
texture creates are very slow.
Might cause artefacts with scaled OSD since large textures are not cleared each
time.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19944 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/vo_gl.c | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 5e33344616..5e9b1b1efb 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -53,6 +53,7 @@ static GLuint osdtex[MAX_OSD_PARTS]; static GLuint osdatex[MAX_OSD_PARTS]; #endif static GLuint *eosdtex; +static GLuint largeeosdtex[2]; //! Display lists that draw the OSD parts static GLuint osdDispList[MAX_OSD_PARTS]; #ifndef FAST_OSD @@ -247,36 +248,87 @@ static void clearEOSD(void) { */ static void genEOSD(ass_image_t *img) { int sx, sy; + int tinytexcur = 0; + int smalltexcur = 0; GLuint *curtex; GLint scale_type = (scaled_osd) ? GL_LINEAR : GL_NEAREST; ass_image_t *i; + int cnt; clearEOSD(); if (!img) return; + if (!largeeosdtex[0]) { + glGenTextures(2, largeeosdtex); + BindTexture(gl_target, largeeosdtex[0]); + glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0); + BindTexture(gl_target, largeeosdtex[1]); + glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0); + } for (i = img; i; i = i->next) + { + if (i->w <= 0 || i->h <= 0 || i->stride < i->w) + continue; + if (i->w < 16 && i->h < 16 && tinytexcur < 1024) + tinytexcur++; + else if (i->w < 32 && i->h < 32 && smalltexcur < 256) + smalltexcur++; + else eosdtexCnt++; + } + if (eosdtexCnt) { eosdtex = calloc(eosdtexCnt, sizeof(GLuint)); glGenTextures(eosdtexCnt, eosdtex); + } + tinytexcur = smalltexcur = 0; for (i = img, curtex = eosdtex; i; i = i->next) { + int x = 0, y = 0; if (i->w <= 0 || i->h <= 0 || i->stride < i->w) { mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n"); continue; } + if (i->w < 16 && i->h < 16 && tinytexcur < 1024) { + x = (tinytexcur & 31) << 4; + y = (tinytexcur >> 5) << 4; + BindTexture(gl_target, largeeosdtex[0]); + tinytexcur++; + } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) { + x = (smalltexcur & 15) << 5; + y = (smalltexcur >> 4) << 5; + BindTexture(gl_target, largeeosdtex[1]); + smalltexcur++; + } else { texSize(i->w, i->h, &sx, &sy); BindTexture(gl_target, *curtex++); glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 0); + } glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, i->bitmap, i->stride, - 0, 0, i->w, i->h, 0); + x, y, i->w, i->h, 0); } eosdDispList = glGenLists(1); glNewList(eosdDispList, GL_COMPILE); + tinytexcur = smalltexcur = 0; for (i = img, curtex = eosdtex; i; i = i->next) { + int x = 0, y = 0; if (i->w <= 0 || i->h <= 0 || i->stride < i->w) continue; glColor4ub(i->color >> 24, (i->color >> 16) & 0xff, (i->color >> 8) & 0xff, 255 - (i->color & 0xff)); + if (i->w < 16 && i->h < 16 && tinytexcur < 1024) { + x = (tinytexcur & 31) << 4; + y = (tinytexcur >> 5) << 4; + sx = sy = 512; + BindTexture(gl_target, largeeosdtex[0]); + tinytexcur++; + } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) { + x = (smalltexcur & 15) << 5; + y = (smalltexcur >> 4) << 5; + sx = sy = 512; + BindTexture(gl_target, largeeosdtex[1]); + smalltexcur++; + } else { texSize(i->w, i->h, &sx, &sy); BindTexture(gl_target, *curtex++); - glDrawTex(i->dst_x, i->dst_y, i->w, i->h, 0, 0, i->w, i->h, sx, sy, use_rectangle == 1, 0, 0); + } + glDrawTex(i->dst_x, i->dst_y, i->w, i->h, x, y, i->w, i->h, sx, sy, use_rectangle == 1, 0, 0); } glEndList(); BindTexture(gl_target, 0); @@ -297,6 +349,9 @@ static void uninitGl(void) { default_texs[0] = 0; clearOSD(); clearEOSD(); + if (largeeosdtex[0]) + glDeleteTextures(2, largeeosdtex); + largeeosdtex[0] = 0; if (DeleteBuffers && gl_buffer) DeleteBuffers(1, &gl_buffer); gl_buffer = 0; gl_buffersize = 0; |