annotate libvo/gl_common.c @ 34972:445009e9ee8d

When the LUMINANCE16 format is less than 14 bit try to use a depth texture instead. On Intel 945 this is vastly faster (after re-enabling the Z16 support in the driver again for newer versions) due to no need for any software conversion. It also has slightly higher precision, good enough for the 14 and possibly 12 bit formats. 10 and 9 bit formats still look horrible, no idea what causes this, there is very little information on the internal precision of the hardware. It is still useful for those since swscale is faster converting 10 bit formats to 16 bit than to 8 bit.
author reimar
date Wed, 08 Aug 2012 19:18:02 +0000
parents 7974179b9471
children 7a51bcd28fd1
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);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
51 void (GLAPIENTRY *mpglMatrixMode)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
52 void (GLAPIENTRY *mpglLoadIdentity)(void);
34337
f8c523d09e5e Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents: 34174
diff changeset
53 void (GLAPIENTRY *mpglLoadMatrixf)(float *);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
54 void (GLAPIENTRY *mpglPushMatrix)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
55 void (GLAPIENTRY *mpglPopMatrix)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
56 void (GLAPIENTRY *mpglClear)(GLbitfield);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
57 GLuint (GLAPIENTRY *mpglGenLists)(GLsizei);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
58 void (GLAPIENTRY *mpglDeleteLists)(GLuint, GLsizei);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
59 void (GLAPIENTRY *mpglNewList)(GLuint, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
60 void (GLAPIENTRY *mpglEndList)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
61 void (GLAPIENTRY *mpglCallList)(GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
62 void (GLAPIENTRY *mpglCallLists)(GLsizei, GLenum, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
63 void (GLAPIENTRY *mpglGenTextures)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
64 void (GLAPIENTRY *mpglDeleteTextures)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
65 void (GLAPIENTRY *mpglTexEnvf)(GLenum, GLenum, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
66 void (GLAPIENTRY *mpglTexEnvi)(GLenum, GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
67 void (GLAPIENTRY *mpglColor4ub)(GLubyte, GLubyte, GLubyte, GLubyte);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
68 void (GLAPIENTRY *mpglColor4f)(GLfloat, GLfloat, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
69 void (GLAPIENTRY *mpglClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
70 void (GLAPIENTRY *mpglClearDepth)(GLclampd);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
71 void (GLAPIENTRY *mpglDepthFunc)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
72 void (GLAPIENTRY *mpglEnable)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
73 void (GLAPIENTRY *mpglDisable)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
74 const GLubyte *(GLAPIENTRY *mpglGetString)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
75 void (GLAPIENTRY *mpglDrawBuffer)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
76 void (GLAPIENTRY *mpglDepthMask)(GLboolean);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
77 void (GLAPIENTRY *mpglBlendFunc)(GLenum, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
78 void (GLAPIENTRY *mpglFlush)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
79 void (GLAPIENTRY *mpglFinish)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
80 void (GLAPIENTRY *mpglPixelStorei)(GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
81 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
82 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
83 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
84 void (GLAPIENTRY *mpglTexParameteri)(GLenum, GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
85 void (GLAPIENTRY *mpglTexParameterf)(GLenum, GLenum, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
86 void (GLAPIENTRY *mpglTexParameterfv)(GLenum, GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
87 void (GLAPIENTRY *mpglTexCoord2f)(GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
88 void (GLAPIENTRY *mpglVertex2f)(GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
89 void (GLAPIENTRY *mpglVertex3f)(GLfloat, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
90 void (GLAPIENTRY *mpglNormal3f)(GLfloat, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
91 void (GLAPIENTRY *mpglLightfv)(GLenum, GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
92 void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
93 void (GLAPIENTRY *mpglShadeModel)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
94 void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
95 void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
96
16595
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 * \defgroup glextfunctions OpenGL extension functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
99 *
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
100 * 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
101 * context is created
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
102 * \{
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
103 */
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
104 void (GLAPIENTRY *mpglGenBuffers)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
105 void (GLAPIENTRY *mpglDeleteBuffers)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
106 void (GLAPIENTRY *mpglBindBuffer)(GLenum, GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
107 GLvoid* (GLAPIENTRY *mpglMapBuffer)(GLenum, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
108 GLboolean (GLAPIENTRY *mpglUnmapBuffer)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
109 void (GLAPIENTRY *mpglBufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
110 void (GLAPIENTRY *mpglCombinerParameterfv)(GLenum, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
111 void (GLAPIENTRY *mpglCombinerParameteri)(GLenum, GLint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
112 void (GLAPIENTRY *mpglCombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
113 GLenum);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
114 void (GLAPIENTRY *mpglCombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
115 GLenum, GLenum, GLboolean, GLboolean,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
116 GLboolean);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
117 void (GLAPIENTRY *mpglBeginFragmentShader)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
118 void (GLAPIENTRY *mpglEndFragmentShader)(void);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
119 void (GLAPIENTRY *mpglSampleMap)(GLuint, GLuint, GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
120 void (GLAPIENTRY *mpglColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
121 GLuint, GLuint, GLuint, GLuint, GLuint);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
122 void (GLAPIENTRY *mpglColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
123 GLuint, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
124 GLuint, GLuint, GLuint);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
125 void (GLAPIENTRY *mpglSetFragmentShaderConstant)(GLuint, const GLfloat *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
126 void (GLAPIENTRY *mpglActiveTexture)(GLenum);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
127 void (GLAPIENTRY *mpglBindTexture)(GLenum, GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
128 void (GLAPIENTRY *mpglMultiTexCoord2f)(GLenum, GLfloat, GLfloat);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
129 void (GLAPIENTRY *mpglGenPrograms)(GLsizei, GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
130 void (GLAPIENTRY *mpglDeletePrograms)(GLsizei, const GLuint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
131 void (GLAPIENTRY *mpglBindProgram)(GLenum, GLuint);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
132 void (GLAPIENTRY *mpglProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
133 void (GLAPIENTRY *mpglGetProgramiv)(GLenum, GLenum, GLint *);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
134 void (GLAPIENTRY *mpglProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
135 GLfloat, GLfloat);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
136 int (GLAPIENTRY *mpglSwapInterval)(int);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
137 void (GLAPIENTRY *mpglTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei,
18578
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
138 GLint, GLenum, GLenum, const GLvoid *);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
139 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
140 void (GLAPIENTRY *mpglFreeMemoryMESA)(void *, int, void *);
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
141 /** \} */ // end of glextfunctions group
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
142
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
143
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
144 void (GLAPIENTRY *mpglVertexPointer)(GLint, GLenum, GLsizei, const GLvoid *);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
145 void (GLAPIENTRY *mpglTexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
146 void (GLAPIENTRY *mpglClientActiveTexture)(GLenum);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
147 void (GLAPIENTRY *mpglEnableClientState)(GLenum);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
148 void (GLAPIENTRY *mpglDisableClientState)(GLenum);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
149 void (GLAPIENTRY *mpglDrawArrays)(GLenum, GLint, GLsizei);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
150
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
151 //! \defgroup glgeneral OpenGL general helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
152
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
153 //! \defgroup glcontext OpenGL context management helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
154
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
155 //! \defgroup gltexture OpenGL texture handling helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
156
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
157 //! \defgroup glconversion OpenGL conversion helper functions
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
158
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
159 static GLint hqtexfmt;
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
160 static int use_depth_l16;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
161
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
162 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
163 * \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
164 * \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
165 * \ingroup glgeneral
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
166 */
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
167 void glAdjustAlignment(int stride) {
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
168 GLint gl_alignment;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
169 if (stride % 8 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
170 gl_alignment=8;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
171 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
172 gl_alignment=4;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
173 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
174 gl_alignment=2;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
175 else
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
176 gl_alignment=1;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
177 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
178 }
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
179
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
180 struct gl_name_map_struct {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
181 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
182 const char *name;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
183 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
184
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
185 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
186 #define MAP(a) {a, #a}
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
187 //! mapping table for the glValName function
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
188 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
189 // internal format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
190 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
191 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
192 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
193 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
194
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
195 // format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
196 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
197 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
198 MAP(GL_COLOR_INDEX),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
199 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
200 MAP(GL_BGR), MAP(GL_BGRA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
201
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
202 //type
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
203 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
204 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
205 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
206 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
207 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
208 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
209 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
210 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
211 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
212 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
213 {0, 0}
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
214 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
215 #undef MAP
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 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
218 * \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
219 * \param value the constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
220 * \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
221 * \ingroup glgeneral
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
222 */
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
223 const char *glValName(GLint value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
224 {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
225 int i = 0;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
226
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
227 while (gl_name_map[i].name) {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
228 if (gl_name_map[i].value == value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
229 return gl_name_map[i].name;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
230 i++;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
231 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
232 return "Unknown format!";
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
233 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
234
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
235 //! 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
236 #define TEXTUREFORMAT_ALWAYS GL_RGB8
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
237 #undef TEXTUREFORMAT_ALWAYS
14078
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 find the OpenGL settings coresponding to format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
241 *
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
242 * All parameters may be NULL.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
243 * \param fmt MPlayer format to analyze.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
244 * \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
245 * \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
246 * 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
247 * \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
248 * \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
249 * \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
250 * \ingroup gltexture
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
251 */
16879
6ea220b10e8e More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents: 16648
diff changeset
252 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
253 GLenum *gl_format, GLenum *gl_type)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
254 {
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
255 int supported = 1;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
256 int dummy1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
257 GLenum dummy2;
16303
a87c6cf3fe52 Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents: 16270
diff changeset
258 GLint dummy3;
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
259 if (!bpp) bpp = &dummy1;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
260 if (!gl_texfmt) gl_texfmt = &dummy3;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
261 if (!gl_format) gl_format = &dummy2;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
262 if (!gl_type) gl_type = &dummy2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
263
33365
706871635af7 Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents: 32537
diff changeset
264 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
265 // reduce the possible cases a bit
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
266 if (IMGFMT_IS_YUVP16_LE(fmt))
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
267 fmt = IMGFMT_420P16_LE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
268 else if (IMGFMT_IS_YUVP16_BE(fmt))
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
269 fmt = IMGFMT_420P16_BE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
270 else
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
271 fmt = IMGFMT_YV12;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
272 }
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
273
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
274 *bpp = IMGFMT_IS_BGR(fmt)?IMGFMT_BGR_DEPTH(fmt):IMGFMT_RGB_DEPTH(fmt);
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
275 *gl_texfmt = GL_RGB;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
276 switch (fmt) {
34572
2a372b469420 Support displaying 64bit RGB via OpenGL.
cehoyos
parents: 34478
diff changeset
277 case IMGFMT_RGB64NE:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
278 *gl_texfmt = GL_RGBA16;
29902
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
279 case IMGFMT_RGB48NE:
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
280 *gl_format = GL_RGB;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
281 *gl_type = GL_UNSIGNED_SHORT;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
282 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
283 case IMGFMT_RGB24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
284 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
285 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
286 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
287 case IMGFMT_RGBA:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
288 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
289 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
290 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
291 break;
30110
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
292 case IMGFMT_420P16:
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
293 supported = 0; // no native YUV support
33366
9b1c1b141f04 Request GL_LUMINANCE16 as internal format for > 8 bit YUV formats.
reimar
parents: 33365
diff changeset
294 *gl_texfmt = GL_LUMINANCE16;
30110
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
295 *bpp = 16;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
296 *gl_format = GL_LUMINANCE;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
297 *gl_type = GL_UNSIGNED_SHORT;
19414a605695 Add support for 16-bit per component YUV formats.
reimar
parents: 30108
diff changeset
298 break;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
299 case IMGFMT_YV12:
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
300 supported = 0; // no native YV12 support
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
301 case IMGFMT_Y800:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
302 case IMGFMT_Y8:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
303 *gl_texfmt = GL_LUMINANCE;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
304 *bpp = 8;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
305 *gl_format = GL_LUMINANCE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
306 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
307 break;
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
308 case IMGFMT_UYVY:
33606
959708d3e6f5 Second GL_YCBCR_MESA format is YVYU, not YUY2.
reimar
parents: 33366
diff changeset
309 // IMGFMT_YUY2 would be more logical for the _REV format,
959708d3e6f5 Second GL_YCBCR_MESA format is YVYU, not YUY2.
reimar
parents: 33366
diff changeset
310 // but gives clearly swapped colors.
959708d3e6f5 Second GL_YCBCR_MESA format is YVYU, not YUY2.
reimar
parents: 33366
diff changeset
311 case IMGFMT_YVYU:
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
312 *gl_texfmt = GL_YCBCR_MESA;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
313 *bpp = 16;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
314 *gl_format = GL_YCBCR_MESA;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
315 *gl_type = fmt == IMGFMT_UYVY ? GL_UNSIGNED_SHORT_8_8 : GL_UNSIGNED_SHORT_8_8_REV;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
316 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
317 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
318 // 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
319 // swscale produces works
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
320 case IMGFMT_RGB8:
33919
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
321 *gl_format = GL_RGB;
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
322 *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
323 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
324 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
325 case IMGFMT_RGB15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
326 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
327 *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
328 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
329 case IMGFMT_RGB16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
330 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
331 *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
332 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
333 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
334 case IMGFMT_BGR8:
33918
294df8d5648d Fix spelling.
reimar
parents: 33882
diff changeset
335 // 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
336 // 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
337 // 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
338 // blue than to red, which isn't wanted
33919
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
339 *gl_format = GL_RGB;
2d87bbea9e0f Fix disabled code.
reimar
parents: 33918
diff changeset
340 *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
341 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
342 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
343 case IMGFMT_BGR15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
344 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
345 *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
346 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
347 case IMGFMT_BGR16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
348 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
349 *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
350 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
351 case IMGFMT_BGR24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
352 *gl_format = GL_BGR;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
353 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
354 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
355 case IMGFMT_BGRA:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
356 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
357 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
358 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
359 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
360 default:
34842
a31ac47eba39 Change some texture formats to synonyms that Mesa GLES accepts.
reimar
parents: 34841
diff changeset
361 *gl_texfmt = GL_RGBA;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
362 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
363 *gl_type = GL_UNSIGNED_BYTE;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
364 supported = 0;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
365 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
366 #ifdef TEXTUREFORMAT_ALWAYS
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
367 *gl_texfmt = TEXTUREFORMAT_ALWAYS;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
368 #endif
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
369 return supported;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
370 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
371
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
372 #ifdef HAVE_LIBDL
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
373 #include <dlfcn.h>
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
374 #endif
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
375 /**
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
376 * \brief find address of a linked function
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
377 * \param s name of function to find
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
378 * \return address of function or NULL if not found
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
379 */
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
380 static void *getdladdr(const char *s) {
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
381 void *ret = NULL;
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
382 #ifdef HAVE_LIBDL
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
383 void *handle = dlopen(NULL, RTLD_LAZY);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
384 if (!handle)
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
385 return NULL;
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
386 ret = dlsym(handle, s);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
387 dlclose(handle);
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
388 #endif
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
389 return ret;
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
390 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
391
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
392 typedef struct {
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
393 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
394 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
395 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
396 void *fallback;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
397 } extfunc_desc_t;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
398
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
399 #if !defined(CONFIG_GL_WIN32) && !defined(CONFIG_GL_X11)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
400 #define DEF_FUNC_DESC(name) {&mpgl##name, NULL, {"gl"#name, NULL}, NULL}
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
401 #else
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
402 #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
403 #endif
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
404 static const extfunc_desc_t extfuncs[] = {
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
405 // 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
406 // different "backends" with one binary
34841
4e749c1bbf49 Make a glGetError function pointer available.
reimar
parents: 34748
diff changeset
407 DEF_FUNC_DESC(GetError),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
408 DEF_FUNC_DESC(Begin),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
409 DEF_FUNC_DESC(End),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
410 DEF_FUNC_DESC(Viewport),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
411 DEF_FUNC_DESC(MatrixMode),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
412 DEF_FUNC_DESC(LoadIdentity),
34337
f8c523d09e5e Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents: 34174
diff changeset
413 DEF_FUNC_DESC(LoadMatrixf),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
414 DEF_FUNC_DESC(PushMatrix),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
415 DEF_FUNC_DESC(PopMatrix),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
416 DEF_FUNC_DESC(Clear),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
417 DEF_FUNC_DESC(GenLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
418 DEF_FUNC_DESC(DeleteLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
419 DEF_FUNC_DESC(NewList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
420 DEF_FUNC_DESC(EndList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
421 DEF_FUNC_DESC(CallList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
422 DEF_FUNC_DESC(CallLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
423 DEF_FUNC_DESC(GenTextures),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
424 DEF_FUNC_DESC(DeleteTextures),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
425 DEF_FUNC_DESC(TexEnvf),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
426 DEF_FUNC_DESC(TexEnvi),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
427 DEF_FUNC_DESC(Color4ub),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
428 DEF_FUNC_DESC(Color4f),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
429 DEF_FUNC_DESC(ClearColor),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
430 DEF_FUNC_DESC(ClearDepth),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
431 DEF_FUNC_DESC(DepthFunc),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
432 DEF_FUNC_DESC(Enable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
433 DEF_FUNC_DESC(Disable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
434 DEF_FUNC_DESC(DrawBuffer),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
435 DEF_FUNC_DESC(DepthMask),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
436 DEF_FUNC_DESC(BlendFunc),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
437 DEF_FUNC_DESC(Flush),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
438 DEF_FUNC_DESC(Finish),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
439 DEF_FUNC_DESC(PixelStorei),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
440 DEF_FUNC_DESC(TexImage1D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
441 DEF_FUNC_DESC(TexImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
442 DEF_FUNC_DESC(TexSubImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
443 DEF_FUNC_DESC(TexParameteri),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
444 DEF_FUNC_DESC(TexParameterf),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
445 DEF_FUNC_DESC(TexParameterfv),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
446 DEF_FUNC_DESC(TexCoord2f),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
447 DEF_FUNC_DESC(Vertex2f),
30137
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
448 DEF_FUNC_DESC(Vertex3f),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
449 DEF_FUNC_DESC(Normal3f),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
450 DEF_FUNC_DESC(Lightfv),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
451 DEF_FUNC_DESC(ColorMaterial),
28ca3af546f5 Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents: 30110
diff changeset
452 DEF_FUNC_DESC(ShadeModel),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
453 DEF_FUNC_DESC(GetIntegerv),
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
454 DEF_FUNC_DESC(ColorMask),
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
455
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
456 // here start the real extensions
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
457 {&mpglGenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
458 {&mpglDeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
459 {&mpglBindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
460 {&mpglMapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
461 {&mpglUnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
462 {&mpglBufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
463 {&mpglCombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
464 {&mpglCombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
465 {&mpglCombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
466 {&mpglCombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
467 {&mpglBeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
468 {&mpglEndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
469 {&mpglSampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
470 {&mpglColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
471 {&mpglColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
472 {&mpglSetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
473 {&mpglActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
474 {&mpglBindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
475 {&mpglMultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
476 {&mpglGenPrograms, "_program", {"glGenProgramsARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
477 {&mpglDeletePrograms, "_program", {"glDeleteProgramsARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
478 {&mpglBindProgram, "_program", {"glBindProgramARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
479 {&mpglProgramString, "_program", {"glProgramStringARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
480 {&mpglGetProgramiv, "_program", {"glGetProgramivARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
481 {&mpglProgramEnvParameter4f, "_program", {"glProgramEnvParameter4fARB", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
482 {&mpglSwapInterval, "_swap_control", {"glXSwapIntervalSGI", "glXSwapInterval", "wglSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
483 {&mpglTexImage3D, NULL, {"glTexImage3D", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
484 {&mpglAllocateMemoryMESA, "GLX_MESA_allocate_memory", {"glXAllocateMemoryMESA", NULL}},
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
485 {&mpglFreeMemoryMESA, "GLX_MESA_allocate_memory", {"glXFreeMemoryMESA", NULL}},
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
486
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
487 // Things needed to run on GLES
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
488 {&mpglVertexPointer, NULL, {"glVertexPointer", NULL}},
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
489 {&mpglTexCoordPointer, NULL, {"glTexCoordPointer", NULL}},
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
490 {&mpglClientActiveTexture, NULL, {"glClientActiveTexture", NULL}},
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
491 {&mpglEnableClientState, NULL, {"glEnableClientState", NULL}},
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
492 {&mpglDisableClientState, NULL, {"glDisableClientState", NULL}},
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
493 {&mpglDrawArrays, NULL, {"glDrawArrays", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
494 {NULL}
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
495 };
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
496
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
497 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
498 * \brief find the function pointers of some useful OpenGL extensions
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
499 * \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
500 * \param ext2 an extra extension string
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
501 */
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
502 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
503 const char *ext2) {
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
504 const extfunc_desc_t *dsc;
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
505 const char *extensions = NULL;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
506 char *allexts;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
507
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
508 if (!getProcAddress)
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
509 getProcAddress = (void *)getdladdr;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
510
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
511 // 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
512 mpglGetString = getProcAddress("glGetString");
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
513 #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
514 if (!mpglGetString)
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
515 mpglGetString = glGetString;
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
516 #endif
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
517
34748
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
518 if (mpglGetString)
f86e300072f0 Small fixes to make it easier to compiler for OpenGL ES
reimar
parents: 34611
diff changeset
519 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
520 if (!extensions) extensions = "";
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
521 if (!ext2) ext2 = "";
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18787
diff changeset
522 allexts = malloc(strlen(extensions) + strlen(ext2) + 2);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
523 strcpy(allexts, extensions);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
524 strcat(allexts, " ");
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
525 strcat(allexts, ext2);
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
526 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
527 for (dsc = extfuncs; dsc->funcptr; dsc++) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
528 void *ptr = NULL;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
529 int i;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
530 if (!dsc->extstr || strstr(allexts, dsc->extstr)) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
531 for (i = 0; !ptr && dsc->funcnames[i]; i++)
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
532 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
533 }
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
534 if (!ptr)
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
535 ptr = dsc->fallback;
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
536 *(void **)dsc->funcptr = ptr;
16984
94b70ab52695 disable *SwapInterval function when extensions are missing, since it
reimar
parents: 16944
diff changeset
537 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
538 if (strstr(allexts, "_texture_float"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
539 hqtexfmt = GL_RGB32F;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
540 else if (strstr(allexts, "NV_float_buffer"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
541 hqtexfmt = GL_FLOAT_RGB32_NV;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
542 else
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
543 hqtexfmt = GL_RGB16;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
544 free(allexts);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
545 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
546
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
547 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
548 * \brief create a texture and set some defaults
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
549 * \param target texture taget, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
550 * \param fmt internal texture format
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
551 * \param format texture host data format
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
552 * \param type texture host data type
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
553 * \param filter filter used for scaling, e.g. GL_LINEAR
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
554 * \param w texture width
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
555 * \param h texture height
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
556 * \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
557 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
558 */
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
559 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
560 int w, int h, unsigned char val) {
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
561 GLfloat fval = (GLfloat)val / 255.0;
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
562 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
563 int stride;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
564 char *init;
31086
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
565 if (w == 0) w = 1;
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
566 if (h == 0) h = 1;
cca95ca6f52b Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents: 31044
diff changeset
567 stride = w * glFmt2bpp(format, type);
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
568 if (!stride) return;
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
569 init = malloc(stride * h);
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
570 memset(init, val, stride * h);
27622
524f6a87cd23 Fix glAdjustAlignment parameter in glCreateClearTex
reimar
parents: 27621
diff changeset
571 glAdjustAlignment(stride);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
572 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, w);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
573 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
574 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
575 // ensure we get enough bits
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
576 GLint rs = 16;
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
577 glGetTexLevelParameteriv(target, 0, GL_TEXTURE_RED_SIZE, &rs);
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
578 use_depth_l16 = rs < 14;
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
579 if (use_depth_l16) {
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
580 fmt = GL_DEPTH_COMPONENT16;
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
581 format = GL_DEPTH_COMPONENT;
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
582 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
583 }
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
584 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
585 mpglTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
586 mpglTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
587 mpglTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
588 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
589 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
590 if (format == GL_DEPTH_COMPONENT) {
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
591 mpglTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE);
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
592 mpglTexParameteri(target, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
593 }
16461
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
594 // 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
595 // We set a sane default anyway.
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
596 mpglTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
597 free(init);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
598 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
599
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
600 /**
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
601 * \brief creates a texture from a PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
602 * \param target texture taget, usually GL_TEXTURE_2D
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
603 * \param fmt internal texture format, 0 for default
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
604 * \param filter filter used for scaling, e.g. GL_LINEAR
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
605 * \param f file to read PPM from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
606 * \param width [out] width of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
607 * \param height [out] height of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
608 * \param maxval [out] maxval value from PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
609 * \return 0 on error, 1 otherwise
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
610 * \ingroup gltexture
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
611 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
612 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
613 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
614 int w, h, m, bpp;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
615 GLenum type;
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
616 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
617 if (!data || (bpp != 3 && bpp != 6)) {
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
618 free(data);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
619 return 0;
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
620 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
621 if (!fmt) {
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
622 fmt = bpp == 6 ? hqtexfmt : 3;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
623 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
624 fmt = GL_RGB16;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
625 }
32393
98fda5253e80 Extract code to read a pnm file into a separate function.
reimar
parents: 31567
diff changeset
626 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
627 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
628 glUploadTex(target, GL_RGB, type,
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
629 data, w * bpp, 0, 0, w, h, 0);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
630 free(data);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
631 if (width) *width = w;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
632 if (height) *height = h;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
633 if (maxval) *maxval = m;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
634 return 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
635 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
636
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
637 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
638 * \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
639 * \param format OpenGL format
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
640 * \param type OpenGL type
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
641 * \return bytes per pixel
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
642 * \ingroup glgeneral
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
643 *
16435
b5ca0e5760d0 Fix a typo in a comment
reimar
parents: 16303
diff changeset
644 * Does not handle all possible variants, just those used by MPlayer
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
645 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
646 int glFmt2bpp(GLenum format, GLenum type) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
647 int component_size = 0;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
648 switch (type) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
649 case GL_UNSIGNED_BYTE_3_3_2:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
650 case GL_UNSIGNED_BYTE_2_3_3_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
651 return 1;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
652 case GL_UNSIGNED_SHORT_5_5_5_1:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
653 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
654 case GL_UNSIGNED_SHORT_5_6_5:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
655 case GL_UNSIGNED_SHORT_5_6_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
656 return 2;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
657 case GL_UNSIGNED_BYTE:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
658 component_size = 1;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
659 break;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
660 case GL_UNSIGNED_SHORT:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
661 component_size = 2;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
662 break;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
663 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
664 switch (format) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
665 case GL_LUMINANCE:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
666 case GL_ALPHA:
34969
7974179b9471 Add support for depth textures to simplify some experiments.
reimar
parents: 34968
diff changeset
667 case GL_DEPTH_COMPONENT:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
668 return component_size;
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
669 case GL_YCBCR_MESA:
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
670 return 2;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
671 case GL_RGB:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
672 case GL_BGR:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
673 return 3 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
674 case GL_RGBA:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
675 case GL_BGRA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
676 return 4 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
677 }
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
678 return 0; // unknown
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
679 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
680
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
681 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
682 * \brief upload a texture, handling things like stride and slices
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
683 * \param target texture target, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
684 * \param format OpenGL format of data
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
685 * \param type OpenGL type of data
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
686 * \param dataptr data to upload
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
687 * \param stride data stride
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
688 * \param x x offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
689 * \param y y offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
690 * \param w width of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
691 * \param h height of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
692 * \param slice height of an upload slice, 0 for all at once
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
693 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
694 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
695 void glUploadTex(GLenum target, GLenum format, GLenum type,
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
696 const void *dataptr, int stride,
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
697 int x, int y, int w, int h, int slice) {
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
698 const uint8_t *data = dataptr;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
699 int y_max = y + h;
16223
f540609340ac extra check for glUploadTex to avoid a possible hang.
reimar
parents: 16221
diff changeset
700 if (w <= 0 || h <= 0) return;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
701 if (slice <= 0)
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
702 slice = h;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
703 if (stride < 0) {
18988
a61ef37d3c71 Fix off-by-one error for negative strides (flipped image)
reimar
parents: 18961
diff changeset
704 data += (h - 1) * stride;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
705 stride = -stride;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
706 }
34972
445009e9ee8d When the LUMINANCE16 format is less than 14 bit try to use
reimar
parents: 34969
diff changeset
707 if (use_depth_l16 && 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
708 format = GL_DEPTH_COMPONENT;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
709 // this is not always correct, but should work for MPlayer
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
710 glAdjustAlignment(stride);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
711 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
712 for (; y + slice <= y_max; y += slice) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
713 mpglTexSubImage2D(target, 0, x, y, w, slice, format, type, data);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
714 data += stride * slice;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
715 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
716 if (y < y_max)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
717 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
718 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
719
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
720 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
721 float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
722 int i;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
723 ucoef[0] = 0 * uvcos + 1.403 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
724 vcoef[0] = 0 * uvsin + 1.403 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
725 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
726 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
727 ucoef[2] = 1.770 * uvcos + 0 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
728 vcoef[2] = 1.770 * uvsin + 0 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
729 ucoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
730 vcoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
731 // Coefficients (probably) must be in [0, 1] range, whereas they originally
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
732 // are in [-2, 2] range, so here comes the trick:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
733 // 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
734 // 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
735 // for CombinerInput and CombinerOutput (or the respective ATI variants)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
736 for (i = 0; i < 4; i++) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
737 ucoef[i] = ucoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
738 vcoef[i] = vcoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
739 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
740 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
741
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
742 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
743 * \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
744 * \param uvcos used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
745 * \param uvsin used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
746 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
747 static void glSetupYUVCombiners(float uvcos, float uvsin) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
748 GLfloat ucoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
749 GLfloat vcoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
750 GLint i;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
751 if (!mpglCombinerInput || !mpglCombinerOutput ||
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
752 !mpglCombinerParameterfv || !mpglCombinerParameteri) {
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
753 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
754 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
755 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
756 mpglGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
757 if (i < 2)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
758 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
759 "[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
760 mpglGetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
761 if (i < 3)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
762 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
763 "[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
764 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
765 mpglCombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
766 mpglCombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
767
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
768 // UV first, like this green component cannot overflow
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
769 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
770 GL_TEXTURE1, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
771 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
772 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
773 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
774 GL_TEXTURE2, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
775 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
776 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
777 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
778 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
779 GL_FALSE, GL_FALSE);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
780
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
781 // stage 2
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
782 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
783 GL_SIGNED_IDENTITY_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
784 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
785 GL_UNSIGNED_INVERT_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
786 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
787 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
788 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
789 GL_UNSIGNED_INVERT_NV, GL_RGB);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
790 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
791 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
792 GL_FALSE, GL_FALSE);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
793
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
794 // leave final combiner stage in default mode
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
795 mpglCombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
796 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
797
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
798 /**
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
799 * \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
800 * \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
801 * \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
802 * used on OS X.
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
803 */
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
804 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
805 int text) {
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
806 GLint i;
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
807 float yuv2rgb[3][4];
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
808
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
809 mpglGetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
810 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
811 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
812 "[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
813
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
814 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
815 for (i = 0; i < 3; i++) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
816 int j;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
817 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
818 for (j = 0; j < 4; j++) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
819 yuv2rgb[i][j] *= 0.125;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
820 yuv2rgb[i][j] += 0.5;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
821 if (yuv2rgb[i][j] > 1)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
822 yuv2rgb[i][j] = 1;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
823 if (yuv2rgb[i][j] < 0)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
824 yuv2rgb[i][j] = 0;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
825 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
826 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
827 if (text == 0) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
828 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
829 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
830 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
831 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
832 if (!mpglBeginFragmentShader || !mpglEndFragmentShader ||
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
833 !mpglSetFragmentShaderConstant || !mpglSampleMap ||
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
834 !mpglColorFragmentOp2 || !mpglColorFragmentOp3) {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
835 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
836 return;
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
837 }
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
838 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
839 if (i < 3)
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
840 mp_msg(MSGT_VO, MSGL_ERR,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
841 "[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
842 mpglBeginFragmentShader();
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
843 mpglSetFragmentShaderConstant(GL_CON_0_ATI, c0);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
844 mpglSetFragmentShaderConstant(GL_CON_1_ATI, c1);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
845 mpglSetFragmentShaderConstant(GL_CON_2_ATI, c2);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
846 mpglSetFragmentShaderConstant(GL_CON_3_ATI, c3);
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
847 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
848 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
849 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
850 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
851 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
852 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
853 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
854 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
855 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
856 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
857 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
858 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
859 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
860 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
861 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
862 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
863 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
864 mpglEndFragmentShader();
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
865 } else {
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
866 static const char template[] =
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
867 "!!ATIfs1.0\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
868 "StartConstants;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
869 " CONSTANT c0 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
870 " CONSTANT c1 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
871 " CONSTANT c2 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
872 " CONSTANT c3 = {%e, %e, %e};\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
873 "EndConstants;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
874 "StartOutputPass;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
875 " SampleMap r0, t0.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
876 " SampleMap r1, t1.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
877 " SampleMap r2, t2.str;\n"
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
878 " 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
879 " 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
880 " 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
881 " 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
882 "EndPass;\n";
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
883 char buffer[512];
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
884 snprintf(buffer, sizeof(buffer), template,
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
885 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
886 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
887 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
888 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
889 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
890 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
891 }
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
892 }
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
893
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
894 /**
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
895 * \brief helper function for gen_spline_lookup_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
896 * \param x subpixel-position ((0,1) range) to calculate weights for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
897 * \param dst where to store transformed weights, must provide space for 4 GLfloats
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
898 *
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
899 * calculates the weights and stores them after appropriate transformation
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
900 * for the scaler fragment program.
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
901 */
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
902 static void store_weights(float x, GLfloat *dst) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
903 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
904 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
905 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
906 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
907 *dst++ = 1 + x - w1 / (w0 + w1);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
908 *dst++ = 1 - x + w3 / (w2 + w3);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
909 *dst++ = w0 + w1;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
910 *dst++ = 0;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
911 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
912
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
913 //! 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
914 #define LOOKUP_BSPLINE_RES (2 * 1024)
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
915 /**
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
916 * \brief creates the 1D lookup texture needed for fast higher-order filtering
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
917 * \param unit texture unit to attach texture to
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
918 */
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
919 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
920 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
921 GLfloat *tp = tex;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
922 int i;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
923 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
924 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
925 store_weights(x, tp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
926 tp += 4;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
927 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
928 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
929 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
930 mpglActiveTexture(unit);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
931 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
932 mpglTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
933 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
934 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
935 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
936 mpglActiveTexture(GL_TEXTURE0);
29896
ac3e6e27f2c7 Use calloc to allocate a rather large (currently 32k) array instead of
reimar
parents: 29679
diff changeset
937 free(tex);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
938 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
939
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
940 #define NOISE_RES 2048
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
941
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
942 /**
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
943 * \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
944 * \param unit texture unit to attach texture to
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
945 */
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
946 static void gen_noise_lookup_tex(GLenum unit) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
947 GLfloat *tex = calloc(NOISE_RES, sizeof(*tex));
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
948 uint32_t lcg = 0x79381c11;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
949 int i;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
950 for (i = 0; i < NOISE_RES; i++)
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
951 tex[i] = (double)i / (NOISE_RES - 1);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
952 for (i = 0; i < NOISE_RES - 1; i++) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
953 int remain = NOISE_RES - i;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
954 int idx = i + (lcg >> 16) % remain;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
955 GLfloat tmp = tex[i];
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
956 tex[i] = tex[idx];
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
957 tex[idx] = tmp;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
958 lcg = lcg * 1664525 + 1013904223;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
959 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
960 mpglActiveTexture(unit);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
961 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
962 mpglTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
963 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
964 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
965 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
966 mpglActiveTexture(GL_TEXTURE0);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
967 free(tex);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
968 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
969
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
970 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
971 "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
972
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
973 #define BICUB_FILT_MAIN(textype) \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
974 /* first y-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
975 "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
976 "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
977 "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
978 "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
979 /* second y-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
980 "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
981 "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
982 "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
983 "LRP a.a, parmy.b, b.rrrr, b.gggg;\n" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
984 /* x-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
985 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
986
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
987 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
988 "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
989 "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
990 "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
991 "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
992 "MUL cdelta.yw, parmy.rrgg, {0, -%e, 0, %e};\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
993 BICUB_FILT_MAIN("2D");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
994
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
995 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
996 "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
997 "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
998 "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
999 "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
1000 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1001 BICUB_FILT_MAIN("RECT");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1002
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1003 #define CALCWEIGHTS(t, s) \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1004 "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
1005 "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
1006 "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
1007 "RCP a.x, "t".z;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1008 "RCP a.y, "t".w;\n" \
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1009 "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
1010 "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
1011 "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
1012
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1013 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
1014 "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
1015 "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
1016 CALCWEIGHTS("parmx", "coord.xxxx")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1017 "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
1018 CALCWEIGHTS("parmy", "coord.yyyy")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1019 "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
1020 BICUB_FILT_MAIN("2D");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1021
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1022 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
1023 "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
1024 "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
1025 CALCWEIGHTS("parmx", "coord.xxxx")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1026 "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
1027 CALCWEIGHTS("parmy", "coord.yyyy")
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1028 "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
1029 BICUB_FILT_MAIN("RECT");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1030
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1031 #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
1032 "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
1033 "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
1034 "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
1035 "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
1036 /* x-interpolation */ \
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1037 "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
1038
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1039 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
1040 "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
1041 "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
1042 "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
1043 BICUB_X_FILT_MAIN("2D");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1044
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1045 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
1046 "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
1047 "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
1048 "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
1049 BICUB_X_FILT_MAIN("RECT");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1050
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1051 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
1052 "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
1053 "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
1054 "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
1055 "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
1056 "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
1057 "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
1058 "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
1059 "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
1060 "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
1061 "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
1062 "SUB b.r, a.r, b.r;\n"
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1063 // NOTE: destination component is only write mask, not swizzle
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1064 // so calculate result in all three components
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1065 "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
1066
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1067 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
1068 "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
1069 "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
1070 "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
1071 "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
1072 "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
1073 "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
1074 "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
1075 "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
1076 "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
1077 "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
1078 "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
1079 "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
1080 "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
1081 "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
1082 "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
1083 "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
1084 "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
1085 "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
1086 "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
1087 "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
1088 "MAD b.r, a.r, {0.859375}, b.r;\n"
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1089 // NOTE: destination component is only write mask, not swizzle
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1090 // so calculate result in all three components
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1091 "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
1092
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1093 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
1094 "PARAM ycoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1095 "PARAM ucoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1096 "PARAM vcoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1097 "PARAM offsets = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1098 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1099 "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
1100 "MAD res.rgb, yuv.gggg, ucoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1101 "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
1102
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1103 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
1104 "PARAM ycoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1105 "PARAM ucoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1106 "PARAM vcoef = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1107 "PARAM offsets = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1108 "PARAM gamma = {%e, %e, %e};\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1109 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1110 "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
1111 "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
1112 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1113 "POW res.r, res.r, gamma.r;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1114 "POW res.g, res.g, gamma.g;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1115 "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
1116
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1117 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
1118 "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
1119 "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
1120 "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
1121 "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
1122 "TEMP res;\n"
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1123 "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
1124 "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
1125 "MAD res.rgb, yuv.bbbb, vcoef, res;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1126 "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
1127 "ADD res.a, res.a, 0.25;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1128 "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
1129 "ADD res.a, res.a, 0.25;\n"
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1130 "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
1131
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1132 static const char yuv_lookup3d_prog_template[] =
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1133 "TEMP res;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1134 "TEX res, yuv, texture[%c], 3D;\n";
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1135
33928
27b1c4df84bd Remove pointless pointer indirection for shader program strings.
reimar
parents: 33927
diff changeset
1136 static const char noise_filt_template[] =
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1137 "MUL coord.xy, fragment.texcoord[0], {%e, %e};\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1138 "TEMP rand;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1139 "TEX rand.r, coord.x, texture[%c], 1D;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1140 "ADD rand.r, rand.r, coord.y;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1141 "TEX rand.r, rand.r, texture[%c], 1D;\n"
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1142 "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
1143
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1144 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1145 * \brief creates and initializes helper textures needed for scaling texture read
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1146 * \param scaler scaler type to create texture for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1147 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1148 * \param texs texture unit ids for the scaler are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1149 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1150 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
1151 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1152 case YUV_SCALER_BILIN:
25727
7934f12c76f0 Add a forgotten case to create_scaler_textures, avoids an incorrect warning.
reimar
parents: 24777
diff changeset
1153 case YUV_SCALER_BICUB_NOTEX:
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1154 case YUV_SCALER_UNSHARP:
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1155 case YUV_SCALER_UNSHARP2:
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1156 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1157 case YUV_SCALER_BICUB:
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1158 case YUV_SCALER_BICUB_X:
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1159 texs[0] = (*texu)++;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1160 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1161 texs[0] += '0';
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1162 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1163 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1164 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
1165 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1166 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1167
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1168 //! resolution of texture for gamma lookup table
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1169 #define LOOKUP_RES 512
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1170 //! resolution for 3D yuv->rgb conversion lookup table
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1171 #define LOOKUP_3DRES 32
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1172 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1173 * \brief creates and initializes helper textures needed for yuv conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1174 * \param params struct containing parameters like brightness, gamma, ...
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1175 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1176 * \param texs texture unit ids for the conversion are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1177 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1178 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
1179 unsigned char *lookup_data = NULL;
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1180 int conv = YUV_CONVERSION(params->type);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1181 switch (conv) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1182 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1183 case YUV_CONVERSION_FRAGMENT_POW:
30028
9ad7756adfa8 Fix a broken indentation.
reimar
parents: 30027
diff changeset
1184 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1185 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1186 texs[0] = (*texu)++;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1187 mpglActiveTexture(GL_TEXTURE0 + texs[0]);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1188 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
1189 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
1190 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
1191 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
1192 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
1193 LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1194 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
1195 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1196 mpglActiveTexture(GL_TEXTURE0);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1197 texs[0] += '0';
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1198 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1199 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1200 {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1201 int sz = LOOKUP_3DRES + 2; // texture size including borders
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1202 if (!mpglTexImage3D) {
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1203 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
1204 break;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1205 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1206 texs[0] = (*texu)++;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1207 mpglActiveTexture(GL_TEXTURE0 + texs[0]);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1208 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
1209 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
1210 glAdjustAlignment(sz);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1211 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1212 mpglTexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1,
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1213 GL_RGB, GL_UNSIGNED_BYTE, lookup_data);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1214 mpglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1215 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
1216 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1217 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1218 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1219 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1220 mpglActiveTexture(GL_TEXTURE0);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1221 texs[0] += '0';
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1222 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1223 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1224 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1225 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
1226 }
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32427
diff changeset
1227 free(lookup_data);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1228 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1229
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1230 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1231 * \brief adds a scaling texture read at the current fragment program position
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1232 * \param scaler type of scaler to insert
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1233 * \param prog_pos current position in fragment program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1234 * \param remain how many bytes remain in the buffer given by prog_pos
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1235 * \param texs array containing the texture unit identifiers for this scaler
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1236 * \param in_tex texture unit the scaler should read from
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1237 * \param out_comp component of the yuv variable the scaler stores the result in
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1238 * \param rect if rectangular (pixel) adressing should be used for in_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1239 * \param texw width of the in_tex texture
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1240 * \param texh height of the in_tex texture
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1241 * \param strength strength of filter effect if the scaler does some kind of filtering
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1242 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1243 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
1244 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
1245 double strength) {
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1246 const char *ttype = rect ? "RECT" : "2D";
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1247 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
1248 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
1249 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1250 case YUV_SCALER_BILIN:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1251 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
1252 in_tex, ttype);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1253 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1254 case YUV_SCALER_BICUB:
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1255 if (rect)
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1256 snprintf(*prog_pos, *remain, bicub_filt_template_RECT,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1257 in_tex, texs[0], texs[0],
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1258 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1259 else
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1260 snprintf(*prog_pos, *remain, bicub_filt_template_2D,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1261 in_tex, (float)texw, (float)texh,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1262 texs[0], ptw, ptw, texs[0], pth, pth,
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1263 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1264 break;
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1265 case YUV_SCALER_BICUB_X:
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1266 if (rect)
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1267 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
1268 in_tex, texs[0],
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1269 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
1270 else
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1271 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
1272 in_tex, (float)texw,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1273 texs[0], ptw, ptw,
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1274 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
1275 break;
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1276 case YUV_SCALER_BICUB_NOTEX:
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1277 if (rect)
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1278 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
1279 in_tex,
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1280 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
1281 else
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1282 snprintf(*prog_pos, *remain, bicub_notex_filt_template_2D,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1283 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
1284 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
1285 break;
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1286 case YUV_SCALER_UNSHARP:
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1287 snprintf(*prog_pos, *remain, unsharp_filt_template,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1288 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
1289 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
1290 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
1291 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
1292 break;
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1293 case YUV_SCALER_UNSHARP2:
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1294 snprintf(*prog_pos, *remain, unsharp_filt_template2,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1295 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
1296 out_comp, 1.5 * ptw, 1.5 * pth,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1297 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
1298 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
1299 in_tex, ttype, in_tex, out_comp, in_tex, out_comp,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1300 in_tex, ttype, in_tex, ttype, in_tex, ttype,
34478
8e09f1cb3ecd Fix vo_gl unsharp filter for chroma.
reimar
parents: 34375
diff changeset
1301 in_tex, ttype, out_comp, strength, strength, strength);
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1302 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1303 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1304 *remain -= strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1305 *prog_pos += strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1306 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1307
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1308 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
1309 const char *name;
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1310 GLenum cur;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1311 GLenum max;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1312 } progstats[] = {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1313 {"instructions", 0x88A0, 0x88A1},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1314 {"native instructions", 0x88A2, 0x88A3},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1315 {"temporaries", 0x88A4, 0x88A5},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1316 {"native temporaries", 0x88A6, 0x88A7},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1317 {"parameters", 0x88A8, 0x88A9},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1318 {"native parameters", 0x88AA, 0x88AB},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1319 {"attribs", 0x88AC, 0x88AD},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1320 {"native attribs", 0x88AE, 0x88AF},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1321 {"ALU instructions", 0x8805, 0x880B},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1322 {"TEX instructions", 0x8806, 0x880C},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1323 {"TEX indirections", 0x8807, 0x880D},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1324 {"native ALU instructions", 0x8808, 0x880E},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1325 {"native TEX instructions", 0x8809, 0x880F},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1326 {"native TEX indirections", 0x880A, 0x8810},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1327 {NULL, 0, 0}
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1328 };
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1329
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1330 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1331 * \brief load the specified GPU Program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1332 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1333 * \param prog program string
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1334 * \return 1 on success, 0 otherwise
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1335 */
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1336 int loadGPUProgram(GLenum target, char *prog) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1337 int i;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1338 GLint cur = 0, max = 0, err = 0;
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1339 if (!mpglProgramString) {
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1340 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
1341 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1342 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1343 mpglProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1344 mpglGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1345 if (err != -1) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1346 mp_msg(MSGT_VO, MSGL_ERR,
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1347 "[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
1348 "[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
1349 "[gl] Error message:\n %s at %.10s\n",
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1350 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
1351 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1352 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1353 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
1354 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1355 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
1356 for (i = 0; progstats[i].name; i++) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1357 mpglGetProgramiv(target, progstats[i].cur, &cur);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1358 mpglGetProgramiv(target, progstats[i].max, &max);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1359 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
1360 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1361 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1362 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1363
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1364 #define MAX_PROGSZ (1024*1024)
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1365
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1366 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1367 * \brief setup a fragment program that will do YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1368 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1369 * brightness, ...
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1370 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1371 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
1372 int type = params->type;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1373 int texw = params->texw;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1374 int texh = params->texh;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1375 int rect = params->target == GL_TEXTURE_RECTANGLE;
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1376 static const char prog_hdr[] =
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1377 "!!ARBfp1.0\n"
30840
e159f9aa13a2 Add newlines to generated fragment program to make both fragment program dump
reimar
parents: 30409
diff changeset
1378 "OPTION ARB_precision_hint_fastest;\n"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1379 // 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
1380 // 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
1381 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;\n";
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1382 int prog_remain;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1383 char *yuv_prog, *prog_pos;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1384 int cur_texu = 3;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1385 char lum_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1386 char chrom_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1387 char conv_texs[1];
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1388 char filt_texs[1] = {0};
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1389 GLint i;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1390 // 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
1391 // for red, green, blue and the constant offsets
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1392 float yuv2rgb[3][4];
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1393 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
1394 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
1395 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
1396 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
1397 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
1398 else
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1399 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
1400
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1401 if (noise) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1402 gen_noise_lookup_tex(cur_texu);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1403 filt_texs[0] = '0' + cur_texu++;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1404 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1405
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1406 mpglGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1407 if (i < cur_texu)
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1408 mp_msg(MSGT_VO, MSGL_ERR,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1409 "[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
1410 cur_texu, i);
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1411 if (!mpglProgramString) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1412 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
1413 return;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1414 }
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1415 yuv_prog = malloc(MAX_PROGSZ);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1416 strcpy(yuv_prog, prog_hdr);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1417 prog_pos = yuv_prog + sizeof(prog_hdr) - 1;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1418 prog_remain = MAX_PROGSZ - sizeof(prog_hdr);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1419 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
1420 '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
1421 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
1422 '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
1423 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
1424 '2', 'b', rect, params->chrom_texw, params->chrom_texh, params->filter_strength);
30108
0898adc64a6f Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents: 30107
diff changeset
1425 mp_get_yuv2rgb_coeffs(&params->csp_params, yuv2rgb);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1426 switch (YUV_CONVERSION(type)) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1427 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1428 snprintf(prog_pos, prog_remain, yuv_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1429 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
1430 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
1431 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
1432 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
1433 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1434 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1435 snprintf(prog_pos, prog_remain, yuv_pow_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1436 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
1437 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
1438 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
1439 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
1440 (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
1441 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1442 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1443 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1444 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
1445 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
1446 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
1447 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
1448 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
1449 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1450 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1451 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
1452 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1453 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1454 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
1455 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1456 }
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1457 prog_remain -= strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1458 prog_pos += strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1459
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1460 if (noise) {
33927
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1461 // 1.0 strength is suitable for dithering 8 to 6 bit
9bb97722d8c7 Hook up -vo gl noise support.
reimar
parents: 33926
diff changeset
1462 double str = params->noise_strength * (1.0 / 64);
33926
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1463 double scale_x = (double)NOISE_RES / texw;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1464 double scale_y = (double)NOISE_RES / texh;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1465 if (rect) {
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1466 scale_x /= texw;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1467 scale_y /= texh;
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1468 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1469 snprintf(prog_pos, prog_remain, noise_filt_template,
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1470 scale_x, scale_y,
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1471 filt_texs[0], filt_texs[0],
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1472 str, str, str);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1473 prog_remain -= strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1474 prog_pos += strlen(prog_pos);
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1475 }
6e3f257d7b05 Add disabled feature: noise filter for vo_gl.
reimar
parents: 33919
diff changeset
1476 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
1477
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
1478 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
1479 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog);
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1480 free(yuv_prog);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1481 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1482
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1483 /**
30964
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1484 * \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
1485 */
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1486 int glAutodetectYUVConversion(void) {
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1487 const char *extensions = mpglGetString(GL_EXTENSIONS);
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1488 const char *vendor = mpglGetString(GL_VENDOR);
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1489 // 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
1490 int is_img = vendor && strstr(vendor, "Imagination") != NULL;
31021
b25ae678c778 Some crash-resilience fixes.
reimar
parents: 31020
diff changeset
1491 if (!extensions || !mpglMultiTexCoord2f)
b25ae678c778 Some crash-resilience fixes.
reimar
parents: 31020
diff changeset
1492 return YUV_CONVERSION_NONE;
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1493 if (strstr(extensions, "GL_ARB_fragment_program") && !is_img)
30964
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1494 return YUV_CONVERSION_FRAGMENT;
34968
0807ab90536c Work around IMG drivers not being able to parse our shaders.
reimar
parents: 34842
diff changeset
1495 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
1496 return YUV_CONVERSION_TEXT_FRAGMENT;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1497 if (strstr(extensions, "GL_ATI_fragment_shader"))
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1498 return YUV_CONVERSION_COMBINERS_ATI;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1499 return YUV_CONVERSION_NONE;
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1500 }
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1501
a5c6b37b3af6 Factor out the YUV->RGB conversion auto-selection and also
reimar
parents: 30953
diff changeset
1502 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1503 * \brief setup YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1504 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1505 * brightness, ...
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1506 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1507 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1508 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
1509 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
1510 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
1511 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
1512 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
1513 switch (YUV_CONVERSION(params->type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1514 case YUV_CONVERSION_COMBINERS:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1515 glSetupYUVCombiners(uvcos, uvsin);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1516 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1517 case YUV_CONVERSION_COMBINERS_ATI:
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
1518 glSetupYUVFragmentATI(&params->csp_params, 0);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1519 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1520 case YUV_CONVERSION_TEXT_FRAGMENT:
30953
d3f31670562d Share more code between the two ATI fragment shader YUV to RGB
reimar
parents: 30952
diff changeset
1521 glSetupYUVFragmentATI(&params->csp_params, 1);
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1522 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1523 case YUV_CONVERSION_FRAGMENT_LOOKUP:
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1524 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1525 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1526 case YUV_CONVERSION_FRAGMENT_POW:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1527 glSetupYUVFragprog(params);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1528 break;
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1529 case YUV_CONVERSION_NONE:
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1530 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1531 default:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1532 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
1533 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1534 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1535
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1536 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1537 * \brief enable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1538 * \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
1539 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1540 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1541 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1542 void glEnableYUVConversion(GLenum target, int type) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1543 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1544 case YUV_CONVERSION_COMBINERS:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1545 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1546 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1547 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1548 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1549 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1550 mpglEnable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1551 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1552 case YUV_CONVERSION_COMBINERS_ATI:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1553 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1554 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1555 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1556 mpglEnable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1557 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1558 mpglEnable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1559 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1560 case YUV_CONVERSION_TEXT_FRAGMENT:
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1561 mpglActiveTexture(GL_TEXTURE1);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1562 mpglEnable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1563 mpglActiveTexture(GL_TEXTURE2);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1564 mpglEnable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1565 mpglActiveTexture(GL_TEXTURE0);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1566 mpglEnable(GL_TEXT_FRAGMENT_SHADER_ATI);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1567 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1568 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1569 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1570 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1571 case YUV_CONVERSION_FRAGMENT:
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1572 case YUV_CONVERSION_NONE:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1573 mpglEnable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1574 break;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1575 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1576 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1577
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1578 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1579 * \brief disable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1580 * \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
1581 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1582 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1583 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1584 void glDisableYUVConversion(GLenum target, int type) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1585 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1586 case YUV_CONVERSION_COMBINERS:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1587 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1588 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1589 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1590 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1591 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1592 mpglDisable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1593 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1594 case YUV_CONVERSION_COMBINERS_ATI:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1595 mpglActiveTexture(GL_TEXTURE1);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1596 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1597 mpglActiveTexture(GL_TEXTURE2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1598 mpglDisable(target);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1599 mpglActiveTexture(GL_TEXTURE0);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1600 mpglDisable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1601 break;
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1602 case YUV_CONVERSION_TEXT_FRAGMENT:
31026
0b0266c8ec53 Add workaroound for yuv=7 mode - does hurt speed but not much
reimar
parents: 31024
diff changeset
1603 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
1604 // 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
1605 // 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
1606 // 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
1607 mpglFlush();
30951
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1608 mpglActiveTexture(GL_TEXTURE1);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1609 mpglDisable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1610 mpglActiveTexture(GL_TEXTURE2);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1611 mpglDisable(target);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1612 mpglActiveTexture(GL_TEXTURE0);
e76a4f6bfc8d Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents: 30946
diff changeset
1613 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1614 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1615 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1616 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1617 case YUV_CONVERSION_FRAGMENT:
30027
f1651b3af651 Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents: 30023
diff changeset
1618 case YUV_CONVERSION_NONE:
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1619 mpglDisable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1620 break;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1621 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1622 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1623
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1624 void glEnable3DLeft(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1625 GLint buffer;
34375
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1626 if (type & GL_3D_SWAP)
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1627 return glEnable3DRight(type & ~GL_3D_SWAP);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1628 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1629 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1630 mpglColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1631 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1632 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1633 mpglColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1634 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1635 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1636 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1637 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1638 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1639 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1640 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1641 buffer = GL_FRONT_LEFT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1642 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1643 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1644 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1645 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1646 buffer = GL_BACK_LEFT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1647 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1648 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1649 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1650 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1651 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1652 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1653
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1654 void glEnable3DRight(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1655 GLint buffer;
34375
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1656 if (type & GL_3D_SWAP)
5b44af093b2a vo_gl stereo: allow swapping left and right view.
reimar
parents: 34338
diff changeset
1657 return glEnable3DLeft(type & ~GL_3D_SWAP);
31567
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1658 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1659 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1660 mpglColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1661 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1662 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1663 mpglColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1664 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1665 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1666 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1667 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1668 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1669 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1670 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1671 buffer = GL_FRONT_RIGHT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1672 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1673 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1674 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1675 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1676 buffer = GL_BACK_RIGHT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1677 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1678 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1679 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1680 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1681 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1682 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1683
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1684 void glDisable3D(int type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1685 GLint buffer;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1686 switch (type) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1687 case GL_3D_RED_CYAN:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1688 case GL_3D_GREEN_MAGENTA:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1689 mpglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1690 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1691 case GL_3D_QUADBUFFER:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1692 mpglDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1693 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1694 switch (buffer) {
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1695 case GL_FRONT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1696 case GL_FRONT_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1697 case GL_FRONT_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1698 buffer = GL_FRONT;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1699 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1700 case GL_BACK:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1701 case GL_BACK_LEFT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1702 case GL_BACK_RIGHT:
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1703 buffer = GL_BACK;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1704 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1705 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1706 mpglDrawBuffer(buffer);
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1707 break;
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1708 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1709 }
0ffe9f97fc9f Add initial stereo support to -vo gl.
reimar
parents: 31309
diff changeset
1710
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1711 /**
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1712 * \brief draw a texture part at given 2D coordinates
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1713 * \param x screen top coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1714 * \param y screen left coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1715 * \param w screen width coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1716 * \param h screen height coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1717 * \param tx texture top coordinate in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1718 * \param ty texture left coordinate in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1719 * \param tw texture part width in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1720 * \param th texture part height in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1721 * \param sx width of texture in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1722 * \param sy height of texture in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1723 * \param rect_tex whether this texture uses texture_rectangle extension
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1724 * \param is_yv12 if != 0, also draw the textures from units 1 and 2,
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1725 * bits 8 - 15 and 16 - 23 specify the x and y scaling of those textures
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1726 * \param flip flip the texture upside down
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1727 * \ingroup gltexture
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1728 */
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1729 void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1730 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1731 int sx, int sy, int rect_tex, int is_yv12, int flip) {
30097
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1732 int chroma_x_shift = (is_yv12 >> 8) & 31;
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1733 int chroma_y_shift = (is_yv12 >> 16) & 31;
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1734 GLfloat xscale = 1 << chroma_x_shift;
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1735 GLfloat yscale = 1 << chroma_y_shift;
9d724e6def3e Support all planar YUV formats in OpenGL vos.
reimar
parents: 30036
diff changeset
1736 GLfloat tx2 = tx / xscale, ty2 = ty / yscale, tw2 = tw / xscale, th2 = th / yscale;
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1737 if (!rect_tex) {
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1738 tx /= sx; ty /= sy; tw /= sx; th /= sy;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1739 tx2 = tx, ty2 = ty, tw2 = tw, th2 = th;
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1740 }
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1741 if (flip) {
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1742 y += h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1743 h = -h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1744 }
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1745
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1746 if (!mpglBegin) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1747 GLfloat vertices [8] = { x, y, x, y + h, x + w, y, x + w, y + h};
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1748 GLfloat texcoords [8] = {tx, ty, tx, ty + th, tx + tw, ty, tx + tw, ty + th};
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1749 GLfloat texcoords2[8] = {tx2, ty2, tx2, ty2 + th2, tx2 + tw2, ty2, tx2 + tw2, ty2 + th2};
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1750 mpglEnableClientState(GL_VERTEX_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1751 mpglVertexPointer(2, GL_FLOAT, 0, vertices);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1752 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1753 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1754 if (is_yv12) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1755 mpglClientActiveTexture(GL_TEXTURE1);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1756 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1757 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords2);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1758 mpglClientActiveTexture(GL_TEXTURE2);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1759 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1760 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords2);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1761 mpglClientActiveTexture(GL_TEXTURE0);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1762 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1763 mpglDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1764 if (is_yv12) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1765 mpglClientActiveTexture(GL_TEXTURE1);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1766 mpglDisableClientState(GL_TEXTURE_COORD_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1767 mpglClientActiveTexture(GL_TEXTURE2);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1768 mpglDisableClientState(GL_TEXTURE_COORD_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1769 mpglClientActiveTexture(GL_TEXTURE0);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1770 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1771 mpglDisableClientState(GL_VERTEX_ARRAY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1772 return;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1773 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
1774
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1775 mpglBegin(GL_QUADS);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1776 mpglTexCoord2f(tx, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1777 if (is_yv12) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1778 mpglMultiTexCoord2f(GL_TEXTURE1, tx2, ty2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1779 mpglMultiTexCoord2f(GL_TEXTURE2, tx2, ty2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1780 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1781 mpglVertex2f(x, y);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1782 mpglTexCoord2f(tx, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1783 if (is_yv12) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1784 mpglMultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1785 mpglMultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1786 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1787 mpglVertex2f(x, y + h);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1788 mpglTexCoord2f(tx + tw, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1789 if (is_yv12) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1790 mpglMultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1791 mpglMultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1792 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1793 mpglVertex2f(x + w, y + h);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1794 mpglTexCoord2f(tx + tw, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1795 if (is_yv12) {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1796 mpglMultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1797 mpglMultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1798 }
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1799 mpglVertex2f(x + w, y);
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1800 mpglEnd();
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1801 }
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1802
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
1803 #ifdef CONFIG_GL_WIN32
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1804 #include "w32_common.h"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1805 /**
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
1806 * \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
1807 * getProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1808 * \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
1809 * \return function pointer returned by wglGetProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1810 */
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1811 static void *w32gpa(const GLubyte *procName) {
25953
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1812 HMODULE oglmod;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1813 void *res = wglGetProcAddress(procName);
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1814 if (res) return res;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1815 oglmod = GetModuleHandle("opengl32.dll");
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1816 return GetProcAddress(oglmod, procName);
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1817 }
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1818
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1819 static int setGlWindow_w32(MPGLContext *ctx)
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1820 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1821 HWND win = vo_w32_window;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1822 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1823 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1824 int new_vinfo;
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1825 HDC windc = vo_w32_get_dc(win);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1826 HGLRC new_context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1827 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
1828 int res = SET_WINDOW_FAILED;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1829
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1830 // 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
1831 // 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
1832 if (*context)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1833 mpglFinish();
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1834 new_vinfo = GetPixelFormat(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1835 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1836 // we can keep the wglContext
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1837 new_context = *context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1838 keep_context = 1;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1839 } else {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1840 // create a context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1841 new_context = wglCreateContext(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1842 if (!new_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1843 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
1844 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1845 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1846 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1847
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1848 // set context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1849 if (!wglMakeCurrent(windc, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1850 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
1851 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1852 wglDeleteContext(new_context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1853 }
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1854 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1855 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1856
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1857 // set new values
21631
2d3fdf94a50c Fix compilation under MinGW with X11 enabled
reimar
parents: 21201
diff changeset
1858 vo_w32_window = win;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1859 {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1860 RECT rect;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1861 GetClientRect(win, &rect);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1862 vo_dwidth = rect.right;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1863 vo_dheight = rect.bottom;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1864 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1865 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1866 if (*context)
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1867 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1868 *context = new_context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1869 *vinfo = new_vinfo;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1870 getFunctions(w32gpa, NULL);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1871
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1872 // 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
1873 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
1874 } else
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1875 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
1876
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1877 out:
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1878 vo_w32_release_dc(win, windc);
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1879 return res;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1880 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1881
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1882 static void releaseGlContext_w32(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1883 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1884 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1885 *vinfo = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1886 if (*context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1887 wglMakeCurrent(0, 0);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1888 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1889 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1890 *context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1891 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1892
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1893 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
1894 HDC vo_hdc = vo_w32_get_dc(vo_w32_window);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1895 SwapBuffers(vo_hdc);
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1896 vo_w32_release_dc(vo_w32_window, vo_hdc);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1897 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1898 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
1899 #ifdef CONFIG_GL_X11
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1900 #include "x11_common.h"
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1901
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1902 /**
14269
718ec28220d6 Doxygen comments improved
reimar
parents: 14142
diff changeset
1903 * \brief Returns the XVisualInfo associated with Window win.
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1904 * \param win Window whose XVisualInfo is returne.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1905 * \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
1906 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1907 static XVisualInfo *getWindowVisualInfo(Window win) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1908 XWindowAttributes xw_attr;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1909 XVisualInfo vinfo_template;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1910 int tmp;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1911 XGetWindowAttributes(mDisplay, win, &xw_attr);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1912 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1913 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1914 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1915
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1916 static void appendstr(char **dst, const char *str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1917 {
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1918 int newsize;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1919 char *newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1920 if (!str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1921 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1922 newsize = strlen(*dst) + 1 + strlen(str) + 1;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1923 newstr = realloc(*dst, newsize);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1924 if (!newstr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1925 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1926 *dst = newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1927 strcat(*dst, " ");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1928 strcat(*dst, str);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1929 }
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1930
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1931 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1932 * \brief Changes the window in which video is displayed.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1933 * 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
1934 * 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
1935 * \param vinfo Currently used visual.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1936 * \param context Currently used context.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1937 * \param win window that should be used for drawing.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1938 * \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
1939 * 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
1940 * 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
1941 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1942 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1943 static int setGlWindow_x11(MPGLContext *ctx)
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1944 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1945 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1946 GLXContext *context = &ctx->context.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1947 Window win = vo_window;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1948 XVisualInfo *new_vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1949 GLXContext new_context = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1950 int keep_context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1951
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1952 // 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
1953 // 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
1954 if (*context)
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
1955 mpglFinish();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1956 new_vinfo = getWindowVisualInfo(win);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1957 if (*context && *vinfo && new_vinfo &&
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1958 (*vinfo)->visualid == new_vinfo->visualid) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1959 // we can keep the GLXContext
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1960 new_context = *context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1961 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1962 new_vinfo = *vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1963 keep_context = 1;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1964 } else {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1965 // create a context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1966 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1967 if (!new_context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1968 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
1969 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1970 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1971 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1972 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1973
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1974 // set context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1975 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1976 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
1977 if (!keep_context) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1978 glXDestroyContext(mDisplay, new_context);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1979 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1980 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1981 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1982 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1983
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1984 // set new values
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1985 vo_window = win;
27885
9829cfa41d6d Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents: 27865
diff changeset
1986 vo_x11_update_geometry();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1987 if (!keep_context) {
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
1988 void *(*getProcAddress)(const GLubyte *);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1989 const char *(*glXExtStr)(Display *, int);
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1990 char *glxstr = strdup("");
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1991 if (*context)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1992 glXDestroyContext(mDisplay, *context);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1993 *context = new_context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1994 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1995 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1996 *vinfo = new_vinfo;
30946
82a429bcf680 Indentation fix.
reimar
parents: 30945
diff changeset
1997 getProcAddress = getdladdr("glXGetProcAddress");
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1998 if (!getProcAddress)
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1999 getProcAddress = getdladdr("glXGetProcAddressARB");
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
2000 glXExtStr = getdladdr("glXQueryExtensionsString");
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2001 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2002 appendstr(&glxstr, glXExtStr(mDisplay, DefaultScreen(mDisplay)));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2003 glXExtStr = getdladdr("glXGetClientString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2004 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2005 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2006 glXExtStr = getdladdr("glXGetServerString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2007 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2008 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2009
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2010 getFunctions(getProcAddress, glxstr);
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2011 if (!mpglGenPrograms && mpglGetString &&
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
2012 getProcAddress &&
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2013 strstr(mpglGetString(GL_EXTENSIONS), "GL_ARB_vertex_program")) {
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2014 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
2015 getFunctions(NULL, glxstr);
30952
994f301a13f6 Try to detect and work around broken glXGetProcAddress on at
reimar
parents: 30951
diff changeset
2016 }
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
2017 free(glxstr);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2018
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2019 // and inform that reinit is neccessary
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2020 return SET_WINDOW_REINIT;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2021 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2022 return SET_WINDOW_OK;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2023 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2024
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2025 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2026 * \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
2027 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2028 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2029 static void releaseGlContext_x11(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2030 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2031 GLXContext *context = &ctx->context.x11;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2032 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2033 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2034 *vinfo = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2035 if (*context)
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2036 {
30945
55917a674d7d Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents: 30840
diff changeset
2037 mpglFinish();
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2038 glXMakeCurrent(mDisplay, None, NULL);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2039 glXDestroyContext(mDisplay, *context);
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
2040 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2041 *context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2042 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2043
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2044 static void swapGlBuffers_x11(MPGLContext *ctx) {
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2045 glXSwapBuffers(mDisplay, vo_window);
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
2046 }
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2047 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2048
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2049 #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
2050 static int x11_check_events(void) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2051 return vo_x11_check_events(mDisplay);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2052 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2053 #endif
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
2054
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2055 #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
2056 #include "sdl_common.h"
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2057
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2058 static void swapGlBuffers_sdl(MPGLContext *ctx) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2059 SDL_GL_SwapBuffers();
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2060 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2061
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2062 static void *sdlgpa(const GLubyte *name) {
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2063 return SDL_GL_GetProcAddress(name);
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2064 }
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2065
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2066 static int setGlWindow_sdl(MPGLContext *ctx) {
34611
f1a31e5fc35f vo_sdl: reuse some more sdl_common code.
reimar
parents: 34572
diff changeset
2067 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
2068 return SET_WINDOW_FAILED;
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2069 SDL_GL_LoadLibrary(NULL);
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2070 getFunctions(sdlgpa, NULL);
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2071 return SET_WINDOW_OK;
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2072 }
31032
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2073
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2074 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
2075 int res = 0;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2076 SDL_Event event;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2077 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
2078 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
2079 }
31043
80036ef586ff Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents: 31041
diff changeset
2080 // poll "events" from within MPlayer code
80036ef586ff Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents: 31041
diff changeset
2081 res |= sdl_default_handle_event(NULL);
31033
8d1080e9c92d Window resizing support for -vo gl with SDL backend.
reimar
parents: 31032
diff changeset
2082 if (res & VO_EVENT_RESIZE)
8d1080e9c92d Window resizing support for -vo gl with SDL backend.
reimar
parents: 31032
diff changeset
2083 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
2084 return res;
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2085 }
362425fe3de8 Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents: 31031
diff changeset
2086
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2087 #endif
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2088
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2089 #ifdef CONFIG_GL_EGL_X11
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2090 static EGLDisplay eglDisplay = EGL_NO_DISPLAY;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2091 static EGLSurface eglSurface = EGL_NO_SURFACE;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2092
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2093 /*
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2094 * Some genius thought it a good idea to make
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2095 * eglGetProcAddress not work for core functions.
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2096 * 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
2097 * might also return symbols from a different library
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2098 * that the one providing the current context, great job!
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2099 */
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2100 static void *eglgpa(const GLubyte *name) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2101 void *res = eglGetProcAddress(name);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2102 if (!res) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2103 void *h = dlopen("/usr/lib/libGLESv1_CM.so", RTLD_LAZY);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2104 res = dlsym(h, name);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2105 dlclose(h);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2106 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2107 return res;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2108 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2109
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2110 static int setGlWindow_egl(MPGLContext *ctx)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2111 {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2112 static const EGLint cfg_attribs[] = { EGL_NONE };
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2113 static const EGLint ctx_attribs[] = { EGL_NONE };
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2114 EGLContext *context = &ctx->context.egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2115 Window win = vo_window;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2116 EGLContext new_context = NULL;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2117 EGLConfig eglConfig;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2118 int num_configs;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2119 if (eglDisplay == EGL_NO_DISPLAY) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2120 eglDisplay = eglGetDisplay(mDisplay);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2121 if (eglDisplay == EGL_NO_DISPLAY) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2122 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
2123 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2124 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2125 if (!eglInitialize(eglDisplay, NULL, NULL)) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2126 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
2127 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2128 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2129 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2130 if (*context != EGL_NO_CONTEXT) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2131 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2132 eglDestroyContext(eglDisplay, *context);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2133 eglDestroySurface(eglDisplay, eglSurface);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2134 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2135 if (!eglChooseConfig(eglDisplay, cfg_attribs, &eglConfig, 1, &num_configs) ||
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2136 num_configs != 1)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2137 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2138 eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, win, NULL);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2139 if (eglSurface == EGL_NO_SURFACE)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2140 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2141
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2142 new_context = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, ctx_attribs);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2143 if (new_context == EGL_NO_CONTEXT)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2144 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2145 if (!eglMakeCurrent(eglDisplay, eglSurface, eglSurface, new_context))
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2146 return SET_WINDOW_FAILED;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2147
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2148 // set new values
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2149 vo_window = win;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2150 vo_x11_update_geometry();
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2151 *context = new_context;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2152
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2153 getFunctions(eglgpa, eglQueryString(eglDisplay, EGL_EXTENSIONS));
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2154 mpglBegin = NULL;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2155 mpglDrawBuffer = NULL;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2156
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2157 // and inform that reinit is necessary
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2158 return SET_WINDOW_REINIT;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2159 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2160
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2161 /**
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2162 * \brief free the VisualInfo and GLXContext of an OpenGL context.
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2163 * \ingroup glcontext
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2164 */
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2165 static void releaseGlContext_egl(MPGLContext *ctx) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2166 EGLContext *context = &ctx->context.egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2167 if (*context != EGL_NO_CONTEXT)
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2168 {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2169 mpglFinish();
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2170 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2171 eglDestroyContext(eglDisplay, *context);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2172 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2173 *context = EGL_NO_CONTEXT;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2174 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2175
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2176 static void swapGlBuffers_egl(MPGLContext *ctx) {
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2177 eglSwapBuffers(eglDisplay, eglSurface);
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2178 }
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2179
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2180 #endif
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2181
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2182 static int setGlWindow_dummy(MPGLContext *ctx) {
31024
0e862bb517b0 Try harder to find linked OpenGL functions.
reimar
parents: 31021
diff changeset
2183 getFunctions(NULL, NULL);
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2184 return SET_WINDOW_OK;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2185 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2186
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2187 static void releaseGlContext_dummy(MPGLContext *ctx) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2188 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2189
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2190 static int dummy_check_events(void) {
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2191 return 0;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2192 }
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2193
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2194 static void dummy_update_xinerama_info(void) {
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2195 if (vo_screenwidth <= 0 || vo_screenheight <= 0) {
31041
42b4b532b86a Missing space in error message.
reimar
parents: 31037
diff changeset
2196 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
2197 "with -screenw and -screenh\n");
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2198 vo_screenwidth = 1280;
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2199 vo_screenheight = 768;
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2200 }
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2201 aspect_save_screenres(vo_screenwidth, vo_screenheight);
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2202 }
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2203
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2204 int init_mpglcontext(MPGLContext *ctx, enum MPGLType type) {
31044
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2205 if (type == GLTYPE_AUTO) {
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2206 int res = init_mpglcontext(ctx, GLTYPE_W32);
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2207 if (res) return res;
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2208 res = init_mpglcontext(ctx, GLTYPE_X11);
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2209 if (res) return res;
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2210 res = init_mpglcontext(ctx, GLTYPE_SDL);
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2211 if (res) return res;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2212 res = init_mpglcontext(ctx, GLTYPE_EGL_X11);
31044
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2213 return res;
4fdb46b8c2c9 Support for auto-selecting the OpenGL backend.
reimar
parents: 31043
diff changeset
2214 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2215 memset(ctx, 0, sizeof(*ctx));
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2216 ctx->setGlWindow = setGlWindow_dummy;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2217 ctx->releaseGlContext = releaseGlContext_dummy;
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2218 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
2219 ctx->check_events = dummy_check_events;
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2220 ctx->type = type;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2221 switch (ctx->type) {
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2222 #ifdef CONFIG_GL_WIN32
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2223 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2224 ctx->setGlWindow = setGlWindow_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2225 ctx->releaseGlContext = releaseGlContext_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2226 ctx->swapGlBuffers = swapGlBuffers_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2227 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
2228 ctx->border = vo_w32_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2229 ctx->check_events = vo_w32_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2230 ctx->fullscreen = vo_w32_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2231 ctx->ontop = vo_w32_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2232 return vo_w32_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2233 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2234 #ifdef CONFIG_GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2235 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2236 ctx->setGlWindow = setGlWindow_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2237 ctx->releaseGlContext = releaseGlContext_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2238 ctx->swapGlBuffers = swapGlBuffers_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2239 ctx->update_xinerama_info = update_xinerama_info;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2240 ctx->border = vo_x11_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2241 ctx->check_events = x11_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2242 ctx->fullscreen = vo_x11_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2243 ctx->ontop = vo_x11_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2244 return vo_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2245 #endif
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2246 #ifdef CONFIG_GL_SDL
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2247 case GLTYPE_SDL:
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2248 SDL_Init(SDL_INIT_VIDEO);
31031
d94eeec25c47 Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents: 31030
diff changeset
2249 ctx->setGlWindow = setGlWindow_sdl;
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2250 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
2251 ctx->check_events = sdl_check_events;
31035
5aae99fd6ca7 Fullscreen support for -vo gl using SDL.
reimar
parents: 31033
diff changeset
2252 ctx->fullscreen = vo_sdl_fullscreen;
31037
4f273572e445 Share SDL initialization code.
reimar
parents: 31035
diff changeset
2253 return vo_sdl_init();
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2254 #endif
34338
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2255 #ifdef CONFIG_GL_EGL_X11
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2256 case GLTYPE_EGL_X11:
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2257 ctx->setGlWindow = setGlWindow_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2258 ctx->releaseGlContext = releaseGlContext_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2259 ctx->swapGlBuffers = swapGlBuffers_egl;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2260 ctx->update_xinerama_info = update_xinerama_info;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2261 ctx->border = vo_x11_border;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2262 ctx->check_events = x11_check_events;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2263 ctx->fullscreen = vo_x11_fullscreen;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2264 ctx->ontop = vo_x11_ontop;
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2265 return vo_init();
4a507d3a039a Add highly experimental support for OpenGL ES.
reimar
parents: 34337
diff changeset
2266 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2267 default:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2268 return 0;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2269 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2270 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2271
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2272 void uninit_mpglcontext(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2273 ctx->releaseGlContext(ctx);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2274 switch (ctx->type) {
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2275 #ifdef CONFIG_GL_WIN32
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2276 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2277 vo_w32_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2278 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2279 #endif
30023
b7a703cf9178 Rename GL_* defines to CONFIG_GL_*
reimar
parents: 30021
diff changeset
2280 #ifdef CONFIG_GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2281 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2282 vo_x11_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2283 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2284 #endif
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2285 #ifdef CONFIG_GL_SDL
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2286 case GLTYPE_SDL:
31037
4f273572e445 Share SDL initialization code.
reimar
parents: 31035
diff changeset
2287 vo_sdl_uninit();
31020
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2288 break;
529614f44431 First steps to support -vo gl with SDL-based Window handling.
reimar
parents: 30964
diff changeset
2289 #endif
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2290 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2291 memset(ctx, 0, sizeof(*ctx));
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
2292 }