annotate libvo/gl_common.c @ 36920:40ad45360c8a

Replace old item 'potmeter' by new item 'pimage'. Recent versions of the X11/GTK GUI didn't allow to control a potmeter, because that didn't seem to make any sense. In order to get rid of the confusing potmeter that doesn't distinguish from a hpotmeter and in order to allow the more useful behaviour recent versions of the X11/GTK GUI have been utilized (and because we're still supporting item 'potmeter' for reasons of compatibility with old skins), introduce new item 'pimage' that reuses most of the current potmeter code. Additionally, remove remaining code and documentation of 'potmeter'.
author ib
date Mon, 17 Mar 2014 12:29:46 +0000
parents 61a9df2e25d0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
1 /*
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
2 * common OpenGL routines
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
3 *
31030
9a02edff6c50 Update copyright and email address.
reimar
parents: 31029
diff changeset
4 * copyleft (C) 2005-2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
5 * Special thanks go to the xine team and Matthias Hopf, whose video_out_opengl.c
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
6 * gave me lots of good ideas.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
7 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
8 * This file is part of MPlayer.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
9 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
10 * MPlayer is free software; you can redistribute it and/or modify
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
11 * it under the terms of the GNU General Public License as published by
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
13 * (at your option) any later version.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
14 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
15 * MPlayer is distributed in the hope that it will be useful,
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
18 * GNU General Public License for more details.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
19 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
20 * You should have received a copy of the GNU General Public License along
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
21 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31309
1a35ec7c45e0 Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents: 31086
diff changeset
23 *
1a35ec7c45e0 Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents: 31086
diff changeset
24 * You can alternatively redistribute this file and/or
1a35ec7c45e0 Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents: 31086
diff changeset
25 * modify it under the terms of the GNU Lesser General Public
1a35ec7c45e0 Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents: 31086
diff changeset
26 * License as published by the Free Software Foundation; either
1a35ec7c45e0 Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents: 31086
diff changeset
27 * version 2.1 of the License, or (at your option) any later version.
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
28 */
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
29
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
30 /**
33882
08a90b0e44e1 doxygen: drop filename from @file directive
diego
parents: 33606
diff changeset
31 * \file
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
32 * \brief OpenGL helper functions used by vo_gl.c and vo_gl2.c
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
33 */
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
34
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
35 #include <stdlib.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
36 #include <stdio.h>
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
37 #include <string.h>
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
38 #include <ctype.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
39 #include <math.h>
34174
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 34061
diff changeset
40
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 34061
diff changeset
41 #include "mp_msg.h"
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
42 #include "gl_common.h"
30108
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
43 #include "csputils.h"
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
44 #include "aspect.h"
32427
58232aeb3fdd Move the read_pnm function into a separate file.
cigaes
parents: 32393
diff changeset
45 #include "pnm_loader.h"
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
46
34841
4e749c1bbf49 Make a glGetError function pointer available.
reimar
parents: 34748
diff changeset
47 GLenum (GLAPIENTRY *mpglGetError)(void);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
48 void (GLAPIENTRY *mpglBegin)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
49 void (GLAPIENTRY *mpglEnd)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
50 void (GLAPIENTRY *mpglViewport)(GLint, GLint, GLsizei, GLsizei);
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
51 void (GLAPIENTRY *mpglLoadMatrixf)(const float *);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
52 void (GLAPIENTRY *mpglClear)(GLbitfield);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
53 GLuint (GLAPIENTRY *mpglGenLists)(GLsizei);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
54 void (GLAPIENTRY *mpglDeleteLists)(GLuint, GLsizei);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
55 void (GLAPIENTRY *mpglNewList)(GLuint, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
56 void (GLAPIENTRY *mpglEndList)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
57 void (GLAPIENTRY *mpglCallList)(GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
58 void (GLAPIENTRY *mpglCallLists)(GLsizei, GLenum, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
59 void (GLAPIENTRY *mpglGenTextures)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
60 void (GLAPIENTRY *mpglDeleteTextures)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
61 void (GLAPIENTRY *mpglTexEnvi)(GLenum, GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
62 void (GLAPIENTRY *mpglColor4ub)(GLubyte, GLubyte, GLubyte, GLubyte);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
63 void (GLAPIENTRY *mpglClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
35890
3be8afb83629 Switch back to glClearDepth.
reimar
parents: 35889
diff changeset
64 void (GLAPIENTRY *mpglClearDepth)(double);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
65 void (GLAPIENTRY *mpglDepthFunc)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
66 void (GLAPIENTRY *mpglEnable)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
67 void (GLAPIENTRY *mpglDisable)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
68 const GLubyte *(GLAPIENTRY *mpglGetString)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
69 void (GLAPIENTRY *mpglDrawBuffer)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
70 void (GLAPIENTRY *mpglDepthMask)(GLboolean);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
71 void (GLAPIENTRY *mpglBlendFunc)(GLenum, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
72 void (GLAPIENTRY *mpglFlush)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
73 void (GLAPIENTRY *mpglFinish)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
74 void (GLAPIENTRY *mpglPixelStorei)(GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
75 void (GLAPIENTRY *mpglTexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
76 void (GLAPIENTRY *mpglTexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
77 void (GLAPIENTRY *mpglTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
78 void (GLAPIENTRY *mpglTexParameteri)(GLenum, GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
79 void (GLAPIENTRY *mpglTexParameterf)(GLenum, GLenum, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
80 void (GLAPIENTRY *mpglTexParameterfv)(GLenum, GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
81 void (GLAPIENTRY *mpglTexCoord2f)(GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
82 void (GLAPIENTRY *mpglVertex2f)(GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
83 void (GLAPIENTRY *mpglVertex3f)(GLfloat, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
84 void (GLAPIENTRY *mpglNormal3f)(GLfloat, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
85 void (GLAPIENTRY *mpglLightfv)(GLenum, GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
86 void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
87 void (GLAPIENTRY *mpglShadeModel)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
88 void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *);
35888
f464ea910bd2 Better compatibility with more restricted GL headers.
reimar
parents: 35102
diff changeset
89 static void (GLAPIENTRY *mpglGetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
90 void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
91
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
92 /**
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
93 * \defgroup glextfunctions OpenGL extension functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
94 *
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
95 * the pointers to these functions are acquired when the OpenGL
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
96 * context is created
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
97 * \{
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
98 */
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
99 void (GLAPIENTRY *mpglGenBuffers)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
100 void (GLAPIENTRY *mpglDeleteBuffers)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
101 void (GLAPIENTRY *mpglBindBuffer)(GLenum, GLuint);
36678
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
102 static GLvoid* (GLAPIENTRY *mpglMapBuffer)(GLenum, GLenum);
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
103 GLvoid* (GLAPIENTRY *mpglMapBufferRange)(GLenum, ptrdiff_t, ptrdiff_t, unsigned);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
104 GLboolean (GLAPIENTRY *mpglUnmapBuffer)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
105 void (GLAPIENTRY *mpglBufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
106 void (GLAPIENTRY *mpglCombinerParameterfv)(GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
107 void (GLAPIENTRY *mpglCombinerParameteri)(GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
108 void (GLAPIENTRY *mpglCombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
109 GLenum);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
110 void (GLAPIENTRY *mpglCombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
111 GLenum, GLenum, GLboolean, GLboolean,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
112 GLboolean);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
113 void (GLAPIENTRY *mpglBeginFragmentShader)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
114 void (GLAPIENTRY *mpglEndFragmentShader)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
115 void (GLAPIENTRY *mpglSampleMap)(GLuint, GLuint, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
116 void (GLAPIENTRY *mpglColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
117 GLuint, GLuint, GLuint, GLuint, GLuint);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
118 void (GLAPIENTRY *mpglColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
119 GLuint, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
120 GLuint, GLuint, GLuint);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
121 void (GLAPIENTRY *mpglSetFragmentShaderConstant)(GLuint, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
122 void (GLAPIENTRY *mpglActiveTexture)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
123 void (GLAPIENTRY *mpglBindTexture)(GLenum, GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
124 void (GLAPIENTRY *mpglMultiTexCoord2f)(GLenum, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
125 void (GLAPIENTRY *mpglGenPrograms)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
126 void (GLAPIENTRY *mpglDeletePrograms)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
127 void (GLAPIENTRY *mpglBindProgram)(GLenum, GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
128 void (GLAPIENTRY *mpglProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
129 void (GLAPIENTRY *mpglGetProgramiv)(GLenum, GLenum, GLint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
130 void (GLAPIENTRY *mpglProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
131 GLfloat, GLfloat);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
132 int (GLAPIENTRY *mpglSwapInterval)(int);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
133 void (GLAPIENTRY *mpglTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei,
18578
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
134 GLint, GLenum, GLenum, const GLvoid *);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
135 void* (GLAPIENTRY *mpglAllocateMemoryMESA)(void *, int, size_t, float, float, float);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
136 void (GLAPIENTRY *mpglFreeMemoryMESA)(void *, int, void *);
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
137 /** \} */ // end of glextfunctions group
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
138
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
139
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
140 void (GLAPIENTRY *mpglVertexPointer)(GLint, GLenum, GLsizei, const GLvoid *);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
141 void (GLAPIENTRY *mpglTexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
142 void (GLAPIENTRY *mpglClientActiveTexture)(GLenum);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
143 void (GLAPIENTRY *mpglEnableClientState)(GLenum);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
144 void (GLAPIENTRY *mpglDisableClientState)(GLenum);
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
145
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
146 void (GLAPIENTRY *mpglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
147 void (GLAPIENTRY *mpglEnableVertexAttribArray)(GLuint);
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
148 void (GLAPIENTRY *mpglDrawArrays)(GLenum, GLint, GLsizei);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
149
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
150 GLuint (GLAPIENTRY *mpglCreateProgram)(void);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
151 GLuint (GLAPIENTRY *mpglCreateShader)(GLenum);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
152 void (GLAPIENTRY *mpglShaderSource)(GLuint, GLsizei, const char **, const GLint *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
153 void (GLAPIENTRY *mpglCompileShader)(GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
154 void (GLAPIENTRY *mpglGetShaderiv)(GLuint, GLenum, GLint *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
155 void (GLAPIENTRY *mpglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, char *);
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
156 void (GLAPIENTRY *mpglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *);
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
157 void (GLAPIENTRY *mpglAttachShader)(GLuint, GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
158 void (GLAPIENTRY *mpglDetachShader)(GLuint, GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
159 void (GLAPIENTRY *mpglDeleteShader)(GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
160 void (GLAPIENTRY *mpglBindAttribLocation)(GLuint, GLuint, const char *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
161 void (GLAPIENTRY *mpglLinkProgram)(GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
162 void (GLAPIENTRY *mpglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, char *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
163 void (GLAPIENTRY *mpglUseProgram)(GLuint);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
164 GLint (GLAPIENTRY *mpglGetUniformLocation)(GLuint, const char *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
165 void (GLAPIENTRY *mpglUniform1iv)(GLint, GLsizei, const GLint *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
166 void (GLAPIENTRY *mpglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const float *);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
167
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
168 //! \defgroup glgeneral OpenGL general helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
169
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
170 //! \defgroup glcontext OpenGL context management helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
171
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
172 //! \defgroup gltexture OpenGL texture handling helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
173
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
174 //! \defgroup glconversion OpenGL conversion helper functions
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
175
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
176 static GLint hqtexfmt;
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
177 static int use_depth_l16;
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
178 static GLenum l16_format;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
179 static GLuint gpu_def_sl_program;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
180 static GLuint gpu_yuv_sl_program;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
181 static GLuint gpu_cur_sl_program;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
182 static float transform_matrix[16];
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
183
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
184 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
185 * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride.
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
186 * \param stride number of bytes per line for which alignment should fit.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
187 * \ingroup glgeneral
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
188 */
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
189 void glAdjustAlignment(int stride) {
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
190 GLint gl_alignment;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
191 if (stride % 8 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
192 gl_alignment=8;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
193 else if (stride % 4 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
194 gl_alignment=4;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
195 else if (stride % 2 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
196 gl_alignment=2;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
197 else
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
198 gl_alignment=1;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
199 mpglPixelStorei(GL_UNPACK_ALIGNMENT, gl_alignment);
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
200 }
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
201
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
202 struct gl_name_map_struct {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
203 GLint value;
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
204 const char *name;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
205 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
206
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
207 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
208 #define MAP(a) {a, #a}
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
209 //! mapping table for the glValName function
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
210 static const struct gl_name_map_struct gl_name_map[] = {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
211 // internal format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
212 MAP(GL_R3_G3_B2), MAP(GL_RGB4), MAP(GL_RGB5), MAP(GL_RGB8),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
213 MAP(GL_RGB10), MAP(GL_RGB12), MAP(GL_RGB16), MAP(GL_RGBA2),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
214 MAP(GL_RGBA4), MAP(GL_RGB5_A1), MAP(GL_RGBA8), MAP(GL_RGB10_A2),
33366
9b1c1b141f04 Request GL_LUMINANCE16 as internal format for > 8 bit YUV formats.
reimar
parents: 33365
diff changeset
215 MAP(GL_RGBA12), MAP(GL_RGBA16), MAP(GL_LUMINANCE8), MAP(GL_LUMINANCE16),
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
216
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
217 // format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
218 MAP(GL_RGB), MAP(GL_RGBA), MAP(GL_RED), MAP(GL_GREEN), MAP(GL_BLUE),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
219 MAP(GL_ALPHA), MAP(GL_LUMINANCE), MAP(GL_LUMINANCE_ALPHA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
220 MAP(GL_COLOR_INDEX),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
221 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
222 MAP(GL_BGR), MAP(GL_BGRA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
223
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
224 //type
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
225 MAP(GL_BYTE), MAP(GL_UNSIGNED_BYTE), MAP(GL_SHORT), MAP(GL_UNSIGNED_SHORT),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
226 MAP(GL_INT), MAP(GL_UNSIGNED_INT), MAP(GL_FLOAT), MAP(GL_DOUBLE),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
227 MAP(GL_2_BYTES), MAP(GL_3_BYTES), MAP(GL_4_BYTES),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
228 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
229 MAP(GL_UNSIGNED_BYTE_3_3_2), MAP(GL_UNSIGNED_BYTE_2_3_3_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
230 MAP(GL_UNSIGNED_SHORT_5_6_5), MAP(GL_UNSIGNED_SHORT_5_6_5_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
231 MAP(GL_UNSIGNED_SHORT_4_4_4_4), MAP(GL_UNSIGNED_SHORT_4_4_4_4_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
232 MAP(GL_UNSIGNED_SHORT_5_5_5_1), MAP(GL_UNSIGNED_SHORT_1_5_5_5_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
233 MAP(GL_UNSIGNED_INT_8_8_8_8), MAP(GL_UNSIGNED_INT_8_8_8_8_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
234 MAP(GL_UNSIGNED_INT_10_10_10_2), MAP(GL_UNSIGNED_INT_2_10_10_10_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
235 {0, 0}
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
236 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
237 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
238
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
239 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
240 * \brief return the name of an OpenGL constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
241 * \param value the constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
242 * \return name of the constant or "Unknown format!"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
243 * \ingroup glgeneral
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
244 */
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
245 const char *glValName(GLint value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
246 {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
247 int i = 0;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
248
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
249 while (gl_name_map[i].name) {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
250 if (gl_name_map[i].value == value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
251 return gl_name_map[i].name;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
252 i++;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
253 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
254 return "Unknown format!";
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
255 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
256
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
257 //! always return this format as internal texture format in glFindFormat
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
258 #define TEXTUREFORMAT_ALWAYS GL_RGB8
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
259 #undef TEXTUREFORMAT_ALWAYS
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
260
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
261 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
262 * \brief find the OpenGL settings coresponding to format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
263 *
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
264 * All parameters may be NULL.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
265 * \param fmt MPlayer format to analyze.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
266 * \param bpp [OUT] bits per pixel of that format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
267 * \param gl_texfmt [OUT] internal texture format that fits the
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
268 * image format, not necessarily the best for performance.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
269 * \param gl_format [OUT] OpenGL format for this image format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
270 * \param gl_type [OUT] OpenGL type for this image format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
271 * \return 1 if format is supported by OpenGL, 0 if not.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
272 * \ingroup gltexture
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
273 */
16879
6ea220b10e8e More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents: 16648
diff changeset
274 int glFindFormat(uint32_t fmt, int *bpp, GLint *gl_texfmt,
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
275 GLenum *gl_format, GLenum *gl_type)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
276 {
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
277 int supported = 1;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
278 int dummy1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
279 GLenum dummy2;
16303
a87c6cf3fe52 Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents: 16270
diff changeset
280 GLint dummy3;
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
281 if (!bpp) bpp = &dummy1;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
282 if (!gl_texfmt) gl_texfmt = &dummy3;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
283 if (!gl_format) gl_format = &dummy2;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
284 if (!gl_type) gl_type = &dummy2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
285
33365
706871635af7 Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents: 32537
diff changeset
286 if (mp_get_chroma_shift(fmt, NULL, NULL, NULL)) {
30110
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
287 // reduce the possible cases a bit
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
288 if (IMGFMT_IS_YUVP16_LE(fmt))
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
289 fmt = IMGFMT_420P16_LE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
290 else if (IMGFMT_IS_YUVP16_BE(fmt))
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
291 fmt = IMGFMT_420P16_BE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
292 else
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
293 fmt = IMGFMT_YV12;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
294 }
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
295
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
296 *bpp = IMGFMT_IS_BGR(fmt)?IMGFMT_BGR_DEPTH(fmt):IMGFMT_RGB_DEPTH(fmt);
36109
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
297 if (IMGFMT_IS_XYZ(fmt)) {
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
298 supported = 0; // no native XYZ support
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
299 *bpp = 24;
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
300 fmt = IMGFMT_RGB24;
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
301 if (IMGFMT_XYZ_DEPTH(fmt) > 8) {
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
302 *bpp = 48;
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
303 fmt = IMGFMT_RGB48NE;
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
304 }
4b69c31e8e77 Support determining texture format for XYZ format.
reimar
parents: 36105
diff changeset
305 }
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
306 *gl_texfmt = GL_RGB;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
307 switch (fmt) {
34572
2a372b469420 Support displaying 64bit RGB via OpenGL.
cehoyos
parents: 34478
diff changeset
308 case IMGFMT_RGB64NE:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
309 *gl_texfmt = GL_RGBA16;
29902
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
310 case IMGFMT_RGB48NE:
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
311 *gl_format = GL_RGB;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
312 *gl_type = GL_UNSIGNED_SHORT;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
313 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
314 case IMGFMT_RGB24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
315 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
316 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
317 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
318 case IMGFMT_RGBA:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
319 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
320 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
321 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
322 break;
30110
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
323 case IMGFMT_420P16:
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
324 supported = 0; // no native YUV support
33366
9b1c1b141f04 Request GL_LUMINANCE16 as internal format for > 8 bit YUV formats.
reimar
parents: 33365
diff changeset
325 *gl_texfmt = GL_LUMINANCE16;
30110
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
326 *bpp = 16;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
327 *gl_format = GL_LUMINANCE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
328 *gl_type = GL_UNSIGNED_SHORT;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
329 break;
36170
4fc911fa5366 Add NV12/NV21 support to some helper functions.
reimar
parents: 36157
diff changeset
330 case IMGFMT_NV12:
4fc911fa5366 Add NV12/NV21 support to some helper functions.
reimar
parents: 36157
diff changeset
331 case IMGFMT_NV21:
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
332 case IMGFMT_YV12:
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
333 supported = 0; // no native YV12 support
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
334 case IMGFMT_Y800:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
335 case IMGFMT_Y8:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
336 *gl_texfmt = GL_LUMINANCE;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
337 *bpp = 8;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
338 *gl_format = GL_LUMINANCE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
339 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
340 break;
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
341 case IMGFMT_YUY2:
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
342 case IMGFMT_UYVY:
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
343 *gl_texfmt = GL_RGB;
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
344 *bpp = 16;
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
345 *gl_format = GL_YCBCR_422_APPLE;
35102
d0909b13984f gl_common: fix wrong gl_type for uyvy and yuy2 in little endian
cehoyos
parents: 35096
diff changeset
346 #if HAVE_BIGENDIAN
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
347 *gl_type = fmt == IMGFMT_YUY2 ? GL_UNSIGNED_SHORT_8_8 : GL_UNSIGNED_SHORT_8_8_REV;
35102
d0909b13984f gl_common: fix wrong gl_type for uyvy and yuy2 in little endian
cehoyos
parents: 35096
diff changeset
348 #else
d0909b13984f gl_common: fix wrong gl_type for uyvy and yuy2 in little endian
cehoyos
parents: 35096
diff changeset
349 *gl_type = fmt == IMGFMT_UYVY ? GL_UNSIGNED_SHORT_8_8 : GL_UNSIGNED_SHORT_8_8_REV;
d0909b13984f gl_common: fix wrong gl_type for uyvy and yuy2 in little endian
cehoyos
parents: 35096
diff changeset
350 #endif
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
351 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
352 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
353 // we do not support palettized formats, although the format the
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
354 // swscale produces works
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
355 case IMGFMT_RGB8:
33919
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
356 *gl_format = GL_RGB;
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
357 *gl_type = GL_UNSIGNED_BYTE_2_3_3_REV;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
358 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
359 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
360 case IMGFMT_RGB15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
361 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
362 *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
363 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
364 case IMGFMT_RGB16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
365 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
366 *gl_type = GL_UNSIGNED_SHORT_5_6_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
367 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
368 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
369 case IMGFMT_BGR8:
33918
294df8d5648d Fix spelling.
reimar
parents: 33882
diff changeset
370 // special case as red and blue have a different number of bits.
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
371 // GL_BGR and GL_UNSIGNED_BYTE_3_3_2 isn't supported at least
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
372 // by nVidia drivers, and in addition would give more bits to
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
373 // blue than to red, which isn't wanted
33919
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
374 *gl_format = GL_RGB;
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
375 *gl_type = GL_UNSIGNED_BYTE_3_3_2;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
376 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
377 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
378 case IMGFMT_BGR15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
379 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
380 *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
381 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
382 case IMGFMT_BGR16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
383 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
384 *gl_type = GL_UNSIGNED_SHORT_5_6_5;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
385 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
386 case IMGFMT_BGR24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
387 *gl_format = GL_BGR;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
388 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
389 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
390 case IMGFMT_BGRA:
35010
4f99cedb5141 Hack to make BGRA work both in GL and GLES.
reimar
parents: 35009
diff changeset
391 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
392 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
393 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
394 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
395 default:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
396 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
397 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
398 *gl_type = GL_UNSIGNED_BYTE;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
399 supported = 0;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
400 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
401 #ifdef TEXTUREFORMAT_ALWAYS
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
402 *gl_texfmt = TEXTUREFORMAT_ALWAYS;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
403 #endif
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
404 return supported;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
405 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
406
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
407 #ifdef HAVE_LIBDL
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
408 #include <dlfcn.h>
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
409 #endif
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
410 /**
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
411 * \brief find address of a linked function
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
412 * \param s name of function to find
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
413 * \return address of function or NULL if not found
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
414 */
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
415 static void *getdladdr(const char *s) {
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
416 void *ret = NULL;
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
417 #ifdef HAVE_LIBDL
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
418 void *handle = dlopen(NULL, RTLD_LAZY);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
419 if (!handle)
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
420 return NULL;
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
421 ret = dlsym(handle, s);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
422 dlclose(handle);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
423 #endif
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
424 return ret;
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
425 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
426
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
427 typedef struct {
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
428 void *funcptr;
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
429 const char *extstr;
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
430 const char *funcnames[7];
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
431 void *fallback;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
432 } extfunc_desc_t;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
433
36121
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
434 #define SIMPLE_FUNC_DESC(name) {&mpgl##name, NULL, {"gl"#name, NULL}, NULL}
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
435 #if !defined(CONFIG_GL_WIN32) && !defined(CONFIG_GL_X11)
36121
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
436 #define DEF_FUNC_DESC(name) SIMPLE_FUNC_DESC(name)
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
437 #else
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
438 #define DEF_FUNC_DESC(name) {&mpgl##name, NULL, {"gl"#name, NULL}, gl ##name}
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
439 #endif
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
440 static const extfunc_desc_t extfuncs[] = {
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
441 // these aren't extension functions but we query them anyway to allow
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
442 // different "backends" with one binary
34841
4e749c1bbf49 Make a glGetError function pointer available.
reimar
parents: 34748
diff changeset
443 DEF_FUNC_DESC(GetError),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
444 DEF_FUNC_DESC(Begin),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
445 DEF_FUNC_DESC(End),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
446 DEF_FUNC_DESC(Viewport),
34337
f8c523d09e5e Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents: 34174
diff changeset
447 DEF_FUNC_DESC(LoadMatrixf),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
448 DEF_FUNC_DESC(Clear),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
449 DEF_FUNC_DESC(GenLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
450 DEF_FUNC_DESC(DeleteLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
451 DEF_FUNC_DESC(NewList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
452 DEF_FUNC_DESC(EndList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
453 DEF_FUNC_DESC(CallList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
454 DEF_FUNC_DESC(CallLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
455 DEF_FUNC_DESC(GenTextures),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
456 DEF_FUNC_DESC(DeleteTextures),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
457 DEF_FUNC_DESC(TexEnvi),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
458 DEF_FUNC_DESC(Color4ub),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
459 DEF_FUNC_DESC(ClearColor),
35890
3be8afb83629 Switch back to glClearDepth.
reimar
parents: 35889
diff changeset
460 DEF_FUNC_DESC(ClearDepth),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
461 DEF_FUNC_DESC(DepthFunc),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
462 DEF_FUNC_DESC(Enable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
463 DEF_FUNC_DESC(Disable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
464 DEF_FUNC_DESC(DrawBuffer),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
465 DEF_FUNC_DESC(DepthMask),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
466 DEF_FUNC_DESC(BlendFunc),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
467 DEF_FUNC_DESC(Flush),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
468 DEF_FUNC_DESC(Finish),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
469 DEF_FUNC_DESC(PixelStorei),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
470 DEF_FUNC_DESC(TexImage1D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
471 DEF_FUNC_DESC(TexImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
472 DEF_FUNC_DESC(TexSubImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
473 DEF_FUNC_DESC(TexParameteri),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
474 DEF_FUNC_DESC(TexParameterf),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
475 DEF_FUNC_DESC(TexParameterfv),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
476 DEF_FUNC_DESC(TexCoord2f),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
477 DEF_FUNC_DESC(Vertex2f),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
478 DEF_FUNC_DESC(Vertex3f),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
479 DEF_FUNC_DESC(Normal3f),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
480 DEF_FUNC_DESC(Lightfv),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
481 DEF_FUNC_DESC(ColorMaterial),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
482 DEF_FUNC_DESC(ShadeModel),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
483 DEF_FUNC_DESC(GetIntegerv),
35888
f464ea910bd2 Better compatibility with more restricted GL headers.
reimar
parents: 35102
diff changeset
484 DEF_FUNC_DESC(GetTexLevelParameteriv),
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
485 DEF_FUNC_DESC(ColorMask),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
486
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
487 // here start the real extensions
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
488 {&mpglGenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
489 {&mpglDeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
490 {&mpglBindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
491 {&mpglMapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}},
36678
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
492 {&mpglMapBufferRange, NULL, {"glMapBufferRange", "glMapBufferRangeARB", NULL}},
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
493 {&mpglUnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
494 {&mpglBufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
495 {&mpglCombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
496 {&mpglCombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
497 {&mpglCombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
498 {&mpglCombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
499 {&mpglBeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
500 {&mpglEndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
501 {&mpglSampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
502 {&mpglColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
503 {&mpglColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
504 {&mpglSetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
505 {&mpglActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
506 {&mpglBindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
507 {&mpglMultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
508 {&mpglGenPrograms, "_program", {"glGenProgramsARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
509 {&mpglDeletePrograms, "_program", {"glDeleteProgramsARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
510 {&mpglBindProgram, "_program", {"glBindProgramARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
511 {&mpglProgramString, "_program", {"glProgramStringARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
512 {&mpglGetProgramiv, "_program", {"glGetProgramivARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
513 {&mpglProgramEnvParameter4f, "_program", {"glProgramEnvParameter4fARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
514 {&mpglSwapInterval, "_swap_control", {"glXSwapIntervalSGI", "glXSwapInterval", "wglSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
515 {&mpglTexImage3D, NULL, {"glTexImage3D", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
516 {&mpglAllocateMemoryMESA, "GLX_MESA_allocate_memory", {"glXAllocateMemoryMESA", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
517 {&mpglFreeMemoryMESA, "GLX_MESA_allocate_memory", {"glXFreeMemoryMESA", NULL}},
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
518
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
519 // Things needed to run on GLES
36121
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
520 SIMPLE_FUNC_DESC(VertexPointer),
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
521 SIMPLE_FUNC_DESC(TexCoordPointer),
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
522 SIMPLE_FUNC_DESC(ClientActiveTexture),
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
523 SIMPLE_FUNC_DESC(EnableClientState),
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
524 SIMPLE_FUNC_DESC(DisableClientState),
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
525
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
526 SIMPLE_FUNC_DESC(VertexAttribPointer),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
527 SIMPLE_FUNC_DESC(EnableVertexAttribArray),
36121
60f5fa453719 Minor simplification.
reimar
parents: 36114
diff changeset
528 SIMPLE_FUNC_DESC(DrawArrays),
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
529
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
530
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
531 SIMPLE_FUNC_DESC(CreateProgram),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
532 SIMPLE_FUNC_DESC(CreateShader),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
533 SIMPLE_FUNC_DESC(ShaderSource),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
534 SIMPLE_FUNC_DESC(CompileShader),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
535 SIMPLE_FUNC_DESC(GetShaderiv),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
536 SIMPLE_FUNC_DESC(GetShaderInfoLog),
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
537 SIMPLE_FUNC_DESC(GetAttachedShaders),
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
538 SIMPLE_FUNC_DESC(AttachShader),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
539 SIMPLE_FUNC_DESC(DetachShader),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
540 SIMPLE_FUNC_DESC(DeleteShader),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
541 SIMPLE_FUNC_DESC(BindAttribLocation),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
542 SIMPLE_FUNC_DESC(LinkProgram),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
543 SIMPLE_FUNC_DESC(GetProgramiv),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
544 SIMPLE_FUNC_DESC(GetProgramInfoLog),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
545 SIMPLE_FUNC_DESC(UseProgram),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
546 SIMPLE_FUNC_DESC(GetUniformLocation),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
547 SIMPLE_FUNC_DESC(Uniform1iv),
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
548 SIMPLE_FUNC_DESC(UniformMatrix4fv),
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
549 {NULL}
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
550 };
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
551
36678
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
552 static GLvoid *wrap_glMapBuffer(GLenum target, ptrdiff_t offset, ptrdiff_t range, unsigned flags) {
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
553 GLenum access = GL_READ_WRITE;
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
554 if (offset != 0 || range == 0 || !(flags & (GL_MAP_WRITE_BIT | GL_MAP_READ_BIT)))
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
555 return NULL;
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
556 if (!(flags & GL_MAP_WRITE_BIT))
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
557 access = GL_READ_ONLY;
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
558 else if (!(flags & GL_MAP_READ_BIT))
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
559 access = GL_WRITE_ONLY;
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
560 return mpglMapBuffer(target, access);
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
561 }
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
562
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
563 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
564 * \brief find the function pointers of some useful OpenGL extensions
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
565 * \param getProcAddress function to resolve function names, may be NULL
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
566 * \param ext2 an extra extension string
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
567 */
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
568 static void getFunctions(void *(*getProcAddress)(const GLubyte *),
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
569 const char *ext2) {
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
570 const extfunc_desc_t *dsc;
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
571 const char *extensions = NULL;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
572 char *allexts;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
573
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
574 if (!getProcAddress)
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
575 getProcAddress = (void *)getdladdr;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
576
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
577 // special case, we need glGetString before starting to find the other functions
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
578 mpglGetString = getProcAddress("glGetString");
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
579 #if defined(CONFIG_GL_WIN32) || defined(CONFIG_GL_X11)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
580 if (!mpglGetString)
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
581 mpglGetString = glGetString;
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
582 #endif
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
583
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
584 if (mpglGetString)
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
585 extensions = (const char *)mpglGetString(GL_EXTENSIONS);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
586 if (!extensions) extensions = "";
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
587 if (!ext2) ext2 = "";
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18787
diff changeset
588 allexts = malloc(strlen(extensions) + strlen(ext2) + 2);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
589 strcpy(allexts, extensions);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
590 strcat(allexts, " ");
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
591 strcat(allexts, ext2);
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
592 mp_msg(MSGT_VO, MSGL_DBG2, "OpenGL extensions string:\n%s\n", allexts);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
593 for (dsc = extfuncs; dsc->funcptr; dsc++) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
594 void *ptr = NULL;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
595 int i;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
596 if (!dsc->extstr || strstr(allexts, dsc->extstr)) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
597 for (i = 0; !ptr && dsc->funcnames[i]; i++)
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
598 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
599 }
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
600 if (!ptr)
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
601 ptr = dsc->fallback;
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
602 *(void **)dsc->funcptr = ptr;
16984
94b70ab52695 disable *SwapInterval function when extensions are missing, since it
reimar
parents: 16944
diff changeset
603 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
604 if (strstr(allexts, "_texture_float"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
605 hqtexfmt = GL_RGB32F;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
606 else if (strstr(allexts, "NV_float_buffer"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
607 hqtexfmt = GL_FLOAT_RGB32_NV;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
608 else
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
609 hqtexfmt = GL_RGB16;
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
610 use_depth_l16 = !!strstr(allexts, "GL_EXT_shadow") ||
36178
927dedf22dde Support 16-bit YUV on OpenGL ES.
reimar
parents: 36170
diff changeset
611 !!strstr(allexts, "GL_ARB_shadow") ||
927dedf22dde Support 16-bit YUV on OpenGL ES.
reimar
parents: 36170
diff changeset
612 !!strstr(allexts, "GL_OES_depth_texture");
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
613 free(allexts);
36678
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
614
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
615 // replacement functions
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
616 if (!mpglMapBufferRange && mpglMapBuffer)
61a9df2e25d0 Use glMapBufferRange by default.
reimar
parents: 36240
diff changeset
617 mpglMapBufferRange = wrap_glMapBuffer;
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
618 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
619
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
620 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
621 * \brief create a texture and set some defaults
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
622 * \param target texture taget, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
623 * \param fmt internal texture format
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
624 * \param format texture host data format
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
625 * \param type texture host data type
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
626 * \param filter filter used for scaling, e.g. GL_LINEAR
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
627 * \param w texture width
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
628 * \param h texture height
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
629 * \param val luminance value to fill texture with
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
630 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
631 */
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
632 void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLint filter,
16460
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
633 int w, int h, unsigned char val) {
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
634 GLfloat fval = (GLfloat)val / 255.0;
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
635 GLfloat border[4] = {fval, fval, fval, fval};
31086
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
636 int stride;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
637 char *init;
31086
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
638 if (w == 0) w = 1;
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
639 if (h == 0) h = 1;
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
640 stride = w * glFmt2bpp(format, type);
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
641 if (!stride) return;
35010
4f99cedb5141 Hack to make BGRA work both in GL and GLES.
reimar
parents: 35009
diff changeset
642 // For BGRA internal format must be BGRA for GLES and RGBA for GL...
4f99cedb5141 Hack to make BGRA work both in GL and GLES.
reimar
parents: 35009
diff changeset
643 if (format == GL_BGRA && !mpglBegin) fmt = GL_BGRA;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
644 init = malloc(stride * h);
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
645 memset(init, val, stride * h);
27622
524f6a87cd23 Fix glAdjustAlignment parameter in glCreateClearTex
reimar
parents: 27621
diff changeset
646 glAdjustAlignment(stride);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
647 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, w);
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
648 // This needs to be here before the very first TexImage call to get
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
649 // best performance on PPC Mac Mini running OSX 10.5
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
650 mpglTexParameteri(target, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
651 mpglTexImage2D(target, 0, fmt, w, h, 0, format, type, init);
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
652 if (format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT) {
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
653 // ensure we get enough bits
34973
7a51bcd28fd1 Query correct component to get luminance texture bit depth
reimar
parents: 34972
diff changeset
654 GLint bits = 0;
36209
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
655 if (mpglGetTexLevelParameteriv)
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
656 mpglGetTexLevelParameteriv(target, 0, GL_TEXTURE_LUMINANCE_SIZE, &bits);
36178
927dedf22dde Support 16-bit YUV on OpenGL ES.
reimar
parents: 36170
diff changeset
657 if (bits >= 0 && bits < 14 && (use_depth_l16 || HAVE_BIGENDIAN)) {
927dedf22dde Support 16-bit YUV on OpenGL ES.
reimar
parents: 36170
diff changeset
658 fmt = GL_DEPTH_COMPONENT;
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
659 format = GL_DEPTH_COMPONENT;
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
660 if (!use_depth_l16) {
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
661 // if we cannot get 16 bit anyway, we can fall back
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
662 // to L8A8 on big-endian, which is at least faster...
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
663 fmt = format = GL_LUMINANCE_ALPHA;
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
664 type = GL_UNSIGNED_BYTE;
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
665 }
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
666 mpglTexImage2D(target, 0, fmt, w, h, 0, format, type, init);
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
667 }
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
668 l16_format = format;
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
669 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
670 mpglTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
671 mpglTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
672 mpglTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
673 mpglTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
674 mpglTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
34969
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
675 if (format == GL_DEPTH_COMPONENT) {
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
676 mpglTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE);
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
677 mpglTexParameteri(target, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
678 }
16461
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
679 // Border texels should not be used with CLAMP_TO_EDGE
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
680 // We set a sane default anyway.
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
681 mpglTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
682 free(init);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
683 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
684
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
685 /**
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
686 * \brief creates a texture from a PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
687 * \param target texture taget, usually GL_TEXTURE_2D
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
688 * \param fmt internal texture format, 0 for default
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
689 * \param filter filter used for scaling, e.g. GL_LINEAR
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
690 * \param f file to read PPM from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
691 * \param width [out] width of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
692 * \param height [out] height of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
693 * \param maxval [out] maxval value from PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
694 * \return 0 on error, 1 otherwise
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
695 * \ingroup gltexture
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
696 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
697 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
698 FILE *f, int *width, int *height, int *maxval) {
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
699 int w, h, m, bpp;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
700 GLenum type;
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
701 uint8_t *data = read_pnm(f, &w, &h, &bpp, &m);
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
702 if (!data || (bpp != 3 && bpp != 6)) {
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
703 free(data);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
704 return 0;
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
705 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
706 if (!fmt) {
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
707 fmt = bpp == 6 ? hqtexfmt : 3;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
708 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
709 fmt = GL_RGB16;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
710 }
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
711 type = bpp == 6 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
712 glCreateClearTex(target, fmt, GL_RGB, type, filter, w, h, 0);
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
713 glUploadTex(target, GL_RGB, type,
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
714 data, w * bpp, 0, 0, w, h, 0);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
715 free(data);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
716 if (width) *width = w;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
717 if (height) *height = h;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
718 if (maxval) *maxval = m;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
719 return 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
720 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
721
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
722 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
723 * \brief return the number of bytes per pixel for the given format
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
724 * \param format OpenGL format
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
725 * \param type OpenGL type
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
726 * \return bytes per pixel
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
727 * \ingroup glgeneral
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
728 *
16435
b5ca0e5760d0 Fix a typo in a comment
reimar
parents: 16303
diff changeset
729 * Does not handle all possible variants, just those used by MPlayer
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
730 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
731 int glFmt2bpp(GLenum format, GLenum type) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
732 int component_size = 0;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
733 switch (type) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
734 case GL_UNSIGNED_BYTE_3_3_2:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
735 case GL_UNSIGNED_BYTE_2_3_3_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
736 return 1;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
737 case GL_UNSIGNED_SHORT_5_5_5_1:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
738 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
739 case GL_UNSIGNED_SHORT_5_6_5:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
740 case GL_UNSIGNED_SHORT_5_6_5_REV:
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
741 case GL_UNSIGNED_SHORT_8_8:
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
742 case GL_UNSIGNED_SHORT_8_8_REV:
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
743 return 2;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
744 case GL_UNSIGNED_BYTE:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
745 component_size = 1;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
746 break;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
747 case GL_UNSIGNED_SHORT:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
748 component_size = 2;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
749 break;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
750 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
751 switch (format) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
752 case GL_LUMINANCE:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
753 case GL_ALPHA:
34969
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
754 case GL_DEPTH_COMPONENT:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
755 return component_size;
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
756 case GL_LUMINANCE_ALPHA:
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
757 return 2 * component_size;
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
758 case GL_YCBCR_422_APPLE:
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
759 case GL_YCBCR_MESA:
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
760 return 2;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
761 case GL_RGB:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
762 case GL_BGR:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
763 return 3 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
764 case GL_RGBA:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
765 case GL_BGRA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
766 return 4 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
767 }
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
768 return 0; // unknown
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
769 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
770
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
771 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
772 * \brief upload a texture, handling things like stride and slices
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
773 * \param target texture target, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
774 * \param format OpenGL format of data
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
775 * \param type OpenGL type of data
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
776 * \param dataptr data to upload
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
777 * \param stride data stride
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
778 * \param x x offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
779 * \param y y offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
780 * \param w width of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
781 * \param h height of the texture part to upload
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
782 * \param slice height of an upload slice, 0 for all at once, -1 forces use of
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
783 * TexImage instead of TexSubImage
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
784 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
785 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
786 void glUploadTex(GLenum target, GLenum format, GLenum type,
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
787 const void *dataptr, int stride,
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
788 int x, int y, int w, int h, int slice) {
36128
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
789 int bpp;
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
790 const uint8_t *data = dataptr;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
791 int y_max = y + h;
16223
f540609340ac extra check for glUploadTex to avoid a possible hang.
reimar
parents: 16221
diff changeset
792 if (w <= 0 || h <= 0) return;
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
793 if (slice == 0)
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
794 slice = h;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
795 if (stride < 0) {
18988
a61ef37d3c71 Fix off-by-one error for negative strides (flipped image)
reimar
parents: 18961
diff changeset
796 data += (h - 1) * stride;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
797 stride = -stride;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
798 }
34978
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
799 if (format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT) {
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
800 format = l16_format;
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
801 if (l16_format == GL_LUMINANCE_ALPHA) type = GL_UNSIGNED_BYTE;
b8565c1d7db3 Use depth textures only if available (MESA + r200 crash otherwise)
reimar
parents: 34973
diff changeset
802 }
36128
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
803 bpp = glFmt2bpp(format, type);
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
804 if (!mpglBegin) {
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
805 // we have to copy line-by-line for GLES
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
806 if (stride != w*bpp) slice = 1;
e51b909bdd8e Add hack to support strides with GLES.
reimar
parents: 36127
diff changeset
807 }
36213
d05b680f78d6 Set GL_UNPACK_ROW_LENGTH even for GLES.
reimar
parents: 36212
diff changeset
808 // this is not always correct, but should work for MPlayer
d05b680f78d6 Set GL_UNPACK_ROW_LENGTH even for GLES.
reimar
parents: 36212
diff changeset
809 glAdjustAlignment(stride);
d05b680f78d6 Set GL_UNPACK_ROW_LENGTH even for GLES.
reimar
parents: 36212
diff changeset
810 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, stride / bpp);
35005
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
811 if (slice < 0) {
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
812 mpglPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
813 mpglTexImage2D(target, 0, GL_RGB, w, h, 0, format, type, data);
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
814 mpglPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
815 return;
b1a1dcae9760 Replace MESA YCBCR support by the Apple variant.
reimar
parents: 34983
diff changeset
816 }
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
817 for (; y + slice <= y_max; y += slice) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
818 mpglTexSubImage2D(target, 0, x, y, w, slice, format, type, data);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
819 data += stride * slice;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
820 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
821 if (y < y_max)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
822 mpglTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
823 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
824
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
825 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
826 float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
827 int i;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
828 ucoef[0] = 0 * uvcos + 1.403 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
829 vcoef[0] = 0 * uvsin + 1.403 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
830 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
831 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
832 ucoef[2] = 1.770 * uvcos + 0 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
833 vcoef[2] = 1.770 * uvsin + 0 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
834 ucoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
835 vcoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
836 // Coefficients (probably) must be in [0, 1] range, whereas they originally
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
837 // are in [-2, 2] range, so here comes the trick:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
838 // First put them in the [-0.5, 0.5] range, then add 0.5.
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
839 // This can be undone with the HALF_BIAS and SCALE_BY_FOUR arguments
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
840 // for CombinerInput and CombinerOutput (or the respective ATI variants)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
841 for (i = 0; i < 4; i++) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
842 ucoef[i] = ucoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
843 vcoef[i] = vcoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
844 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
845 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
846
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
847 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
848 * \brief Setup register combiners for YUV to RGB conversion.
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
849 * \param uvcos used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
850 * \param uvsin used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
851 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
852 static void glSetupYUVCombiners(float uvcos, float uvsin) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
853 GLfloat ucoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
854 GLfloat vcoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
855 GLint i;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
856 if (!mpglCombinerInput || !mpglCombinerOutput ||
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
857 !mpglCombinerParameterfv || !mpglCombinerParameteri) {
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
858 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner functions missing!\n");
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
859 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
860 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
861 mpglGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
862 if (i < 2)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
863 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
864 "[gl] 2 general combiners needed for YUV combiner support (found %i)\n", i);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
865 mpglGetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
866 if (i < 3)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
867 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
868 "[gl] 3 texture units needed for YUV combiner support (found %i)\n", i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
869 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
870 mpglCombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
871 mpglCombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
872
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
873 // UV first, like this green component cannot overflow
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
874 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
875 GL_TEXTURE1, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
876 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
877 GL_CONSTANT_COLOR0_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
878 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
879 GL_TEXTURE2, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
880 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
881 GL_CONSTANT_COLOR1_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
882 mpglCombinerOutput(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
883 GL_SPARE0_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
884 GL_FALSE, GL_FALSE);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
885
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
886 // stage 2
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
887 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_SPARE0_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
888 GL_SIGNED_IDENTITY_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
889 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_ZERO,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
890 GL_UNSIGNED_INVERT_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
891 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
892 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
893 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
894 GL_UNSIGNED_INVERT_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
895 mpglCombinerOutput(GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
896 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
897 GL_FALSE, GL_FALSE);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
898
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
899 // leave final combiner stage in default mode
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
900 mpglCombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
901 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
902
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
903 /**
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
904 * \brief Setup ATI version of register combiners for YUV to RGB conversion.
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
905 * \param csp_params parameters used for colorspace conversion
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
906 * \param text if set use the GL_ATI_text_fragment_shader API as
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
907 * used on OS X.
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
908 */
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
909 static void glSetupYUVFragmentATI(struct mp_csp_params *csp_params,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
910 int text) {
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
911 GLint i;
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
912 float yuv2rgb[3][4];
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
913
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
914 mpglGetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
915 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
916 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
917 "[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
918
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
919 mp_get_yuv2rgb_coeffs(csp_params, yuv2rgb);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
920 for (i = 0; i < 3; i++) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
921 int j;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
922 yuv2rgb[i][3] -= -0.5 * (yuv2rgb[i][1] + yuv2rgb[i][2]);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
923 for (j = 0; j < 4; j++) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
924 yuv2rgb[i][j] *= 0.125;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
925 yuv2rgb[i][j] += 0.5;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
926 if (yuv2rgb[i][j] > 1)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
927 yuv2rgb[i][j] = 1;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
928 if (yuv2rgb[i][j] < 0)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
929 yuv2rgb[i][j] = 0;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
930 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
931 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
932 if (text == 0) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
933 GLfloat c0[4] = {yuv2rgb[0][0], yuv2rgb[1][0], yuv2rgb[2][0]};
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
934 GLfloat c1[4] = {yuv2rgb[0][1], yuv2rgb[1][1], yuv2rgb[2][1]};
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
935 GLfloat c2[4] = {yuv2rgb[0][2], yuv2rgb[1][2], yuv2rgb[2][2]};
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
936 GLfloat c3[4] = {yuv2rgb[0][3], yuv2rgb[1][3], yuv2rgb[2][3]};
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
937 if (!mpglBeginFragmentShader || !mpglEndFragmentShader ||
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
938 !mpglSetFragmentShaderConstant || !mpglSampleMap ||
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
939 !mpglColorFragmentOp2 || !mpglColorFragmentOp3) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
940 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner (ATI) functions missing!\n");
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
941 return;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
942 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
943 mpglGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
944 if (i < 3)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
945 mp_msg(MSGT_VO, MSGL_ERR,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
946 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
947 mpglBeginFragmentShader();
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
948 mpglSetFragmentShaderConstant(GL_CON_0_ATI, c0);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
949 mpglSetFragmentShaderConstant(GL_CON_1_ATI, c1);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
950 mpglSetFragmentShaderConstant(GL_CON_2_ATI, c2);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
951 mpglSetFragmentShaderConstant(GL_CON_3_ATI, c3);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
952 mpglSampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
953 mpglSampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
954 mpglSampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
955 mpglColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
956 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
957 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
958 mpglColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_NONE,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
959 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
960 GL_CON_2_ATI, GL_NONE, GL_BIAS_BIT_ATI,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
961 GL_REG_1_ATI, GL_NONE, GL_NONE);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
962 mpglColorFragmentOp3(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
963 GL_REG_0_ATI, GL_NONE, GL_NONE,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
964 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
965 GL_REG_2_ATI, GL_NONE, GL_NONE);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
966 mpglColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_8X_BIT_ATI,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
967 GL_REG_0_ATI, GL_NONE, GL_NONE,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
968 GL_CON_3_ATI, GL_NONE, GL_BIAS_BIT_ATI);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
969 mpglEndFragmentShader();
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
970 } else {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
971 static const char template[] =
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
972 "!!ATIfs1.0\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
973 "StartConstants;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
974 " CONSTANT c0 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
975 " CONSTANT c1 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
976 " CONSTANT c2 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
977 " CONSTANT c3 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
978 "EndConstants;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
979 "StartOutputPass;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
980 " SampleMap r0, t0.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
981 " SampleMap r1, t1.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
982 " SampleMap r2, t2.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
983 " MUL r1.rgb, r1.bias, c1.bias;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
984 " MAD r2.rgb, r2.bias, c2.bias, r1;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
985 " MAD r0.rgb, r0, c0.bias, r2;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
986 " ADD r0.rgb.8x, r0, c3.bias;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
987 "EndPass;\n";
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
988 char buffer[512];
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
989 snprintf(buffer, sizeof(buffer), template,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
990 yuv2rgb[0][0], yuv2rgb[1][0], yuv2rgb[2][0],
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
991 yuv2rgb[0][1], yuv2rgb[1][1], yuv2rgb[2][1],
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
992 yuv2rgb[0][2], yuv2rgb[1][2], yuv2rgb[2][2],
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
993 yuv2rgb[0][3], yuv2rgb[1][3], yuv2rgb[2][3]);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
994 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] generated fragment program:\n%s\n", buffer);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
995 loadGPUProgram(GL_TEXT_FRAGMENT_SHADER_ATI, buffer);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
996 }
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
997 }
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
998
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
999 /**
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1000 * \brief helper function for gen_spline_lookup_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1001 * \param x subpixel-position ((0,1) range) to calculate weights for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1002 * \param dst where to store transformed weights, must provide space for 4 GLfloats
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1003 *
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1004 * calculates the weights and stores them after appropriate transformation
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1005 * for the scaler fragment program.
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1006 */
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1007 static void store_weights(float x, GLfloat *dst) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1008 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1009 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1010 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1011 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1012 *dst++ = 1 + x - w1 / (w0 + w1);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1013 *dst++ = 1 - x + w3 / (w2 + w3);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1014 *dst++ = w0 + w1;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1015 *dst++ = 0;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1016 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1017
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1018 //! to avoid artefacts this should be rather large
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
1019 #define LOOKUP_BSPLINE_RES (2 * 1024)
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1020 /**
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1021 * \brief creates the 1D lookup texture needed for fast higher-order filtering
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1022 * \param unit texture unit to attach texture to
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1023 */
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1024 static void gen_spline_lookup_tex(GLenum unit) {
29896
ac3e6e27f2c7 Use calloc to allocate a rather large (currently 32k) array instead of
reimar
parents: 29679
diff changeset
1025 GLfloat *tex = calloc(4 * LOOKUP_BSPLINE_RES, sizeof(*tex));
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
1026 GLfloat *tp = tex;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1027 int i;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1028 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1029 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1030 store_weights(x, tp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1031 tp += 4;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1032 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1033 store_weights(0, tex);
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
1034 store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1035 mpglActiveTexture(unit);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1036 mpglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1037 mpglTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1038 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1039 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1040 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1041 mpglActiveTexture(GL_TEXTURE0);
29896
ac3e6e27f2c7 Use calloc to allocate a rather large (currently 32k) array instead of
reimar
parents: 29679
diff changeset
1042 free(tex);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1043 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1044
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1045 #define NOISE_RES 2048
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1046
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1047 /**
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1048 * \brief creates the 1D lookup texture needed to generate pseudo-random numbers.
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1049 * \param unit texture unit to attach texture to
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1050 */
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1051 static void gen_noise_lookup_tex(GLenum unit) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1052 GLfloat *tex = calloc(NOISE_RES, sizeof(*tex));
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1053 uint32_t lcg = 0x79381c11;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1054 int i;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1055 for (i = 0; i < NOISE_RES; i++)
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1056 tex[i] = (double)i / (NOISE_RES - 1);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1057 for (i = 0; i < NOISE_RES - 1; i++) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1058 int remain = NOISE_RES - i;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1059 int idx = i + (lcg >> 16) % remain;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1060 GLfloat tmp = tex[i];
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1061 tex[i] = tex[idx];
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1062 tex[idx] = tmp;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1063 lcg = lcg * 1664525 + 1013904223;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1064 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1065 mpglActiveTexture(unit);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1066 mpglTexImage1D(GL_TEXTURE_1D, 0, 1, NOISE_RES, 0, GL_RED, GL_FLOAT, tex);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1067 mpglTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1068 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1069 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1070 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1071 mpglActiveTexture(GL_TEXTURE0);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1072 free(tex);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1073 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1074
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1075 static const char bilin_filt_template[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1076 "TEX yuv.%c, fragment.texcoord[%c], texture[%c], %s;\n";
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1077
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1078 #define BICUB_FILT_MAIN(textype) \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1079 /* first y-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1080 "ADD coord, fragment.texcoord[%c].xyxy, cdelta.xyxw;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1081 "ADD coord2, fragment.texcoord[%c].xyxy, cdelta.zyzw;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1082 "TEX a.r, coord.xyxy, texture[%c], "textype";\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1083 "TEX a.g, coord.zwzw, texture[%c], "textype";\n" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
1084 /* second y-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1085 "TEX b.r, coord2.xyxy, texture[%c], "textype";\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1086 "TEX b.g, coord2.zwzw, texture[%c], "textype";\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1087 "LRP a.b, parmy.b, a.rrrr, a.gggg;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1088 "LRP a.a, parmy.b, b.rrrr, b.gggg;\n" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1089 /* x-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1090 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1091
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1092 static const char bicub_filt_template_2D[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1093 "MAD coord.xy, fragment.texcoord[%c], {%e, %e}, {0.5, 0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1094 "TEX parmx, coord.x, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1095 "MUL cdelta.xz, parmx.rrgg, {-%e, 0, %e, 0};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1096 "TEX parmy, coord.y, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1097 "MUL cdelta.yw, parmy.rrgg, {0, -%e, 0, %e};\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1098 BICUB_FILT_MAIN("2D");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1099
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1100 static const char bicub_filt_template_RECT[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1101 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1102 "TEX parmx, coord.x, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1103 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1104 "TEX parmy, coord.y, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1105 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1106 BICUB_FILT_MAIN("RECT");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1107
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1108 #define CALCWEIGHTS(t, s) \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1109 "MAD "t", {-0.5, 0.1666, 0.3333, -0.3333}, "s", {1, 0, -0.5, 0.5};\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1110 "MAD "t", "t", "s", {0, 0, -0.5, 0.5};\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1111 "MAD "t", "t", "s", {-0.6666, 0, 0.8333, 0.1666};\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1112 "RCP a.x, "t".z;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1113 "RCP a.y, "t".w;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1114 "MAD "t".xy, "t".xyxy, a.xyxy, {1, 1, 0, 0};\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1115 "ADD "t".x, "t".xxxx, "s";\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1116 "SUB "t".y, "t".yyyy, "s";\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1117
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1118 static const char bicub_notex_filt_template_2D[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1119 "MAD coord.xy, fragment.texcoord[%c], {%e, %e}, {0.5, 0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1120 "FRC coord.xy, coord.xyxy;\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1121 CALCWEIGHTS("parmx", "coord.xxxx")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1122 "MUL cdelta.xz, parmx.rrgg, {-%e, 0, %e, 0};\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1123 CALCWEIGHTS("parmy", "coord.yyyy")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1124 "MUL cdelta.yw, parmy.rrgg, {0, -%e, 0, %e};\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1125 BICUB_FILT_MAIN("2D");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1126
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1127 static const char bicub_notex_filt_template_RECT[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1128 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1129 "FRC coord.xy, coord.xyxy;\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1130 CALCWEIGHTS("parmx", "coord.xxxx")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1131 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1132 CALCWEIGHTS("parmy", "coord.yyyy")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1133 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n"
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1134 BICUB_FILT_MAIN("RECT");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1135
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1136 #define BICUB_X_FILT_MAIN(textype) \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1137 "ADD coord.xy, fragment.texcoord[%c].xyxy, cdelta.xyxy;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1138 "ADD coord2.xy, fragment.texcoord[%c].xyxy, cdelta.zyzy;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1139 "TEX a.r, coord, texture[%c], "textype";\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1140 "TEX b.r, coord2, texture[%c], "textype";\n" \
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1141 /* x-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1142 "LRP yuv.%c, parmx.b, a.rrrr, b.rrrr;\n"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1143
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1144 static const char bicub_x_filt_template_2D[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1145 "MAD coord.x, fragment.texcoord[%c], {%e}, {0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1146 "TEX parmx, coord, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1147 "MUL cdelta.xyz, parmx.rrgg, {-%e, 0, %e};\n"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1148 BICUB_X_FILT_MAIN("2D");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1149
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1150 static const char bicub_x_filt_template_RECT[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1151 "ADD coord.x, fragment.texcoord[%c], {0.5};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1152 "TEX parmx, coord, texture[%c], 1D;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1153 "MUL cdelta.xyz, parmx.rrgg, {-1, 0, 1};\n"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1154 BICUB_X_FILT_MAIN("RECT");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1155
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1156 static const char unsharp_filt_template[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1157 "PARAM dcoord%c = {%e, %e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1158 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1159 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1160 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1161 "TEX b.r, coord.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1162 "TEX b.g, coord.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1163 "ADD b.r, b.r, b.g;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1164 "TEX b.b, coord2.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1165 "TEX b.g, coord2.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1166 "DP3 b, b, {0.25, 0.25, 0.25};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1167 "SUB b.r, a.r, b.r;\n"
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1168 // NOTE: destination component is only write mask, not swizzle
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1169 // so calculate result in all three components
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1170 "MAD yuv.%c, b.rrrr, {%e, %e, %e}, a.rrrr;\n";
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1171
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1172 static const char unsharp_filt_template2[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1173 "PARAM dcoord%c = {%e, %e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1174 "PARAM dcoord2%c = {%e, 0, 0, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1175 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1176 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1177 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1178 "TEX b.r, coord.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1179 "TEX b.g, coord.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1180 "ADD b.r, b.r, b.g;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1181 "TEX b.b, coord2.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1182 "TEX b.g, coord2.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1183 "ADD b.r, b.r, b.b;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1184 "ADD b.a, b.r, b.g;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1185 "ADD coord, fragment.texcoord[%c].xyxy, dcoord2%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1186 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord2%c;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1187 "TEX b.r, coord.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1188 "TEX b.g, coord.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1189 "ADD b.r, b.r, b.g;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1190 "TEX b.b, coord2.xyxy, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1191 "TEX b.g, coord2.zwzw, texture[%c], %s;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1192 "DP4 b.r, b, {-0.1171875, -0.1171875, -0.1171875, -0.09765625};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1193 "MAD b.r, a.r, {0.859375}, b.r;\n"
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1194 // NOTE: destination component is only write mask, not swizzle
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1195 // so calculate result in all three components
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1196 "MAD yuv.%c, b.rrrr, {%e, %e, %e}, a.rrrr;\n";
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1197
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1198 static const char yuv_prog_template[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1199 "PARAM ycoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1200 "PARAM ucoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1201 "PARAM vcoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1202 "PARAM offsets = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1203 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1204 "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1205 "MAD res.rgb, yuv.gggg, ucoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1206 "MAD res.rgb, yuv.bbbb, vcoef, res;\n";
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1207
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1208 static const char yuv_pow_prog_template[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1209 "PARAM ycoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1210 "PARAM ucoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1211 "PARAM vcoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1212 "PARAM offsets = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1213 "PARAM gamma = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1214 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1215 "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1216 "MAD res.rgb, yuv.gggg, ucoef, res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1217 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1218 "POW res.r, res.r, gamma.r;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1219 "POW res.g, res.g, gamma.g;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1220 "POW res.b, res.b, gamma.b;\n";
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1221
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1222 static const char yuv_lookup_prog_template[] =
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1223 "PARAM ycoef = {%e, %e, %e, 0};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1224 "PARAM ucoef = {%e, %e, %e, 0};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1225 "PARAM vcoef = {%e, %e, %e, 0};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1226 "PARAM offsets = {%e, %e, %e, 0.125};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1227 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1228 "MAD res, yuv.rrrr, ycoef, offsets;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1229 "MAD res.rgb, yuv.gggg, ucoef, res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1230 "MAD res.rgb, yuv.bbbb, vcoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1231 "TEX res.r, res.raaa, texture[%c], 2D;\n"
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1232 "ADD res.a, res.a, 0.25;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1233 "TEX res.g, res.gaaa, texture[%c], 2D;\n"
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1234 "ADD res.a, res.a, 0.25;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1235 "TEX res.b, res.baaa, texture[%c], 2D;\n";
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1236
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1237 static const char yuv_lookup3d_prog_template[] =
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1238 "TEMP res;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1239 "TEX res, yuv, texture[%c], 3D;\n";
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1240
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1241 static const char noise_filt_template[] =
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1242 "MUL coord.xy, fragment.texcoord[0], {%e, %e};\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1243 "TEMP rand;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1244 "TEX rand.r, coord.x, texture[%c], 1D;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1245 "ADD rand.r, rand.r, coord.y;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1246 "TEX rand.r, rand.r, texture[%c], 1D;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1247 "MAD res.rgb, rand.rrrr, {%e, %e, %e}, res;\n";
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1248
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1249 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1250 * \brief creates and initializes helper textures needed for scaling texture read
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1251 * \param scaler scaler type to create texture for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1252 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1253 * \param texs texture unit ids for the scaler are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1254 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1255 static void create_scaler_textures(int scaler, int *texu, char *texs) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1256 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1257 case YUV_SCALER_BILIN:
25727
7934f12c76f0 Add a forgotten case to create_scaler_textures, avoids an incorrect warning.
reimar
parents: 24777
diff changeset
1258 case YUV_SCALER_BICUB_NOTEX:
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1259 case YUV_SCALER_UNSHARP:
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1260 case YUV_SCALER_UNSHARP2:
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1261 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1262 case YUV_SCALER_BICUB:
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1263 case YUV_SCALER_BICUB_X:
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1264 texs[0] = (*texu)++;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1265 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1266 texs[0] += '0';
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1267 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1268 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1269 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown scaler type %i\n", scaler);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1270 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1271 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1272
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1273 //! resolution of texture for gamma lookup table
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1274 #define LOOKUP_RES 512
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1275 //! resolution for 3D yuv->rgb conversion lookup table
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1276 #define LOOKUP_3DRES 32
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1277 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1278 * \brief creates and initializes helper textures needed for yuv conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1279 * \param params struct containing parameters like brightness, gamma, ...
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1280 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1281 * \param texs texture unit ids for the conversion are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1282 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1283 static void create_conv_textures(gl_conversion_params_t *params, int *texu, char *texs) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1284 unsigned char *lookup_data = NULL;
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1285 int conv = YUV_CONVERSION(params->type);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1286 switch (conv) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1287 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1288 case YUV_CONVERSION_FRAGMENT_POW:
30028
9ad7756adfa8 Fix a broken indentation.
reimar
parents: 30027
diff changeset
1289 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1290 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1291 texs[0] = (*texu)++;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1292 mpglActiveTexture(GL_TEXTURE0 + texs[0]);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1293 lookup_data = malloc(4 * LOOKUP_RES);
30108
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1294 mp_gen_gamma_map(lookup_data, LOOKUP_RES, params->csp_params.rgamma);
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1295 mp_gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->csp_params.ggamma);
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1296 mp_gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->csp_params.bgamma);
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
1297 glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LINEAR,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1298 LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1299 glUploadTex(GL_TEXTURE_2D, GL_LUMINANCE, GL_UNSIGNED_BYTE, lookup_data,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1300 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1301 mpglActiveTexture(GL_TEXTURE0);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1302 texs[0] += '0';
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1303 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1304 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1305 {
36114
2c96438ef2ad Avoid 3D texture with border.
reimar
parents: 36112
diff changeset
1306 int sz = LOOKUP_3DRES; // texture size
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1307 if (!mpglTexImage3D) {
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1308 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Missing 3D texture function!\n");
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1309 break;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1310 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1311 texs[0] = (*texu)++;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1312 mpglActiveTexture(GL_TEXTURE0 + texs[0]);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1313 lookup_data = malloc(3 * sz * sz * sz);
30108
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1314 mp_gen_yuv2rgb_map(&params->csp_params, lookup_data, LOOKUP_3DRES);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1315 glAdjustAlignment(sz);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1316 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
36114
2c96438ef2ad Avoid 3D texture with border.
reimar
parents: 36112
diff changeset
1317 mpglTexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 0,
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1318 GL_RGB, GL_UNSIGNED_BYTE, lookup_data);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1319 mpglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1320 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1321 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
36114
2c96438ef2ad Avoid 3D texture with border.
reimar
parents: 36112
diff changeset
1322 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2c96438ef2ad Avoid 3D texture with border.
reimar
parents: 36112
diff changeset
1323 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2c96438ef2ad Avoid 3D texture with border.
reimar
parents: 36112
diff changeset
1324 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1325 mpglActiveTexture(GL_TEXTURE0);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1326 texs[0] += '0';
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1327 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1328 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1329 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1330 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", conv);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1331 }
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32427
diff changeset
1332 free(lookup_data);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1333 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1334
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1335 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1336 * \brief adds a scaling texture read at the current fragment program position
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1337 * \param scaler type of scaler to insert
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1338 * \param prog_pos current position in fragment program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1339 * \param remain how many bytes remain in the buffer given by prog_pos
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1340 * \param texs array containing the texture unit identifiers for this scaler
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1341 * \param in_tex texture unit the scaler should read from
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1342 * \param out_comp component of the yuv variable the scaler stores the result in
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1343 * \param rect if rectangular (pixel) adressing should be used for in_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1344 * \param texw width of the in_tex texture
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1345 * \param texh height of the in_tex texture
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1346 * \param strength strength of filter effect if the scaler does some kind of filtering
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1347 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1348 static void add_scaler(int scaler, char **prog_pos, int *remain, char *texs,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1349 char in_tex, char out_comp, int rect, int texw, int texh,
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1350 double strength) {
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1351 const char *ttype = rect ? "RECT" : "2D";
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1352 const float ptw = rect ? 1.0 : 1.0 / texw;
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1353 const float pth = rect ? 1.0 : 1.0 / texh;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1354 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1355 case YUV_SCALER_BILIN:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1356 snprintf(*prog_pos, *remain, bilin_filt_template, out_comp, in_tex,
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1357 in_tex, ttype);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1358 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1359 case YUV_SCALER_BICUB:
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1360 if (rect)
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1361 snprintf(*prog_pos, *remain, bicub_filt_template_RECT,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1362 in_tex, texs[0], texs[0],
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1363 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1364 else
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1365 snprintf(*prog_pos, *remain, bicub_filt_template_2D,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1366 in_tex, (float)texw, (float)texh,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1367 texs[0], ptw, ptw, texs[0], pth, pth,
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1368 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1369 break;
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1370 case YUV_SCALER_BICUB_X:
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1371 if (rect)
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1372 snprintf(*prog_pos, *remain, bicub_x_filt_template_RECT,
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1373 in_tex, texs[0],
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1374 in_tex, in_tex, in_tex, in_tex, out_comp);
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1375 else
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1376 snprintf(*prog_pos, *remain, bicub_x_filt_template_2D,
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
1377 in_tex, (float)texw,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1378 texs[0], ptw, ptw,
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1379 in_tex, in_tex, in_tex, in_tex, out_comp);
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1380 break;
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1381 case YUV_SCALER_BICUB_NOTEX:
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1382 if (rect)
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1383 snprintf(*prog_pos, *remain, bicub_notex_filt_template_RECT,
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1384 in_tex,
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1385 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1386 else
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1387 snprintf(*prog_pos, *remain, bicub_notex_filt_template_2D,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1388 in_tex, (float)texw, (float)texh, ptw, ptw, pth, pth,
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1389 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1390 break;
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1391 case YUV_SCALER_UNSHARP:
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1392 snprintf(*prog_pos, *remain, unsharp_filt_template,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1393 out_comp, 0.5 * ptw, 0.5 * pth, 0.5 * ptw, -0.5 * pth,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1394 in_tex, out_comp, in_tex, out_comp, in_tex,
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1395 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype,
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1396 in_tex, ttype, out_comp, strength, strength, strength);
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1397 break;
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1398 case YUV_SCALER_UNSHARP2:
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1399 snprintf(*prog_pos, *remain, unsharp_filt_template2,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1400 out_comp, 1.2 * ptw, 1.2 * pth, 1.2 * ptw, -1.2 * pth,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1401 out_comp, 1.5 * ptw, 1.5 * pth,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1402 in_tex, out_comp, in_tex, out_comp, in_tex,
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1403 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1404 in_tex, ttype, in_tex, out_comp, in_tex, out_comp,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1405 in_tex, ttype, in_tex, ttype, in_tex, ttype,
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1406 in_tex, ttype, out_comp, strength, strength, strength);
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1407 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1408 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1409 *remain -= strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1410 *prog_pos += strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1411 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1412
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1413 static const struct {
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
1414 const char *name;
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1415 GLenum cur;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1416 GLenum max;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1417 } progstats[] = {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1418 {"instructions", 0x88A0, 0x88A1},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1419 {"native instructions", 0x88A2, 0x88A3},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1420 {"temporaries", 0x88A4, 0x88A5},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1421 {"native temporaries", 0x88A6, 0x88A7},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1422 {"parameters", 0x88A8, 0x88A9},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1423 {"native parameters", 0x88AA, 0x88AB},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1424 {"attribs", 0x88AC, 0x88AD},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1425 {"native attribs", 0x88AE, 0x88AF},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1426 {"ALU instructions", 0x8805, 0x880B},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1427 {"TEX instructions", 0x8806, 0x880C},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1428 {"TEX indirections", 0x8807, 0x880D},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1429 {"native ALU instructions", 0x8808, 0x880E},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1430 {"native TEX instructions", 0x8809, 0x880F},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1431 {"native TEX indirections", 0x880A, 0x8810},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1432 {NULL, 0, 0}
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1433 };
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1434
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1435 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1436 * \brief load the specified GPU Program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1437 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1438 * \param prog program string
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1439 * \return 1 on success, 0 otherwise
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1440 */
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1441 int loadGPUProgram(GLenum target, char *prog) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1442 int i;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1443 GLint cur = 0, max = 0, err = 0;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1444 if (!mpglProgramString) {
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1445 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Missing GPU program function\n");
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1446 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1447 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1448 mpglProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1449 mpglGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1450 if (err != -1) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1451 mp_msg(MSGT_VO, MSGL_ERR,
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1452 "[gl] Error compiling fragment program, make sure your card supports\n"
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1453 "[gl] GL_ARB_fragment_program (use glxinfo to check).\n"
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1454 "[gl] Error message:\n %s at %.10s\n",
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1455 mpglGetString(GL_PROGRAM_ERROR_STRING), &prog[err]);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1456 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1457 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1458 if (!mpglGetProgramiv || !mp_msg_test(MSGT_VO, MSGL_DBG2))
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1459 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1460 mp_msg(MSGT_VO, MSGL_V, "[gl] Program statistics:\n");
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1461 for (i = 0; progstats[i].name; i++) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1462 mpglGetProgramiv(target, progstats[i].cur, &cur);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1463 mpglGetProgramiv(target, progstats[i].max, &max);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1464 mp_msg(MSGT_VO, MSGL_V, "[gl] %s: %i/%i\n", progstats[i].name, cur, max);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1465 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1466 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1467 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1468
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1469 #define MAX_PROGSZ (1024*1024)
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1470
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1471 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1472 * \brief setup a fragment program that will do YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1473 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1474 * brightness, ...
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1475 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1476 static void glSetupYUVFragprog(gl_conversion_params_t *params) {
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1477 int type = params->type;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1478 int texw = params->texw;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1479 int texh = params->texh;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1480 int rect = params->target == GL_TEXTURE_RECTANGLE;
36105
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1481 int convtype = YUV_CONVERSION(type);
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1482 int has_gamma = params->csp_params.rgamma != 1 || params->csp_params.bgamma != 1 || params->csp_params.bgamma != 1;
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1483 static const char prog_hdr[] =
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1484 "!!ARBfp1.0\n"
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1485 "OPTION ARB_precision_hint_fastest;\n"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1486 // all scaler variables must go here so they aren't defined
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1487 // multiple times when the same scaler is used more than once
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1488 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;\n";
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1489 int prog_remain;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1490 char *yuv_prog, *prog_pos;
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1491 int cur_texu = 3 + params->has_alpha_tex;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1492 char lum_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1493 char chrom_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1494 char conv_texs[1];
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1495 char filt_texs[1] = {0};
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1496 GLint i;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1497 // this is the conversion matrix, with y, u, v factors
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1498 // for red, green, blue and the constant offsets
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1499 float yuv2rgb[3][4];
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1500 int noise = params->noise_strength != 0;
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1501 create_conv_textures(params, &cur_texu, conv_texs);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1502 create_scaler_textures(YUV_LUM_SCALER(type), &cur_texu, lum_scale_texs);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1503 if (YUV_CHROM_SCALER(type) == YUV_LUM_SCALER(type))
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1504 memcpy(chrom_scale_texs, lum_scale_texs, sizeof(chrom_scale_texs));
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1505 else
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1506 create_scaler_textures(YUV_CHROM_SCALER(type), &cur_texu, chrom_scale_texs);
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1507
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1508 if (noise) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1509 gen_noise_lookup_tex(cur_texu);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1510 filt_texs[0] = '0' + cur_texu++;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1511 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1512
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1513 mpglGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1514 if (i < cur_texu)
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1515 mp_msg(MSGT_VO, MSGL_ERR,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1516 "[gl] %i texture units needed for this type of YUV fragment support (found %i)\n",
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1517 cur_texu, i);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1518 if (!mpglProgramString) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1519 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] ProgramString function missing!\n");
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1520 return;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1521 }
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1522 yuv_prog = malloc(MAX_PROGSZ);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1523 strcpy(yuv_prog, prog_hdr);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1524 prog_pos = yuv_prog + sizeof(prog_hdr) - 1;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1525 prog_remain = MAX_PROGSZ - sizeof(prog_hdr);
36111
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1526 if (!params->is_planar) {
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1527 // interleaved
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1528 snprintf(prog_pos, prog_remain, "TEX yuv.rgb, fragment.texcoord[0], texture[0], %s;\n", rect ? "RECT" : "2D");
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1529 prog_remain -= strlen(prog_pos);
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1530 prog_pos += strlen(prog_pos);
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1531 } else {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1532 add_scaler(YUV_LUM_SCALER(type), &prog_pos, &prog_remain, lum_scale_texs,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1533 '0', 'r', rect, texw, texh, params->filter_strength);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1534 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1535 '1', 'g', rect, params->chrom_texw, params->chrom_texh, params->filter_strength);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1536 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1537 '2', 'b', rect, params->chrom_texw, params->chrom_texh, params->filter_strength);
36111
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1538 }
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1539 if (params->csp_params.format == MP_CSP_XYZ) {
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1540 snprintf(prog_pos, prog_remain, "PARAM xyzgamma = {2.6};\nPOW yuv.r, yuv.r, xyzgamma.r;\nPOW yuv.g, yuv.g, xyzgamma.r;\nPOW yuv.b, yuv.b, xyzgamma.r;\n");
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1541 prog_remain -= strlen(prog_pos);
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1542 prog_pos += strlen(prog_pos);
55bd3eed6c9a Add xyz support for -vo gl.
reimar
parents: 36109
diff changeset
1543 }
30108
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1544 mp_get_yuv2rgb_coeffs(&params->csp_params, yuv2rgb);
36105
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1545
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1546 // enable/disable gamma on demand
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1547 if (has_gamma && convtype == YUV_CONVERSION_FRAGMENT) convtype = YUV_CONVERSION_FRAGMENT_POW;
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1548 else if (!has_gamma && (convtype == YUV_CONVERSION_FRAGMENT_POW || convtype == YUV_CONVERSION_FRAGMENT_LOOKUP))
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1549 convtype = YUV_CONVERSION_FRAGMENT;
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1550
10a63b5e6513 Enable/disable extra instructions for gamma correction
reimar
parents: 36076
diff changeset
1551 switch (convtype) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1552 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1553 snprintf(prog_pos, prog_remain, yuv_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1554 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1555 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1556 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1557 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C]);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1558 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1559 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1560 snprintf(prog_pos, prog_remain, yuv_pow_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1561 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1562 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1563 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1564 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C],
30107
11e3ee8cd05e Put the colourspace-related variables into a separate struct to ease
reimar
parents: 30097
diff changeset
1565 (float)1.0 / params->csp_params.rgamma, (float)1.0 / params->csp_params.bgamma, (float)1.0 / params->csp_params.bgamma);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1566 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1567 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1568 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1569 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1570 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1571 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V],
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1572 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C],
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1573 conv_texs[0], conv_texs[0], conv_texs[0]);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1574 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1575 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1576 snprintf(prog_pos, prog_remain, yuv_lookup3d_prog_template, conv_texs[0]);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1577 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1578 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1579 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(type));
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1580 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1581 }
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1582 prog_remain -= strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1583 prog_pos += strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1584
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1585 if (noise) {
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1586 // 1.0 strength is suitable for dithering 8 to 6 bit
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1587 double str = params->noise_strength * (1.0 / 64);
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1588 double scale_x = (double)NOISE_RES / texw;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1589 double scale_y = (double)NOISE_RES / texh;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1590 if (rect) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1591 scale_x /= texw;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1592 scale_y /= texh;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1593 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1594 snprintf(prog_pos, prog_remain, noise_filt_template,
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1595 scale_x, scale_y,
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1596 filt_texs[0], filt_texs[0],
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1597 str, str, str);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1598 prog_remain -= strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1599 prog_pos += strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1600 }
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1601 if (params->has_alpha_tex) {
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1602 snprintf(prog_pos, prog_remain, "TEX result.color.a, fragment.texcoord[3], texture[3], 2D;\n");
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1603 prog_remain -= strlen(prog_pos);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1604 prog_pos += strlen(prog_pos);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1605 }
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1606 snprintf(prog_pos, prog_remain, "MOV result.color.rgb, res;\nEND");
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1607
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
1608 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] generated fragment program:\n%s\n", yuv_prog);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1609 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog);
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1610 free(yuv_prog);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1611 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1612
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1613 static void print_result(int link, GLuint obj) {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1614 char msgtmp[500];
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1615 GLint status;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1616 (link ? mpglGetProgramiv : mpglGetShaderiv)(obj, link ? GL_LINK_STATUS : GL_COMPILE_STATUS, &status);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1617 if (!status)
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1618 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Shader %s failed.\n", link ? "linking" : "compilation");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1619 msgtmp[0] = 0;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1620 (link ? mpglGetProgramInfoLog : mpglGetShaderInfoLog)(obj, sizeof(msgtmp), NULL, msgtmp);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1621 mp_msg(MSGT_VO, status ? MSGL_V : MSGL_ERR, "[gl] %s messages:\n%s\n", link ? "Linker" : "Compiler", msgtmp);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1622 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1623
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1624 static GLuint compile_shader(GLenum type, const char *source) {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1625 GLuint shader = mpglCreateShader(type);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1626 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] Compiling shader:\n%s\n", source);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1627 mpglShaderSource(shader, 1, &source, NULL);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1628 mpglCompileShader(shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1629 print_result(0, shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1630 return shader;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1631 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1632
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1633 static const char vertex_shader[] =
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1634 "uniform mat4 matrix;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1635 "attribute vec4 vPos;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1636 "attribute vec2 tca, tca2, tca3;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1637 "varying vec2 tcv, tcv2, tcv3;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1638 "void main() {\n"
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1639 "#ifdef GL_ES\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1640 " gl_Position = matrix * vPos;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1641 " tcv = tca; tcv2 = tca2; tcv3 = tca3;\n"
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1642 "#else\n"
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1643 " gl_Position = gl_ModelViewProjectionMatrix * vPos;\n"
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1644 " tcv = vec2(gl_MultiTexCoord0);\n"
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1645 " tcv2 = vec2(gl_MultiTexCoord1);\n"
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1646 " tcv3 = vec2(gl_MultiTexCoord2);\n"
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1647 "#endif\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1648 "}\n";
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1649
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1650 static GLuint new_gpu_program(void) {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1651 GLuint program = mpglCreateProgram();
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1652 GLuint shader = compile_shader(GL_VERTEX_SHADER, vertex_shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1653 mpglAttachShader(program, shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1654 mpglDeleteShader(shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1655 return program;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1656 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1657
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1658 static const char def_frag_shader[] =
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1659 "#ifdef GL_ES\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1660 "precision mediump float;\n"
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1661 "#endif\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1662 "uniform sampler2D texs[4];\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1663 "varying vec2 tcv;\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1664 "void main() {\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1665 " gl_FragColor = texture2D(texs[0], tcv);\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1666 "}\n";
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1667
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1668 static const char yuv_frag_shader_template[] =
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1669 "#ifdef GL_ES\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1670 "precision mediump float;\n"
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1671 "#endif\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1672 "uniform sampler2D texs[4];\n"
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1673 "varying vec2 tcv, tcv2, tcv3;\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1674 "void main() {\n"
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1675 " const vec3 gamma = vec3(%e, %e, %e);\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1676 " const float xyz_gamma = %e;\n"
36132
17b5ef08fdaa Add a const.
reimar
parents: 36131
diff changeset
1677 " const mat4 yuv_conv = mat4(\n"
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1678 " %e, %e, %e, 0,\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1679 " %e, %e, %e, 0,\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1680 " %e, %e, %e, 0,\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1681 " %e, %e, %e, 1\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1682 " );\n"
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1683 " vec4 yuv = vec4(0.0, 0.5, 0.5, 1.0);\n"
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1684 " if (%i == 0) {\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1685 " yuv = texture2D(texs[0], tcv);\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1686 " } else {\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1687 " yuv.r = texture2D(texs[0], tcv).r;\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1688 " yuv.g = texture2D(texs[1], tcv2).r;\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1689 " yuv.b = texture2D(texs[2], tcv2).r;\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1690 " }\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1691 " if (xyz_gamma != 1.0)\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1692 " yuv.rgb = pow(yuv.rgb, vec3(xyz_gamma, xyz_gamma, xyz_gamma));\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1693 " vec4 rgb = yuv_conv * yuv;\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1694 " if (gamma != vec3(1.0, 1.0, 1.0))\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1695 " rgb.rgb = pow(rgb.rgb, gamma);\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1696 " rgb.a = %i == 0 ? 1.0 : texture2D(texs[3], tcv3).r;\n"
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1697 " gl_FragColor = rgb;\n"
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1698 "}\n";
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1699
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1700 static void detach_shader(GLuint prog, GLenum type) {
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1701 GLuint attached[4];
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1702 GLsizei num_attached;
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1703 mpglGetAttachedShaders(prog, 4, &num_attached, attached);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1704 while (num_attached--) {
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1705 GLint cur_type;
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1706 mpglGetShaderiv(attached[num_attached], GL_SHADER_TYPE, &cur_type);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1707 if (cur_type == type)
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1708 mpglDetachShader(prog, attached[num_attached]);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1709 }
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1710 }
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1711
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1712 static void set_frag_shader(GLuint prog, GLuint shader) {
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1713 detach_shader(prog, GL_FRAGMENT_SHADER);
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1714 mpglAttachShader(prog, shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1715 mpglBindAttribLocation(prog, 0, "vPos");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1716 mpglBindAttribLocation(prog, 1, "tca");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1717 mpglBindAttribLocation(prog, 2, "tca2");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1718 mpglBindAttribLocation(prog, 3, "tca3");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1719 mpglLinkProgram(prog);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1720 print_result(1, prog);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1721 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1722
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1723 static void set_frag_src(GLuint prog, const char *src) {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1724 GLuint shader = compile_shader(GL_FRAGMENT_SHADER, src);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1725 set_frag_shader(prog, shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1726 mpglDeleteShader(shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1727 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1728
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1729 static void update_yuv_frag_src(const gl_conversion_params_t *params) {
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1730 char buffer[2000];
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1731 float yuv2rgb[3][4];
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1732 mp_get_yuv2rgb_coeffs(&params->csp_params, yuv2rgb);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1733 snprintf(buffer, sizeof(buffer), yuv_frag_shader_template,
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1734 1.0 / params->csp_params.rgamma,
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1735 1.0 / params->csp_params.ggamma,
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1736 1.0 / params->csp_params.bgamma,
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1737 params->csp_params.format == MP_CSP_XYZ ? 2.6 : 1.0,
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1738 yuv2rgb[0][0], yuv2rgb[1][0], yuv2rgb[2][0],
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1739 yuv2rgb[0][1], yuv2rgb[1][1], yuv2rgb[2][1],
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1740 yuv2rgb[0][2], yuv2rgb[1][2], yuv2rgb[2][2],
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1741 yuv2rgb[0][3], yuv2rgb[1][3], yuv2rgb[2][3],
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1742 params->is_planar, 0);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1743 set_frag_src(gpu_yuv_sl_program, buffer);
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1744 }
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1745
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1746 static void GLAPIENTRY matrix_uniform(const float *matrix)
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1747 {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1748 GLint loc;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1749 if (matrix != transform_matrix)
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1750 memcpy(transform_matrix, matrix, sizeof(transform_matrix));
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1751 loc = mpglGetUniformLocation(gpu_cur_sl_program, "matrix");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1752 mpglUniformMatrix4fv(loc, 1, GL_FALSE, transform_matrix);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1753 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1754
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1755 static void use_program(GLuint prog) {
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1756 GLint loc;
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1757 static const GLint texs[] = {0, 1, 2, 3, 4};
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1758 mpglUseProgram(prog);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1759 gpu_cur_sl_program = prog;
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1760 if (!prog) return;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1761 loc = mpglGetUniformLocation(prog, "texs");
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1762 mpglUniform1iv(loc, sizeof(texs)/sizeof(texs[0]), texs);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1763 matrix_uniform(transform_matrix);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1764 }
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1765
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1766 /**
30964
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1767 * \brief detect the best YUV->RGB conversion method available
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1768 */
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1769 int glAutodetectYUVConversion(void) {
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1770 const char *extensions = mpglGetString(GL_EXTENSIONS);
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1771 const char *vendor = mpglGetString(GL_VENDOR);
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1772 // Imagination cannot parse floats in exponential representation (%e)
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1773 int is_img = vendor && strstr(vendor, "Imagination") != NULL;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1774 if (!mpglBegin)
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1775 return YUV_CONVERSION_SL_PROGRAM;
31021
b25ae678c778 Some crash-resilience fixes.
reimar
parents: 31020
diff changeset
1776 if (!extensions || !mpglMultiTexCoord2f)
b25ae678c778 Some crash-resilience fixes.
reimar
parents: 31020
diff changeset
1777 return YUV_CONVERSION_NONE;
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1778 if (strstr(extensions, "GL_ARB_fragment_program") && !is_img)
36112
e2e188ede1d1 Use better default for YUV mode autodetection.
reimar
parents: 36111
diff changeset
1779 return YUV_CONVERSION_FRAGMENT_LOOKUP;
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1780 if (strstr(extensions, "GL_ATI_text_fragment_shader") && !is_img)
30964
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1781 return YUV_CONVERSION_TEXT_FRAGMENT;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1782 if (strstr(extensions, "GL_ATI_fragment_shader"))
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1783 return YUV_CONVERSION_COMBINERS_ATI;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1784 return YUV_CONVERSION_NONE;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1785 }
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1786
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1787 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1788 * \brief setup YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1789 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1790 * brightness, ...
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1791 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1792 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1793 void glSetupYUVConversion(gl_conversion_params_t *params) {
30107
11e3ee8cd05e Put the colourspace-related variables into a separate struct to ease
reimar
parents: 30097
diff changeset
1794 float uvcos = params->csp_params.saturation * cos(params->csp_params.hue);
11e3ee8cd05e Put the colourspace-related variables into a separate struct to ease
reimar
parents: 30097
diff changeset
1795 float uvsin = params->csp_params.saturation * sin(params->csp_params.hue);
31086
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
1796 if (params->chrom_texw == 0) params->chrom_texw = 1;
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
1797 if (params->chrom_texh == 0) params->chrom_texh = 1;
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1798 switch (YUV_CONVERSION(params->type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1799 case YUV_CONVERSION_COMBINERS:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1800 glSetupYUVCombiners(uvcos, uvsin);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1801 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1802 case YUV_CONVERSION_COMBINERS_ATI:
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
1803 glSetupYUVFragmentATI(&params->csp_params, 0);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1804 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1805 case YUV_CONVERSION_TEXT_FRAGMENT:
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
1806 glSetupYUVFragmentATI(&params->csp_params, 1);
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1807 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1808 case YUV_CONVERSION_FRAGMENT_LOOKUP:
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1809 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1810 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1811 case YUV_CONVERSION_FRAGMENT_POW:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1812 glSetupYUVFragprog(params);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1813 break;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1814 case YUV_CONVERSION_SL_PROGRAM:
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1815 if (!gpu_yuv_sl_program)
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
1816 gpu_yuv_sl_program = new_gpu_program();
36134
2b742d298c68 gl: support advanced processing for GLES2.
reimar
parents: 36132
diff changeset
1817 update_yuv_frag_src(params);
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1818 break;
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1819 case YUV_CONVERSION_NONE:
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1820 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1821 default:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1822 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(params->type));
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1823 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1824 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1825
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1826 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1827 * \brief enable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1828 * \param target texture target for Y, U and V textures (e.g. GL_TEXTURE_2D)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1829 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1830 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1831 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1832 void glEnableYUVConversion(GLenum target, int type) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1833 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1834 case YUV_CONVERSION_COMBINERS:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1835 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1836 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1837 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1838 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1839 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1840 mpglEnable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1841 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1842 case YUV_CONVERSION_COMBINERS_ATI:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1843 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1844 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1845 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1846 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1847 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1848 mpglEnable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1849 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1850 case YUV_CONVERSION_TEXT_FRAGMENT:
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1851 mpglActiveTexture(GL_TEXTURE1);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1852 mpglEnable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1853 mpglActiveTexture(GL_TEXTURE2);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1854 mpglEnable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1855 mpglActiveTexture(GL_TEXTURE0);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1856 mpglEnable(GL_TEXT_FRAGMENT_SHADER_ATI);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1857 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1858 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1859 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1860 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1861 case YUV_CONVERSION_FRAGMENT:
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1862 case YUV_CONVERSION_NONE:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1863 mpglEnable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1864 break;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1865 case YUV_CONVERSION_SL_PROGRAM:
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1866 use_program(gpu_yuv_sl_program);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1867 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1868 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1869 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1870
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1871 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1872 * \brief disable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1873 * \param target texture target for Y, U and V textures (e.g. GL_TEXTURE_2D)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1874 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1875 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1876 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1877 void glDisableYUVConversion(GLenum target, int type) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1878 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1879 case YUV_CONVERSION_COMBINERS:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1880 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1881 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1882 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1883 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1884 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1885 mpglDisable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1886 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1887 case YUV_CONVERSION_COMBINERS_ATI:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1888 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1889 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1890 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1891 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1892 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1893 mpglDisable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1894 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1895 case YUV_CONVERSION_TEXT_FRAGMENT:
31026
0b0266c8ec53 Add workaroound for yuv=7 mode - does hurt speed but not much
reimar
parents: 31024
diff changeset
1896 mpglDisable(GL_TEXT_FRAGMENT_SHADER_ATI);
31029
47a6b4716ef3 Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents: 31026
diff changeset
1897 // HACK: at least the Mac OS X 10.5 PPC Radeon drivers are broken and
47a6b4716ef3 Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents: 31026
diff changeset
1898 // without this disable the texture units while the program is still
47a6b4716ef3 Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents: 31026
diff changeset
1899 // running (10.4 PPC seems to work without this though).
31026
0b0266c8ec53 Add workaroound for yuv=7 mode - does hurt speed but not much
reimar
parents: 31024
diff changeset
1900 mpglFlush();
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1901 mpglActiveTexture(GL_TEXTURE1);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1902 mpglDisable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1903 mpglActiveTexture(GL_TEXTURE2);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1904 mpglDisable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1905 mpglActiveTexture(GL_TEXTURE0);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1906 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1907 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1908 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1909 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1910 case YUV_CONVERSION_FRAGMENT:
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1911 case YUV_CONVERSION_NONE:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1912 mpglDisable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1913 break;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1914 case YUV_CONVERSION_SL_PROGRAM:
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1915 use_program(gpu_def_sl_program);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
1916 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1917 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1918 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1919
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1920 void glSetupAlphaStippleTex(unsigned pattern) {
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1921 int i;
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1922 uint8_t stipple[16];
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1923 for (i = 0; i < 16; i++) {
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1924 stipple[i] = (pattern & 1) * 0xff;
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1925 pattern >>= 1;
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1926 }
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1927 mpglActiveTexture(GL_TEXTURE3);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1928 glAdjustAlignment(2);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1929 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1930 mpglTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 4, 4, 0, GL_ALPHA, GL_UNSIGNED_BYTE, stipple);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1931 mpglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1932 mpglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1933 mpglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1934 mpglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1935 mpglActiveTexture(GL_TEXTURE0);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1936 }
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1937
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1938 void glEnable3DLeft(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1939 GLint buffer;
34375
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1940 if (type & GL_3D_SWAP)
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1941 return glEnable3DRight(type & ~GL_3D_SWAP);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1942 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1943 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1944 mpglColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1945 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1946 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1947 mpglColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1948 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1949 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1950 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1951 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1952 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1953 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1954 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1955 buffer = GL_FRONT_LEFT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1956 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1957 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1958 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1959 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1960 buffer = GL_BACK_LEFT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1961 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1962 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1963 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1964 break;
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1965 case GL_3D_STIPPLE:
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1966 mpglActiveTexture(GL_TEXTURE3);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1967 mpglEnable(GL_TEXTURE_2D);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1968 mpglActiveTexture(GL_TEXTURE0);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1969 mpglEnable(GL_BLEND);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1970 mpglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
1971 break;
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1972 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1973 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1974
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1975 void glEnable3DRight(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1976 GLint buffer;
34375
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1977 if (type & GL_3D_SWAP)
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1978 return glEnable3DLeft(type & ~GL_3D_SWAP);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1979 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1980 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1981 mpglColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1982 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1983 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1984 mpglColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1985 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1986 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1987 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1988 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1989 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1990 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1991 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1992 buffer = GL_FRONT_RIGHT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1993 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1994 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1995 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1996 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1997 buffer = GL_BACK_RIGHT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1998 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1999 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2000 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2001 break;
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2002 case GL_3D_STIPPLE:
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2003 mpglActiveTexture(GL_TEXTURE3);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2004 mpglEnable(GL_TEXTURE_2D);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2005 mpglActiveTexture(GL_TEXTURE0);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2006 mpglEnable(GL_BLEND);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2007 mpglBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2008 break;
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2009 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2010 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2011
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2012 void glDisable3D(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2013 GLint buffer;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2014 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2015 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2016 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2017 mpglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2018 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2019 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2020 mpglDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2021 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2022 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2023 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2024 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2025 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2026 buffer = GL_FRONT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2027 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2028 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2029 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2030 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2031 buffer = GL_BACK;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2032 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2033 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2034 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2035 break;
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2036 case GL_3D_STIPPLE:
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2037 mpglActiveTexture(GL_TEXTURE3);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2038 mpglDisable(GL_TEXTURE_2D);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2039 mpglActiveTexture(GL_TEXTURE0);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2040 mpglDisable(GL_BLEND);
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2041 break;
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2042 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2043 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
2044
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2045 static void draw_vertices(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2046 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2047 GLfloat tx2, GLfloat ty2, GLfloat tw2, GLfloat th2,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2048 int is_yv12, int use_stipple)
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2049 {
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2050 int i;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2051 GLfloat vertices [8] = { x, y, x, y + h, x + w, y, x + w, y + h};
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2052 GLfloat texcoords [8] = {tx, ty, tx, ty + th, tx + tw, ty, tx + tw, ty + th};
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2053 GLfloat texcoords2[8] = {tx2, ty2, tx2, ty2 + th2, tx2 + tw2, ty2, tx2 + tw2, ty2 + th2};
34983
0034a2bf7b42 Support interleaving the two frame halves from a 3D video
reimar
parents: 34978
diff changeset
2054 GLfloat texcoords3[8] = {vo_dx / 4.0, vo_dy / 4.0, vo_dx / 4.0, (vo_dy + vo_dheight) / 4.0, (vo_dx + vo_dwidth) / 4.0, vo_dy / 4.0, (vo_dx + vo_dwidth) / 4.0, (vo_dy + vo_dheight) / 4.0};
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2055
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2056 if (!mpglBegin) {
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2057 mpglVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2058 mpglEnableVertexAttribArray(0);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2059 mpglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texcoords);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2060 mpglEnableVertexAttribArray(1);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2061 mpglVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, texcoords2);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2062 mpglEnableVertexAttribArray(2);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2063 mpglVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, texcoords3);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2064 mpglEnableVertexAttribArray(3);
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2065 mpglDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2066 return;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2067 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2068
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2069 mpglBegin(GL_TRIANGLE_STRIP);
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2070 for (i = 0; i < 4; i++) {
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2071 int px = 2*i;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2072 int py = 2*i + 1;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2073 mpglTexCoord2f(texcoords[px], texcoords[py]);
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2074 if (is_yv12) {
36235
c00402488d80 vo_gl: Fix chroma with rectangle=1.
reimar
parents: 36219
diff changeset
2075 mpglMultiTexCoord2f(GL_TEXTURE1, texcoords2[px], texcoords2[py]);
c00402488d80 vo_gl: Fix chroma with rectangle=1.
reimar
parents: 36219
diff changeset
2076 mpglMultiTexCoord2f(GL_TEXTURE2, texcoords2[px], texcoords2[py]);
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2077 }
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2078 if (use_stipple)
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2079 mpglMultiTexCoord2f(GL_TEXTURE3, texcoords3[px], texcoords3[py]);
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2080 mpglVertex2f(vertices[px], vertices[py]);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
2081 }
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2082 mpglEnd();
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2083 }
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2084
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2085 /**
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2086 * \brief draw a texture part at given 2D coordinates
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2087 * \param x screen top coordinate
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2088 * \param y screen left coordinate
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2089 * \param w screen width coordinate
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2090 * \param h screen height coordinate
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2091 * \param tx texture top coordinate in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2092 * \param ty texture left coordinate in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2093 * \param tw texture part width in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2094 * \param th texture part height in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2095 * \param sx width of texture in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2096 * \param sy height of texture in pixels
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2097 * \param rect_tex whether this texture uses texture_rectangle extension
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2098 * \param is_yv12 if != 0, also draw the textures from units 1 and 2,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2099 * bits 8 - 15 and 16 - 23 specify the x and y scaling of those textures
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2100 * \param flip flip the texture upside down
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2101 * \param use_stipple overlay texture 3 as 4x4 alpha stipple
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2102 * \ingroup gltexture
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2103 */
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2104 void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2105 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2106 int sx, int sy, int rect_tex, int is_yv12, int flip,
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2107 int use_stipple) {
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2108 int chroma_x_shift = (is_yv12 >> 8) & 31;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2109 int chroma_y_shift = (is_yv12 >> 16) & 31;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2110 GLfloat xscale = 1 << chroma_x_shift;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2111 GLfloat yscale = 1 << chroma_y_shift;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2112 GLfloat tx2 = tx / xscale, ty2 = ty / yscale, tw2 = tw / xscale, th2 = th / yscale;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2113 if (!rect_tex) {
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2114 tx /= sx; ty /= sy; tw /= sx; th /= sy;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2115 tx2 = tx; ty2 = ty; tw2 = tw; th2 = th;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
2116 }
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2117 if (flip) {
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2118 y += h;
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2119 h = -h;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
2120 }
36123
99c8f7888cbe Simplify drawing OpenGL vertices.
reimar
parents: 36122
diff changeset
2121 draw_vertices(x, y, w, h, tx, ty, tw, th, tx2, ty2, tw2, th2, is_yv12, use_stipple);
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
2122 }
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
2123
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2124 #ifdef CONFIG_GL_WIN32
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2125 #include "w32_common.h"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2126 /**
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
2127 * \brief little helper since wglGetProcAddress definition does not fit our
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2128 * getProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2129 * \param procName name of function to look up
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2130 * \return function pointer returned by wglGetProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2131 */
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
2132 static void *w32gpa(const GLubyte *procName) {
25953
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
2133 HMODULE oglmod;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
2134 void *res = wglGetProcAddress(procName);
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
2135 if (res) return res;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
2136 oglmod = GetModuleHandle("opengl32.dll");
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
2137 return GetProcAddress(oglmod, procName);
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
2138 }
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
2139
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2140 static int setGlWindow_w32(MPGLContext *ctx)
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2141 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2142 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2143 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2144 int new_vinfo;
36076
e0a9f63abfdd Remove some nonsense code, align with X11 implementation.
reimar
parents: 35890
diff changeset
2145 HDC windc = vo_w32_get_dc(vo_w32_window);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2146 HGLRC new_context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2147 int keep_context = 0;
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2148 int res = SET_WINDOW_FAILED;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2149
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2150 // should only be needed when keeping context, but not doing glFinish
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2151 // can cause flickering even when we do not keep it.
16944
179a7a2857a8 do not call glFinish when we do not have a context
reimar
parents: 16879
diff changeset
2152 if (*context)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
2153 mpglFinish();
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2154 new_vinfo = GetPixelFormat(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2155 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2156 // we can keep the wglContext
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2157 new_context = *context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2158 keep_context = 1;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2159 } else {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2160 // create a context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2161 new_context = wglCreateContext(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2162 if (!new_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2163 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GL context!\n");
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2164 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2165 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2166 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2167
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2168 // set context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2169 if (!wglMakeCurrent(windc, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
2170 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not set GL context!\n");
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2171 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2172 wglDeleteContext(new_context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2173 }
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2174 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2175 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2176
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2177 // set new values
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2178 {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2179 RECT rect;
36076
e0a9f63abfdd Remove some nonsense code, align with X11 implementation.
reimar
parents: 35890
diff changeset
2180 GetClientRect(vo_w32_window, &rect);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2181 vo_dwidth = rect.right;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2182 vo_dheight = rect.bottom;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2183 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2184 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2185 if (*context)
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2186 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2187 *context = new_context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2188 *vinfo = new_vinfo;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
2189 getFunctions(w32gpa, NULL);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2190
36240
e8640e3f9b7e gl: Ensure gpu_def_sl_program is correctly initialized.
reimar
parents: 36239
diff changeset
2191 gpu_def_sl_program = 0;
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2192 gpu_yuv_sl_program = 0;
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2193
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2194 // and inform that reinit is neccessary
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2195 res = SET_WINDOW_REINIT;
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2196 } else
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2197 res = SET_WINDOW_OK;
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2198
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2199 out:
36076
e0a9f63abfdd Remove some nonsense code, align with X11 implementation.
reimar
parents: 35890
diff changeset
2200 vo_w32_release_dc(vo_w32_window, windc);
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
2201 return res;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2202 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2203
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2204 static void releaseGlContext_w32(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2205 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2206 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2207 *vinfo = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2208 if (*context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2209 wglMakeCurrent(0, 0);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2210 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2211 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2212 *context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
2213 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2214
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2215 static void swapGlBuffers_w32(MPGLContext *ctx) {
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
2216 HDC vo_hdc = vo_w32_get_dc(vo_w32_window);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2217 SwapBuffers(vo_hdc);
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
2218 vo_w32_release_dc(vo_w32_window, vo_hdc);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2219 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2220 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2221 #ifdef CONFIG_GL_X11
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2222 #include "x11_common.h"
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
2223
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2224 /**
14269
718ec28220d6 Doxygen comments improved
reimar
parents: 14142
diff changeset
2225 * \brief Returns the XVisualInfo associated with Window win.
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2226 * \param win Window whose XVisualInfo is returne.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2227 * \return XVisualInfo of the window. Caller must use XFree to free it.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2228 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2229 static XVisualInfo *getWindowVisualInfo(Window win) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2230 XWindowAttributes xw_attr;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2231 XVisualInfo vinfo_template;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2232 int tmp;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2233 XGetWindowAttributes(mDisplay, win, &xw_attr);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2234 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2235 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2236 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2237
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2238 static void appendstr(char **dst, const char *str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2239 {
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2240 int newsize;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2241 char *newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2242 if (!str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2243 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2244 newsize = strlen(*dst) + 1 + strlen(str) + 1;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2245 newstr = realloc(*dst, newsize);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2246 if (!newstr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2247 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2248 *dst = newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2249 strcat(*dst, " ");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2250 strcat(*dst, str);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2251 }
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2252
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2253 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2254 * \brief Changes the window in which video is displayed.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2255 * If possible only transfers the context to the new window, otherwise
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2256 * creates a new one, which must be initialized by the caller.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2257 * \param vinfo Currently used visual.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2258 * \param context Currently used context.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2259 * \param win window that should be used for drawing.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2260 * \return one of SET_WINDOW_FAILED, SET_WINDOW_OK or SET_WINDOW_REINIT.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2261 * In case of SET_WINDOW_REINIT the context could not be transfered
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2262 * and the caller must initialize it correctly.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2263 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2264 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2265 static int setGlWindow_x11(MPGLContext *ctx)
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2266 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2267 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2268 GLXContext *context = &ctx->context.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2269 Window win = vo_window;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2270 XVisualInfo *new_vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2271 GLXContext new_context = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2272 int keep_context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2273
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2274 // should only be needed when keeping context, but not doing glFinish
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2275 // can cause flickering even when we do not keep it.
16944
179a7a2857a8 do not call glFinish when we do not have a context
reimar
parents: 16879
diff changeset
2276 if (*context)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
2277 mpglFinish();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2278 new_vinfo = getWindowVisualInfo(win);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2279 if (*context && *vinfo && new_vinfo &&
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2280 (*vinfo)->visualid == new_vinfo->visualid) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2281 // we can keep the GLXContext
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2282 new_context = *context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2283 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2284 new_vinfo = *vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2285 keep_context = 1;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2286 } else {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2287 // create a context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2288 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2289 if (!new_context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2290 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GLX context!\n");
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2291 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2292 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2293 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2294 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2295
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2296 // set context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2297 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
2298 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not set GLX context!\n");
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2299 if (!keep_context) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
2300 glXDestroyContext(mDisplay, new_context);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2301 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2302 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2303 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2304 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2305
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2306 // set new values
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2307 vo_window = win;
27885
9829cfa41d6d Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents: 27865
diff changeset
2308 vo_x11_update_geometry();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2309 if (!keep_context) {
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
2310 void *(*getProcAddress)(const GLubyte *);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
2311 const char *(*glXExtStr)(Display *, int);
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2312 char *glxstr = strdup("");
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2313 if (*context)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2314 glXDestroyContext(mDisplay, *context);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2315 *context = new_context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2316 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2317 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2318 *vinfo = new_vinfo;
30946
82a429bcf680 Indentation fix.
reimar
parents: 30945
diff changeset
2319 getProcAddress = getdladdr("glXGetProcAddress");
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
2320 if (!getProcAddress)
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
2321 getProcAddress = getdladdr("glXGetProcAddressARB");
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
2322 glXExtStr = getdladdr("glXQueryExtensionsString");
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2323 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2324 appendstr(&glxstr, glXExtStr(mDisplay, DefaultScreen(mDisplay)));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2325 glXExtStr = getdladdr("glXGetClientString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2326 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2327 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2328 glXExtStr = getdladdr("glXGetServerString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2329 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2330 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2331
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2332 getFunctions(getProcAddress, glxstr);
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2333 if (!mpglGenPrograms && mpglGetString &&
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
2334 getProcAddress &&
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2335 strstr(mpglGetString(GL_EXTENSIONS), "GL_ARB_vertex_program")) {
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2336 mp_msg(MSGT_VO, MSGL_WARN, "Broken glXGetProcAddress detected, trying workaround\n");
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
2337 getFunctions(NULL, glxstr);
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2338 }
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2339 free(glxstr);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2340
36240
e8640e3f9b7e gl: Ensure gpu_def_sl_program is correctly initialized.
reimar
parents: 36239
diff changeset
2341 gpu_def_sl_program = 0;
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2342 gpu_yuv_sl_program = 0;
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2343
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2344 // and inform that reinit is neccessary
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2345 return SET_WINDOW_REINIT;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2346 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2347 return SET_WINDOW_OK;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2348 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2349
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2350 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2351 * \brief free the VisualInfo and GLXContext of an OpenGL context.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2352 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2353 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2354 static void releaseGlContext_x11(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2355 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2356 GLXContext *context = &ctx->context.x11;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2357 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2358 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2359 *vinfo = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2360 if (*context)
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2361 {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
2362 mpglFinish();
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2363 glXMakeCurrent(mDisplay, None, NULL);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2364 glXDestroyContext(mDisplay, *context);
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2365 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2366 *context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2367 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2368
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2369 static void swapGlBuffers_x11(MPGLContext *ctx) {
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2370 glXSwapBuffers(mDisplay, vo_window);
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2371 }
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2372 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2373
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2374 #if defined(CONFIG_GL_X11) || defined(CONFIG_GL_EGL_X11)
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2375 static int x11_check_events(void) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2376 return vo_x11_check_events(mDisplay);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2377 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2378 #endif
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2379
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2380 #ifdef CONFIG_GL_SDL
31032
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2381 #include "sdl_common.h"
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2382
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2383 static void swapGlBuffers_sdl(MPGLContext *ctx) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2384 SDL_GL_SwapBuffers();
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2385 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2386
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2387 static void *sdlgpa(const GLubyte *name) {
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2388 return SDL_GL_GetProcAddress(name);
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2389 }
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2390
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2391 static int setGlWindow_sdl(MPGLContext *ctx) {
34611
f1a31e5fc35f vo_sdl: reuse some more sdl_common code.
reimar
parents: 34572
diff changeset
2392 if (!sdl_set_mode(0, SDL_OPENGL | SDL_RESIZABLE))
31033
8d1080e9c92d Window resizing support for -vo gl with SDL backend.
reimar
parents: 31032
diff changeset
2393 return SET_WINDOW_FAILED;
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2394 SDL_GL_LoadLibrary(NULL);
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2395 getFunctions(sdlgpa, NULL);
36240
e8640e3f9b7e gl: Ensure gpu_def_sl_program is correctly initialized.
reimar
parents: 36239
diff changeset
2396 gpu_def_sl_program = 0;
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2397 gpu_yuv_sl_program = 0;
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2398 return SET_WINDOW_OK;
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2399 }
31032
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2400
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2401 static int sdl_check_events(void) {
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2402 int res = 0;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2403 SDL_Event event;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2404 while (SDL_PollEvent(&event)) {
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2405 res |= sdl_default_handle_event(&event);
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2406 }
31043
80036ef586ff Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents: 31041
diff changeset
2407 // poll "events" from within MPlayer code
80036ef586ff Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents: 31041
diff changeset
2408 res |= sdl_default_handle_event(NULL);
31033
8d1080e9c92d Window resizing support for -vo gl with SDL backend.
reimar
parents: 31032
diff changeset
2409 if (res & VO_EVENT_RESIZE)
8d1080e9c92d Window resizing support for -vo gl with SDL backend.
reimar
parents: 31032
diff changeset
2410 sdl_set_mode(0, SDL_OPENGL | SDL_RESIZABLE);
31032
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2411 return res;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2412 }
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2413
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2414 #endif
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2415
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2416 #if defined(CONFIG_GL_EGL_X11) || defined(CONFIG_GL_EGL_ANDROID)
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2417 static EGLDisplay eglDisplay = EGL_NO_DISPLAY;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2418 static EGLSurface eglSurface = EGL_NO_SURFACE;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2419
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2420 /*
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2421 * Some genius thought it a good idea to make
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2422 * eglGetProcAddress not work for core functions.
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2423 * So we have to use a non-portable way that in addition
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2424 * might also return symbols from a different library
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2425 * that the one providing the current context, great job!
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2426 * In addition the implementation of eglGetProcAddress
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2427 * on Galaxy S2 Android seems to actively return wrong
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2428 * pointers, it just gets better and better...
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2429 */
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2430 #ifdef CONFIG_GL_EGL_ANDROID
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2431 static EGLNativeWindowType vo_window;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2432 #define eglGetProcAddress(a) 0
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2433 #define mDisplay EGL_DEFAULT_DISPLAY
36209
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2434 static EGLNativeWindowType (*android_createDisplaySurface)(void);
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2435 #endif
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2436 static void *eglgpa(const GLubyte *name) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2437 void *res = eglGetProcAddress(name);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2438 if (!res) {
36122
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2439 static const char * const paths[] = {
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2440 "/usr/lib/libGLESv2.so",
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2441 "/usr/lib/x86_64-linux-gnu/libGLESv2.so",
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2442 "/usr/lib/i386-linux-gnu/libGLESv2.so",
36122
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2443 NULL};
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2444 int i;
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2445 void *h = NULL;
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2446 for (i = 0; !h && paths[i]; i++)
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2447 h = dlopen(paths[i], RTLD_LAZY);
cf45e1421a71 Search GLES library in more locations.
reimar
parents: 36121
diff changeset
2448 if (!h) return NULL;
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2449 res = dlsym(h, name);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2450 dlclose(h);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2451 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2452 return res;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2453 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2454
36131
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2455 static void GLAPIENTRY dummy_color(GLubyte r, GLubyte g, GLubyte b, GLubyte a) {
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2456 }
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2457
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2458 static void GLAPIENTRY dummy_texenvi(GLenum t, GLenum p, GLint v) {
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2459 }
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2460
36212
a19b74774033 SwapInterval support for GLES/EGL.
reimar
parents: 36211
diff changeset
2461 static int GLAPIENTRY SwapInterval_egl(int i) {
a19b74774033 SwapInterval support for GLES/EGL.
reimar
parents: 36211
diff changeset
2462 return eglSwapInterval(eglDisplay, i);
a19b74774033 SwapInterval support for GLES/EGL.
reimar
parents: 36211
diff changeset
2463 }
a19b74774033 SwapInterval support for GLES/EGL.
reimar
parents: 36211
diff changeset
2464
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2465 static int setGlWindow_egl(MPGLContext *ctx)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2466 {
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2467 static const EGLint cfg_attribs[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2468 static const EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2469 EGLContext *context = &ctx->context.egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2470 EGLContext new_context = NULL;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2471 EGLConfig eglConfig;
36210
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2472 EGLint id;
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2473 int num_configs;
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2474 #ifdef CONFIG_GL_EGL_ANDROID
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2475 EGLint w, h;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2476 if (vo_window) {
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2477 eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &w);
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2478 eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &h);
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2479 vo_screenwidth = vo_dwidth = w;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2480 vo_screenheight = vo_dheight = h;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2481 return SET_WINDOW_OK;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2482 }
36157
868f3a141dca Support -wid on Android.
reimar
parents: 36134
diff changeset
2483 if (WinID != -1)
868f3a141dca Support -wid on Android.
reimar
parents: 36134
diff changeset
2484 vo_window = (EGLNativeWindowType)(intptr_t)WinID;
36209
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2485 if (!vo_window) {
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2486 if (!android_createDisplaySurface) {
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2487 void *handle = dlopen("libui.so", RTLD_LAZY);
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2488 if (!handle)
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2489 return SET_WINDOW_FAILED;
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2490 android_createDisplaySurface = dlsym(handle, "android_createDisplaySurface");
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2491 if (!android_createDisplaySurface)
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2492 return SET_WINDOW_FAILED;
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2493 }
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2494 vo_window = android_createDisplaySurface();
36209
236179a10ee9 vo_gl: some Android fixes.
reimar
parents: 36191
diff changeset
2495 }
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2496 if (!vo_window)
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2497 return SET_WINDOW_FAILED;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2498 #endif
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2499 if (eglDisplay == EGL_NO_DISPLAY) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2500 eglDisplay = eglGetDisplay(mDisplay);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2501 if (eglDisplay == EGL_NO_DISPLAY) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2502 mp_msg(MSGT_VO, MSGL_FATAL, "eglGetDisplay failed: 0x%x\n", eglGetError());
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2503 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2504 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2505 if (!eglInitialize(eglDisplay, NULL, NULL)) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2506 mp_msg(MSGT_VO, MSGL_FATAL, "eglInitialize failed: 0x%x\n", eglGetError());
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2507 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2508 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2509 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2510 if (*context != EGL_NO_CONTEXT) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2511 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2512 eglDestroyContext(eglDisplay, *context);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2513 eglDestroySurface(eglDisplay, eglSurface);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2514 }
36210
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2515 if (mp_msg_test(MSGT_VO, MSGL_DBG2)) {
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2516 EGLConfig *configs;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2517 EGLint count = 0, i;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2518 eglGetConfigs(eglDisplay, NULL, 0, &count);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2519 configs = calloc(count, sizeof(*configs));
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2520 eglGetConfigs(eglDisplay, configs, count, &count);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2521 mp_msg(MSGT_VO, MSGL_V, " ID | sizes | gl |es2| samples | caveat\n"
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2522 " r g b a d s | es| vg | surfaces |\n");
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2523 for (i = 0; i < count; i++) {
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2524 EGLint rs, gs, bs, as, ds, ss, samples, surfaces, renderable, caveat;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2525 const char *caveatstr = "unknown";
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2526 eglGetConfigAttrib(eglDisplay, configs[i], EGL_CONFIG_ID, &id);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2527 eglGetConfigAttrib(eglDisplay, configs[i], EGL_RED_SIZE, &rs);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2528 eglGetConfigAttrib(eglDisplay, configs[i], EGL_GREEN_SIZE, &gs);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2529 eglGetConfigAttrib(eglDisplay, configs[i], EGL_BLUE_SIZE, &bs);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2530 eglGetConfigAttrib(eglDisplay, configs[i], EGL_ALPHA_SIZE, &as);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2531 eglGetConfigAttrib(eglDisplay, configs[i], EGL_DEPTH_SIZE, &ds);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2532 eglGetConfigAttrib(eglDisplay, configs[i], EGL_STENCIL_SIZE, &ss);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2533 eglGetConfigAttrib(eglDisplay, configs[i], EGL_SAMPLES, &samples);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2534 eglGetConfigAttrib(eglDisplay, configs[i], EGL_SURFACE_TYPE, &surfaces);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2535 eglGetConfigAttrib(eglDisplay, configs[i], EGL_RENDERABLE_TYPE, &renderable);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2536 eglGetConfigAttrib(eglDisplay, configs[i], EGL_CONFIG_CAVEAT, &caveat);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2537 switch (caveat) {
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2538 case EGL_SLOW_CONFIG: caveatstr = "slow"; break;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2539 case EGL_NON_CONFORMANT_CONFIG: caveatstr = "nonconf"; break;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2540 case EGL_NONE: caveatstr = "none"; break;
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2541 }
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2542 mp_msg(MSGT_VO, MSGL_V, "0x%03x %2i %2i %2i %2i %2i %2i %c %c %c %c %2i 0x%03x %s (0x%x)\n",
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2543 id, rs, gs, bs, as, ds, ss,
36211
40a06b268bb6 Cosmetics: remove tabs that slipped in by accident.
reimar
parents: 36210
diff changeset
2544 renderable & EGL_OPENGL_BIT ? '+' : '-',
40a06b268bb6 Cosmetics: remove tabs that slipped in by accident.
reimar
parents: 36210
diff changeset
2545 renderable & EGL_OPENGL_ES_BIT ? '+' : '-',
40a06b268bb6 Cosmetics: remove tabs that slipped in by accident.
reimar
parents: 36210
diff changeset
2546 renderable & EGL_OPENGL_ES2_BIT ? '+' : '-',
40a06b268bb6 Cosmetics: remove tabs that slipped in by accident.
reimar
parents: 36210
diff changeset
2547 renderable & EGL_OPENVG_BIT ? '+' : '-',
36210
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2548 samples, surfaces, caveatstr, caveat);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2549 }
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2550 free(configs);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2551 }
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2552 if (!eglChooseConfig(eglDisplay, cfg_attribs, &eglConfig, 1, &num_configs) ||
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2553 num_configs != 1)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2554 return SET_WINDOW_FAILED;
36210
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2555 eglGetConfigAttrib(eglDisplay, eglConfig, EGL_CONFIG_ID, &id);
6e2e30ee31d0 Add support for printing available egl configs.
reimar
parents: 36209
diff changeset
2556 mp_msg(MSGT_VO, MSGL_V, "Chosen config %x\n", id);
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2557 eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, vo_window, NULL);
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2558 if (eglSurface == EGL_NO_SURFACE)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2559 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2560
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2561 new_context = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, ctx_attribs);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2562 if (new_context == EGL_NO_CONTEXT)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2563 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2564 if (!eglMakeCurrent(eglDisplay, eglSurface, eglSurface, new_context))
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2565 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2566
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2567 // set new values
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2568 #ifdef CONFIG_GL_EGL_X11
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2569 vo_x11_update_geometry();
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2570 #else
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2571 eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &w);
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2572 eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &h);
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2573 vo_screenwidth = vo_dwidth = w;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2574 vo_screenheight = vo_dheight = h;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2575 #endif
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2576 *context = new_context;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2577
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2578 getFunctions(eglgpa, eglQueryString(eglDisplay, EGL_EXTENSIONS));
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2579 mpglBegin = NULL;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2580 mpglDrawBuffer = NULL;
36212
a19b74774033 SwapInterval support for GLES/EGL.
reimar
parents: 36211
diff changeset
2581 mpglSwapInterval = SwapInterval_egl;
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2582
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2583 gpu_def_sl_program = new_gpu_program();
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2584 set_frag_src(gpu_def_sl_program, def_frag_shader);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2585 mpglLoadMatrixf = matrix_uniform;
36131
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2586 mpglColor4ub = dummy_color;
08f70b06452c Provide dummy glColor4ub glTexEnvi functions.
reimar
parents: 36130
diff changeset
2587 mpglTexEnvi = dummy_texenvi;
36126
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2588 use_program(gpu_def_sl_program);
fd34a83228ca Switch OpenGL ES renderer to 2.0.
reimar
parents: 36125
diff changeset
2589
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2590 gpu_yuv_sl_program = 0;
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2591
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2592 // and inform that reinit is necessary
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2593 return SET_WINDOW_REINIT;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2594 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2595
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2596 /**
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2597 * \brief free the VisualInfo and GLXContext of an OpenGL context.
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2598 * \ingroup glcontext
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2599 */
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2600 static void releaseGlContext_egl(MPGLContext *ctx) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2601 EGLContext *context = &ctx->context.egl;
36214
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2602 if (*context != EGL_NO_CONTEXT) {
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2603 mpglFinish();
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2604 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2605 eglDestroyContext(eglDisplay, *context);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2606 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2607 *context = EGL_NO_CONTEXT;
36214
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2608 if (eglSurface != EGL_NO_SURFACE)
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2609 eglDestroySurface(eglDisplay, eglSurface);
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2610 eglSurface = EGL_NO_SURFACE;
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2611 if (eglDisplay != EGL_NO_DISPLAY)
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2612 eglTerminate(eglDisplay);
fc128e175f72 Fully uninitialize EGL.
reimar
parents: 36213
diff changeset
2613 eglDisplay = EGL_NO_DISPLAY;
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2614 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2615
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2616 static void swapGlBuffers_egl(MPGLContext *ctx) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2617 eglSwapBuffers(eglDisplay, eglSurface);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2618 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2619
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2620 #endif
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2621
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2622 static int setGlWindow_dummy(MPGLContext *ctx) {
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
2623 getFunctions(NULL, NULL);
36240
e8640e3f9b7e gl: Ensure gpu_def_sl_program is correctly initialized.
reimar
parents: 36239
diff changeset
2624 gpu_def_sl_program = 0;
36238
1573608248ad vo_gl: Make yuv=8 compatible with OpenGL in addition to OpenGL ES.
reimar
parents: 36235
diff changeset
2625 gpu_yuv_sl_program = 0;
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2626 return SET_WINDOW_OK;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2627 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2628
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2629 static void releaseGlContext_dummy(MPGLContext *ctx) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2630 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2631
35087
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2632 static void swapGlBuffers_dummy(MPGLContext *ctx) {
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2633 }
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2634
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2635 static int dummy_check_events(void) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2636 return 0;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2637 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2638
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2639 static void dummy_fullscreen(void) {
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2640 vo_fs = !vo_fs;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2641 }
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2642
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2643 static void dummy_update_xinerama_info(void) {
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2644 if (vo_screenwidth <= 0 || vo_screenheight <= 0) {
31041
42b4b532b86a Missing space in error message.
reimar
parents: 31037
diff changeset
2645 mp_msg(MSGT_VO, MSGL_ERR, "You must specify the screen dimensions "
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2646 "with -screenw and -screenh\n");
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2647 vo_screenwidth = 1280;
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2648 vo_screenheight = 768;
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2649 }
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2650 aspect_save_screenres(vo_screenwidth, vo_screenheight);
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2651 }
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2652
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2653 int init_mpglcontext(MPGLContext *ctx, enum MPGLType type) {
31044
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2654 if (type == GLTYPE_AUTO) {
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2655 int res = init_mpglcontext(ctx, GLTYPE_W32);
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2656 if (res) return res;
35096
d1651b078aa7 gl: Prefer OSX backend over SDL.
reimar
parents: 35094
diff changeset
2657 res = init_mpglcontext(ctx, GLTYPE_OSX);
d1651b078aa7 gl: Prefer OSX backend over SDL.
reimar
parents: 35094
diff changeset
2658 if (res) return res;
31044
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2659 res = init_mpglcontext(ctx, GLTYPE_X11);
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2660 if (res) return res;
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2661 res = init_mpglcontext(ctx, GLTYPE_SDL);
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2662 if (res) return res;
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2663 res = init_mpglcontext(ctx, GLTYPE_EGL_ANDROID);
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2664 if (res) return res;
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2665 res = init_mpglcontext(ctx, GLTYPE_EGL_X11);
31044
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2666 return res;
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2667 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2668 memset(ctx, 0, sizeof(*ctx));
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2669 ctx->setGlWindow = setGlWindow_dummy;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2670 ctx->releaseGlContext = releaseGlContext_dummy;
35087
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2671 ctx->swapGlBuffers = swapGlBuffers_dummy;
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2672 ctx->update_xinerama_info = dummy_update_xinerama_info;
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2673 ctx->check_events = dummy_check_events;
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2674 ctx->fullscreen = dummy_fullscreen;
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2675 ctx->type = type;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2676 switch (ctx->type) {
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2677 #ifdef CONFIG_GL_WIN32
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2678 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2679 ctx->setGlWindow = setGlWindow_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2680 ctx->releaseGlContext = releaseGlContext_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2681 ctx->swapGlBuffers = swapGlBuffers_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2682 ctx->update_xinerama_info = w32_update_xinerama_info;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2683 ctx->border = vo_w32_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2684 ctx->check_events = vo_w32_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2685 ctx->fullscreen = vo_w32_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2686 ctx->ontop = vo_w32_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2687 return vo_w32_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2688 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2689 #ifdef CONFIG_GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2690 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2691 ctx->setGlWindow = setGlWindow_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2692 ctx->releaseGlContext = releaseGlContext_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2693 ctx->swapGlBuffers = swapGlBuffers_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2694 ctx->update_xinerama_info = update_xinerama_info;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2695 ctx->border = vo_x11_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2696 ctx->check_events = x11_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2697 ctx->fullscreen = vo_x11_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2698 ctx->ontop = vo_x11_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2699 return vo_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2700 #endif
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2701 #ifdef CONFIG_GL_SDL
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2702 case GLTYPE_SDL:
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2703 SDL_Init(SDL_INIT_VIDEO);
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2704 ctx->setGlWindow = setGlWindow_sdl;
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2705 ctx->swapGlBuffers = swapGlBuffers_sdl;
31032
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2706 ctx->check_events = sdl_check_events;
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2707 ctx->fullscreen = vo_sdl_fullscreen;
31037
4f273572e445 Share SDL initialization code.
reimar
parents: 31035
diff changeset
2708 return vo_sdl_init();
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2709 #endif
35889
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2710 #ifdef CONFIG_GL_EGL_ANDROID
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2711 case GLTYPE_EGL_ANDROID:
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2712 ctx->setGlWindow = setGlWindow_egl;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2713 ctx->releaseGlContext = releaseGlContext_egl;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2714 ctx->swapGlBuffers = swapGlBuffers_egl;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2715 return 1;
a51578d7e264 Add (hackish) support for OpenGL on Android.
reimar
parents: 35888
diff changeset
2716 #endif
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2717 #ifdef CONFIG_GL_EGL_X11
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2718 case GLTYPE_EGL_X11:
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2719 ctx->setGlWindow = setGlWindow_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2720 ctx->releaseGlContext = releaseGlContext_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2721 ctx->swapGlBuffers = swapGlBuffers_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2722 ctx->update_xinerama_info = update_xinerama_info;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2723 ctx->border = vo_x11_border;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2724 ctx->check_events = x11_check_events;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2725 ctx->fullscreen = vo_x11_fullscreen;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2726 ctx->ontop = vo_x11_ontop;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2727 return vo_init();
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2728 #endif
35089
a87c434ecaa3 Allow compiling -vo gl with OSX backend even if X11 and SDL are not available.
reimar
parents: 35087
diff changeset
2729 #ifdef CONFIG_GL_OSX
35087
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2730 case GLTYPE_OSX:
35094
967b0f13715c Provide a swap buffer function for OS X.
reimar
parents: 35089
diff changeset
2731 ctx->swapGlBuffers = vo_osx_swap_buffers;
35087
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2732 ctx->update_xinerama_info = vo_osx_update_xinerama_info;
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2733 ctx->check_events = vo_osx_check_events;
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2734 ctx->fullscreen = vo_osx_fullscreen;
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2735 ctx->ontop = vo_osx_ontop;
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2736 return vo_osx_init();
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2737 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2738 default:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2739 return 0;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2740 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2741 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2742
36219
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2743 int mpglcontext_create_window(MPGLContext *ctx, uint32_t d_width, uint32_t d_height,
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2744 uint32_t flags, const char *title)
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2745 {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2746 #ifdef CONFIG_GL_WIN32
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2747 if (ctx->type == GLTYPE_W32 && !vo_w32_config(d_width, d_height, flags))
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2748 return -1;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2749 #endif
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2750 #ifdef CONFIG_GL_OSX
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2751 if (ctx->type == GLTYPE_OSX && !vo_osx_config(d_width, d_height, flags))
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2752 return -1;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2753 #endif
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2754 #ifdef CONFIG_GL_EGL_X11
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2755 if (ctx->type == GLTYPE_EGL_X11) {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2756 XVisualInfo vinfo = { .visual = CopyFromParent, .depth = CopyFromParent };
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2757 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, flags,
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2758 CopyFromParent, "gl", title);
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2759 }
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2760 #endif
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2761 #ifdef CONFIG_GL_X11
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2762 if (ctx->type == GLTYPE_X11) {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2763 int default_glx_attribs[] = {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2764 GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2765 GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, (flags & VOFLAG_DEPTH) ? 1 : 0, None
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2766 };
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2767 static const int stereo_glx_attribs[] = {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2768 GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2769 GLX_DOUBLEBUFFER, GLX_STEREO, None
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2770 };
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2771 XVisualInfo *vinfo = NULL;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2772 if (flags & VOFLAG_STEREO) {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2773 vinfo = glXChooseVisual(mDisplay, mScreen, stereo_glx_attribs);
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2774 if (!vinfo)
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2775 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Could not find a stereo visual, "
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2776 "3D will probably not work!\n");
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2777 }
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2778 if (!vinfo)
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2779 vinfo = glXChooseVisual(mDisplay, mScreen, default_glx_attribs);
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2780 if (!vinfo) {
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2781 mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n");
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2782 return -1;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2783 }
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2784 mp_msg(MSGT_VO, MSGL_V, "[gl] GLX chose visual with ID 0x%x\n", (int)vinfo->visualid);
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2785
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2786 vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags,
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2787 XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone),
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2788 "gl", title);
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2789 }
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2790 #endif
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2791 #ifdef CONFIG_GL_SDL
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2792 if (ctx->type == GLTYPE_SDL && !vo_sdl_config(d_width, d_height, flags, title))
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2793 return -1;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2794 #endif
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2795 return 0;
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2796 }
673719da1a92 Extract window creation code to common file.
reimar
parents: 36214
diff changeset
2797
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2798 void uninit_mpglcontext(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2799 ctx->releaseGlContext(ctx);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2800 switch (ctx->type) {
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2801 #ifdef CONFIG_GL_WIN32
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2802 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2803 vo_w32_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2804 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2805 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2806 #ifdef CONFIG_GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2807 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2808 vo_x11_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2809 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2810 #endif
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2811 #ifdef CONFIG_GL_SDL
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2812 case GLTYPE_SDL:
31037
4f273572e445 Share SDL initialization code.
reimar
parents: 31035
diff changeset
2813 vo_sdl_uninit();
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2814 break;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2815 #endif
35089
a87c434ecaa3 Allow compiling -vo gl with OSX backend even if X11 and SDL are not available.
reimar
parents: 35087
diff changeset
2816 #ifdef CONFIG_GL_OSX
35087
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2817 case GLTYPE_OSX:
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2818 vo_osx_uninit();
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2819 break;
078a00af881c Use OSX common layer in -vo gl.
reimar
parents: 35010
diff changeset
2820 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2821 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2822 memset(ctx, 0, sizeof(*ctx));
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2823 }