summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-01-20 21:15:04 +0100
committerwm4 <wm4@nowhere>2015-01-20 21:15:04 +0100
commit724f722d7f284076e717d59c8565b7ed27dadae3 (patch)
treeb388e76fa14ba356a4cd96d842ad0617a9c4568f /video/out
parent21322a016e74ddf20cffaab5d621db1cf694eaa5 (diff)
downloadmpv-724f722d7f284076e717d59c8565b7ed27dadae3.tar.bz2
mpv-724f722d7f284076e717d59c8565b7ed27dadae3.tar.xz
vo_opengl_old: remove this VO
At this point, there is probably no hardware left that doesn't do OpenGL 2.1, and at the same time is fast enough to handle video.
Diffstat (limited to 'video/out')
-rw-r--r--video/out/gl_common.c2
-rw-r--r--video/out/pnm_loader.c97
-rw-r--r--video/out/pnm_loader.h52
-rw-r--r--video/out/vo.c4
-rw-r--r--video/out/vo_opengl_old.c2167
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;