diff options
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/gl_common.c | 2 | ||||
-rw-r--r-- | video/out/pnm_loader.c | 97 | ||||
-rw-r--r-- | video/out/pnm_loader.h | 52 | ||||
-rw-r--r-- | video/out/vo.c | 4 | ||||
-rw-r--r-- | video/out/vo_opengl_old.c | 2167 |
5 files changed, 0 insertions, 2322 deletions
diff --git a/video/out/gl_common.c b/video/out/gl_common.c index dcfaf32398..3eeef29ea5 100644 --- a/video/out/gl_common.c +++ b/video/out/gl_common.c @@ -960,8 +960,6 @@ MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, if (gl_flavor >= 210 && !(ctx->gl->mpgl_caps & MPGL_CAP_GL21)) { MP_WARN(ctx->vo, "At least OpenGL 2.1 required.\n"); - if (!vo->probing && (ctx->gl->mpgl_caps & MPGL_CAP_GL_LEGACY)) - MP_WARN(ctx->vo, "Try with: --vo=opengl-old\n"); goto cleanup; } else if (gl_flavor < 210 && !(ctx->gl->mpgl_caps & MPGL_CAP_GL_LEGACY)) { MP_WARN(ctx->vo, "OpenGL context creation failed!\n"); diff --git a/video/out/pnm_loader.c b/video/out/pnm_loader.c deleted file mode 100644 index 70afe0fa23..0000000000 --- a/video/out/pnm_loader.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * PNM image files loader - * - * copyleft (C) 2005-2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * You can alternatively redistribute this file and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - */ - -/** - * \file pnm_loader.c - * \brief PNM image files loader - */ - -#include <stdlib.h> -#include <stdint.h> -#include <stdio.h> -#include "misc/ctype.h" -#include "pnm_loader.h" - -/** - * \brief skips whitespace and comments - * \param f file to read from - */ -static void ppm_skip(FILE *f) { - int c, comment = 0; - do { - c = fgetc(f); - if (c == '#') - comment = 1; - if (c == '\n') - comment = 0; - } while (c != EOF && (mp_isspace(c) || comment)); - if (c != EOF) - ungetc(c, f); -} - -#define MAXDIM (16 * 1024) - -uint8_t *read_pnm(FILE *f, int *width, int *height, - int *bytes_per_pixel, int *maxval) { - uint8_t *data; - int type; - unsigned w, h, m, val, bpp; - *width = *height = *bytes_per_pixel = *maxval = 0; - ppm_skip(f); - if (fgetc(f) != 'P') - return NULL; - type = fgetc(f); - if (type != '5' && type != '6') - return NULL; - ppm_skip(f); - if (fscanf(f, "%u", &w) != 1) - return NULL; - ppm_skip(f); - if (fscanf(f, "%u", &h) != 1) - return NULL; - ppm_skip(f); - if (fscanf(f, "%u", &m) != 1) - return NULL; - val = fgetc(f); - if (!mp_isspace(val)) - return NULL; - if (w > MAXDIM || h > MAXDIM) - return NULL; - bpp = (m > 255) ? 2 : 1; - if (type == '6') - bpp *= 3; - data = malloc(w * h * bpp); - if (fread(data, w * bpp, h, f) != h) { - free(data); - return NULL; - } - *width = w; - *height = h; - *bytes_per_pixel = bpp; - *maxval = m; - return data; -} diff --git a/video/out/pnm_loader.h b/video/out/pnm_loader.h deleted file mode 100644 index e00cce2e63..0000000000 --- a/video/out/pnm_loader.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * PNM image files loader - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * You can alternatively redistribute this file and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - */ - -#ifndef MPLAYER_PNM_LOADER_H -#define MPLAYER_PNM_LOADER_H - -#include <stdio.h> -#include <stdint.h> - -/** - * Read a "portable anymap" image. - * Supports raw PGM (P5) and PNM (P6). - * - * @param[in] f input stream. - * @param[out] width width of the loaded image. - * @param[out] height height of the loaded image. - * @param[out] bytes_per_pixel format of the loaded image. - * @param[out] maxval maximum pixel value; possible values are: - * 1 for 8 bits gray, - * 2 for 16 bits gray, - * 3 for 8 bits per component RGB, - * 6 for 16 bits per component RGB. - * @return a newly allocated array of - * width*height*bytes_per_pixel bytes, - * or NULL in case of error. - */ -uint8_t *read_pnm(FILE *f, int *width, int *height, - int *bytes_per_pixel, int *maxval); - -#endif /* MPLAYER_PNM_LOADER_H */ diff --git a/video/out/vo.c b/video/out/vo.c index 251f32e6af..53a32a72ed 100644 --- a/video/out/vo.c +++ b/video/out/vo.c @@ -54,7 +54,6 @@ extern const struct vo_driver video_out_vdpau; extern const struct vo_driver video_out_xv; extern const struct vo_driver video_out_opengl; extern const struct vo_driver video_out_opengl_hq; -extern const struct vo_driver video_out_opengl_old; extern const struct vo_driver video_out_opengl_cb; extern const struct vo_driver video_out_null; extern const struct vo_driver video_out_image; @@ -84,9 +83,6 @@ const struct vo_driver *const video_out_drivers[] = #if HAVE_SDL2 &video_out_sdl, #endif -#if HAVE_GL - &video_out_opengl_old, -#endif #if HAVE_VAAPI &video_out_vaapi, #endif diff --git a/video/out/vo_opengl_old.c b/video/out/vo_opengl_old.c deleted file mode 100644 index f39f5709cf..0000000000 --- a/video/out/vo_opengl_old.c +++ /dev/null @@ -1,2167 +0,0 @@ -/* - * This file is part of MPlayer. - * - * Original author: Reimar Doeffinger <Reimar.Doeffinger@gmx.de> - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * You can alternatively redistribute this file and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <stdbool.h> -#include <assert.h> - -#include "config.h" -#include "talloc.h" -#include "common/msg.h" -#include "misc/ctype.h" -#include "options/m_option.h" -#include "vo.h" -#include "video/vfcap.h" -#include "video/mp_image.h" -#include "sub/osd.h" - -#include "gl_common.h" -#include "gl_osd.h" -#include "video/memcpy_pic.h" -#include "pnm_loader.h" - -//for gl_priv.use_yuv -#define MASK_ALL_YUV (~(1 << YUV_CONVERSION_NONE)) -#define MASK_NOT_COMBINERS (~((1 << YUV_CONVERSION_NONE) | (1 << YUV_CONVERSION_COMBINERS))) -#define MASK_GAMMA_SUPPORT (MASK_NOT_COMBINERS & ~(1 << YUV_CONVERSION_FRAGMENT)) - -struct gl_priv { - MPGLContext *glctx; - GL *gl; - - int allow_sw; - - int scaled_osd; - struct mpgl_osd *osd; - int osd_color; - double osd_pts; - - int use_ycbcr; - int use_yuv; - int is_yuv; - int lscale; - int cscale; - float filter_strength; - float noise_strength; - int yuvconvtype; - int use_rectangle; - int err_shown; - uint32_t image_width; - uint32_t image_height; - uint32_t image_format; - int many_fmts; - int have_texture_rg; - int max_tex_component_size; - int ati_hack; - int force_pbo; - int use_glFinish; - int swap_interval; - GLenum target; - GLint texfmt; - GLenum gl_format; - GLenum gl_type; - GLuint buffer; - GLuint buffer_uv[2]; - int buffersize; - int buffersize_uv; - void *bufferptr; - void *bufferptr_uv[2]; - GLuint fragprog; - GLuint default_texs[22]; - char *custom_prog; - char *custom_tex; - int custom_tlin; - int custom_trect; - int mipmap_gen; - int stereo_mode; - char *backend_arg; - - struct mp_csp_equalizer video_eq; - - int texture_width; - int texture_height; - int mpi_flipped; - int vo_flipped; - - struct mp_rect src_rect; // displayed part of the source video - struct mp_rect dst_rect; // video rectangle on output window - struct mp_osd_res osd_res; - - int slice_height; -}; - -static int glFindFormat(uint32_t format, int have_texture_rg, int *bpp, - GLint *gl_texfmt, GLenum *gl_format, GLenum *gl_type); -static void glCreateClearTex(GL *gl, GLenum target, GLenum fmt, GLenum format, - GLenum type, GLint filter, int w, int h, - unsigned char val); -static int glCreatePPMTex(GL *gl, GLenum target, GLenum fmt, GLint filter, - FILE *f, int *width, int *height, int *maxval); -static void glDrawTex(GL *gl, GLfloat x, GLfloat y, GLfloat w, GLfloat h, - GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th, - int sx, int sy, int rect_tex, int is_yv12, int flip); -static int loadGPUProgram(struct vo *vo, GL *gl, GLenum target, char *prog); -//! do not use YUV conversion, this should always stay 0 -#define YUV_CONVERSION_NONE 0 -//! use nVidia specific register combiners for YUV conversion -//! implementation has been removed -#define YUV_CONVERSION_COMBINERS 1 -//! use a fragment program for YUV conversion -#define YUV_CONVERSION_FRAGMENT 2 -//! use a fragment program for YUV conversion with gamma using POW -#define YUV_CONVERSION_FRAGMENT_POW 3 -//! use a fragment program with additional table lookup for YUV conversion -#define YUV_CONVERSION_FRAGMENT_LOOKUP 4 -//! use ATI specific register combiners ("fragment program") -#define YUV_CONVERSION_COMBINERS_ATI 5 -//! use a fragment program with 3D table lookup for YUV conversion -#define YUV_CONVERSION_FRAGMENT_LOOKUP3D 6 -//! use ATI specific "text" register combiners ("fragment program") -#define YUV_CONVERSION_TEXT_FRAGMENT 7 -//! use normal bilinear scaling for textures -#define YUV_SCALER_BILIN 0 -//! use higher quality bicubic scaling for textures -#define YUV_SCALER_BICUB 1 -//! use cubic scaling in X and normal linear scaling in Y direction -#define YUV_SCALER_BICUB_X 2 -//! use cubic scaling without additional lookup texture -#define YUV_SCALER_BICUB_NOTEX 3 -#define YUV_SCALER_UNSHARP 4 -#define YUV_SCALER_UNSHARP2 5 -//! mask for conversion type -#define YUV_CONVERSION_MASK 0xF -//! mask for scaler type -#define YUV_SCALER_MASK 0xF -//! shift value for luminance scaler type -#define YUV_LUM_SCALER_SHIFT 8 -//! shift value for chrominance scaler type -#define YUV_CHROM_SCALER_SHIFT 12 -//! extract conversion out of type -#define YUV_CONVERSION(t) ((t) & YUV_CONVERSION_MASK) -//! extract luminance scaler out of type -#define YUV_LUM_SCALER(t) (((t) >> YUV_LUM_SCALER_SHIFT) & YUV_SCALER_MASK) -//! extract chrominance scaler out of type -#define YUV_CHROM_SCALER(t) (((t) >> YUV_CHROM_SCALER_SHIFT) & YUV_SCALER_MASK) -#define SET_YUV_CONVERSION(c) ((c) & YUV_CONVERSION_MASK) -#define SET_YUV_LUM_SCALER(s) (((s) & YUV_SCALER_MASK) << YUV_LUM_SCALER_SHIFT) -#define SET_YUV_CHROM_SCALER(s) (((s) & YUV_SCALER_MASK) << YUV_CHROM_SCALER_SHIFT) -//! returns whether the yuv conversion supports large brightness range etc. -static inline int glYUVLargeRange(int conv) -{ - switch (conv) { - case YUV_CONVERSION_NONE: - case YUV_CONVERSION_FRAGMENT_LOOKUP3D: - case YUV_CONVERSION_TEXT_FRAGMENT: - return 0; - } - return 1; -} -typedef struct { - GLenum target; - int type; - struct mp_csp_params csp_params; - int texw; - int texh; - int chrom_texw; - int chrom_texh; - float filter_strength; - float noise_strength; -} gl_conversion_params_t; - -static int glAutodetectYUVConversion(GL *gl); -static void glSetupYUVConversion(struct vo *vo, GL *gl, - gl_conversion_params_t *params); -static void glEnableYUVConversion(GL *gl, GLenum target, int type); -static void glDisableYUVConversion(GL *gl, GLenum target, int type); - - -#define GL_3D_RED_CYAN 1 -#define GL_3D_GREEN_MAGENTA 2 -#define GL_3D_QUADBUFFER 3 - -static void glEnable3DLeft(GL *gl, int type) -{ - GLint buffer; - switch (type) { - case GL_3D_RED_CYAN: - gl->ColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); - break; - case GL_3D_GREEN_MAGENTA: - gl->ColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE); - break; - case GL_3D_QUADBUFFER: - gl->GetIntegerv(GL_DRAW_BUFFER, &buffer); - switch (buffer) { - case GL_FRONT: - case GL_FRONT_LEFT: - case GL_FRONT_RIGHT: - buffer = GL_FRONT_LEFT; - break; - case GL_BACK: - case GL_BACK_LEFT: - case GL_BACK_RIGHT: - buffer = GL_BACK_LEFT; - break; - } - gl->DrawBuffer(buffer); - break; - } -} - -static void glEnable3DRight(GL *gl, int type) -{ - GLint buffer; - switch (type) { - case GL_3D_RED_CYAN: - gl->ColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); - break; - case GL_3D_GREEN_MAGENTA: - gl->ColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); - break; - case GL_3D_QUADBUFFER: - gl->GetIntegerv(GL_DRAW_BUFFER, &buffer); - switch (buffer) { - case GL_FRONT: - case GL_FRONT_LEFT: - case GL_FRONT_RIGHT: - buffer = GL_FRONT_RIGHT; - break; - case GL_BACK: - case GL_BACK_LEFT: - case GL_BACK_RIGHT: - buffer = GL_BACK_RIGHT; - break; - } - gl->DrawBuffer(buffer); - break; - } -} - -static void glDisable3D(GL *gl, int type) -{ - GLint buffer; - switch (type) { - case GL_3D_RED_CYAN: - case GL_3D_GREEN_MAGENTA: - gl->ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - break; - case GL_3D_QUADBUFFER: - gl->DrawBuffer(GL_BACK); - gl->GetIntegerv(GL_DRAW_BUFFER, &buffer); - switch (buffer) { - case GL_FRONT: - case GL_FRONT_LEFT: - case GL_FRONT_RIGHT: - buffer = GL_FRONT; - break; - case GL_BACK: - case GL_BACK_LEFT: - case GL_BACK_RIGHT: - buffer = GL_BACK; - break; - } - gl->DrawBuffer(buffer); - break; - } -} - -//! always return this format as internal texture format in glFindFormat -#define TEXTUREFORMAT_ALWAYS GL_RGB8 -#undef TEXTUREFORMAT_ALWAYS - -/** - * \brief find the OpenGL settings coresponding to format. - * - * All parameters may be NULL. - * \param fmt MPlayer format to analyze. - * \param dummy reserved - * \param gl_texfmt [OUT] internal texture format that fits the - * image format, not necessarily the best for performance. - * \param gl_format [OUT] OpenGL format for this image format. - * \param gl_type [OUT] OpenGL type for this image format. - * \return 1 if format is supported by OpenGL, 0 if not. - * \ingroup gltexture - */ -static int glFindFormat(uint32_t fmt, int have_texture_rg, int *dummy, - GLint *gl_texfmt, GLenum *gl_format, GLenum *gl_type) -{ - int supported = 1; - GLenum dummy2; - GLint dummy3; - if (!gl_texfmt) - gl_texfmt = &dummy3; - if (!gl_format) - gl_format = &dummy2; - if (!gl_type) - gl_type = &dummy2; - - struct mp_imgfmt_desc desc = mp_imgfmt_get_desc(fmt); - if (desc.flags & MP_IMGFLAG_YUV_P) { - // reduce the possible cases a bit - if (desc.plane_bits > 8) - fmt = IMGFMT_420P16; - else - fmt = IMGFMT_420P; - } - - *gl_texfmt = 3; - switch (fmt) { - case IMGFMT_RGB48: - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_SHORT; - break; - case IMGFMT_RGB24: - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_RGBA: - *gl_texfmt = 4; - *gl_format = GL_RGBA; - *gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_420P16: - supported = 0; // no native YUV support - *gl_texfmt = have_texture_rg ? GL_R16 : GL_LUMINANCE16; - *gl_format = have_texture_rg ? GL_RED : GL_LUMINANCE; - *gl_type = GL_UNSIGNED_SHORT; - break; - case IMGFMT_420P: - supported = 0; // no native YV12 support - case IMGFMT_Y8: - *gl_texfmt = 1; - *gl_format = GL_LUMINANCE; - *gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_UYVY: - *gl_texfmt = GL_YCBCR_MESA; - *gl_format = GL_YCBCR_MESA; - *gl_type = fmt == IMGFMT_UYVY ? GL_UNSIGNED_SHORT_8_8 : GL_UNSIGNED_SHORT_8_8_REV; - break; -#if 0 - // we do not support palettized formats, although the format the - // swscale produces works - case IMGFMT_RGB8: - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_BYTE_2_3_3_REV; - break; -#endif - case IMGFMT_BGR555: - *gl_format = GL_RGBA; - *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; - break; - case IMGFMT_BGR565: - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_SHORT_5_6_5_REV; - break; -#if 0 - case IMGFMT_BGR8: - // special case as red and blue have a different number of bits. - // GL_BGR and GL_UNSIGNED_BYTE_3_3_2 isn't supported at least - // by nVidia drivers, and in addition would give more bits to - // blue than to red, which isn't wanted - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_BYTE_3_3_2; - break; -#endif - case IMGFMT_RGB555: - *gl_format = GL_BGRA; - *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; - break; - case IMGFMT_RGB565: - *gl_format = GL_RGB; - *gl_type = GL_UNSIGNED_SHORT_5_6_5; - break; - case IMGFMT_BGR24: - *gl_format = GL_BGR; - *gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_BGRA: - *gl_texfmt = 4; - *gl_format = GL_BGRA; - *gl_type = GL_UNSIGNED_BYTE; - break; - default: - *gl_texfmt = 4; - *gl_format = GL_RGBA; - *gl_type = GL_UNSIGNED_BYTE; - supported = 0; - } -#ifdef TEXTUREFORMAT_ALWAYS - *gl_texfmt = TEXTUREFORMAT_ALWAYS; -#endif - return supported; -} - -/** - * \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 - */ -static void glCreateClearTex(GL *gl, 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 - }; - int stride; - char *init; - if (w == 0) - w = 1; - if (h == 0) - h = 1; - stride = w * glFmt2bpp(format, type); - if (!stride) - return; - init = malloc(stride * h); - memset(init, val, stride * h); - glAdjustAlignment(gl, stride); - gl->PixelStorei(GL_UNPACK_ROW_LENGTH, w); - gl->TexImage2D(target, 0, fmt, w, h, 0, format, type, init); - gl->TexParameterf(target, GL_TEXTURE_PRIORITY, 1.0); - gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); - gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); - gl->TexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - gl->TexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - // Border texels should not be used with CLAMP_TO_EDGE - // We set a sane default anyway. - gl->TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border); - free(init); -} - -static GLint detect_hqtexfmt(GL *gl) -{ - const char *extensions = (const char *)gl->GetString(GL_EXTENSIONS); - if (strstr(extensions, "_texture_float")) - return GL_RGB32F; - else if (strstr(extensions, "NV_float_buffer")) - return GL_FLOAT_RGB32_NV; - return GL_RGB16; -} - -/** - * \brief creates a texture from a PPM file - * \param target texture taget, usually GL_TEXTURE_2D - * \param fmt internal texture format, 0 for default - * \param filter filter used for scaling, e.g. GL_LINEAR - * \param f file to read PPM from - * \param width [out] width of texture - * \param height [out] height of texture - * \param maxval [out] maxval value from PPM file - * \return 0 on error, 1 otherwise - * \ingroup gltexture - */ -static int glCreatePPMTex(GL *gl, GLenum target, GLenum fmt, GLint filter, - FILE *f, int *width, int *height, int *maxval) -{ - int w, h, m, bpp; - GLenum type; - uint8_t *data = read_pnm(f, &w, &h, &bpp, &m); - GLint hqtexfmt = detect_hqtexfmt(gl); - if (!data || (bpp != 3 && bpp != 6)) { - free(data); - return 0; - } - if (!fmt) { - fmt = bpp == 6 ? hqtexfmt : 3; - if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE) - fmt = GL_RGB16; - } - type = bpp == 6 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; - glCreateClearTex(gl, target, fmt, GL_RGB, type, filter, w, h, 0); - glUploadTex(gl, target, GL_RGB, type, - data, w * bpp, 0, 0, w, h, 0); - free(data); - if (width) - *width = w; - if (height) - *height = h; - if (maxval) - *maxval = m; - return 1; -} - -// Replace all occurances of variables named "$"+name (e.g. $foo) in *text with -// replace, and return the result. *text must have been allocated with talloc. -static void replace_var_str(char **text, const char *name, const char *replace) -{ - size_t namelen = strlen(name); - char *nextvar = *text; - void *parent = talloc_parent(*text); - for (;;) { - nextvar = strchr(nextvar, '$'); - if (!nextvar) - break; - char *until = nextvar; - nextvar++; - if (strncmp(nextvar, name, namelen) != 0) - continue; - nextvar += namelen; - // try not to replace prefixes of other vars (e.g. $foo vs. $foo_bar) - char term = nextvar[0]; - if (mp_isalnum(term) || term == '_') - continue; - int prelength = until - *text; - int postlength = nextvar - *text; - char *n = talloc_asprintf(parent, "%.*s%s%s", prelength, *text, replace, - nextvar); - talloc_free(*text); - *text = n; - nextvar = *text + postlength; - } -} - -static void replace_var_float(char **text, const char *name, float replace) -{ - char *s = talloc_asprintf(NULL, "%e", replace); - replace_var_str(text, name, s); - talloc_free(s); -} - -static void replace_var_char(char **text, const char *name, char replace) -{ - char s[2] = { replace, '\0' }; - replace_var_str(text, name, s); -} - -// Append template to *text. Possibly initialize *text if it's NULL. -static void append_template(char **text, const char* template) -{ - if (!*text) - *text = talloc_strdup(NULL, template); - else - *text = talloc_strdup_append(*text, template); -} - -/** - * \brief helper function for gen_spline_lookup_tex - * \param x subpixel-position ((0,1) range) to calculate weights for - * \param dst where to store transformed weights, must provide space for 4 GLfloats - * - * calculates the weights and stores them after appropriate transformation - * for the scaler fragment program. - */ -static void store_weights(float x, GLfloat *dst) -{ - float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6; - float w1 = (((3 * x - 6) * x + 0) * x + 4) / 6; - float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6; - float w3 = (((1 * x + 0) * x + 0) * x + 0) / 6; - *dst++ = 1 + x - w1 / (w0 + w1); - *dst++ = 1 - x + w3 / (w2 + w3); - *dst++ = w0 + w1; - *dst++ = 0; -} - -//! to avoid artefacts this should be rather large -#define LOOKUP_BSPLINE_RES (2 * 1024) -/** - * \brief creates the 1D lookup texture needed for fast higher-order filtering - * \param unit texture unit to attach texture to - */ -static void gen_spline_lookup_tex(GL *gl, GLenum unit) -{ - GLfloat *tex = calloc(4 * LOOKUP_BSPLINE_RES, sizeof(*tex)); - GLfloat *tp = tex; - int i; - for (i = 0; i < LOOKUP_BSPLINE_RES; i++) { - float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES; - store_weights(x, tp); - tp += 4; - } - store_weights(0, tex); - store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]); - gl->ActiveTexture(unit); - gl->TexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, - GL_FLOAT, tex); - gl->TexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); - gl->ActiveTexture(GL_TEXTURE0); - free(tex); -} - -#define NOISE_RES 2048 - -/** - * \brief creates the 1D lookup texture needed to generate pseudo-random numbers. - * \param unit texture unit to attach texture to - */ -static void gen_noise_lookup_tex(GL *gl, GLenum unit) { - GLfloat *tex = calloc(NOISE_RES, sizeof(*tex)); - uint32_t lcg = 0x79381c11; - int i; - for (i = 0; i < NOISE_RES; i++) - tex[i] = (double)i / (NOISE_RES - 1); - for (i = 0; i < NOISE_RES - 1; i++) { - int remain = NOISE_RES - i; - int idx = i + (lcg >> 16) % remain; - GLfloat tmp = tex[i]; - tex[i] = tex[idx]; - tex[idx] = tmp; - lcg = lcg * 1664525 + 1013904223; - } - gl->ActiveTexture(unit); - gl->TexImage1D(GL_TEXTURE_1D, 0, 1, NOISE_RES, 0, GL_RED, GL_FLOAT, tex); - gl->TexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); - gl->ActiveTexture(GL_TEXTURE0); - free(tex); -} - -#define SAMPLE(dest, coord, texture) \ - "TEX textemp, " coord ", " texture ", $tex_type;\n" \ - "MOV " dest ", textemp.r;\n" - -static const char bilin_filt_template[] = - SAMPLE("yuv.$out_comp","fragment.texcoord[$in_tex]","texture[$in_tex]"); - -#define BICUB_FILT_MAIN \ - /* first y-interpolation */ \ - "ADD coord, fragment.texcoord[$in_tex].xyxy, cdelta.xyxw;\n" \ - "ADD coord2, fragment.texcoord[$in_tex].xyxy, cdelta.zyzw;\n" \ - SAMPLE("a.r","coord.xyxy","texture[$in_tex]") \ - SAMPLE("a.g","coord.zwzw","texture[$in_tex]") \ - /* second y-interpolation */ \ - SAMPLE("b.r","coord2.xyxy","texture[$in_tex]") \ - SAMPLE("b.g","coord2.zwzw","texture[$in_tex]") \ - "LRP a.b, parmy.b, a.rrrr, a.gggg;\n" \ - "LRP a.a, parmy.b, b.rrrr, b.gggg;\n" \ - /* x-interpolation */ \ - "LRP yuv.$out_comp, parmx.b, a.bbbb, a.aaaa;\n" - -static const char bicub_filt_template_2D[] = - "MAD coord.xy, fragment.texcoord[$in_tex], {$texw, $texh}, {0.5, 0.5};\n" - "TEX parmx, coord.x, texture[$texs], 1D;\n" - "MUL cdelta.xz, parmx.rrgg, {-$ptw, 0, $ptw, 0};\n" - "TEX parmy, coord.y, texture[$texs], 1D;\n" - "MUL cdelta.yw, parmy.rrgg, {0, -$pth, 0, $pth};\n" - BICUB_FILT_MAIN; - -static const char bicub_filt_template_RECT[] = - "ADD coord, fragment.texcoord[$in_tex], {0.5, 0.5};\n" - "TEX parmx, coord.x, texture[$texs], 1D;\n" - "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n" - "TEX parmy, coord.y, texture[$texs], 1D;\n" - "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n" - BICUB_FILT_MAIN; - -#define CALCWEIGHTS(t, s) \ - "MAD "t ", {-0.5, 0.1666, 0.3333, -0.3333}, "s ", {1, 0, -0.5, 0.5};\n" \ - "MAD "t ", "t ", "s ", {0, 0, -0.5, 0.5};\n" \ - "MAD "t ", "t ", "s ", {-0.6666, 0, 0.8333, 0.1666};\n" \ - "RCP a.x, "t ".z;\n" \ - "RCP a.y, "t ".w;\n" \ - "MAD "t ".xy, "t ".xyxy, a.xyxy, {1, 1, 0, 0};\n" \ - "ADD "t ".x, "t ".xxxx, "s ";\n" \ - "SUB "t ".y, "t ".yyyy, "s ";\n" - -static const char bicub_notex_filt_template_2D[] = - "MAD coord.xy, fragment.texcoord[$in_tex], {$texw, $texh}, {0.5, 0.5};\n" - "FRC coord.xy, coord.xyxy;\n" - CALCWEIGHTS("parmx", "coord.xxxx") - "MUL cdelta.xz, parmx.rrgg, {-$ptw, 0, $ptw, 0};\n" - CALCWEIGHTS("parmy", "coord.yyyy") - "MUL cdelta.yw, parmy.rrgg, {0, -$pth, 0, $pth};\n" - BICUB_FILT_MAIN; - -static const char bicub_notex_filt_template_RECT[] = - "ADD coord, fragment.texcoord[$in_tex], {0.5, 0.5};\n" - "FRC coord.xy, coord.xyxy;\n" - CALCWEIGHTS("parmx", "coord.xxxx") - "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n" - CALCWEIGHTS("parmy", "coord.yyyy") - "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n" - BICUB_FILT_MAIN; - -#define BICUB_X_FILT_MAIN \ - "ADD coord.xy, fragment.texcoord[$in_tex].xyxy, cdelta.xyxy;\n" \ - "ADD coord2.xy, fragment.texcoord[$in_tex].xyxy, cdelta.zyzy;\n" \ - SAMPLE("a.r","coord","texture[$in_tex]") \ - SAMPLE("b.r","coord2","texture[$in_tex]") \ - /* x-interpolation */ \ - "LRP yuv.$out_comp, parmx.b, a.rrrr, b.rrrr;\n" - -static const char bicub_x_filt_template_2D[] = - "MAD coord.x, fragment.texcoord[$in_tex], {$texw}, {0.5};\n" - "TEX parmx, coord, texture[$texs], 1D;\n" - "MUL cdelta.xyz, parmx.rrgg, {-$ptw, 0, $ptw};\n" - BICUB_X_FILT_MAIN; - -static const char bicub_x_filt_template_RECT[] = - "ADD coord.x, fragment.texcoord[$in_tex], {0.5};\n" - "TEX parmx, coord, texture[$texs], 1D;\n" - "MUL cdelta.xyz, parmx.rrgg, {-1, 0, 1};\n" - BICUB_X_FILT_MAIN; - -static const char unsharp_filt_template[] = - "PARAM dcoord$out_comp = {$ptw_05, $pth_05, $ptw_05, -$pth_05};\n" - "ADD coord, fragment.texcoord[$in_tex].xyxy, dcoord$out_comp;\n" - "SUB coord2, fragment.texcoord[$in_tex].xyxy, dcoord$out_comp;\n" - SAMPLE("a.r","fragment.texcoord[$in_tex]","texture[$in_tex]") - SAMPLE("b.r","coord.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord.zwzw","texture[$in_tex]") - "ADD b.r, b.r, b.g;\n" - SAMPLE("b.b","coord2.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord2.zwzw","texture[$in_tex]") - "DP3 b, b, {0.25, 0.25, 0.25};\n" - "SUB b.r, a.r, b.r;\n" - "MAD textemp.r, b.r, {$strength}, a.r;\n" - "MOV yuv.$out_comp, textemp.r;\n"; - -static const char unsharp_filt_template2[] = - "PARAM dcoord$out_comp = {$ptw_12, $pth_12, $ptw_12, -$pth_12};\n" - "PARAM dcoord2$out_comp = {$ptw_15, 0, 0, $pth_15};\n" - "ADD coord, fragment.texcoord[$in_tex].xyxy, dcoord$out_comp;\n" - "SUB coord2, fragment.texcoord[$in_tex].xyxy, dcoord$out_comp;\n" - SAMPLE("a.r","fragment.texcoord[$in_tex]","texture[$in_tex]") - SAMPLE("b.r","coord.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord.zwzw","texture[$in_tex]") - "ADD b.r, b.r, b.g;\n" - SAMPLE("b.b","coord2.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord2.zwzw","texture[$in_tex]") - "ADD b.r, b.r, b.b;\n" - "ADD b.a, b.r, b.g;\n" - "ADD coord, fragment.texcoord[$in_tex].xyxy, dcoord2$out_comp;\n" - "SUB coord2, fragment.texcoord[$in_tex].xyxy, dcoord2$out_comp;\n" - SAMPLE("b.r","coord.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord.zwzw","texture[$in_tex]") - "ADD b.r, b.r, b.g;\n" - SAMPLE("b.b","coord2.xyxy","texture[$in_tex]") - SAMPLE("b.g","coord2.zwzw","texture[$in_tex]") - "DP4 b.r, b, {-0.1171875, -0.1171875, -0.1171875, -0.09765625};\n" - "MAD b.r, a.r, {0.859375}, b.r;\n" - "MAD textemp.r, b.r, {$strength}, a.r;\n" - "MOV yuv.$out_comp, textemp.r;\n"; - -static const char yuv_prog_template[] = - "PARAM ycoef = {$cm11, $cm21, $cm31};\n" - "PARAM ucoef = {$cm12, $cm22, $cm32};\n" - "PARAM vcoef = {$cm13, $cm23, $cm33};\n" - "PARAM offsets = {$cm14, $cm24, $cm34};\n" - "TEMP res;\n" - "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n" - "MAD res.rgb, yuv.gggg, ucoef, res;\n" - "MAD res.rgb, yuv.bbbb, vcoef, res;\n"; - -static const char yuv_pow_prog_template[] = - "PARAM ycoef = {$cm11, $cm21, $cm31};\n" - "PARAM ucoef = {$cm12, $cm22, $cm32};\n" - "PARAM vcoef = {$cm13, $cm23, $cm33};\n" - "PARAM offsets = {$cm14, $cm24, $cm34};\n" - "PARAM gamma = {$gamma_r, $gamma_g, $gamma_b};\n" - "TEMP res;\n" - "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n" - "MAD res.rgb, yuv.gggg, ucoef, res; |