summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-09-20 17:48:01 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-09-20 17:48:01 +0000
commit0e99017da985eff9bf9b996ae1268794e6dfa770 (patch)
tree71259826b0349aae4ee31b6fd5670bee28f45c7a /libvo
parent2d4476731cfcc01df399835bd0c96864550ac009 (diff)
downloadmpv-0e99017da985eff9bf9b996ae1268794e6dfa770.tar.bz2
mpv-0e99017da985eff9bf9b996ae1268794e6dfa770.tar.xz
Change glCreateClearTex to use the same host data format as later uploads.
This fixes at least some of the massive performance problems the ATI drivers have. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27653 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/gl_common.c22
-rw-r--r--libvo/gl_common.h2
-rw-r--r--libvo/vo_gl.c16
-rw-r--r--libvo/vo_gl2.c6
4 files changed, 26 insertions, 20 deletions
diff --git a/libvo/gl_common.c b/libvo/gl_common.c
index a52a605234..e191f7e6ad 100644
--- a/libvo/gl_common.c
+++ b/libvo/gl_common.c
@@ -349,22 +349,26 @@ static void getFunctions(void *(*getProcAddress)(const GLubyte *),
* \brief create a texture and set some defaults
* \param target texture taget, usually GL_TEXTURE_2D
* \param fmt internal texture format
+ * \param format texture host data format
+ * \param type texture host data type
* \param filter filter used for scaling, e.g. GL_LINEAR
* \param w texture width
* \param h texture height
* \param val luminance value to fill texture with
* \ingroup gltexture
*/
-void glCreateClearTex(GLenum target, GLenum fmt, GLint filter,
+void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLint filter,
int w, int h, unsigned char val) {
GLfloat fval = (GLfloat)val / 255.0;
GLfloat border[4] = {fval, fval, fval, fval};
- GLenum clrfmt = (fmt == GL_ALPHA) ? GL_ALPHA : GL_LUMINANCE;
- char *init = malloc(w * h);
- memset(init, val, w * h);
+ int stride = w * glFmt2bpp(format, type);
+ char *init;
+ if (!stride) return;
+ init = malloc(stride * h);
+ memset(init, val, stride * h);
glAdjustAlignment(w);
glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
- glTexImage2D(target, 0, fmt, w, h, 0, clrfmt, GL_UNSIGNED_BYTE, init);
+ glTexImage2D(target, 0, fmt, w, h, 0, format, type, init);
glTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
@@ -411,6 +415,7 @@ int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
FILE *f, int *width, int *height, int *maxval) {
unsigned w, h, m, val, bpp;
char *data;
+ GLenum type;
ppm_skip(f);
if (fgetc(f) != 'P' || fgetc(f) != '6')
return 0;
@@ -437,8 +442,9 @@ int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
fmt = GL_RGB16;
}
- glCreateClearTex(target, fmt, filter, w, h, 0);
- glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE,
+ type = m > 255 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
+ glCreateClearTex(target, fmt, GL_RGB, type, filter, w, h, 0);
+ glUploadTex(target, GL_RGB, type,
data, w * bpp, 0, 0, w, h, 0);
free(data);
if (width) *width = w;
@@ -980,7 +986,7 @@ static void create_conv_textures(gl_conversion_params_t *params, int *texu, char
gen_gamma_map(lookup_data, LOOKUP_RES, params->rgamma);
gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->ggamma);
gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->bgamma);
- glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LINEAR,
+ glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LINEAR,
LOOKUP_RES, 4, 0);
glUploadTex(GL_TEXTURE_2D, GL_LUMINANCE, GL_UNSIGNED_BYTE, lookup_data,
LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0);
diff --git a/libvo/gl_common.h b/libvo/gl_common.h
index 6df60ce257..fdeb1c35e2 100644
--- a/libvo/gl_common.h
+++ b/libvo/gl_common.h
@@ -210,7 +210,7 @@ const char *glValName(GLint value);
int glFindFormat(uint32_t format, int *bpp, GLint *gl_texfmt,
GLenum *gl_format, GLenum *gl_type);
int glFmt2bpp(GLenum format, GLenum type);
-void glCreateClearTex(GLenum target, GLenum fmt, GLint filter,
+void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLint filter,
int w, int h, unsigned char val);
int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
FILE *f, int *width, int *height, int *maxval);
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index b26e3c1855..7521b3e5ed 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -281,9 +281,9 @@ static void genEOSD(mp_eosd_images_t *imgs) {
if (!largeeosdtex[0]) {
glGenTextures(2, largeeosdtex);
BindTexture(gl_target, largeeosdtex[0]);
- glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0);
+ glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, 512, 512, 0);
BindTexture(gl_target, largeeosdtex[1]);
- glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0);
+ glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, 512, 512, 0);
}
for (i = img; i; i = i->next)
{
@@ -322,7 +322,7 @@ static void genEOSD(mp_eosd_images_t *imgs) {
} else {
texSize(i->w, i->h, &sx, &sy);
BindTexture(gl_target, *curtex++);
- glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 0);
+ glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0);
}
glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, i->bitmap, i->stride,
x, y, i->w, i->h, 0);
@@ -412,10 +412,10 @@ static int initGl(uint32_t d_width, uint32_t d_height) {
BindTexture(GL_TEXTURE_3D, default_texs[i + 14]);
}
ActiveTexture(GL_TEXTURE1);
- glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR,
+ glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR,
texture_width / 2, texture_height / 2, 128);
ActiveTexture(GL_TEXTURE2);
- glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR,
+ glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR,
texture_width / 2, texture_height / 2, 128);
switch (use_yuv) {
case YUV_CONVERSION_FRAGMENT_LOOKUP:
@@ -433,7 +433,7 @@ static int initGl(uint32_t d_width, uint32_t d_height) {
BindTexture(gl_target, 0);
update_yuvconv();
}
- glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR,
+ glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR,
texture_width, texture_height, 0);
resize(d_width, d_height);
@@ -537,14 +537,14 @@ static void create_osd_texture(int x0, int y0, int w, int h,
// create Textures for OSD part
glGenTextures(1, &osdtex[osdtexCnt]);
BindTexture(gl_target, osdtex[osdtexCnt]);
- glCreateClearTex(gl_target, GL_LUMINANCE, scale_type, sx, sy, 0);
+ glCreateClearTex(gl_target, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0);
glUploadTex(gl_target, GL_LUMINANCE, GL_UNSIGNED_BYTE, src, stride,
0, 0, w, h, 0);
#ifndef FAST_OSD
glGenTextures(1, &osdatex[osdtexCnt]);
BindTexture(gl_target, osdatex[osdtexCnt]);
- glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 255);
+ glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 255);
{
int i;
char *tmp = malloc(stride * h);
diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c
index 5a81213b6f..1efe6308df 100644
--- a/libvo/vo_gl2.c
+++ b/libvo/vo_gl2.c
@@ -256,16 +256,16 @@ static int initTextures(void)
ActiveTexture(GL_TEXTURE0);
}
- glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, GL_LINEAR,
+ glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR,
texture_width, texture_height, 0);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
if (image_format == IMGFMT_YV12) {
ActiveTexture(GL_TEXTURE1);
- glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, GL_LINEAR,
+ glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR,
texture_width / 2, texture_height / 2, 128);
ActiveTexture(GL_TEXTURE2);
- glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, GL_LINEAR,
+ glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR,
texture_width / 2, texture_height / 2, 128);
ActiveTexture(GL_TEXTURE0);
}