diff options
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/gl_common.c | 24 | ||||
-rw-r--r-- | libvo/gl_common.h | 2 | ||||
-rw-r--r-- | libvo/vo_gl.c | 16 | ||||
-rw-r--r-- | libvo/vo_gl2.c | 6 |
4 files changed, 27 insertions, 21 deletions
diff --git a/libvo/gl_common.c b/libvo/gl_common.c index 2dad92c605..90272f6e80 100644 --- a/libvo/gl_common.c +++ b/libvo/gl_common.c @@ -350,22 +350,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); - glAdjustAlignment(w); + int stride = w * glFmt2bpp(format, type); + char *init; + if (!stride) return; + init = malloc(stride * h); + memset(init, val, stride * h); + glAdjustAlignment(stride); 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); @@ -412,6 +416,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; @@ -438,8 +443,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; @@ -981,7 +987,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 8b1e4b144c..1f1b73cca9 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 9d538a8447..dedbac75cc 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 d7814948aa..070fd0d5d6 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); } |