mirror of
https://github.com/mpv-player/mpv
synced 2025-02-03 21:52:12 +00:00
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:
parent
2d4476731c
commit
0e99017da9
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user