annotate libvo/gl_common.c @ 30021:7f09bc7a4279

Make the check for X11 and WIN32 backends for OpenGL separate. This fixes compilation on Windows with X11 but no GLX available.
author reimar
date Sat, 19 Dec 2009 10:52:32 +0000
parents 9b90e1052b32
children b7a703cf9178
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 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
4 * copyleft (C) 2005 Reimar Döffinger <Reimar.Doeffinger@stud.uni-karlsruhe.de>
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.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
23 */
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
24
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
25 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
26 * \file gl_common.c
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
27 * \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
28 */
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 26839
diff changeset
29
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
30 #include <stdlib.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
31 #include <stdio.h>
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
32 #include <string.h>
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
33 #include <ctype.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
34 #include <math.h>
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
35 #include "gl_common.h"
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
36 #include "libavutil/common.h"
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
37
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
38 void (GLAPIENTRY *Begin)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
39 void (GLAPIENTRY *End)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
40 void (GLAPIENTRY *Viewport)(GLint, GLint, GLsizei, GLsizei);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
41 void (GLAPIENTRY *MatrixMode)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
42 void (GLAPIENTRY *LoadIdentity)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
43 void (GLAPIENTRY *Scaled)(double, double, double);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
44 void (GLAPIENTRY *Ortho)(double, double, double, double, double, double);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
45 void (GLAPIENTRY *PushMatrix)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
46 void (GLAPIENTRY *PopMatrix)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
47 void (GLAPIENTRY *Clear)(GLbitfield);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
48 GLuint (GLAPIENTRY *GenLists)(GLsizei);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
49 void (GLAPIENTRY *DeleteLists)(GLuint, GLsizei);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
50 void (GLAPIENTRY *NewList)(GLuint, GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
51 void (GLAPIENTRY *EndList)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
52 void (GLAPIENTRY *CallList)(GLuint);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
53 void (GLAPIENTRY *CallLists)(GLsizei, GLenum, const GLvoid *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
54 void (GLAPIENTRY *GenTextures)(GLsizei, GLuint *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
55 void (GLAPIENTRY *DeleteTextures)(GLsizei, const GLuint *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
56 void (GLAPIENTRY *TexEnvi)(GLenum, GLenum, GLint);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
57 void (GLAPIENTRY *Color4ub)(GLubyte, GLubyte, GLubyte, GLubyte);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
58 void (GLAPIENTRY *Color3f)(GLfloat, GLfloat, GLfloat);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
59 void (GLAPIENTRY *ClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
60 void (GLAPIENTRY *Enable)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
61 void (GLAPIENTRY *Disable)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
62 const GLubyte *(GLAPIENTRY *GetString)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
63 void (GLAPIENTRY *DrawBuffer)(GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
64 void (GLAPIENTRY *DepthMask)(GLboolean);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
65 void (GLAPIENTRY *BlendFunc)(GLenum, GLenum);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
66 void (GLAPIENTRY *Flush)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
67 void (GLAPIENTRY *Finish)(void);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
68 void (GLAPIENTRY *PixelStorei)(GLenum, GLint);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
69 void (GLAPIENTRY *TexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
70 void (GLAPIENTRY *TexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
71 void (GLAPIENTRY *TexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
72 void (GLAPIENTRY *TexParameteri)(GLenum, GLenum, GLint);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
73 void (GLAPIENTRY *TexParameterf)(GLenum, GLenum, GLfloat);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
74 void (GLAPIENTRY *TexParameterfv)(GLenum, GLenum, const GLfloat *);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
75 void (GLAPIENTRY *TexCoord2f)(GLfloat, GLfloat);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
76 void (GLAPIENTRY *Vertex2f)(GLfloat, GLfloat);
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
77 void (GLAPIENTRY *GetIntegerv)(GLenum, GLint *);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
78
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
79 /**
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
80 * \defgroup glextfunctions OpenGL extension functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
81 *
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
82 * 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
83 * context is created
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
84 * \{
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
85 */
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
86 void (GLAPIENTRY *GenBuffers)(GLsizei, GLuint *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
87 void (GLAPIENTRY *DeleteBuffers)(GLsizei, const GLuint *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
88 void (GLAPIENTRY *BindBuffer)(GLenum, GLuint);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
89 GLvoid* (GLAPIENTRY *MapBuffer)(GLenum, GLenum);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
90 GLboolean (GLAPIENTRY *UnmapBuffer)(GLenum);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
91 void (GLAPIENTRY *BufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
92 void (GLAPIENTRY *CombinerParameterfv)(GLenum, const GLfloat *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
93 void (GLAPIENTRY *CombinerParameteri)(GLenum, GLint);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
94 void (GLAPIENTRY *CombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
95 GLenum);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
96 void (GLAPIENTRY *CombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
97 GLenum, GLenum, GLboolean, GLboolean,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
98 GLboolean);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
99 void (GLAPIENTRY *BeginFragmentShader)(void);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
100 void (GLAPIENTRY *EndFragmentShader)(void);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
101 void (GLAPIENTRY *SampleMap)(GLuint, GLuint, GLenum);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
102 void (GLAPIENTRY *ColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
103 GLuint, GLuint, GLuint, GLuint, GLuint);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
104 void (GLAPIENTRY *ColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint,
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
105 GLuint, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
106 GLuint, GLuint, GLuint);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
107 void (GLAPIENTRY *SetFragmentShaderConstant)(GLuint, const GLfloat *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
108 void (GLAPIENTRY *ActiveTexture)(GLenum);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
109 void (GLAPIENTRY *BindTexture)(GLenum, GLuint);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
110 void (GLAPIENTRY *MultiTexCoord2f)(GLenum, GLfloat, GLfloat);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
111 void (GLAPIENTRY *GenPrograms)(GLsizei, GLuint *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
112 void (GLAPIENTRY *DeletePrograms)(GLsizei, const GLuint *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
113 void (GLAPIENTRY *BindProgram)(GLenum, GLuint);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
114 void (GLAPIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
115 void (GLAPIENTRY *GetProgramiv)(GLenum, GLenum, GLint *);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
116 void (GLAPIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
117 GLfloat, GLfloat);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
118 int (GLAPIENTRY *SwapInterval)(int);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
119 void (GLAPIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei,
18578
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
120 GLint, GLenum, GLenum, const GLvoid *);
29941
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
121 void* (GLAPIENTRY *AllocateMemoryMESA)(void *, int, size_t, float, float, float);
092c1689c9df Prefer GLAPIENTRY over APIENTRY, it is the better name and used more by OpenGL headers.
reimar
parents: 29939
diff changeset
122 void (GLAPIENTRY *FreeMemoryMESA)(void *, int, void *);
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
123 /** \} */ // end of glextfunctions group
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
124
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
125 //! \defgroup glgeneral OpenGL general helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
126
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
127 //! \defgroup glcontext OpenGL context management helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
128
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
129 //! \defgroup gltexture OpenGL texture handling helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
130
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
131 //! \defgroup glconversion OpenGL conversion helper functions
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
132
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
133 static GLint hqtexfmt;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
134
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
135 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
136 * \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
137 * \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
138 * \ingroup glgeneral
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
139 */
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
140 void glAdjustAlignment(int stride) {
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
141 GLint gl_alignment;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
142 if (stride % 8 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
143 gl_alignment=8;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
144 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
145 gl_alignment=4;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
146 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
147 gl_alignment=2;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
148 else
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
149 gl_alignment=1;
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
150 PixelStorei(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
151 }
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
152
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
153 struct gl_name_map_struct {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
154 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
155 const char *name;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
156 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
157
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
158 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
159 #define MAP(a) {a, #a}
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
160 //! mapping table for the glValName function
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
161 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
162 // internal format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
163 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
164 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
165 MAP(GL_RGBA4), MAP(GL_RGB5_A1), MAP(GL_RGBA8), MAP(GL_RGB10_A2),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
166 MAP(GL_RGBA12), MAP(GL_RGBA16), MAP(GL_LUMINANCE8),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
167
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
168 // format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
169 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
170 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
171 MAP(GL_COLOR_INDEX),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
172 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
173 MAP(GL_BGR), MAP(GL_BGRA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
174
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
175 //type
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
176 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
177 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
178 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
179 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
180 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
181 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
182 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
183 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
184 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
185 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
186 {0, 0}
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
187 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
188 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
189
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
190 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
191 * \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
192 * \param value the constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
193 * \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
194 * \ingroup glgeneral
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
195 */
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
196 const char *glValName(GLint value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
197 {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
198 int i = 0;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
199
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
200 while (gl_name_map[i].name) {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
201 if (gl_name_map[i].value == value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
202 return gl_name_map[i].name;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
203 i++;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
204 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
205 return "Unknown format!";
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
206 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
207
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
208 //! 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
209 #define TEXTUREFORMAT_ALWAYS GL_RGB8
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
210 #undef TEXTUREFORMAT_ALWAYS
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
211
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
212 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
213 * \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
214 *
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
215 * All parameters may be NULL.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
216 * \param fmt MPlayer format to analyze.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
217 * \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
218 * \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
219 * 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
220 * \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
221 * \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
222 * \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
223 * \ingroup gltexture
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
224 */
16879
6ea220b10e8e More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents: 16648
diff changeset
225 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
226 GLenum *gl_format, GLenum *gl_type)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
227 {
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
228 int supported = 1;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
229 int dummy1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
230 GLenum dummy2;
16303
a87c6cf3fe52 Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents: 16270
diff changeset
231 GLint dummy3;
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
232 if (!bpp) bpp = &dummy1;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
233 if (!gl_texfmt) gl_texfmt = &dummy3;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
234 if (!gl_format) gl_format = &dummy2;
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
235 if (!gl_type) gl_type = &dummy2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
236
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
237 *bpp = IMGFMT_IS_BGR(fmt)?IMGFMT_BGR_DEPTH(fmt):IMGFMT_RGB_DEPTH(fmt);
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
238 *gl_texfmt = 3;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
239 switch (fmt) {
29902
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
240 case IMGFMT_RGB48NE:
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
241 *gl_format = GL_RGB;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
242 *gl_type = GL_UNSIGNED_SHORT;
85aaba93adf1 Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents: 29896
diff changeset
243 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
244 case IMGFMT_RGB24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
245 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
246 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
247 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
248 case IMGFMT_RGBA:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
249 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
250 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
251 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
252 break;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
253 case IMGFMT_YV12:
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
254 supported = 0; // no native YV12 support
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
255 case IMGFMT_Y800:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
256 case IMGFMT_Y8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
257 *gl_texfmt = 1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
258 *bpp = 8;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
259 *gl_format = GL_LUMINANCE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
260 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
261 break;
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
262 case IMGFMT_UYVY:
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
263 case IMGFMT_YUY2:
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
264 *gl_texfmt = GL_YCBCR_MESA;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
265 *bpp = 16;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
266 *gl_format = GL_YCBCR_MESA;
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
267 *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
268 break;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
269 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
270 // 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
271 // swscale produces works
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
272 case IMGFMT_RGB8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
273 gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
274 gl_type = GL_UNSIGNED_BYTE_2_3_3_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
275 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
276 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
277 case IMGFMT_RGB15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
278 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
279 *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
280 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
281 case IMGFMT_RGB16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
282 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
283 *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
284 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
285 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
286 case IMGFMT_BGR8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
287 // special case as red and blue have a differen number of bits.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
288 // 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
289 // 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
290 // blue than to red, which isn't wanted
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
291 gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
292 gl_type = GL_UNSIGNED_BYTE_3_3_2;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
293 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
294 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
295 case IMGFMT_BGR15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
296 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
297 *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
298 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
299 case IMGFMT_BGR16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
300 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
301 *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
302 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
303 case IMGFMT_BGR24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
304 *gl_format = GL_BGR;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
305 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
306 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
307 case IMGFMT_BGRA:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
308 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
309 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
310 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
311 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
312 default:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
313 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
314 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
315 *gl_type = GL_UNSIGNED_BYTE;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
316 supported = 0;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
317 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
318 #ifdef TEXTUREFORMAT_ALWAYS
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
319 *gl_texfmt = TEXTUREFORMAT_ALWAYS;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
320 #endif
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
321 return supported;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
322 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
323
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
324 static void *setNull(const GLubyte *s) {
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
325 return NULL;
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
326 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
327
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
328 typedef struct {
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
329 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
330 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
331 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
332 void *fallback;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
333 } extfunc_desc_t;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
334
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
335 #define DEF_FUNC_DESC(name) {&name, NULL, {"gl"#name, NULL}, gl ##name}
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
336 static const extfunc_desc_t extfuncs[] = {
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
337 // 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
338 // different "backends" with one binary
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
339 DEF_FUNC_DESC(Begin),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
340 DEF_FUNC_DESC(End),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
341 DEF_FUNC_DESC(Viewport),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
342 DEF_FUNC_DESC(MatrixMode),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
343 DEF_FUNC_DESC(LoadIdentity),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
344 DEF_FUNC_DESC(Scaled),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
345 DEF_FUNC_DESC(Ortho),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
346 DEF_FUNC_DESC(PushMatrix),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
347 DEF_FUNC_DESC(PopMatrix),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
348 DEF_FUNC_DESC(Clear),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
349 DEF_FUNC_DESC(GenLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
350 DEF_FUNC_DESC(DeleteLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
351 DEF_FUNC_DESC(NewList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
352 DEF_FUNC_DESC(EndList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
353 DEF_FUNC_DESC(CallList),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
354 DEF_FUNC_DESC(CallLists),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
355 DEF_FUNC_DESC(GenTextures),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
356 DEF_FUNC_DESC(DeleteTextures),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
357 DEF_FUNC_DESC(TexEnvi),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
358 DEF_FUNC_DESC(Color4ub),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
359 DEF_FUNC_DESC(Color3f),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
360 DEF_FUNC_DESC(ClearColor),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
361 DEF_FUNC_DESC(Enable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
362 DEF_FUNC_DESC(Disable),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
363 DEF_FUNC_DESC(DrawBuffer),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
364 DEF_FUNC_DESC(DepthMask),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
365 DEF_FUNC_DESC(BlendFunc),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
366 DEF_FUNC_DESC(Flush),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
367 DEF_FUNC_DESC(Finish),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
368 DEF_FUNC_DESC(PixelStorei),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
369 DEF_FUNC_DESC(TexImage1D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
370 DEF_FUNC_DESC(TexImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
371 DEF_FUNC_DESC(TexSubImage2D),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
372 DEF_FUNC_DESC(TexParameteri),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
373 DEF_FUNC_DESC(TexParameterf),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
374 DEF_FUNC_DESC(TexParameterfv),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
375 DEF_FUNC_DESC(TexCoord2f),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
376 DEF_FUNC_DESC(Vertex2f),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
377 DEF_FUNC_DESC(GetIntegerv),
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
378
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
379 // here start the real extensions
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
380 {&GenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
381 {&DeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
382 {&BindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
383 {&MapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
384 {&UnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
385 {&BufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
386 {&CombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
387 {&CombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
388 {&CombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
389 {&CombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
390 {&BeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
391 {&EndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
392 {&SampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
393 {&ColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
394 {&ColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
395 {&SetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
396 {&ActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
397 {&BindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
398 {&MultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
399 {&GenPrograms, "_program", {"glGenProgramsARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
400 {&DeletePrograms, "_program", {"glDeleteProgramsARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
401 {&BindProgram, "_program", {"glBindProgramARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
402 {&ProgramString, "_program", {"glProgramStringARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
403 {&GetProgramiv, "_program", {"glGetProgramivARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
404 {&ProgramEnvParameter4f, "_program", {"glProgramEnvParameter4fARB", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
405 {&SwapInterval, "_swap_control", {"glXSwapInterval", "glXSwapIntervalEXT", "glXSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", "wglSwapIntervalSGI", NULL}},
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
406 {&TexImage3D, NULL, {"glTexImage3D", NULL}},
28067
7511f7328d93 Add experimental support for glXAllocateMemoryMESA
reimar
parents: 28059
diff changeset
407 {&AllocateMemoryMESA, "GLX_MESA_allocate_memory", {"glXAllocateMemoryMESA", NULL}},
7511f7328d93 Add experimental support for glXAllocateMemoryMESA
reimar
parents: 28059
diff changeset
408 {&FreeMemoryMESA, "GLX_MESA_allocate_memory", {"glXFreeMemoryMESA", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
409 {NULL}
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
410 };
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
411
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
412 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
413 * \brief find the function pointers of some useful OpenGL extensions
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
414 * \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
415 * \param ext2 an extra extension string
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
416 */
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
417 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
418 const char *ext2) {
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
419 const extfunc_desc_t *dsc;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
420 const char *extensions;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
421 char *allexts;
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
422
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
423 if (!getProcAddress)
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
424 getProcAddress = setNull;
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
425
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
426 // special case, we need glGetString before starting to find the other functions
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
427 GetString = getProcAddress("glGetString");
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
428 if (!GetString)
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
429 GetString = glGetString;
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
430
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
431 extensions = (const char *)GetString(GL_EXTENSIONS);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
432 if (!extensions) extensions = "";
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
433 if (!ext2) ext2 = "";
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18787
diff changeset
434 allexts = malloc(strlen(extensions) + strlen(ext2) + 2);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
435 strcpy(allexts, extensions);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
436 strcat(allexts, " ");
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
437 strcat(allexts, ext2);
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
438 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
439 for (dsc = extfuncs; dsc->funcptr; dsc++) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
440 void *ptr = NULL;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
441 int i;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
442 if (!dsc->extstr || strstr(allexts, dsc->extstr)) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
443 for (i = 0; !ptr && dsc->funcnames[i]; i++)
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
444 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
445 }
29942
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
446 if (!ptr)
9b90e1052b32 Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents: 29941
diff changeset
447 ptr = dsc->fallback;
25762
280c4a499e63 Simplify and silence lots of warnings
reimar
parents: 25760
diff changeset
448 *(void **)dsc->funcptr = ptr;
16984
94b70ab52695 disable *SwapInterval function when extensions are missing, since it
reimar
parents: 16944
diff changeset
449 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
450 if (strstr(allexts, "_texture_float"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
451 hqtexfmt = GL_RGB32F;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
452 else if (strstr(allexts, "NV_float_buffer"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
453 hqtexfmt = GL_FLOAT_RGB32_NV;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
454 else
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
455 hqtexfmt = GL_RGB16;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
456 free(allexts);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
457 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
458
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
459 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
460 * \brief create a texture and set some defaults
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
461 * \param target texture taget, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
462 * \param fmt internal texture format
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
463 * \param format texture host data format
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
464 * \param type texture host data type
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
465 * \param filter filter used for scaling, e.g. GL_LINEAR
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
466 * \param w texture width
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
467 * \param h texture height
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
468 * \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
469 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
470 */
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
471 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
472 int w, int h, unsigned char val) {
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
473 GLfloat fval = (GLfloat)val / 255.0;
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
474 GLfloat border[4] = {fval, fval, fval, fval};
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
475 int stride = w * glFmt2bpp(format, type);
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
476 char *init;
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
477 if (!stride) return;
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
478 init = malloc(stride * h);
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
479 memset(init, val, stride * h);
27622
524f6a87cd23 Fix glAdjustAlignment parameter in glCreateClearTex
reimar
parents: 27621
diff changeset
480 glAdjustAlignment(stride);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
481 PixelStorei(GL_UNPACK_ROW_LENGTH, w);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
482 TexImage2D(target, 0, fmt, w, h, 0, format, type, init);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
483 TexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
484 TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
485 TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
486 TexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
487 TexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
16461
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
488 // 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
489 // We set a sane default anyway.
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
490 TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
491 free(init);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
492 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
493
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
494 /**
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
495 * \brief skips whitespace and comments
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
496 * \param f file to read from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
497 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
498 static void ppm_skip(FILE *f) {
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
499 int c, comment = 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
500 do {
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
501 c = fgetc(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
502 if (c == '#')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
503 comment = 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
504 if (c == '\n')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
505 comment = 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
506 } while (c != EOF && (isspace(c) || comment));
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
507 if (c != EOF)
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
508 ungetc(c, f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
509 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
510
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
511 #define MAXDIM (16 * 1024)
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
512
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
513 /**
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
514 * \brief creates a texture from a PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
515 * \param target texture taget, usually GL_TEXTURE_2D
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
516 * \param fmt internal texture format, 0 for default
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
517 * \param filter filter used for scaling, e.g. GL_LINEAR
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
518 * \param f file to read PPM from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
519 * \param width [out] width of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
520 * \param height [out] height of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
521 * \param maxval [out] maxval value from PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
522 * \return 0 on error, 1 otherwise
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
523 * \ingroup gltexture
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
524 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
525 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
526 FILE *f, int *width, int *height, int *maxval) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
527 unsigned w, h, m, val, bpp;
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
528 char *data;
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
529 GLenum type;
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
530 ppm_skip(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
531 if (fgetc(f) != 'P' || fgetc(f) != '6')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
532 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
533 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
534 if (fscanf(f, "%u", &w) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
535 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
536 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
537 if (fscanf(f, "%u", &h) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
538 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
539 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
540 if (fscanf(f, "%u", &m) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
541 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
542 val = fgetc(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
543 if (!isspace(val))
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
544 return 0;
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
545 if (w > MAXDIM || h > MAXDIM)
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
546 return 0;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
547 bpp = (m > 255) ? 6 : 3;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
548 data = malloc(w * h * bpp);
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
549 if (fread(data, w * bpp, h, f) != h)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
550 return 0;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
551 if (!fmt) {
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
552 fmt = (m > 255) ? hqtexfmt : 3;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
553 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
554 fmt = GL_RGB16;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
555 }
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
556 type = m > 255 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
557 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
558 glUploadTex(target, GL_RGB, type,
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
559 data, w * bpp, 0, 0, w, h, 0);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
560 free(data);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
561 if (width) *width = w;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
562 if (height) *height = h;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
563 if (maxval) *maxval = m;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
564 return 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
565 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
566
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
567 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
568 * \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
569 * \param format OpenGL format
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
570 * \param type OpenGL type
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
571 * \return bytes per pixel
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
572 * \ingroup glgeneral
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
573 *
16435
b5ca0e5760d0 Fix a typo in a comment
reimar
parents: 16303
diff changeset
574 * Does not handle all possible variants, just those used by MPlayer
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
575 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
576 int glFmt2bpp(GLenum format, GLenum type) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
577 int component_size = 0;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
578 switch (type) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
579 case GL_UNSIGNED_BYTE_3_3_2:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
580 case GL_UNSIGNED_BYTE_2_3_3_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
581 return 1;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
582 case GL_UNSIGNED_SHORT_5_5_5_1:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
583 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
584 case GL_UNSIGNED_SHORT_5_6_5:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
585 case GL_UNSIGNED_SHORT_5_6_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
586 return 2;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
587 case GL_UNSIGNED_BYTE:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
588 component_size = 1;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
589 break;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
590 case GL_UNSIGNED_SHORT:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
591 component_size = 2;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
592 break;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
593 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
594 switch (format) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
595 case GL_LUMINANCE:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
596 case GL_ALPHA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
597 return component_size;
28059
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
598 case GL_YCBCR_MESA:
8f43ff543dc6 Add support for YCBCR MESA texture format to vo_gl.
reimar
parents: 28036
diff changeset
599 return 2;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
600 case GL_RGB:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
601 case GL_BGR:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
602 return 3 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
603 case GL_RGBA:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
604 case GL_BGRA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
605 return 4 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
606 }
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
607 return 0; // unknown
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
608 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
609
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
610 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
611 * \brief upload a texture, handling things like stride and slices
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
612 * \param target texture target, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
613 * \param format OpenGL format of data
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
614 * \param type OpenGL type of data
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
615 * \param dataptr data to upload
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
616 * \param stride data stride
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
617 * \param x x offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
618 * \param y y offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
619 * \param w width of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
620 * \param h height of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
621 * \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
622 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
623 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
624 void glUploadTex(GLenum target, GLenum format, GLenum type,
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
625 const void *dataptr, int stride,
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
626 int x, int y, int w, int h, int slice) {
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
627 const uint8_t *data = dataptr;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
628 int y_max = y + h;
16223
f540609340ac extra check for glUploadTex to avoid a possible hang.
reimar
parents: 16221
diff changeset
629 if (w <= 0 || h <= 0) return;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
630 if (slice <= 0)
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
631 slice = h;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
632 if (stride < 0) {
18988
a61ef37d3c71 Fix off-by-one error for negative strides (flipped image)
reimar
parents: 18961
diff changeset
633 data += (h - 1) * stride;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
634 stride = -stride;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
635 }
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
636 // this is not always correct, but should work for MPlayer
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
637 glAdjustAlignment(stride);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
638 PixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
639 for (; y + slice <= y_max; y += slice) {
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
640 TexSubImage2D(target, 0, x, y, w, slice, format, type, data);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
641 data += stride * slice;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
642 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
643 if (y < y_max)
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
644 TexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data);
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
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
647 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
648 float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
649 int i;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
650 ucoef[0] = 0 * uvcos + 1.403 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
651 vcoef[0] = 0 * uvsin + 1.403 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
652 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
653 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
654 ucoef[2] = 1.770 * uvcos + 0 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
655 vcoef[2] = 1.770 * uvsin + 0 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
656 ucoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
657 vcoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
658 // Coefficients (probably) must be in [0, 1] range, whereas they originally
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
659 // are in [-2, 2] range, so here comes the trick:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
660 // 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
661 // 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
662 // for CombinerInput and CombinerOutput (or the respective ATI variants)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
663 for (i = 0; i < 4; i++) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
664 ucoef[i] = ucoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
665 vcoef[i] = vcoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
666 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
667 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
668
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
669 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
670 * \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
671 * \param uvcos used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
672 * \param uvsin used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
673 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
674 static void glSetupYUVCombiners(float uvcos, float uvsin) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
675 GLfloat ucoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
676 GLfloat vcoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
677 GLint i;
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
678 if (!CombinerInput || !CombinerOutput ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
679 !CombinerParameterfv || !CombinerParameteri) {
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
680 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
681 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
682 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
683 GetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
684 if (i < 2)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
685 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
686 "[gl] 2 general combiners needed for YUV combiner support (found %i)\n", i);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
687 GetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
688 if (i < 3)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
689 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
690 "[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
691 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
692 CombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
693 CombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
694
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
695 // UV first, like this green component cannot overflow
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
696 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
697 GL_TEXTURE1, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
698 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
699 GL_CONSTANT_COLOR0_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
700 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
701 GL_TEXTURE2, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
702 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
703 GL_CONSTANT_COLOR1_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
704 CombinerOutput(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
705 GL_SPARE0_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
706 GL_FALSE, GL_FALSE);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
707
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
708 // stage 2
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
709 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_SPARE0_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
710 GL_SIGNED_IDENTITY_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
711 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_ZERO,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
712 GL_UNSIGNED_INVERT_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
713 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
714 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
715 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
716 GL_UNSIGNED_INVERT_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
717 CombinerOutput(GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
718 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
719 GL_FALSE, GL_FALSE);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
720
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
721 // leave final combiner stage in default mode
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
722 CombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
723 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
724
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
725 /**
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
726 * \brief Setup ATI version of register combiners for YUV to RGB conversion.
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
727 * \param uvcos used for saturation and hue adjustment
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
728 * \param uvsin used for saturation and hue adjustment
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
729 *
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
730 * ATI called this fragment shader, but the name is confusing in the
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
731 * light of a very different OpenGL 2.0 extension with the same name
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
732 */
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
733 static void glSetupYUVCombinersATI(float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
734 GLfloat ucoef[4];
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
735 GLfloat vcoef[4];
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
736 GLint i;
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
737 if (!BeginFragmentShader || !EndFragmentShader ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
738 !SetFragmentShaderConstant || !SampleMap ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
739 !ColorFragmentOp2 || !ColorFragmentOp3) {
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
740 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner (ATI) functions missing!\n");
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
741 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
742 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
743 GetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
744 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
745 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
746 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
747 GetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
748 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
749 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
750 "[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
751 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
752 BeginFragmentShader();
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
753 SetFragmentShaderConstant(GL_CON_0_ATI, ucoef);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
754 SetFragmentShaderConstant(GL_CON_1_ATI, vcoef);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
755 SampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
756 SampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
757 SampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
758 // UV first, like this green component cannot overflow
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
759 ColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
760 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
761 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
762 ColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_4X_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
763 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
764 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
765 GL_REG_1_ATI, GL_NONE, GL_NONE);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
766 ColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
767 GL_REG_0_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
768 GL_REG_2_ATI, GL_NONE, GL_NONE);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
769 EndFragmentShader();
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
770 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
771
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
772 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
773 * \brief helper function for gen_spline_lookup_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
774 * \param x subpixel-position ((0,1) range) to calculate weights for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
775 * \param dst where to store transformed weights, must provide space for 4 GLfloats
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
776 *
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
777 * calculates the weights and stores them after appropriate transformation
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
778 * for the scaler fragment program.
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
779 */
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
780 static void store_weights(float x, GLfloat *dst) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
781 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
782 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
783 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
784 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
785 *dst++ = 1 + x - w1 / (w0 + w1);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
786 *dst++ = 1 - x + w3 / (w2 + w3);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
787 *dst++ = w0 + w1;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
788 *dst++ = 0;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
789 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
790
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
791 //! 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
792 #define LOOKUP_BSPLINE_RES (2 * 1024)
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
793 /**
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
794 * \brief creates the 1D lookup texture needed for fast higher-order filtering
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
795 * \param unit texture unit to attach texture to
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
796 */
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
797 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
798 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
799 GLfloat *tp = tex;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
800 int i;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
801 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
802 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
803 store_weights(x, tp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
804 tp += 4;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
805 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
806 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
807 store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
808 ActiveTexture(unit);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
809 TexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
810 TexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
811 TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
812 TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
813 TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
814 ActiveTexture(GL_TEXTURE0);
29896
ac3e6e27f2c7 Use calloc to allocate a rather large (currently 32k) array instead of
reimar
parents: 29679
diff changeset
815 free(tex);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
816 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
817
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
818 static const char *bilin_filt_template =
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
819 "TEX yuv.%c, fragment.texcoord[%c], texture[%c], %s;";
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
820
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
821 #define BICUB_FILT_MAIN(textype) \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
822 /* first y-interpolation */ \
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
823 "ADD coord, fragment.texcoord[%c].xyxy, cdelta.xyxw;" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
824 "ADD coord2, fragment.texcoord[%c].xyxy, cdelta.zyzw;" \
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
825 "TEX a.r, coord.xyxy, texture[%c], "textype";" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
826 "TEX a.g, coord.zwzw, texture[%c], "textype";" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
827 /* second y-interpolation */ \
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
828 "TEX b.r, coord2.xyxy, texture[%c], "textype";" \
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
829 "TEX b.g, coord2.zwzw, texture[%c], "textype";" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
830 "LRP a.b, parmy.b, a.rrrr, a.gggg;" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
831 "LRP a.a, parmy.b, b.rrrr, b.gggg;" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
832 /* x-interpolation */ \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
833 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
834
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
835 static const char *bicub_filt_template_2D =
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
836 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
837 "TEX parmx, coord.x, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
838 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
839 "TEX parmy, coord.y, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
840 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
841 BICUB_FILT_MAIN("2D");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
842
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
843 static const char *bicub_filt_template_RECT =
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
844 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
845 "TEX parmx, coord.x, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
846 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
847 "TEX parmy, coord.y, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
848 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
849 BICUB_FILT_MAIN("RECT");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
850
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
851 #define CALCWEIGHTS(t, s) \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
852 "MAD "t", {-0.5, 0.1666, 0.3333, -0.3333}, "s", {1, 0, -0.5, 0.5};" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
853 "MAD "t", "t", "s", {0, 0, -0.5, 0.5};" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
854 "MAD "t", "t", "s", {-0.6666, 0, 0.8333, 0.1666};" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
855 "RCP a.x, "t".z;" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
856 "RCP a.y, "t".w;" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
857 "MAD "t".xy, "t".xyxy, a.xyxy, {1, 1, 0, 0};" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
858 "ADD "t".x, "t".xxxx, "s";" \
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
859 "SUB "t".y, "t".yyyy, "s";"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
860
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
861 static const char *bicub_notex_filt_template_2D =
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
862 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
863 "FRC coord.xy, coord.xyxy;"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
864 CALCWEIGHTS("parmx", "coord.xxxx")
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
865 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
866 CALCWEIGHTS("parmy", "coord.yyyy")
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
867 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
868 BICUB_FILT_MAIN("2D");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
869
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
870 static const char *bicub_notex_filt_template_RECT =
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
871 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
872 "FRC coord.xy, coord.xyxy;"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
873 CALCWEIGHTS("parmx", "coord.xxxx")
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
874 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
875 CALCWEIGHTS("parmy", "coord.yyyy")
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
876 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};"
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
877 BICUB_FILT_MAIN("RECT");
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
878
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
879 #define BICUB_X_FILT_MAIN(textype) \
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
880 "ADD coord.xy, fragment.texcoord[%c].xyxy, cdelta.xyxy;" \
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
881 "ADD coord2.xy, fragment.texcoord[%c].xyxy, cdelta.zyzy;" \
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
882 "TEX a.r, coord, texture[%c], "textype";" \
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
883 "TEX b.r, coord2, texture[%c], "textype";" \
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
884 /* x-interpolation */ \
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
885 "LRP yuv.%c, parmx.b, a.rrrr, b.rrrr;"
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
886
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
887 static const char *bicub_x_filt_template_2D =
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
888 "MAD coord.x, fragment.texcoord[%c], {%f}, {0.5};"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
889 "TEX parmx, coord, texture[%c], 1D;"
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
890 "MUL cdelta.xyz, parmx.rrgg, {-%f, 0, %f};"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
891 BICUB_X_FILT_MAIN("2D");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
892
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
893 static const char *bicub_x_filt_template_RECT =
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
894 "ADD coord.x, fragment.texcoord[%c], {0.5};"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
895 "TEX parmx, coord, texture[%c], 1D;"
26195
802c489f77f0 Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents: 25953
diff changeset
896 "MUL cdelta.xyz, parmx.rrgg, {-1, 0, 1};"
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
897 BICUB_X_FILT_MAIN("RECT");
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
898
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
899 static const char *unsharp_filt_template =
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
900 "PARAM dcoord%c = {%f, %f, %f, %f};"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
901 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
902 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;"
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
903 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;"
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
904 "TEX b.r, coord.xyxy, texture[%c], %s;"
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
905 "TEX b.g, coord.zwzw, texture[%c], %s;"
25757
70ab55da2689 Remove leftover backslash
reimar
parents: 25756
diff changeset
906 "ADD b.r, b.r, b.g;"
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
907 "TEX b.b, coord2.xyxy, texture[%c], %s;"
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
908 "TEX b.g, coord2.zwzw, texture[%c], %s;"
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
909 "DP3 b, b, {0.25, 0.25, 0.25};"
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
910 "SUB b.r, a.r, b.r;"
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
911 "MAD yuv.%c, b.r, {%f}, a.r;";
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
912
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
913 static const char *unsharp_filt_template2 =
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
914 "PARAM dcoord%c = {%f, %f, %f, %f};"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
915 "PARAM dcoord2%c = {%f, 0, 0, %f};"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
916 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
917 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;"
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
918 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
919 "TEX b.r, coord.xyxy, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
920 "TEX b.g, coord.zwzw, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
921 "ADD b.r, b.r, b.g;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
922 "TEX b.b, coord2.xyxy, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
923 "TEX b.g, coord2.zwzw, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
924 "ADD b.r, b.r, b.b;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
925 "ADD b.a, b.r, b.g;"
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
926 "ADD coord, fragment.texcoord[%c].xyxy, dcoord2%c;"
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
927 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord2%c;"
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
928 "TEX b.r, coord.xyxy, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
929 "TEX b.g, coord.zwzw, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
930 "ADD b.r, b.r, b.g;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
931 "TEX b.b, coord2.xyxy, texture[%c], %s;"
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
932 "TEX b.g, coord2.zwzw, texture[%c], %s;"
25769
b3edb59e089f Fix a coefficient for lscale=5 OpenGL mode
reimar
parents: 25762
diff changeset
933 "DP4 b.r, b, {-0.1171875, -0.1171875, -0.1171875, -0.09765625};"
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
934 "MAD b.r, a.r, {0.859375}, b.r;"
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
935 "MAD yuv.%c, b.r, {%f}, a.r;";
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
936
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
937 static const char *yuv_prog_template =
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
938 "PARAM ycoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
939 "PARAM ucoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
940 "PARAM vcoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
941 "PARAM offsets = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
942 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
943 "MAD res.rgb, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
944 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
945 "MAD result.color.rgb, yuv.bbbb, vcoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
946 "END";
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
947
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
948 static const char *yuv_pow_prog_template =
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
949 "PARAM ycoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
950 "PARAM ucoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
951 "PARAM vcoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
952 "PARAM offsets = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
953 "PARAM gamma = {%.4f, %.4f, %.4f};"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
954 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
955 "MAD res.rgb, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
956 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
957 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;"
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
958 "POW result.color.r, res.r, gamma.r;"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
959 "POW result.color.g, res.g, gamma.g;"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
960 "POW result.color.b, res.b, gamma.b;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
961 "END";
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
962
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
963 static const char *yuv_lookup_prog_template =
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
964 "PARAM ycoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
965 "PARAM ucoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
966 "PARAM vcoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
967 "PARAM offsets = {%.4f, %.4f, %.4f, 0.125};"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
968 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
969 "MAD res, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
970 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
971 "MAD res.rgb, yuv.bbbb, vcoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
972 "TEX result.color.r, res.raaa, texture[%c], 2D;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
973 "ADD res.a, res.a, 0.25;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
974 "TEX result.color.g, res.gaaa, texture[%c], 2D;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
975 "ADD res.a, res.a, 0.25;"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
976 "TEX result.color.b, res.baaa, texture[%c], 2D;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
977 "END";
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
978
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
979 static const char *yuv_lookup3d_prog_template =
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
980 "TEX result.color, yuv, texture[%c], 3D;"
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
981 "END";
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
982
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
983 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
984 * \brief creates and initializes helper textures needed for scaling texture read
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
985 * \param scaler scaler type to create texture for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
986 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
987 * \param texs texture unit ids for the scaler are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
988 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
989 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
990 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
991 case YUV_SCALER_BILIN:
25727
7934f12c76f0 Add a forgotten case to create_scaler_textures, avoids an incorrect warning.
reimar
parents: 24777
diff changeset
992 case YUV_SCALER_BICUB_NOTEX:
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
993 case YUV_SCALER_UNSHARP:
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
994 case YUV_SCALER_UNSHARP2:
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
995 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
996 case YUV_SCALER_BICUB:
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
997 case YUV_SCALER_BICUB_X:
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
998 texs[0] = (*texu)++;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
999 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1000 texs[0] += '0';
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1001 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1002 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1003 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
1004 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1005 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1006
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1007 static void gen_gamma_map(unsigned char *map, int size, float gamma);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1008
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1009 #define ROW_R 0
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1010 #define ROW_G 1
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1011 #define ROW_B 2
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1012 #define COL_Y 0
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1013 #define COL_U 1
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1014 #define COL_V 2
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1015 #define COL_C 3
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1016
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1017 static void get_yuv2rgb_coeffs(gl_conversion_params_t *params, float yuv2rgb[3][4]) {
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1018 float uvcos = params->saturation * cos(params->hue);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1019 float uvsin = params->saturation * sin(params->hue);
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1020 int i;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1021 float uv_coeffs[3][2] = {
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1022 { 0.000, 1.596},
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1023 {-0.391, -0.813},
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1024 { 2.018, 0.000}
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1025 };
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1026 for (i = 0; i < 3; i++) {
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1027 yuv2rgb[i][COL_C] = params->brightness;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1028 yuv2rgb[i][COL_Y] = 1.164 * params->contrast;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1029 yuv2rgb[i][COL_C] += (-16 / 255.0) * yuv2rgb[i][COL_Y];
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1030 yuv2rgb[i][COL_U] = uv_coeffs[i][0] * uvcos + uv_coeffs[i][1] * uvsin;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1031 yuv2rgb[i][COL_C] += (-128 / 255.0) * yuv2rgb[i][COL_U];
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1032 yuv2rgb[i][COL_V] = uv_coeffs[i][0] * uvsin + uv_coeffs[i][1] * uvcos;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1033 yuv2rgb[i][COL_C] += (-128 / 255.0) * yuv2rgb[i][COL_V];
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1034 // this "centers" contrast control so that e.g. a contrast of 0
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1035 // leads to a grey image, not a black one
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1036 yuv2rgb[i][COL_C] += 0.5 - params->contrast / 2.0;
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1037 }
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1038 }
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1039
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1040 //! size of gamma map use to avoid slow exp function in gen_yuv2rgb_map
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1041 #define GMAP_SIZE (1024)
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1042 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1043 * \brief generate a 3D YUV -> RGB map
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1044 * \param params struct containing parameters like brightness, gamma, ...
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1045 * \param map where to store map. Must provide space for (size + 2)^3 elements
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1046 * \param size size of the map, excluding border
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1047 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1048 static void gen_yuv2rgb_map(gl_conversion_params_t *params, unsigned char *map, int size) {
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1049 int i, j, k, l;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1050 float step = 1.0 / size;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1051 float y, u, v;
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1052 float yuv2rgb[3][4];
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1053 unsigned char gmaps[3][GMAP_SIZE];
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1054 gen_gamma_map(gmaps[0], GMAP_SIZE, params->rgamma);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1055 gen_gamma_map(gmaps[1], GMAP_SIZE, params->ggamma);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1056 gen_gamma_map(gmaps[2], GMAP_SIZE, params->bgamma);
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1057 get_yuv2rgb_coeffs(params, yuv2rgb);
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1058 for (i = 0; i < 3; i++)
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1059 for (j = 0; j < 4; j++)
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1060 yuv2rgb[i][j] *= GMAP_SIZE - 1;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1061 v = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1062 for (i = -1; i <= size; i++) {
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1063 u = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1064 for (j = -1; j <= size; j++) {
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1065 y = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1066 for (k = -1; k <= size; k++) {
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1067 for (l = 0; l < 3; l++) {
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1068 float rgb = yuv2rgb[l][COL_Y] * y + yuv2rgb[l][COL_U] * u + yuv2rgb[l][COL_V] * v + yuv2rgb[l][COL_C];
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1069 *map++ = gmaps[l][av_clip(rgb, 0, GMAP_SIZE - 1)];
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1070 }
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1071 y += (k == -1 || k == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1072 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1073 u += (j == -1 || j == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1074 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1075 v += (i == -1 || i == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1076 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1077 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1078
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1079 //! resolution of texture for gamma lookup table
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1080 #define LOOKUP_RES 512
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1081 //! resolution for 3D yuv->rgb conversion lookup table
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1082 #define LOOKUP_3DRES 32
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1083 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1084 * \brief creates and initializes helper textures needed for yuv conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1085 * \param params struct containing parameters like brightness, gamma, ...
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1086 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1087 * \param texs texture unit ids for the conversion are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1088 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1089 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
1090 unsigned char *lookup_data = NULL;
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1091 int conv = YUV_CONVERSION(params->type);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1092 switch (conv) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1093 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1094 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1095 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1096 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1097 texs[0] = (*texu)++;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1098 ActiveTexture(GL_TEXTURE0 + texs[0]);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1099 lookup_data = malloc(4 * LOOKUP_RES);
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1100 gen_gamma_map(lookup_data, LOOKUP_RES, params->rgamma);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1101 gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->ggamma);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1102 gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->bgamma);
27621
53b5cf466361 Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents: 27509
diff changeset
1103 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
1104 LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1105 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
1106 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1107 ActiveTexture(GL_TEXTURE0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1108 texs[0] += '0';
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1109 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1110 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1111 {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1112 int sz = LOOKUP_3DRES + 2; // texture size including borders
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1113 if (!TexImage3D) {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1114 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
1115 break;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1116 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1117 texs[0] = (*texu)++;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1118 ActiveTexture(GL_TEXTURE0 + texs[0]);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1119 lookup_data = malloc(3 * sz * sz * sz);
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1120 gen_yuv2rgb_map(params, lookup_data, LOOKUP_3DRES);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1121 glAdjustAlignment(sz);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1122 PixelStorei(GL_UNPACK_ROW_LENGTH, 0);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1123 TexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1,
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1124 GL_RGB, GL_UNSIGNED_BYTE, lookup_data);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1125 TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1126 TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1127 TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1128 TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1129 TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1130 TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1131 ActiveTexture(GL_TEXTURE0);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1132 texs[0] += '0';
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1133 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1134 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1135 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1136 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
1137 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1138 if (lookup_data)
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1139 free(lookup_data);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1140 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1141
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1142 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1143 * \brief adds a scaling texture read at the current fragment program position
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1144 * \param scaler type of scaler to insert
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1145 * \param prog_pos current position in fragment program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1146 * \param remain how many bytes remain in the buffer given by prog_pos
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1147 * \param texs array containing the texture unit identifiers for this scaler
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1148 * \param in_tex texture unit the scaler should read from
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1149 * \param out_comp component of the yuv variable the scaler stores the result in
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1150 * \param rect if rectangular (pixel) adressing should be used for in_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1151 * \param texw width of the in_tex texture
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1152 * \param texh height of the in_tex texture
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1153 * \param strength strength of filter effect if the scaler does some kind of filtering
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1154 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1155 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
1156 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
1157 double strength) {
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1158 const char *ttype = rect ? "RECT" : "2D";
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1159 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
1160 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
1161 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1162 case YUV_SCALER_BILIN:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1163 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
1164 in_tex, ttype);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1165 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1166 case YUV_SCALER_BICUB:
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1167 if (rect)
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1168 snprintf(*prog_pos, *remain, bicub_filt_template_RECT,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1169 in_tex, texs[0], texs[0],
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1170 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1171 else
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1172 snprintf(*prog_pos, *remain, bicub_filt_template_2D,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1173 in_tex, (float)texw, (float)texh,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1174 texs[0], ptw, ptw, texs[0], pth, pth,
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1175 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
1176 break;
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1177 case YUV_SCALER_BICUB_X:
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1178 if (rect)
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1179 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
1180 in_tex, texs[0],
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1181 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
1182 else
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1183 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
1184 in_tex, (float)texw,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1185 texs[0], ptw, ptw,
22489
7589c6f9880a Add a new GPU-based scaling method to vo gl
reimar
parents: 22326
diff changeset
1186 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
1187 break;
24318
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1188 case YUV_SCALER_BICUB_NOTEX:
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1189 if (rect)
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1190 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
1191 in_tex,
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1192 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
1193 else
e6e8bf060dae Add a bicubic scaler that needs a lot more instruction but no
reimar
parents: 24315
diff changeset
1194 snprintf(*prog_pos, *remain, bicub_notex_filt_template_2D,
25756
ab70f293a168 Simplify
reimar
parents: 25755
diff changeset
1195 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
1196 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
1197 break;
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1198 case YUV_SCALER_UNSHARP:
25755
4ece7bfc77b7 Use the same unsharp filter template for 2D and RECT textures
reimar
parents: 25745
diff changeset
1199 snprintf(*prog_pos, *remain, unsharp_filt_template,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1200 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
1201 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
1202 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1203 in_tex, ttype, out_comp, strength);
25729
9a96fd14d1c5 Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents: 25727
diff changeset
1204 break;
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1205 case YUV_SCALER_UNSHARP2:
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1206 snprintf(*prog_pos, *remain, unsharp_filt_template2,
25760
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1207 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
1208 out_comp, 1.5 * ptw, 1.5 * pth,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1209 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
1210 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
1211 in_tex, ttype, in_tex, out_comp, in_tex, out_comp,
11f8a85a1a5c Fix using both lscale and cscale 4
reimar
parents: 25758
diff changeset
1212 in_tex, ttype, in_tex, ttype, in_tex, ttype,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1213 in_tex, ttype, out_comp, strength);
25758
2ee33590afe6 Add a fragment program for 5x5 unsharp masking
reimar
parents: 25757
diff changeset
1214 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1215 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1216 *remain -= strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1217 *prog_pos += strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1218 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1219
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1220 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
1221 const char *name;
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1222 GLenum cur;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1223 GLenum max;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1224 } progstats[] = {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1225 {"instructions", 0x88A0, 0x88A1},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1226 {"native instructions", 0x88A2, 0x88A3},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1227 {"temporaries", 0x88A4, 0x88A5},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1228 {"native temporaries", 0x88A6, 0x88A7},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1229 {"parameters", 0x88A8, 0x88A9},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1230 {"native parameters", 0x88AA, 0x88AB},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1231 {"attribs", 0x88AC, 0x88AD},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1232 {"native attribs", 0x88AE, 0x88AF},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1233 {"ALU instructions", 0x8805, 0x880B},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1234 {"TEX instructions", 0x8806, 0x880C},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1235 {"TEX indirections", 0x8807, 0x880D},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1236 {"native ALU instructions", 0x8808, 0x880E},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1237 {"native TEX instructions", 0x8809, 0x880F},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1238 {"native TEX indirections", 0x880A, 0x8810},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1239 {NULL, 0, 0}
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1240 };
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1241
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1242 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1243 * \brief load the specified GPU Program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1244 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1245 * \param prog program string
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1246 * \return 1 on success, 0 otherwise
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
1247 */
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1248 int loadGPUProgram(GLenum target, char *prog) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1249 int i;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1250 GLint cur = 0, max = 0, err = 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1251 if (!ProgramString) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1252 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
1253 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1254 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1255 ProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1256 GetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1257 if (err != -1) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1258 mp_msg(MSGT_VO, MSGL_ERR,
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1259 "[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
1260 "[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
1261 "[gl] Error message:\n %s at %.10s\n",
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1262 GetString(GL_PROGRAM_ERROR_STRING), &prog[err]);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1263 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1264 }
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
1265 if (!GetProgramiv || !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
1266 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1267 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
1268 for (i = 0; progstats[i].name; i++) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1269 GetProgramiv(target, progstats[i].cur, &cur);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1270 GetProgramiv(target, progstats[i].max, &max);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1271 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
1272 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1273 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1274 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1275
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1276 #define MAX_PROGSZ (1024*1024)
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1277
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1278 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1279 * \brief setup a fragment program that will do YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1280 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1281 * brightness, ...
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1282 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1283 static void glSetupYUVFragprog(gl_conversion_params_t *params) {
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1284 int type = params->type;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1285 int texw = params->texw;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1286 int texh = params->texh;
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1287 int rect = params->target == GL_TEXTURE_RECTANGLE;
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1288 static const char prog_hdr[] =
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1289 "!!ARBfp1.0\n"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1290 "OPTION ARB_precision_hint_fastest;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1291 // 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
1292 // multiple times when the same scaler is used more than once
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
1293 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;";
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1294 int prog_remain;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1295 char *yuv_prog, *prog_pos;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1296 int cur_texu = 3;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1297 char lum_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1298 char chrom_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1299 char conv_texs[1];
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1300 GLint i;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1301 // 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
1302 // for red, green, blue and the constant offsets
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1303 float yuv2rgb[3][4];
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1304 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
1305 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
1306 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
1307 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
1308 else
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1309 create_scaler_textures(YUV_CHROM_SCALER(type), &cur_texu, chrom_scale_texs);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1310 GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1311 if (i < cur_texu)
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1312 mp_msg(MSGT_VO, MSGL_ERR,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1313 "[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
1314 cur_texu, i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1315 if (!ProgramString) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1316 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
1317 return;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1318 }
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1319 yuv_prog = malloc(MAX_PROGSZ);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1320 strcpy(yuv_prog, prog_hdr);
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1321 prog_pos = yuv_prog + sizeof(prog_hdr) - 1;
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1322 prog_remain = MAX_PROGSZ - sizeof(prog_hdr);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1323 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
1324 '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
1325 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1326 '1', 'g', rect, texw / 2, texh / 2, params->filter_strength);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1327 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
26836
ba086caf1230 Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents: 26834
diff changeset
1328 '2', 'b', rect, texw / 2, texh / 2, params->filter_strength);
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1329 get_yuv2rgb_coeffs(params, yuv2rgb);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1330 switch (YUV_CONVERSION(type)) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1331 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1332 snprintf(prog_pos, prog_remain, yuv_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1333 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
1334 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
1335 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
1336 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
1337 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1338 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1339 snprintf(prog_pos, prog_remain, yuv_pow_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1340 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
1341 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
1342 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
1343 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C],
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1344 (float)1.0 / params->rgamma, (float)1.0 / params->bgamma, (float)1.0 / params->bgamma);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1345 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1346 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1347 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template,
26839
91f8d353b6d2 Simplify yuv to rgb conversion matrix stuff.
reimar
parents: 26838
diff changeset
1348 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
1349 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
1350 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
1351 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
1352 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
1353 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1354 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1355 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
1356 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1357 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1358 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
1359 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1360 }
29905
908f55fb5ed8 Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents: 29904
diff changeset
1361 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
1362 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog);
25885
fa24feceb3f9 Allow for larger fragment programs.
reimar
parents: 25769
diff changeset
1363 free(yuv_prog);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1364 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1365
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 little helper function to create a lookup table for gamma
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1368 * \param map buffer to create map into
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1369 * \param size size of buffer
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1370 * \param gamma gamma value
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1371 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1372 static void gen_gamma_map(unsigned char *map, int size, float gamma) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1373 int i;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1374 if (gamma == 1.0) {
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1375 for (i = 0; i < size; i++)
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1376 map[i] = 255 * i / (size - 1);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1377 return;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1378 }
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1379 gamma = 1.0 / gamma;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1380 for (i = 0; i < size; i++) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1381 float tmp = (float)i / (size - 1.0);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1382 tmp = pow(tmp, gamma);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1383 if (tmp > 1.0) tmp = 1.0;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1384 if (tmp < 0.0) tmp = 0.0;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1385 map[i] = 255 * tmp;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1386 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1387 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1388
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1389 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1390 * \brief setup YUV->RGB conversion
26837
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1391 * \param parms struct containing parameters like conversion and scaler type,
e564a1f2f762 update doxygen comments
reimar
parents: 26836
diff changeset
1392 * brightness, ...
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1393 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1394 */
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1395 void glSetupYUVConversion(gl_conversion_params_t *params) {
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1396 float uvcos = params->saturation * cos(params->hue);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1397 float uvsin = params->saturation * sin(params->hue);
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1398 switch (YUV_CONVERSION(params->type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1399 case YUV_CONVERSION_COMBINERS:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1400 glSetupYUVCombiners(uvcos, uvsin);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1401 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1402 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1403 glSetupYUVCombinersATI(uvcos, uvsin);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1404 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1405 case YUV_CONVERSION_FRAGMENT_LOOKUP:
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1406 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1407 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1408 case YUV_CONVERSION_FRAGMENT_POW:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1409 glSetupYUVFragprog(params);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1410 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1411 default:
26834
aadfce1c25c8 Use a struct instead of a huge and further growing argument list.
reimar
parents: 26195
diff changeset
1412 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
1413 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1414 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1415
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1416 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1417 * \brief enable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1418 * \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
1419 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1420 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1421 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1422 void glEnableYUVConversion(GLenum target, int type) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1423 if (type <= 0) return;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1424 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1425 case YUV_CONVERSION_COMBINERS:
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1426 ActiveTexture(GL_TEXTURE1);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1427 Enable(target);
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1428 ActiveTexture(GL_TEXTURE2);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1429 Enable(target);
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1430 ActiveTexture(GL_TEXTURE0);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1431 Enable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1432 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1433 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1434 ActiveTexture(GL_TEXTURE1);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1435 Enable(target);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1436 ActiveTexture(GL_TEXTURE2);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1437 Enable(target);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1438 ActiveTexture(GL_TEXTURE0);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1439 Enable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1440 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1441 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1442 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1443 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1444 case YUV_CONVERSION_FRAGMENT:
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1445 Enable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1446 break;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1447 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1448 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1449
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1450 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1451 * \brief disable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1452 * \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
1453 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1454 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1455 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1456 void glDisableYUVConversion(GLenum target, int type) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1457 if (type <= 0) return;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1458 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1459 case YUV_CONVERSION_COMBINERS:
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1460 ActiveTexture(GL_TEXTURE1);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1461 Disable(target);
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1462 ActiveTexture(GL_TEXTURE2);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1463 Disable(target);
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1464 ActiveTexture(GL_TEXTURE0);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1465 Disable(GL_REGISTER_COMBINERS_NV);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1466 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1467 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1468 ActiveTexture(GL_TEXTURE1);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1469 Disable(target);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1470 ActiveTexture(GL_TEXTURE2);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1471 Disable(target);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1472 ActiveTexture(GL_TEXTURE0);
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1473 Disable(GL_FRAGMENT_SHADER_ATI);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1474 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1475 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1476 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1477 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1478 case YUV_CONVERSION_FRAGMENT:
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1479 Disable(GL_FRAGMENT_PROGRAM);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1480 break;
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
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1484 /**
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1485 * \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
1486 * \param x screen top coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1487 * \param y screen left coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1488 * \param w screen width coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1489 * \param h screen height coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1490 * \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
1491 * \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
1492 * \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
1493 * \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
1494 * \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
1495 * \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
1496 * \param rect_tex whether this texture uses texture_rectangle extension
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1497 * \param is_yv12 if set, also draw the textures from units 1 and 2
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1498 * \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
1499 * \ingroup gltexture
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1500 */
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1501 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
1502 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1503 int sx, int sy, int rect_tex, int is_yv12, int flip) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1504 GLfloat tx2 = tx / 2, ty2 = ty / 2, tw2 = tw / 2, th2 = th / 2;
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1505 if (!rect_tex) {
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1506 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
1507 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
1508 }
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1509 if (flip) {
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1510 y += h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1511 h = -h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1512 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1513 Begin(GL_QUADS);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1514 TexCoord2f(tx, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1515 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1516 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1517 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1518 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1519 Vertex2f(x, y);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1520 TexCoord2f(tx, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1521 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1522 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1523 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1524 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1525 Vertex2f(x, y + h);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1526 TexCoord2f(tx + tw, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1527 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1528 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1529 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1530 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1531 Vertex2f(x + w, y + h);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1532 TexCoord2f(tx + tw, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1533 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1534 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1535 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1536 }
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1537 Vertex2f(x + w, y);
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1538 End();
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1539 }
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1540
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1541 #ifdef GL_WIN32
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1542 #include "w32_common.h"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1543 /**
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29183
diff changeset
1544 * \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
1545 * getProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1546 * \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
1547 * \return function pointer returned by wglGetProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1548 */
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1549 static void *w32gpa(const GLubyte *procName) {
25953
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1550 HMODULE oglmod;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1551 void *res = wglGetProcAddress(procName);
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1552 if (res) return res;
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1553 oglmod = GetModuleHandle("opengl32.dll");
606adc08ee6d Try harder to find OpenGL functions on Windows.
reimar
parents: 25885
diff changeset
1554 return GetProcAddress(oglmod, procName);
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1555 }
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1556
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1557 static int setGlWindow_w32(MPGLContext *ctx)
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1558 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1559 HWND win = vo_w32_window;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1560 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1561 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1562 int new_vinfo;
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1563 HDC windc = vo_w32_get_dc(win);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1564 HGLRC new_context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1565 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
1566 int res = SET_WINDOW_FAILED;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1567
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1568 // 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
1569 // 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
1570 if (*context)
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1571 Finish();
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1572 new_vinfo = GetPixelFormat(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1573 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1574 // we can keep the wglContext
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1575 new_context = *context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1576 keep_context = 1;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1577 } else {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1578 // create a context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1579 new_context = wglCreateContext(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1580 if (!new_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1581 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
1582 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1583 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1584 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1585
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1586 // set context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1587 if (!wglMakeCurrent(windc, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1588 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
1589 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1590 wglDeleteContext(new_context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1591 }
24314
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1592 goto out;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1593 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1594
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1595 // set new values
21631
2d3fdf94a50c Fix compilation under MinGW with X11 enabled
reimar
parents: 21201
diff changeset
1596 vo_w32_window = win;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1597 {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1598 RECT rect;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1599 GetClientRect(win, &rect);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1600 vo_dwidth = rect.right;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1601 vo_dheight = rect.bottom;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1602 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1603 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1604 if (*context)
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1605 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1606 *context = new_context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1607 *vinfo = new_vinfo;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1608 getFunctions(w32gpa, NULL);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1609
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1610 // 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
1611 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
1612 } else
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1613 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
1614
20359547f3c3 Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents: 22489
diff changeset
1615 out:
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1616 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
1617 return res;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1618 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1619
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1620 static void releaseGlContext_w32(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1621 int *vinfo = &ctx->vinfo.w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1622 HGLRC *context = &ctx->context.w32;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1623 *vinfo = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1624 if (*context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1625 wglMakeCurrent(0, 0);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1626 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1627 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1628 *context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1629 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1630
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1631 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
1632 HDC vo_hdc = vo_w32_get_dc(vo_w32_window);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1633 SwapBuffers(vo_hdc);
29904
f529a2bb299d Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents: 29902
diff changeset
1634 vo_w32_release_dc(vo_w32_window, vo_hdc);
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1635 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1636 #endif
30021
7f09bc7a4279 Make the check for X11 and WIN32 backends for OpenGL separate.
reimar
parents: 29942
diff changeset
1637 #ifdef GL_X11
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1638 #ifdef HAVE_LIBDL
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1639 #include <dlfcn.h>
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1640 #endif
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1641 #include "x11_common.h"
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1642 /**
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1643 * \brief find address of a linked function
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1644 * \param s name of function to find
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1645 * \return address of function or NULL if not found
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1646 */
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1647 static void *getdladdr(const char *s) {
29183
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1648 void *ret = NULL;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1649 #ifdef HAVE_LIBDL
29183
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1650 void *handle = dlopen(NULL, RTLD_LAZY);
17419
433e35de3b10 avoid Solaris 10 compile error with gcc 3.4.5
reimar
parents: 17336
diff changeset
1651 if (!handle)
29183
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1652 return NULL;
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1653 ret = dlsym(handle, s);
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1654 dlclose(handle);
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1655 #endif
29183
edd77b4f699b Change getdladdr to always use dlopen, dlsym and then dlclose.
reimar
parents: 28232
diff changeset
1656 return ret;
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1657 }
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1658
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1659 /**
14269
718ec28220d6 Doxygen comments improved
reimar
parents: 14142
diff changeset
1660 * \brief Returns the XVisualInfo associated with Window win.
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1661 * \param win Window whose XVisualInfo is returne.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1662 * \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
1663 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1664 static XVisualInfo *getWindowVisualInfo(Window win) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1665 XWindowAttributes xw_attr;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1666 XVisualInfo vinfo_template;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1667 int tmp;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1668 XGetWindowAttributes(mDisplay, win, &xw_attr);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1669 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1670 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1671 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1672
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1673 static void appendstr(char **dst, const char *str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1674 {
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1675 int newsize;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1676 char *newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1677 if (!str)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1678 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1679 newsize = strlen(*dst) + 1 + strlen(str) + 1;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1680 newstr = realloc(*dst, newsize);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1681 if (!newstr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1682 return;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1683 *dst = newstr;
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1684 strcat(*dst, " ");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1685 strcat(*dst, str);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1686 }
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1687
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1688 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1689 * \brief Changes the window in which video is displayed.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1690 * 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
1691 * 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
1692 * \param vinfo Currently used visual.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1693 * \param context Currently used context.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1694 * \param win window that should be used for drawing.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1695 * \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
1696 * 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
1697 * 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
1698 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1699 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1700 static int setGlWindow_x11(MPGLContext *ctx)
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1701 {
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1702 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1703 GLXContext *context = &ctx->context.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1704 Window win = vo_window;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1705 XVisualInfo *new_vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1706 GLXContext new_context = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1707 int keep_context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1708
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1709 // 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
1710 // 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
1711 if (*context)
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1712 Finish();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1713 new_vinfo = getWindowVisualInfo(win);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1714 if (*context && *vinfo && new_vinfo &&
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1715 (*vinfo)->visualid == new_vinfo->visualid) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1716 // we can keep the GLXContext
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1717 new_context = *context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1718 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1719 new_vinfo = *vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1720 keep_context = 1;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1721 } else {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1722 // create a context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1723 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1724 if (!new_context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1725 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
1726 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1727 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1728 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1729 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1730
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1731 // set context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1732 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1733 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
1734 if (!keep_context) {
28036
463a30e51b44 Cosmetics, whitespace and "... == NULL" to "!..."
reimar
parents: 27885
diff changeset
1735 glXDestroyContext(mDisplay, new_context);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1736 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1737 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1738 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1739 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1740
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1741 // set new values
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1742 vo_window = win;
27885
9829cfa41d6d Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents: 27865
diff changeset
1743 vo_x11_update_geometry();
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1744 if (!keep_context) {
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
1745 void *(*getProcAddress)(const GLubyte *);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1746 const char *(*glXExtStr)(Display *, int);
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1747 char *glxstr = strdup("");
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1748 if (*context)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1749 glXDestroyContext(mDisplay, *context);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1750 *context = new_context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1751 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1752 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1753 *vinfo = new_vinfo;
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1754 getProcAddress = getdladdr("glXGetProcAddress");
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1755 if (!getProcAddress)
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1756 getProcAddress = getdladdr("glXGetProcAddressARB");
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1757 if (!getProcAddress)
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1758 getProcAddress = (void *)getdladdr;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1759 glXExtStr = getdladdr("glXQueryExtensionsString");
29679
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1760 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1761 appendstr(&glxstr, glXExtStr(mDisplay, DefaultScreen(mDisplay)));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1762 glXExtStr = getdladdr("glXGetClientString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1763 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1764 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1765 glXExtStr = getdladdr("glXGetServerString");
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1766 if (glXExtStr)
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1767 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1768
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1769 getFunctions(getProcAddress, glxstr);
465247b46e39 Also check GLX client and server strings for extensions
reimar
parents: 29263
diff changeset
1770 free(glxstr);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1771
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1772 // and inform that reinit is neccessary
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1773 return SET_WINDOW_REINIT;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1774 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1775 return SET_WINDOW_OK;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1776 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1777
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1778 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1779 * \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
1780 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1781 */
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1782 static void releaseGlContext_x11(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1783 XVisualInfo **vinfo = &ctx->vinfo.x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1784 GLXContext *context = &ctx->context.x11;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1785 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1786 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1787 *vinfo = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1788 if (*context)
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1789 {
29939
319b62d55feb Pass all OpenGL functions through a function pointer indirection.
reimar
parents: 29938
diff changeset
1790 Finish();
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1791 glXMakeCurrent(mDisplay, None, NULL);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1792 glXDestroyContext(mDisplay, *context);
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1793 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1794 *context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1795 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1796
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1797 static void swapGlBuffers_x11(MPGLContext *ctx) {
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1798 glXSwapBuffers(mDisplay, vo_window);
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1799 }
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1800
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1801 static int x11_check_events(void) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1802 return vo_x11_check_events(mDisplay);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1803 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1804 #endif
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1805
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1806 int init_mpglcontext(MPGLContext *ctx, enum MPGLType type) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1807 memset(ctx, 0, sizeof(*ctx));
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1808 ctx->type = type;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1809 switch (ctx->type) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1810 #ifdef GL_WIN32
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1811 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1812 ctx->setGlWindow = setGlWindow_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1813 ctx->releaseGlContext = releaseGlContext_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1814 ctx->swapGlBuffers = swapGlBuffers_w32;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1815 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
1816 ctx->border = vo_w32_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1817 ctx->check_events = vo_w32_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1818 ctx->fullscreen = vo_w32_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1819 ctx->ontop = vo_w32_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1820 return vo_w32_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1821 #endif
30021
7f09bc7a4279 Make the check for X11 and WIN32 backends for OpenGL separate.
reimar
parents: 29942
diff changeset
1822 #ifdef GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1823 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1824 ctx->setGlWindow = setGlWindow_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1825 ctx->releaseGlContext = releaseGlContext_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1826 ctx->swapGlBuffers = swapGlBuffers_x11;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1827 ctx->update_xinerama_info = update_xinerama_info;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1828 ctx->border = vo_x11_border;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1829 ctx->check_events = x11_check_events;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1830 ctx->fullscreen = vo_x11_fullscreen;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1831 ctx->ontop = vo_x11_ontop;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1832 return vo_init();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1833 #endif
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1834 default:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1835 return 0;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1836 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1837 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1838
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1839 void uninit_mpglcontext(MPGLContext *ctx) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1840 ctx->releaseGlContext(ctx);
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1841 switch (ctx->type) {
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1842 #ifdef GL_WIN32
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1843 case GLTYPE_W32:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1844 vo_w32_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1845 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1846 #endif
30021
7f09bc7a4279 Make the check for X11 and WIN32 backends for OpenGL separate.
reimar
parents: 29942
diff changeset
1847 #ifdef GL_X11
29938
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1848 case GLTYPE_X11:
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1849 vo_x11_uninit();
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1850 break;
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1851 #endif
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1852 }
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1853 memset(ctx, 0, sizeof(*ctx));
eb6c70e2cbea Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents: 29905
diff changeset
1854 }