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
This commit is contained in:
reimar 2008-09-20 17:48:01 +00:00
parent 2d4476731c
commit 0e99017da9
4 changed files with 26 additions and 20 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}