Mercurial > mplayer.hg
annotate libvo/gl_common.c @ 32927:edb972e22021
Fix memory leak in appInitStruct().
The NumberOf{Main,Bar,Menu}Items members actually don't hold the
number of items but the last index used. Therefore, the last item
won't get freed so far.
To set the correct "number" for the global external variable prior
to using it, the function appResetStruct() has been added and is used
in appInitStruct() as well.
author | ib |
---|---|
date | Thu, 03 Mar 2011 13:45:30 +0000 |
parents | 8fa2f43cb760 |
children | 706871635af7 |
rev | line source |
---|---|
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
1 /* |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
2 * common OpenGL routines |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
3 * |
31030 | 4 * copyleft (C) 2005-2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de> |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
5 * Special thanks go to the xine team and Matthias Hopf, whose video_out_opengl.c |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
6 * gave me lots of good ideas. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
7 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
8 * This file is part of MPlayer. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
9 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or modify |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
13 * (at your option) any later version. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
14 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
18 * GNU General Public License for more details. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
19 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
20 * You should have received a copy of the GNU General Public License along |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
21 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
31309
1a35ec7c45e0
Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents:
31086
diff
changeset
|
23 * |
1a35ec7c45e0
Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents:
31086
diff
changeset
|
24 * You can alternatively redistribute this file and/or |
1a35ec7c45e0
Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents:
31086
diff
changeset
|
25 * modify it under the terms of the GNU Lesser General Public |
1a35ec7c45e0
Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents:
31086
diff
changeset
|
26 * License as published by the Free Software Foundation; either |
1a35ec7c45e0
Dual-license gl_common and vo_gl under the LGPL v2.1 or later as
reimar
parents:
31086
diff
changeset
|
27 * version 2.1 of the License, or (at your option) any later version. |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
28 */ |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
29 |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
30 /** |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
31 * \file gl_common.c |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
32 * \brief OpenGL helper functions used by vo_gl.c and vo_gl2.c |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
33 */ |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
34 |
16117 | 35 #include <stdlib.h> |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
36 #include <stdio.h> |
16117 | 37 #include <string.h> |
16592 | 38 #include <ctype.h> |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
39 #include <math.h> |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
40 #include "gl_common.h" |
30108
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
41 #include "csputils.h" |
31035 | 42 #include "aspect.h" |
32427 | 43 #include "pnm_loader.h" |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
44 |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
45 void (GLAPIENTRY *mpglBegin)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
46 void (GLAPIENTRY *mpglEnd)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
47 void (GLAPIENTRY *mpglViewport)(GLint, GLint, GLsizei, GLsizei); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
48 void (GLAPIENTRY *mpglMatrixMode)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
49 void (GLAPIENTRY *mpglLoadIdentity)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
50 void (GLAPIENTRY *mpglTranslated)(double, double, double); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
51 void (GLAPIENTRY *mpglScaled)(double, double, double); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
52 void (GLAPIENTRY *mpglOrtho)(double, double, double, double, double, double); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
53 void (GLAPIENTRY *mpglFrustum)(double, double, double, double, double, double); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
54 void (GLAPIENTRY *mpglPushMatrix)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
55 void (GLAPIENTRY *mpglPopMatrix)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
56 void (GLAPIENTRY *mpglClear)(GLbitfield); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
57 GLuint (GLAPIENTRY *mpglGenLists)(GLsizei); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
58 void (GLAPIENTRY *mpglDeleteLists)(GLuint, GLsizei); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
59 void (GLAPIENTRY *mpglNewList)(GLuint, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
60 void (GLAPIENTRY *mpglEndList)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
61 void (GLAPIENTRY *mpglCallList)(GLuint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
62 void (GLAPIENTRY *mpglCallLists)(GLsizei, GLenum, const GLvoid *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
63 void (GLAPIENTRY *mpglGenTextures)(GLsizei, GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
64 void (GLAPIENTRY *mpglDeleteTextures)(GLsizei, const GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
65 void (GLAPIENTRY *mpglTexEnvf)(GLenum, GLenum, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
66 void (GLAPIENTRY *mpglTexEnvi)(GLenum, GLenum, GLint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
67 void (GLAPIENTRY *mpglColor4ub)(GLubyte, GLubyte, GLubyte, GLubyte); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
68 void (GLAPIENTRY *mpglColor3f)(GLfloat, GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
69 void (GLAPIENTRY *mpglColor4f)(GLfloat, GLfloat, GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
70 void (GLAPIENTRY *mpglClearColor)(GLclampf, GLclampf, GLclampf, GLclampf); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
71 void (GLAPIENTRY *mpglClearDepth)(GLclampd); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
72 void (GLAPIENTRY *mpglDepthFunc)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
73 void (GLAPIENTRY *mpglEnable)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
74 void (GLAPIENTRY *mpglDisable)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
75 const GLubyte *(GLAPIENTRY *mpglGetString)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
76 void (GLAPIENTRY *mpglDrawBuffer)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
77 void (GLAPIENTRY *mpglDepthMask)(GLboolean); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
78 void (GLAPIENTRY *mpglBlendFunc)(GLenum, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
79 void (GLAPIENTRY *mpglFlush)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
80 void (GLAPIENTRY *mpglFinish)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
81 void (GLAPIENTRY *mpglPixelStorei)(GLenum, GLint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
82 void (GLAPIENTRY *mpglTexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
83 void (GLAPIENTRY *mpglTexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
84 void (GLAPIENTRY *mpglTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
85 void (GLAPIENTRY *mpglTexParameteri)(GLenum, GLenum, GLint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
86 void (GLAPIENTRY *mpglTexParameterf)(GLenum, GLenum, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
87 void (GLAPIENTRY *mpglTexParameterfv)(GLenum, GLenum, const GLfloat *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
88 void (GLAPIENTRY *mpglTexCoord2f)(GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
89 void (GLAPIENTRY *mpglVertex2f)(GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
90 void (GLAPIENTRY *mpglVertex3f)(GLfloat, GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
91 void (GLAPIENTRY *mpglNormal3f)(GLfloat, GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
92 void (GLAPIENTRY *mpglLightfv)(GLenum, GLenum, const GLfloat *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
93 void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
94 void (GLAPIENTRY *mpglShadeModel)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
95 void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *); |
31567 | 96 void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean); |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
97 |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
98 /** |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
99 * \defgroup glextfunctions OpenGL extension functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
100 * |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
101 * 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
|
102 * context is created |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
103 * \{ |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
104 */ |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
105 void (GLAPIENTRY *mpglGenBuffers)(GLsizei, GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
106 void (GLAPIENTRY *mpglDeleteBuffers)(GLsizei, const GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
107 void (GLAPIENTRY *mpglBindBuffer)(GLenum, GLuint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
108 GLvoid* (GLAPIENTRY *mpglMapBuffer)(GLenum, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
109 GLboolean (GLAPIENTRY *mpglUnmapBuffer)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
110 void (GLAPIENTRY *mpglBufferData)(GLenum, intptr_t, const GLvoid *, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
111 void (GLAPIENTRY *mpglCombinerParameterfv)(GLenum, const GLfloat *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
112 void (GLAPIENTRY *mpglCombinerParameteri)(GLenum, GLint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
113 void (GLAPIENTRY *mpglCombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum, |
16099 | 114 GLenum); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
115 void (GLAPIENTRY *mpglCombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum, |
16099 | 116 GLenum, GLenum, GLboolean, GLboolean, |
117 GLboolean); | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
118 void (GLAPIENTRY *mpglBeginFragmentShader)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
119 void (GLAPIENTRY *mpglEndFragmentShader)(void); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
120 void (GLAPIENTRY *mpglSampleMap)(GLuint, GLuint, GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
121 void (GLAPIENTRY *mpglColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint, |
16625 | 122 GLuint, GLuint, GLuint, GLuint, GLuint); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
123 void (GLAPIENTRY *mpglColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint, |
16625 | 124 GLuint, GLuint, GLuint, GLuint, GLuint, |
125 GLuint, GLuint, GLuint); | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
126 void (GLAPIENTRY *mpglSetFragmentShaderConstant)(GLuint, const GLfloat *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
127 void (GLAPIENTRY *mpglActiveTexture)(GLenum); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
128 void (GLAPIENTRY *mpglBindTexture)(GLenum, GLuint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
129 void (GLAPIENTRY *mpglMultiTexCoord2f)(GLenum, GLfloat, GLfloat); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
130 void (GLAPIENTRY *mpglGenPrograms)(GLsizei, GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
131 void (GLAPIENTRY *mpglDeletePrograms)(GLsizei, const GLuint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
132 void (GLAPIENTRY *mpglBindProgram)(GLenum, GLuint); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
133 void (GLAPIENTRY *mpglProgramString)(GLenum, GLenum, GLsizei, const GLvoid *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
134 void (GLAPIENTRY *mpglGetProgramiv)(GLenum, GLenum, GLint *); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
135 void (GLAPIENTRY *mpglProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat, |
16099 | 136 GLfloat, GLfloat); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
137 int (GLAPIENTRY *mpglSwapInterval)(int); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
138 void (GLAPIENTRY *mpglTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, |
18578 | 139 GLint, GLenum, GLenum, const GLvoid *); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
140 void* (GLAPIENTRY *mpglAllocateMemoryMESA)(void *, int, size_t, float, float, float); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
141 void (GLAPIENTRY *mpglFreeMemoryMESA)(void *, int, void *); |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
142 /** \} */ // end of glextfunctions group |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
143 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
144 //! \defgroup glgeneral OpenGL general helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
145 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
146 //! \defgroup glcontext OpenGL context management helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
147 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
148 //! \defgroup gltexture OpenGL texture handling helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
149 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
150 //! \defgroup glconversion OpenGL conversion helper functions |
16099 | 151 |
18961 | 152 static GLint hqtexfmt; |
153 | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
154 /** |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
155 * \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
|
156 * \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
|
157 * \ingroup glgeneral |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
158 */ |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
159 void glAdjustAlignment(int stride) { |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
160 GLint gl_alignment; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
161 if (stride % 8 == 0) |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
162 gl_alignment=8; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
163 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
|
164 gl_alignment=4; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
165 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
|
166 gl_alignment=2; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
167 else |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
168 gl_alignment=1; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
169 mpglPixelStorei(GL_UNPACK_ALIGNMENT, gl_alignment); |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
170 } |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
171 |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
172 struct gl_name_map_struct { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
173 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
|
174 const char *name; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
175 }; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
176 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
177 #undef MAP |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
178 #define MAP(a) {a, #a} |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
179 //! mapping table for the glValName function |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
180 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
|
181 // internal format |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 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
|
186 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
187 // format |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
188 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
|
189 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
|
190 MAP(GL_COLOR_INDEX), |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
191 // rest 1.2 only |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
192 MAP(GL_BGR), MAP(GL_BGRA), |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
193 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
194 //type |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
195 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
|
196 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
|
197 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
|
198 // rest 1.2 only |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 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
|
203 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
|
204 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
|
205 {0, 0} |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
206 }; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
207 #undef MAP |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
208 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
209 /** |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
210 * \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
|
211 * \param value the constant |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
212 * \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
|
213 * \ingroup glgeneral |
14078
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 const char *glValName(GLint value) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
216 { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
217 int i = 0; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
218 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
219 while (gl_name_map[i].name) { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
220 if (gl_name_map[i].value == value) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
221 return gl_name_map[i].name; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
222 i++; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
223 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
224 return "Unknown format!"; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
225 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
226 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
227 //! 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
|
228 #define TEXTUREFORMAT_ALWAYS GL_RGB8 |
16474 | 229 #undef TEXTUREFORMAT_ALWAYS |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
230 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
231 /** |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
232 * \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
|
233 * |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
234 * All parameters may be NULL. |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
235 * \param fmt MPlayer format to analyze. |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
236 * \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
|
237 * \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
|
238 * 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
|
239 * \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
|
240 * \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
|
241 * \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
|
242 * \ingroup gltexture |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
243 */ |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16648
diff
changeset
|
244 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
|
245 GLenum *gl_format, GLenum *gl_type) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
246 { |
16474 | 247 int supported = 1; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
248 int dummy1; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
249 GLenum dummy2; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16270
diff
changeset
|
250 GLint dummy3; |
28036 | 251 if (!bpp) bpp = &dummy1; |
252 if (!gl_texfmt) gl_texfmt = &dummy3; | |
253 if (!gl_format) gl_format = &dummy2; | |
254 if (!gl_type) gl_type = &dummy2; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29183
diff
changeset
|
255 |
30110 | 256 if (mp_get_chroma_shift(fmt, NULL, NULL)) { |
257 // reduce the possible cases a bit | |
258 if (IMGFMT_IS_YUVP16_LE(fmt)) | |
259 fmt = IMGFMT_420P16_LE; | |
260 else if (IMGFMT_IS_YUVP16_BE(fmt)) | |
261 fmt = IMGFMT_420P16_BE; | |
262 else | |
263 fmt = IMGFMT_YV12; | |
264 } | |
30097 | 265 |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
266 *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
|
267 *gl_texfmt = 3; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
268 switch (fmt) { |
29902
85aaba93adf1
Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents:
29896
diff
changeset
|
269 case IMGFMT_RGB48NE: |
85aaba93adf1
Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents:
29896
diff
changeset
|
270 *gl_format = GL_RGB; |
85aaba93adf1
Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents:
29896
diff
changeset
|
271 *gl_type = GL_UNSIGNED_SHORT; |
85aaba93adf1
Support RGB48NE format in OpenGL vos (only really useful once they are modified
reimar
parents:
29896
diff
changeset
|
272 break; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
273 case IMGFMT_RGB24: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
274 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
275 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
276 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
277 case IMGFMT_RGBA: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
278 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
279 *gl_format = GL_RGBA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
280 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
281 break; |
30110 | 282 case IMGFMT_420P16: |
283 supported = 0; // no native YUV support | |
284 *gl_texfmt = 1; | |
285 *bpp = 16; | |
286 *gl_format = GL_LUMINANCE; | |
287 *gl_type = GL_UNSIGNED_SHORT; | |
288 break; | |
16474 | 289 case IMGFMT_YV12: |
290 supported = 0; // no native YV12 support | |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
291 case IMGFMT_Y800: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
292 case IMGFMT_Y8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
293 *gl_texfmt = 1; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
294 *bpp = 8; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
295 *gl_format = GL_LUMINANCE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
296 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
297 break; |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
298 case IMGFMT_UYVY: |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
299 case IMGFMT_YUY2: |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
300 *gl_texfmt = GL_YCBCR_MESA; |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
301 *bpp = 16; |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
302 *gl_format = GL_YCBCR_MESA; |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
303 *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
|
304 break; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
305 #if 0 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
306 // 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
|
307 // swscale produces works |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
308 case IMGFMT_RGB8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
309 gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
310 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
|
311 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
312 #endif |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
313 case IMGFMT_RGB15: |
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_SHORT_1_5_5_5_REV; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
316 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
317 case IMGFMT_RGB16: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
318 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
319 *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
|
320 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
321 #if 0 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
322 case IMGFMT_BGR8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
323 // 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
|
324 // 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
|
325 // 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
|
326 // 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
|
327 gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
328 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
|
329 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
330 #endif |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
331 case IMGFMT_BGR15: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
332 *gl_format = GL_BGRA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
333 *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
|
334 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
335 case IMGFMT_BGR16: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
336 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
337 *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
|
338 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
339 case IMGFMT_BGR24: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
340 *gl_format = GL_BGR; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
341 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
342 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
343 case IMGFMT_BGRA: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
344 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
345 *gl_format = GL_BGRA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
346 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
347 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
348 default: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
349 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
350 *gl_format = GL_RGBA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
351 *gl_type = GL_UNSIGNED_BYTE; |
16474 | 352 supported = 0; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
353 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
354 #ifdef TEXTUREFORMAT_ALWAYS |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
355 *gl_texfmt = TEXTUREFORMAT_ALWAYS; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
356 #endif |
16474 | 357 return supported; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
358 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
359 |
31024 | 360 #ifdef HAVE_LIBDL |
361 #include <dlfcn.h> | |
362 #endif | |
363 /** | |
364 * \brief find address of a linked function | |
365 * \param s name of function to find | |
366 * \return address of function or NULL if not found | |
367 */ | |
368 static void *getdladdr(const char *s) { | |
369 void *ret = NULL; | |
370 #ifdef HAVE_LIBDL | |
371 void *handle = dlopen(NULL, RTLD_LAZY); | |
372 if (!handle) | |
373 return NULL; | |
374 ret = dlsym(handle, s); | |
375 dlclose(handle); | |
376 #endif | |
377 return ret; | |
16099 | 378 } |
379 | |
17335 | 380 typedef struct { |
25762 | 381 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
|
382 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
|
383 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
|
384 void *fallback; |
17335 | 385 } extfunc_desc_t; |
386 | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
387 #define DEF_FUNC_DESC(name) {&mpgl##name, NULL, {"gl"#name, NULL}, gl ##name} |
17335 | 388 static const extfunc_desc_t extfuncs[] = { |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
389 // 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
|
390 // different "backends" with one binary |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
391 DEF_FUNC_DESC(Begin), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
392 DEF_FUNC_DESC(End), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
393 DEF_FUNC_DESC(Viewport), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
394 DEF_FUNC_DESC(MatrixMode), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
395 DEF_FUNC_DESC(LoadIdentity), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
396 DEF_FUNC_DESC(Translated), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
397 DEF_FUNC_DESC(Scaled), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
398 DEF_FUNC_DESC(Ortho), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
399 DEF_FUNC_DESC(Frustum), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
400 DEF_FUNC_DESC(PushMatrix), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
401 DEF_FUNC_DESC(PopMatrix), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
402 DEF_FUNC_DESC(Clear), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
403 DEF_FUNC_DESC(GenLists), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
404 DEF_FUNC_DESC(DeleteLists), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
405 DEF_FUNC_DESC(NewList), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
406 DEF_FUNC_DESC(EndList), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
407 DEF_FUNC_DESC(CallList), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
408 DEF_FUNC_DESC(CallLists), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
409 DEF_FUNC_DESC(GenTextures), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
410 DEF_FUNC_DESC(DeleteTextures), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
411 DEF_FUNC_DESC(TexEnvf), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
412 DEF_FUNC_DESC(TexEnvi), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
413 DEF_FUNC_DESC(Color4ub), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
414 DEF_FUNC_DESC(Color3f), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
415 DEF_FUNC_DESC(Color4f), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
416 DEF_FUNC_DESC(ClearColor), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
417 DEF_FUNC_DESC(ClearDepth), |
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
418 DEF_FUNC_DESC(DepthFunc), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
419 DEF_FUNC_DESC(Enable), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
420 DEF_FUNC_DESC(Disable), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
421 DEF_FUNC_DESC(DrawBuffer), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
422 DEF_FUNC_DESC(DepthMask), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
423 DEF_FUNC_DESC(BlendFunc), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
424 DEF_FUNC_DESC(Flush), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
425 DEF_FUNC_DESC(Finish), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
426 DEF_FUNC_DESC(PixelStorei), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
427 DEF_FUNC_DESC(TexImage1D), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
428 DEF_FUNC_DESC(TexImage2D), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
429 DEF_FUNC_DESC(TexSubImage2D), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
430 DEF_FUNC_DESC(TexParameteri), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
431 DEF_FUNC_DESC(TexParameterf), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
432 DEF_FUNC_DESC(TexParameterfv), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
433 DEF_FUNC_DESC(TexCoord2f), |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
434 DEF_FUNC_DESC(Vertex2f), |
30137
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
435 DEF_FUNC_DESC(Vertex3f), |
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
436 DEF_FUNC_DESC(Normal3f), |
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
437 DEF_FUNC_DESC(Lightfv), |
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
438 DEF_FUNC_DESC(ColorMaterial), |
28ca3af546f5
Add pointers to a few more standard OpenGL functions to ease future extensions.
reimar
parents:
30110
diff
changeset
|
439 DEF_FUNC_DESC(ShadeModel), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
440 DEF_FUNC_DESC(GetIntegerv), |
31567 | 441 DEF_FUNC_DESC(ColorMask), |
29939
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
442 |
319b62d55feb
Pass all OpenGL functions through a function pointer indirection.
reimar
parents:
29938
diff
changeset
|
443 // here start the real extensions |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
444 {&mpglGenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
445 {&mpglDeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
446 {&mpglBindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
447 {&mpglMapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
448 {&mpglUnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
449 {&mpglBufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
450 {&mpglCombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
451 {&mpglCombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
452 {&mpglCombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
453 {&mpglCombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
454 {&mpglBeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
455 {&mpglEndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
456 {&mpglSampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
457 {&mpglColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
458 {&mpglColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
459 {&mpglSetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
460 {&mpglActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
461 {&mpglBindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
462 {&mpglMultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
463 {&mpglGenPrograms, "_program", {"glGenProgramsARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
464 {&mpglDeletePrograms, "_program", {"glDeleteProgramsARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
465 {&mpglBindProgram, "_program", {"glBindProgramARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
466 {&mpglProgramString, "_program", {"glProgramStringARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
467 {&mpglGetProgramiv, "_program", {"glGetProgramivARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
468 {&mpglProgramEnvParameter4f, "_program", {"glProgramEnvParameter4fARB", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
469 {&mpglSwapInterval, "_swap_control", {"glXSwapIntervalSGI", "glXSwapInterval", "wglSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
470 {&mpglTexImage3D, NULL, {"glTexImage3D", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
471 {&mpglAllocateMemoryMESA, "GLX_MESA_allocate_memory", {"glXAllocateMemoryMESA", NULL}}, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
472 {&mpglFreeMemoryMESA, "GLX_MESA_allocate_memory", {"glXFreeMemoryMESA", NULL}}, |
17335 | 473 {NULL} |
474 }; | |
475 | |
16117 | 476 /** |
477 * \brief find the function pointers of some useful OpenGL extensions | |
16588 | 478 * \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
|
479 * \param ext2 an extra extension string |
16117 | 480 */ |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
481 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
|
482 const char *ext2) { |
17335 | 483 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
|
484 const char *extensions; |
17335 | 485 char *allexts; |
29942
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
486 |
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
487 if (!getProcAddress) |
31024 | 488 getProcAddress = (void *)getdladdr; |
29942
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
489 |
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
490 // special case, we need glGetString before starting to find the other functions |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
491 mpglGetString = getProcAddress("glGetString"); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
492 if (!mpglGetString) |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
493 mpglGetString = glGetString; |
29942
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
494 |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
495 extensions = (const char *)mpglGetString(GL_EXTENSIONS); |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
496 if (!extensions) extensions = ""; |
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
497 if (!ext2) ext2 = ""; |
18878 | 498 allexts = malloc(strlen(extensions) + strlen(ext2) + 2); |
17335 | 499 strcpy(allexts, extensions); |
500 strcat(allexts, " "); | |
501 strcat(allexts, ext2); | |
29905
908f55fb5ed8
Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents:
29904
diff
changeset
|
502 mp_msg(MSGT_VO, MSGL_DBG2, "OpenGL extensions string:\n%s\n", allexts); |
17335 | 503 for (dsc = extfuncs; dsc->funcptr; dsc++) { |
504 void *ptr = NULL; | |
505 int i; | |
506 if (!dsc->extstr || strstr(allexts, dsc->extstr)) { | |
507 for (i = 0; !ptr && dsc->funcnames[i]; i++) | |
508 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]); | |
509 } | |
29942
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
510 if (!ptr) |
9b90e1052b32
Use a fallback to make sure the basic OpenGL functions are available instead of
reimar
parents:
29941
diff
changeset
|
511 ptr = dsc->fallback; |
25762 | 512 *(void **)dsc->funcptr = ptr; |
16984
94b70ab52695
disable *SwapInterval function when extensions are missing, since it
reimar
parents:
16944
diff
changeset
|
513 } |
18961 | 514 if (strstr(allexts, "_texture_float")) |
515 hqtexfmt = GL_RGB32F; | |
516 else if (strstr(allexts, "NV_float_buffer")) | |
517 hqtexfmt = GL_FLOAT_RGB32_NV; | |
518 else | |
519 hqtexfmt = GL_RGB16; | |
17335 | 520 free(allexts); |
16099 | 521 } |
522 | |
16117 | 523 /** |
524 * \brief create a texture and set some defaults | |
525 * \param target texture taget, usually GL_TEXTURE_2D | |
526 * \param fmt internal texture format | |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
527 * \param format texture host data format |
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
528 * \param type texture host data type |
16117 | 529 * \param filter filter used for scaling, e.g. GL_LINEAR |
530 * \param w texture width | |
531 * \param h texture height | |
532 * \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
|
533 * \ingroup gltexture |
16117 | 534 */ |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
535 void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLint filter, |
16460 | 536 int w, int h, unsigned char val) { |
537 GLfloat fval = (GLfloat)val / 255.0; | |
538 GLfloat border[4] = {fval, fval, fval, fval}; | |
31086
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
539 int stride; |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
540 char *init; |
31086
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
541 if (w == 0) w = 1; |
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
542 if (h == 0) h = 1; |
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
543 stride = w * glFmt2bpp(format, type); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
544 if (!stride) return; |
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
545 init = malloc(stride * h); |
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
546 memset(init, val, stride * h); |
27622
524f6a87cd23
Fix glAdjustAlignment parameter in glCreateClearTex
reimar
parents:
27621
diff
changeset
|
547 glAdjustAlignment(stride); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
548 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, w); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
549 mpglTexImage2D(target, 0, fmt, w, h, 0, format, type, init); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
550 mpglTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
551 mpglTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
552 mpglTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
553 mpglTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
554 mpglTexParameteri(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
|
555 // 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
|
556 // We set a sane default anyway. |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
557 mpglTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border); |
16117 | 558 free(init); |
559 } | |
560 | |
561 /** | |
16592 | 562 * \brief creates a texture from a PPM file |
563 * \param target texture taget, usually GL_TEXTURE_2D | |
18961 | 564 * \param fmt internal texture format, 0 for default |
16592 | 565 * \param filter filter used for scaling, e.g. GL_LINEAR |
566 * \param f file to read PPM from | |
567 * \param width [out] width of texture | |
568 * \param height [out] height of texture | |
569 * \param maxval [out] maxval value from PPM file | |
570 * \return 0 on error, 1 otherwise | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
571 * \ingroup gltexture |
16592 | 572 */ |
573 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter, | |
574 FILE *f, int *width, int *height, int *maxval) { | |
32393
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
575 int w, h, m, bpp; |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
576 GLenum type; |
32393
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
577 uint8_t *data = read_pnm(f, &w, &h, &bpp, &m); |
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
578 if (!data || (bpp != 3 && bpp != 6)) { |
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
579 free(data); |
16592 | 580 return 0; |
32393
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
581 } |
18961 | 582 if (!fmt) { |
32393
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
583 fmt = bpp == 6 ? hqtexfmt : 3; |
18961 | 584 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE) |
585 fmt = GL_RGB16; | |
586 } | |
32393
98fda5253e80
Extract code to read a pnm file into a separate function.
reimar
parents:
31567
diff
changeset
|
587 type = bpp == 6 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
588 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
|
589 glUploadTex(target, GL_RGB, type, |
18961 | 590 data, w * bpp, 0, 0, w, h, 0); |
16592 | 591 free(data); |
592 if (width) *width = w; | |
593 if (height) *height = h; | |
594 if (maxval) *maxval = m; | |
595 return 1; | |
596 } | |
597 | |
598 /** | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
599 * \brief return the number of bytes per pixel for the given format |
16117 | 600 * \param format OpenGL format |
601 * \param type OpenGL type | |
602 * \return bytes per pixel | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
603 * \ingroup glgeneral |
16117 | 604 * |
16435 | 605 * Does not handle all possible variants, just those used by MPlayer |
16117 | 606 */ |
607 int glFmt2bpp(GLenum format, GLenum type) { | |
18961 | 608 int component_size = 0; |
16117 | 609 switch (type) { |
610 case GL_UNSIGNED_BYTE_3_3_2: | |
611 case GL_UNSIGNED_BYTE_2_3_3_REV: | |
612 return 1; | |
613 case GL_UNSIGNED_SHORT_5_5_5_1: | |
614 case GL_UNSIGNED_SHORT_1_5_5_5_REV: | |
615 case GL_UNSIGNED_SHORT_5_6_5: | |
616 case GL_UNSIGNED_SHORT_5_6_5_REV: | |
617 return 2; | |
18961 | 618 case GL_UNSIGNED_BYTE: |
619 component_size = 1; | |
620 break; | |
621 case GL_UNSIGNED_SHORT: | |
622 component_size = 2; | |
623 break; | |
16117 | 624 } |
625 switch (format) { | |
626 case GL_LUMINANCE: | |
627 case GL_ALPHA: | |
18961 | 628 return component_size; |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
629 case GL_YCBCR_MESA: |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28036
diff
changeset
|
630 return 2; |
16117 | 631 case GL_RGB: |
632 case GL_BGR: | |
18961 | 633 return 3 * component_size; |
16117 | 634 case GL_RGBA: |
635 case GL_BGRA: | |
18961 | 636 return 4 * component_size; |
16117 | 637 } |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
638 return 0; // unknown |
16117 | 639 } |
640 | |
641 /** | |
642 * \brief upload a texture, handling things like stride and slices | |
643 * \param target texture target, usually GL_TEXTURE_2D | |
644 * \param format OpenGL format of data | |
645 * \param type OpenGL type of data | |
21201 | 646 * \param dataptr data to upload |
16117 | 647 * \param stride data stride |
648 * \param x x offset in texture | |
649 * \param y y offset in texture | |
650 * \param w width of the texture part to upload | |
651 * \param h height of the texture part to upload | |
652 * \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
|
653 * \ingroup gltexture |
16117 | 654 */ |
655 void glUploadTex(GLenum target, GLenum format, GLenum type, | |
21201 | 656 const void *dataptr, int stride, |
16117 | 657 int x, int y, int w, int h, int slice) { |
21201 | 658 const uint8_t *data = dataptr; |
16117 | 659 int y_max = y + h; |
16223
f540609340ac
extra check for glUploadTex to avoid a possible hang.
reimar
parents:
16221
diff
changeset
|
660 if (w <= 0 || h <= 0) return; |
16117 | 661 if (slice <= 0) |
662 slice = h; | |
17220 | 663 if (stride < 0) { |
18988
a61ef37d3c71
Fix off-by-one error for negative strides (flipped image)
reimar
parents:
18961
diff
changeset
|
664 data += (h - 1) * stride; |
17220 | 665 stride = -stride; |
666 } | |
16117 | 667 // this is not always correct, but should work for MPlayer |
668 glAdjustAlignment(stride); | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
669 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type)); |
16117 | 670 for (; y + slice <= y_max; y += slice) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
671 mpglTexSubImage2D(target, 0, x, y, w, slice, format, type, data); |
16117 | 672 data += stride * slice; |
673 } | |
674 if (y < y_max) | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
675 mpglTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data); |
16117 | 676 } |
677 | |
16625 | 678 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef, |
679 float uvcos, float uvsin) { | |
680 int i; | |
681 ucoef[0] = 0 * uvcos + 1.403 * uvsin; | |
682 vcoef[0] = 0 * uvsin + 1.403 * uvcos; | |
683 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin; | |
684 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos; | |
685 ucoef[2] = 1.770 * uvcos + 0 * uvsin; | |
686 vcoef[2] = 1.770 * uvsin + 0 * uvcos; | |
687 ucoef[3] = 0; | |
688 vcoef[3] = 0; | |
689 // Coefficients (probably) must be in [0, 1] range, whereas they originally | |
690 // are in [-2, 2] range, so here comes the trick: | |
691 // First put them in the [-0.5, 0.5] range, then add 0.5. | |
692 // This can be undone with the HALF_BIAS and SCALE_BY_FOUR arguments | |
693 // for CombinerInput and CombinerOutput (or the respective ATI variants) | |
694 for (i = 0; i < 4; i++) { | |
695 ucoef[i] = ucoef[i] * 0.25 + 0.5; | |
696 vcoef[i] = vcoef[i] * 0.25 + 0.5; | |
697 } | |
698 } | |
699 | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
700 /** |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
701 * \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
|
702 * \param uvcos used for saturation and hue adjustment |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
703 * \param uvsin used for saturation and hue adjustment |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
704 */ |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
705 static void glSetupYUVCombiners(float uvcos, float uvsin) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
706 GLfloat ucoef[4]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
707 GLfloat vcoef[4]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
708 GLint i; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
709 if (!mpglCombinerInput || !mpglCombinerOutput || |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
710 !mpglCombinerParameterfv || !mpglCombinerParameteri) { |
18579
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
711 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
|
712 return; |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
713 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
714 mpglGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
715 if (i < 2) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
716 mp_msg(MSGT_VO, MSGL_ERR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
717 "[gl] 2 general combiners needed for YUV combiner support (found %i)\n", i); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
718 mpglGetIntegerv(GL_MAX_TEXTURE_UNITS, &i); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
719 if (i < 3) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
720 mp_msg(MSGT_VO, MSGL_ERR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
721 "[gl] 3 texture units needed for YUV combiner support (found %i)\n", i); |
16625 | 722 fillUVcoeff(ucoef, vcoef, uvcos, uvsin); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
723 mpglCombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
724 mpglCombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
725 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
726 // UV first, like this green component cannot overflow |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
727 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
728 GL_TEXTURE1, GL_HALF_BIAS_NORMAL_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
729 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
730 GL_CONSTANT_COLOR0_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
731 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
732 GL_TEXTURE2, GL_HALF_BIAS_NORMAL_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
733 mpglCombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
734 GL_CONSTANT_COLOR1_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
735 mpglCombinerOutput(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
736 GL_SPARE0_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
737 GL_FALSE, GL_FALSE); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
738 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
739 // stage 2 |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
740 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_SPARE0_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
741 GL_SIGNED_IDENTITY_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
742 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_ZERO, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
743 GL_UNSIGNED_INVERT_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
744 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
745 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
746 mpglCombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
747 GL_UNSIGNED_INVERT_NV, GL_RGB); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
748 mpglCombinerOutput(GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
749 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
750 GL_FALSE, GL_FALSE); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
751 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
752 // leave final combiner stage in default mode |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
753 mpglCombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
754 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
755 |
16625 | 756 /** |
757 * \brief Setup ATI version of register combiners for YUV to RGB conversion. | |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
758 * \param csp_params parameters used for colorspace conversion |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
759 * \param text if set use the GL_ATI_text_fragment_shader API as |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
760 * used on OS X. |
16625 | 761 */ |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
762 static void glSetupYUVFragmentATI(struct mp_csp_params *csp_params, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
763 int text) { |
16625 | 764 GLint i; |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
765 float yuv2rgb[3][4]; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
766 |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
767 mpglGetIntegerv (GL_MAX_TEXTURE_UNITS, &i); |
16625 | 768 if (i < 3) |
769 mp_msg(MSGT_VO, MSGL_ERR, | |
770 "[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i); | |
771 | |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
772 mp_get_yuv2rgb_coeffs(csp_params, yuv2rgb); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
773 for (i = 0; i < 3; i++) { |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
774 int j; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
775 yuv2rgb[i][3] -= -0.5 * (yuv2rgb[i][1] + yuv2rgb[i][2]); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
776 for (j = 0; j < 4; j++) { |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
777 yuv2rgb[i][j] *= 0.125; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
778 yuv2rgb[i][j] += 0.5; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
779 if (yuv2rgb[i][j] > 1) |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
780 yuv2rgb[i][j] = 1; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
781 if (yuv2rgb[i][j] < 0) |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
782 yuv2rgb[i][j] = 0; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
783 } |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
784 } |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
785 if (text == 0) { |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
786 GLfloat c0[4] = {yuv2rgb[0][0], yuv2rgb[1][0], yuv2rgb[2][0]}; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
787 GLfloat c1[4] = {yuv2rgb[0][1], yuv2rgb[1][1], yuv2rgb[2][1]}; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
788 GLfloat c2[4] = {yuv2rgb[0][2], yuv2rgb[1][2], yuv2rgb[2][2]}; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
789 GLfloat c3[4] = {yuv2rgb[0][3], yuv2rgb[1][3], yuv2rgb[2][3]}; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
790 if (!mpglBeginFragmentShader || !mpglEndFragmentShader || |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
791 !mpglSetFragmentShaderConstant || !mpglSampleMap || |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
792 !mpglColorFragmentOp2 || !mpglColorFragmentOp3) { |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
793 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner (ATI) functions missing!\n"); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
794 return; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
795 } |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
796 mpglGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
797 if (i < 3) |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
798 mp_msg(MSGT_VO, MSGL_ERR, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
799 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
800 mpglBeginFragmentShader(); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
801 mpglSetFragmentShaderConstant(GL_CON_0_ATI, c0); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
802 mpglSetFragmentShaderConstant(GL_CON_1_ATI, c1); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
803 mpglSetFragmentShaderConstant(GL_CON_2_ATI, c2); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
804 mpglSetFragmentShaderConstant(GL_CON_3_ATI, c3); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
805 mpglSampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
806 mpglSampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
807 mpglSampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
808 mpglColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
809 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
810 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
811 mpglColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_NONE, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
812 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
813 GL_CON_2_ATI, GL_NONE, GL_BIAS_BIT_ATI, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
814 GL_REG_1_ATI, GL_NONE, GL_NONE); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
815 mpglColorFragmentOp3(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
816 GL_REG_0_ATI, GL_NONE, GL_NONE, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
817 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
818 GL_REG_2_ATI, GL_NONE, GL_NONE); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
819 mpglColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_8X_BIT_ATI, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
820 GL_REG_0_ATI, GL_NONE, GL_NONE, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
821 GL_CON_3_ATI, GL_NONE, GL_BIAS_BIT_ATI); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
822 mpglEndFragmentShader(); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
823 } else { |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
824 static const char template[] = |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
825 "!!ATIfs1.0\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
826 "StartConstants;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
827 " CONSTANT c0 = {%e, %e, %e};\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
828 " CONSTANT c1 = {%e, %e, %e};\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
829 " CONSTANT c2 = {%e, %e, %e};\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
830 " CONSTANT c3 = {%e, %e, %e};\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
831 "EndConstants;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
832 "StartOutputPass;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
833 " SampleMap r0, t0.str;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
834 " SampleMap r1, t1.str;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
835 " SampleMap r2, t2.str;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
836 " MUL r1.rgb, r1.bias, c1.bias;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
837 " MAD r2.rgb, r2.bias, c2.bias, r1;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
838 " MAD r0.rgb, r0, c0.bias, r2;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
839 " ADD r0.rgb.8x, r0, c3.bias;\n" |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
840 "EndPass;\n"; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
841 char buffer[512]; |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
842 snprintf(buffer, sizeof(buffer), template, |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
843 yuv2rgb[0][0], yuv2rgb[1][0], yuv2rgb[2][0], |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
844 yuv2rgb[0][1], yuv2rgb[1][1], yuv2rgb[2][1], |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
845 yuv2rgb[0][2], yuv2rgb[1][2], yuv2rgb[2][2], |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
846 yuv2rgb[0][3], yuv2rgb[1][3], yuv2rgb[2][3]); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
847 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] generated fragment program:\n%s\n", buffer); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
848 loadGPUProgram(GL_TEXT_FRAGMENT_SHADER_ATI, buffer); |
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
849 } |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
850 } |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
851 |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
852 /** |
19221 | 853 * \brief helper function for gen_spline_lookup_tex |
854 * \param x subpixel-position ((0,1) range) to calculate weights for | |
855 * \param dst where to store transformed weights, must provide space for 4 GLfloats | |
856 * | |
857 * calculates the weights and stores them after appropriate transformation | |
858 * for the scaler fragment program. | |
859 */ | |
18622 | 860 static void store_weights(float x, GLfloat *dst) { |
861 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6; | |
862 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6; | |
863 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6; | |
864 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6; | |
865 *dst++ = 1 + x - w1 / (w0 + w1); | |
866 *dst++ = 1 - x + w3 / (w2 + w3); | |
867 *dst++ = w0 + w1; | |
868 *dst++ = 0; | |
869 } | |
870 | |
871 //! 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
|
872 #define LOOKUP_BSPLINE_RES (2 * 1024) |
18622 | 873 /** |
874 * \brief creates the 1D lookup texture needed for fast higher-order filtering | |
875 * \param unit texture unit to attach texture to | |
876 */ | |
877 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
|
878 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
|
879 GLfloat *tp = tex; |
18622 | 880 int i; |
881 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) { | |
882 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES; | |
883 store_weights(x, tp); | |
884 tp += 4; | |
885 } | |
886 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
|
887 store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
888 mpglActiveTexture(unit); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
889 mpglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
890 mpglTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
891 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
892 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
893 mpglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
894 mpglActiveTexture(GL_TEXTURE0); |
29896
ac3e6e27f2c7
Use calloc to allocate a rather large (currently 32k) array instead of
reimar
parents:
29679
diff
changeset
|
895 free(tex); |
18622 | 896 } |
897 | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
898 static const char *bilin_filt_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
899 "TEX yuv.%c, fragment.texcoord[%c], texture[%c], %s;\n"; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
900 |
18622 | 901 #define BICUB_FILT_MAIN(textype) \ |
902 /* first y-interpolation */ \ | |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
903 "ADD coord, fragment.texcoord[%c].xyxy, cdelta.xyxw;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
904 "ADD coord2, fragment.texcoord[%c].xyxy, cdelta.zyzw;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
905 "TEX a.r, coord.xyxy, texture[%c], "textype";\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
906 "TEX a.g, coord.zwzw, texture[%c], "textype";\n" \ |
18787
5a2e45cd754f
reduce number of texture indirections to support older cards
reimar
parents:
18693
diff
changeset
|
907 /* second y-interpolation */ \ |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
908 "TEX b.r, coord2.xyxy, texture[%c], "textype";\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
909 "TEX b.g, coord2.zwzw, texture[%c], "textype";\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
910 "LRP a.b, parmy.b, a.rrrr, a.gggg;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
911 "LRP a.a, parmy.b, b.rrrr, b.gggg;\n" \ |
18622 | 912 /* x-interpolation */ \ |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
913 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;\n" |
18622 | 914 |
915 static const char *bicub_filt_template_2D = | |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
916 "MAD coord.xy, fragment.texcoord[%c], {%e, %e}, {0.5, 0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
917 "TEX parmx, coord.x, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
918 "MUL cdelta.xz, parmx.rrgg, {-%e, 0, %e, 0};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
919 "TEX parmy, coord.y, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
920 "MUL cdelta.yw, parmy.rrgg, {0, -%e, 0, %e};\n" |
18622 | 921 BICUB_FILT_MAIN("2D"); |
922 | |
923 static const char *bicub_filt_template_RECT = | |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
924 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
925 "TEX parmx, coord.x, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
926 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
927 "TEX parmy, coord.y, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
928 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n" |
18622 | 929 BICUB_FILT_MAIN("RECT"); |
930 | |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
931 #define CALCWEIGHTS(t, s) \ |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
932 "MAD "t", {-0.5, 0.1666, 0.3333, -0.3333}, "s", {1, 0, -0.5, 0.5};\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
933 "MAD "t", "t", "s", {0, 0, -0.5, 0.5};\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
934 "MAD "t", "t", "s", {-0.6666, 0, 0.8333, 0.1666};\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
935 "RCP a.x, "t".z;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
936 "RCP a.y, "t".w;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
937 "MAD "t".xy, "t".xyxy, a.xyxy, {1, 1, 0, 0};\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
938 "ADD "t".x, "t".xxxx, "s";\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
939 "SUB "t".y, "t".yyyy, "s";\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
940 |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
941 static const char *bicub_notex_filt_template_2D = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
942 "MAD coord.xy, fragment.texcoord[%c], {%e, %e}, {0.5, 0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
943 "FRC coord.xy, coord.xyxy;\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
944 CALCWEIGHTS("parmx", "coord.xxxx") |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
945 "MUL cdelta.xz, parmx.rrgg, {-%e, 0, %e, 0};\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
946 CALCWEIGHTS("parmy", "coord.yyyy") |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
947 "MUL cdelta.yw, parmy.rrgg, {0, -%e, 0, %e};\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
948 BICUB_FILT_MAIN("2D"); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
949 |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
950 static const char *bicub_notex_filt_template_RECT = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
951 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
952 "FRC coord.xy, coord.xyxy;\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
953 CALCWEIGHTS("parmx", "coord.xxxx") |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
954 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
955 CALCWEIGHTS("parmy", "coord.yyyy") |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
956 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};\n" |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
957 BICUB_FILT_MAIN("RECT"); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
958 |
22489 | 959 #define BICUB_X_FILT_MAIN(textype) \ |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
960 "ADD coord.xy, fragment.texcoord[%c].xyxy, cdelta.xyxy;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
961 "ADD coord2.xy, fragment.texcoord[%c].xyxy, cdelta.zyzy;\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
962 "TEX a.r, coord, texture[%c], "textype";\n" \ |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
963 "TEX b.r, coord2, texture[%c], "textype";\n" \ |
22489 | 964 /* x-interpolation */ \ |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
965 "LRP yuv.%c, parmx.b, a.rrrr, b.rrrr;\n" |
22489 | 966 |
967 static const char *bicub_x_filt_template_2D = | |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
968 "MAD coord.x, fragment.texcoord[%c], {%e}, {0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
969 "TEX parmx, coord, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
970 "MUL cdelta.xyz, parmx.rrgg, {-%e, 0, %e};\n" |
22489 | 971 BICUB_X_FILT_MAIN("2D"); |
972 | |
973 static const char *bicub_x_filt_template_RECT = | |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
974 "ADD coord.x, fragment.texcoord[%c], {0.5};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
975 "TEX parmx, coord, texture[%c], 1D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
976 "MUL cdelta.xyz, parmx.rrgg, {-1, 0, 1};\n" |
22489 | 977 BICUB_X_FILT_MAIN("RECT"); |
978 | |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
979 static const char *unsharp_filt_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
980 "PARAM dcoord%c = {%e, %e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
981 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
982 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
983 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
984 "TEX b.r, coord.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
985 "TEX b.g, coord.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
986 "ADD b.r, b.r, b.g;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
987 "TEX b.b, coord2.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
988 "TEX b.g, coord2.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
989 "DP3 b, b, {0.25, 0.25, 0.25};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
990 "SUB b.r, a.r, b.r;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
991 "MAD yuv.%c, b.r, {%e}, a.r;\n"; |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
992 |
25758 | 993 static const char *unsharp_filt_template2 = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
994 "PARAM dcoord%c = {%e, %e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
995 "PARAM dcoord2%c = {%e, 0, 0, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
996 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
997 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
998 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
999 "TEX b.r, coord.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1000 "TEX b.g, coord.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1001 "ADD b.r, b.r, b.g;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1002 "TEX b.b, coord2.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1003 "TEX b.g, coord2.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1004 "ADD b.r, b.r, b.b;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1005 "ADD b.a, b.r, b.g;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1006 "ADD coord, fragment.texcoord[%c].xyxy, dcoord2%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1007 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord2%c;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1008 "TEX b.r, coord.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1009 "TEX b.g, coord.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1010 "ADD b.r, b.r, b.g;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1011 "TEX b.b, coord2.xyxy, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1012 "TEX b.g, coord2.zwzw, texture[%c], %s;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1013 "DP4 b.r, b, {-0.1171875, -0.1171875, -0.1171875, -0.09765625};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1014 "MAD b.r, a.r, {0.859375}, b.r;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1015 "MAD yuv.%c, b.r, {%e}, a.r;\n"; |
25758 | 1016 |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1017 static const char *yuv_prog_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1018 "PARAM ycoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1019 "PARAM ucoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1020 "PARAM vcoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1021 "PARAM offsets = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1022 "TEMP res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1023 "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1024 "MAD res.rgb, yuv.gggg, ucoef, res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1025 "MAD result.color.rgb, yuv.bbbb, vcoef, res;\n" |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1026 "END"; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1027 |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1028 static const char *yuv_pow_prog_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1029 "PARAM ycoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1030 "PARAM ucoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1031 "PARAM vcoef = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1032 "PARAM offsets = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1033 "PARAM gamma = {%e, %e, %e};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1034 "TEMP res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1035 "MAD res.rgb, yuv.rrrr, ycoef, offsets;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1036 "MAD res.rgb, yuv.gggg, ucoef, res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1037 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1038 "POW result.color.r, res.r, gamma.r;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1039 "POW result.color.g, res.g, gamma.g;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1040 "POW result.color.b, res.b, gamma.b;\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1041 "END"; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1042 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1043 static const char *yuv_lookup_prog_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1044 "PARAM ycoef = {%e, %e, %e, 0};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1045 "PARAM ucoef = {%e, %e, %e, 0};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1046 "PARAM vcoef = {%e, %e, %e, 0};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1047 "PARAM offsets = {%e, %e, %e, 0.125};\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1048 "TEMP res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1049 "MAD res, yuv.rrrr, ycoef, offsets;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1050 "MAD res.rgb, yuv.gggg, ucoef, res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1051 "MAD res.rgb, yuv.bbbb, vcoef, res;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1052 "TEX result.color.r, res.raaa, texture[%c], 2D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1053 "ADD res.a, res.a, 0.25;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1054 "TEX result.color.g, res.gaaa, texture[%c], 2D;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1055 "ADD res.a, res.a, 0.25;\n" |
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1056 "TEX result.color.b, res.baaa, texture[%c], 2D;\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1057 "END"; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1058 |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1059 static const char *yuv_lookup3d_prog_template = |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1060 "TEX result.color, yuv, texture[%c], 3D;\n" |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1061 "END"; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1062 |
19221 | 1063 /** |
1064 * \brief creates and initializes helper textures needed for scaling texture read | |
1065 * \param scaler scaler type to create texture for | |
1066 * \param texu contains next free texture unit number | |
1067 * \param texs texture unit ids for the scaler are stored in this array | |
1068 */ | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1069 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
|
1070 switch (scaler) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1071 case YUV_SCALER_BILIN: |
25727
7934f12c76f0
Add a forgotten case to create_scaler_textures, avoids an incorrect warning.
reimar
parents:
24777
diff
changeset
|
1072 case YUV_SCALER_BICUB_NOTEX: |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
1073 case YUV_SCALER_UNSHARP: |
25758 | 1074 case YUV_SCALER_UNSHARP2: |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1075 break; |
18622 | 1076 case YUV_SCALER_BICUB: |
22489 | 1077 case YUV_SCALER_BICUB_X: |
18622 | 1078 texs[0] = (*texu)++; |
1079 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]); | |
1080 texs[0] += '0'; | |
1081 break; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1082 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1083 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
|
1084 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1085 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1086 |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1087 //! resolution of texture for gamma lookup table |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1088 #define LOOKUP_RES 512 |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1089 //! resolution for 3D yuv->rgb conversion lookup table |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1090 #define LOOKUP_3DRES 32 |
19221 | 1091 /** |
1092 * \brief creates and initializes helper textures needed for yuv conversion | |
26837 | 1093 * \param params struct containing parameters like brightness, gamma, ... |
19221 | 1094 * \param texu contains next free texture unit number |
1095 * \param texs texture unit ids for the conversion are stored in this array | |
1096 */ | |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1097 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
|
1098 unsigned char *lookup_data = NULL; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1099 int conv = YUV_CONVERSION(params->type); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1100 switch (conv) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1101 case YUV_CONVERSION_FRAGMENT: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1102 case YUV_CONVERSION_FRAGMENT_POW: |
30028 | 1103 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1104 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1105 texs[0] = (*texu)++; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1106 mpglActiveTexture(GL_TEXTURE0 + texs[0]); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1107 lookup_data = malloc(4 * LOOKUP_RES); |
30108
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
1108 mp_gen_gamma_map(lookup_data, LOOKUP_RES, params->csp_params.rgamma); |
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
1109 mp_gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->csp_params.ggamma); |
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
1110 mp_gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->csp_params.bgamma); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27509
diff
changeset
|
1111 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
|
1112 LOOKUP_RES, 4, 0); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1113 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
|
1114 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1115 mpglActiveTexture(GL_TEXTURE0); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1116 texs[0] += '0'; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1117 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1118 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1119 { |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1120 int sz = LOOKUP_3DRES + 2; // texture size including borders |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1121 if (!mpglTexImage3D) { |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1122 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
|
1123 break; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1124 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1125 texs[0] = (*texu)++; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1126 mpglActiveTexture(GL_TEXTURE0 + texs[0]); |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1127 lookup_data = malloc(3 * sz * sz * sz); |
30108
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
1128 mp_gen_yuv2rgb_map(¶ms->csp_params, lookup_data, LOOKUP_3DRES); |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1129 glAdjustAlignment(sz); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1130 mpglPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1131 mpglTexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1, |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1132 GL_RGB, GL_UNSIGNED_BYTE, lookup_data); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1133 mpglTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1134 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1135 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1136 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1137 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1138 mpglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1139 mpglActiveTexture(GL_TEXTURE0); |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1140 texs[0] += '0'; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1141 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1142 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1143 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1144 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
|
1145 } |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32427
diff
changeset
|
1146 free(lookup_data); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1147 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1148 |
19221 | 1149 /** |
1150 * \brief adds a scaling texture read at the current fragment program position | |
1151 * \param scaler type of scaler to insert | |
1152 * \param prog_pos current position in fragment program | |
1153 * \param remain how many bytes remain in the buffer given by prog_pos | |
1154 * \param texs array containing the texture unit identifiers for this scaler | |
1155 * \param in_tex texture unit the scaler should read from | |
1156 * \param out_comp component of the yuv variable the scaler stores the result in | |
1157 * \param rect if rectangular (pixel) adressing should be used for in_tex | |
1158 * \param texw width of the in_tex texture | |
1159 * \param texh height of the in_tex texture | |
26837 | 1160 * \param strength strength of filter effect if the scaler does some kind of filtering |
19221 | 1161 */ |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1162 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
|
1163 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
|
1164 double strength) { |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1165 const char *ttype = rect ? "RECT" : "2D"; |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1166 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
|
1167 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
|
1168 switch (scaler) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1169 case YUV_SCALER_BILIN: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1170 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
|
1171 in_tex, ttype); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1172 break; |
18622 | 1173 case YUV_SCALER_BICUB: |
1174 if (rect) | |
1175 snprintf(*prog_pos, *remain, bicub_filt_template_RECT, | |
1176 in_tex, texs[0], texs[0], | |
1177 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); | |
1178 else | |
1179 snprintf(*prog_pos, *remain, bicub_filt_template_2D, | |
1180 in_tex, (float)texw, (float)texh, | |
25756 | 1181 texs[0], ptw, ptw, texs[0], pth, pth, |
18622 | 1182 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); |
1183 break; | |
22489 | 1184 case YUV_SCALER_BICUB_X: |
1185 if (rect) | |
1186 snprintf(*prog_pos, *remain, bicub_x_filt_template_RECT, | |
1187 in_tex, texs[0], | |
1188 in_tex, in_tex, in_tex, in_tex, out_comp); | |
1189 else | |
1190 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
|
1191 in_tex, (float)texw, |
25756 | 1192 texs[0], ptw, ptw, |
22489 | 1193 in_tex, in_tex, in_tex, in_tex, out_comp); |
1194 break; | |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1195 case YUV_SCALER_BICUB_NOTEX: |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1196 if (rect) |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1197 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
|
1198 in_tex, |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1199 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
|
1200 else |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1201 snprintf(*prog_pos, *remain, bicub_notex_filt_template_2D, |
25756 | 1202 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
|
1203 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
|
1204 break; |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
1205 case YUV_SCALER_UNSHARP: |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1206 snprintf(*prog_pos, *remain, unsharp_filt_template, |
25760 | 1207 out_comp, 0.5 * ptw, 0.5 * pth, 0.5 * ptw, -0.5 * pth, |
1208 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
|
1209 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
|
1210 in_tex, ttype, out_comp, strength); |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
1211 break; |
25758 | 1212 case YUV_SCALER_UNSHARP2: |
1213 snprintf(*prog_pos, *remain, unsharp_filt_template2, | |
25760 | 1214 out_comp, 1.2 * ptw, 1.2 * pth, 1.2 * ptw, -1.2 * pth, |
1215 out_comp, 1.5 * ptw, 1.5 * pth, | |
1216 in_tex, out_comp, in_tex, out_comp, in_tex, | |
25758 | 1217 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype, |
25760 | 1218 in_tex, ttype, in_tex, out_comp, in_tex, out_comp, |
1219 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
|
1220 in_tex, ttype, out_comp, strength); |
25758 | 1221 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1222 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1223 *remain -= strlen(*prog_pos); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1224 *prog_pos += strlen(*prog_pos); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1225 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1226 |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1227 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
|
1228 const char *name; |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1229 GLenum cur; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1230 GLenum max; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1231 } progstats[] = { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1232 {"instructions", 0x88A0, 0x88A1}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1233 {"native instructions", 0x88A2, 0x88A3}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1234 {"temporaries", 0x88A4, 0x88A5}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1235 {"native temporaries", 0x88A6, 0x88A7}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1236 {"parameters", 0x88A8, 0x88A9}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1237 {"native parameters", 0x88AA, 0x88AB}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1238 {"attribs", 0x88AC, 0x88AD}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1239 {"native attribs", 0x88AE, 0x88AF}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1240 {"ALU instructions", 0x8805, 0x880B}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1241 {"TEX instructions", 0x8806, 0x880C}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1242 {"TEX indirections", 0x8807, 0x880D}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1243 {"native ALU instructions", 0x8808, 0x880E}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1244 {"native TEX instructions", 0x8809, 0x880F}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1245 {"native TEX indirections", 0x880A, 0x8810}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1246 {NULL, 0, 0} |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1247 }; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1248 |
19221 | 1249 /** |
1250 * \brief load the specified GPU Program | |
1251 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested | |
1252 * \param prog program string | |
1253 * \return 1 on success, 0 otherwise | |
1254 */ | |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1255 int loadGPUProgram(GLenum target, char *prog) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1256 int i; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1257 GLint cur = 0, max = 0, err = 0; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1258 if (!mpglProgramString) { |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1259 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
|
1260 return 0; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1261 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1262 mpglProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1263 mpglGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err); |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1264 if (err != -1) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1265 mp_msg(MSGT_VO, MSGL_ERR, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1266 "[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
|
1267 "[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
|
1268 "[gl] Error message:\n %s at %.10s\n", |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1269 mpglGetString(GL_PROGRAM_ERROR_STRING), &prog[err]); |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1270 return 0; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1271 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1272 if (!mpglGetProgramiv || !mp_msg_test(MSGT_VO, MSGL_DBG2)) |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1273 return 1; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1274 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
|
1275 for (i = 0; progstats[i].name; i++) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1276 mpglGetProgramiv(target, progstats[i].cur, &cur); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1277 mpglGetProgramiv(target, progstats[i].max, &max); |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1278 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
|
1279 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1280 return 1; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1281 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1282 |
25885 | 1283 #define MAX_PROGSZ (1024*1024) |
1284 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1285 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1286 * \brief setup a fragment program that will do YUV->RGB conversion |
26837 | 1287 * \param parms struct containing parameters like conversion and scaler type, |
1288 * brightness, ... | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1289 */ |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1290 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
|
1291 int type = params->type; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1292 int texw = params->texw; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1293 int texh = params->texh; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1294 int rect = params->target == GL_TEXTURE_RECTANGLE; |
25885 | 1295 static const char prog_hdr[] = |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1296 "!!ARBfp1.0\n" |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1297 "OPTION ARB_precision_hint_fastest;\n" |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1298 // 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
|
1299 // multiple times when the same scaler is used more than once |
30840
e159f9aa13a2
Add newlines to generated fragment program to make both fragment program dump
reimar
parents:
30409
diff
changeset
|
1300 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;\n"; |
25885 | 1301 int prog_remain; |
1302 char *yuv_prog, *prog_pos; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1303 int cur_texu = 3; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1304 char lum_scale_texs[1]; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1305 char chrom_scale_texs[1]; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1306 char conv_texs[1]; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1307 GLint i; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1308 // 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
|
1309 // for red, green, blue and the constant offsets |
26839 | 1310 float yuv2rgb[3][4]; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1311 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
|
1312 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
|
1313 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
|
1314 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
|
1315 else |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1316 create_scaler_textures(YUV_CHROM_SCALER(type), &cur_texu, chrom_scale_texs); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1317 mpglGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1318 if (i < cur_texu) |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1319 mp_msg(MSGT_VO, MSGL_ERR, |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1320 "[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
|
1321 cur_texu, i); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1322 if (!mpglProgramString) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1323 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
|
1324 return; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1325 } |
25885 | 1326 yuv_prog = malloc(MAX_PROGSZ); |
1327 strcpy(yuv_prog, prog_hdr); | |
1328 prog_pos = yuv_prog + sizeof(prog_hdr) - 1; | |
1329 prog_remain = MAX_PROGSZ - sizeof(prog_hdr); | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1330 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
|
1331 '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
|
1332 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
30097 | 1333 '1', 'g', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1334 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
30097 | 1335 '2', 'b', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); |
30108
0898adc64a6f
Extract functions to generate yuv->rgb matrices and lookup tables into a
reimar
parents:
30107
diff
changeset
|
1336 mp_get_yuv2rgb_coeffs(¶ms->csp_params, yuv2rgb); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1337 switch (YUV_CONVERSION(type)) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1338 case YUV_CONVERSION_FRAGMENT: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1339 snprintf(prog_pos, prog_remain, yuv_prog_template, |
26839 | 1340 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1341 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1342 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1343 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
|
1344 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1345 case YUV_CONVERSION_FRAGMENT_POW: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1346 snprintf(prog_pos, prog_remain, yuv_pow_prog_template, |
26839 | 1347 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1348 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1349 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1350 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C], | |
30107
11e3ee8cd05e
Put the colourspace-related variables into a separate struct to ease
reimar
parents:
30097
diff
changeset
|
1351 (float)1.0 / params->csp_params.rgamma, (float)1.0 / params->csp_params.bgamma, (float)1.0 / params->csp_params.bgamma); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1352 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1353 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1354 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template, |
26839 | 1355 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1356 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1357 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1358 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
|
1359 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
|
1360 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1361 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1362 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
|
1363 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1364 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1365 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
|
1366 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1367 } |
29905
908f55fb5ed8
Move OpenGL-related messages that have large output from MSGL_V to MSGL_DGB2.
reimar
parents:
29904
diff
changeset
|
1368 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
|
1369 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog); |
25885 | 1370 free(yuv_prog); |
16488
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 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1373 /** |
30964
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1374 * \brief detect the best YUV->RGB conversion method available |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1375 */ |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1376 int glAutodetectYUVConversion(void) { |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1377 const char *extensions = mpglGetString(GL_EXTENSIONS); |
31021 | 1378 if (!extensions || !mpglMultiTexCoord2f) |
1379 return YUV_CONVERSION_NONE; | |
30964
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1380 if (strstr(extensions, "GL_ARB_fragment_program")) |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1381 return YUV_CONVERSION_FRAGMENT; |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1382 if (strstr(extensions, "GL_ATI_text_fragment_shader")) |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1383 return YUV_CONVERSION_TEXT_FRAGMENT; |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1384 if (strstr(extensions, "GL_ATI_fragment_shader")) |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1385 return YUV_CONVERSION_COMBINERS_ATI; |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1386 return YUV_CONVERSION_NONE; |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1387 } |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1388 |
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30953
diff
changeset
|
1389 /** |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1390 * \brief setup YUV->RGB conversion |
26837 | 1391 * \param parms struct containing parameters like conversion and scaler type, |
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) { |
30107
11e3ee8cd05e
Put the colourspace-related variables into a separate struct to ease
reimar
parents:
30097
diff
changeset
|
1396 float uvcos = params->csp_params.saturation * cos(params->csp_params.hue); |
11e3ee8cd05e
Put the colourspace-related variables into a separate struct to ease
reimar
parents:
30097
diff
changeset
|
1397 float uvsin = params->csp_params.saturation * sin(params->csp_params.hue); |
31086
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
1398 if (params->chrom_texw == 0) params->chrom_texw = 1; |
cca95ca6f52b
Handle chroma texture size becoming 0, e.g. due to bad rounding.
reimar
parents:
31044
diff
changeset
|
1399 if (params->chrom_texh == 0) params->chrom_texh = 1; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1400 switch (YUV_CONVERSION(params->type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1401 case YUV_CONVERSION_COMBINERS: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1402 glSetupYUVCombiners(uvcos, uvsin); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1403 break; |
16625 | 1404 case YUV_CONVERSION_COMBINERS_ATI: |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
1405 glSetupYUVFragmentATI(¶ms->csp_params, 0); |
16625 | 1406 break; |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1407 case YUV_CONVERSION_TEXT_FRAGMENT: |
30953
d3f31670562d
Share more code between the two ATI fragment shader YUV to RGB
reimar
parents:
30952
diff
changeset
|
1408 glSetupYUVFragmentATI(¶ms->csp_params, 1); |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1409 break; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1410 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1411 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1412 case YUV_CONVERSION_FRAGMENT: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1413 case YUV_CONVERSION_FRAGMENT_POW: |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1414 glSetupYUVFragprog(params); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1415 break; |
30027
f1651b3af651
Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents:
30023
diff
changeset
|
1416 case YUV_CONVERSION_NONE: |
f1651b3af651
Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents:
30023
diff
changeset
|
1417 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1418 default: |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1419 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
|
1420 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1421 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1422 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1423 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1424 * \brief enable the specified YUV conversion |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1425 * \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
|
1426 * \param type type of YUV conversion |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1427 * \ingroup glconversion |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1428 */ |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
1429 void glEnableYUVConversion(GLenum target, int type) { |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1430 switch (YUV_CONVERSION(type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1431 case YUV_CONVERSION_COMBINERS: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1432 mpglActiveTexture(GL_TEXTURE1); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1433 mpglEnable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1434 mpglActiveTexture(GL_TEXTURE2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1435 mpglEnable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1436 mpglActiveTexture(GL_TEXTURE0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1437 mpglEnable(GL_REGISTER_COMBINERS_NV); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1438 break; |
16625 | 1439 case YUV_CONVERSION_COMBINERS_ATI: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1440 mpglActiveTexture(GL_TEXTURE1); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1441 mpglEnable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1442 mpglActiveTexture(GL_TEXTURE2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1443 mpglEnable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1444 mpglActiveTexture(GL_TEXTURE0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1445 mpglEnable(GL_FRAGMENT_SHADER_ATI); |
16625 | 1446 break; |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1447 case YUV_CONVERSION_TEXT_FRAGMENT: |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1448 mpglActiveTexture(GL_TEXTURE1); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1449 mpglEnable(target); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1450 mpglActiveTexture(GL_TEXTURE2); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1451 mpglEnable(target); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1452 mpglActiveTexture(GL_TEXTURE0); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1453 mpglEnable(GL_TEXT_FRAGMENT_SHADER_ATI); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1454 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1455 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1456 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1457 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1458 case YUV_CONVERSION_FRAGMENT: |
30027
f1651b3af651
Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents:
30023
diff
changeset
|
1459 case YUV_CONVERSION_NONE: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1460 mpglEnable(GL_FRAGMENT_PROGRAM); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1461 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1462 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1463 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1464 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1465 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1466 * \brief disable the specified YUV conversion |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1467 * \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
|
1468 * \param type type of YUV conversion |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1469 * \ingroup glconversion |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1470 */ |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
1471 void glDisableYUVConversion(GLenum target, int type) { |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1472 switch (YUV_CONVERSION(type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1473 case YUV_CONVERSION_COMBINERS: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1474 mpglActiveTexture(GL_TEXTURE1); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1475 mpglDisable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1476 mpglActiveTexture(GL_TEXTURE2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1477 mpglDisable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1478 mpglActiveTexture(GL_TEXTURE0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1479 mpglDisable(GL_REGISTER_COMBINERS_NV); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1480 break; |
16625 | 1481 case YUV_CONVERSION_COMBINERS_ATI: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1482 mpglActiveTexture(GL_TEXTURE1); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1483 mpglDisable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1484 mpglActiveTexture(GL_TEXTURE2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1485 mpglDisable(target); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1486 mpglActiveTexture(GL_TEXTURE0); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1487 mpglDisable(GL_FRAGMENT_SHADER_ATI); |
16625 | 1488 break; |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1489 case YUV_CONVERSION_TEXT_FRAGMENT: |
31026
0b0266c8ec53
Add workaroound for yuv=7 mode - does hurt speed but not much
reimar
parents:
31024
diff
changeset
|
1490 mpglDisable(GL_TEXT_FRAGMENT_SHADER_ATI); |
31029
47a6b4716ef3
Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents:
31026
diff
changeset
|
1491 // HACK: at least the Mac OS X 10.5 PPC Radeon drivers are broken and |
47a6b4716ef3
Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents:
31026
diff
changeset
|
1492 // without this disable the texture units while the program is still |
47a6b4716ef3
Clarify that the GL_TEXT_FRAGMENT_SHADER_ATI bug workaround is for OSX,
reimar
parents:
31026
diff
changeset
|
1493 // running (10.4 PPC seems to work without this though). |
31026
0b0266c8ec53
Add workaroound for yuv=7 mode - does hurt speed but not much
reimar
parents:
31024
diff
changeset
|
1494 mpglFlush(); |
30951
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1495 mpglActiveTexture(GL_TEXTURE1); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1496 mpglDisable(target); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1497 mpglActiveTexture(GL_TEXTURE2); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1498 mpglDisable(target); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1499 mpglActiveTexture(GL_TEXTURE0); |
e76a4f6bfc8d
Implement OpenGL-based YUV to RGB version for Radeon 9200 class
reimar
parents:
30946
diff
changeset
|
1500 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1501 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1502 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1503 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1504 case YUV_CONVERSION_FRAGMENT: |
30027
f1651b3af651
Enable running fragment programs with YUV_CONVERSION_NONE
reimar
parents:
30023
diff
changeset
|
1505 case YUV_CONVERSION_NONE: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1506 mpglDisable(GL_FRAGMENT_PROGRAM); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1507 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1508 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1509 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1510 |
31567 | 1511 void glEnable3DLeft(int type) { |
1512 GLint buffer; | |
1513 switch (type) { | |
1514 case GL_3D_RED_CYAN: | |
1515 mpglColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); | |
1516 break; | |
1517 case GL_3D_GREEN_MAGENTA: | |
1518 mpglColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE); | |
1519 break; | |
1520 case GL_3D_QUADBUFFER: | |
1521 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); | |
1522 switch (buffer) { | |
1523 case GL_FRONT: | |
1524 case GL_FRONT_LEFT: | |
1525 case GL_FRONT_RIGHT: | |
1526 buffer = GL_FRONT_LEFT; | |
1527 break; | |
1528 case GL_BACK: | |
1529 case GL_BACK_LEFT: | |
1530 case GL_BACK_RIGHT: | |
1531 buffer = GL_BACK_LEFT; | |
1532 break; | |
1533 } | |
1534 mpglDrawBuffer(buffer); | |
1535 break; | |
1536 } | |
1537 } | |
1538 | |
1539 void glEnable3DRight(int type) { | |
1540 GLint buffer; | |
1541 switch (type) { | |
1542 case GL_3D_RED_CYAN: | |
1543 mpglColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); | |
1544 break; | |
1545 case GL_3D_GREEN_MAGENTA: | |
1546 mpglColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); | |
1547 break; | |
1548 case GL_3D_QUADBUFFER: | |
1549 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); | |
1550 switch (buffer) { | |
1551 case GL_FRONT: | |
1552 case GL_FRONT_LEFT: | |
1553 case GL_FRONT_RIGHT: | |
1554 buffer = GL_FRONT_RIGHT; | |
1555 break; | |
1556 case GL_BACK: | |
1557 case GL_BACK_LEFT: | |
1558 case GL_BACK_RIGHT: | |
1559 buffer = GL_BACK_RIGHT; | |
1560 break; | |
1561 } | |
1562 mpglDrawBuffer(buffer); | |
1563 break; | |
1564 } | |
1565 } | |
1566 | |
1567 void glDisable3D(int type) { | |
1568 GLint buffer; | |
1569 switch (type) { | |
1570 case GL_3D_RED_CYAN: | |
1571 case GL_3D_GREEN_MAGENTA: | |
1572 mpglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | |
1573 break; | |
1574 case GL_3D_QUADBUFFER: | |
1575 mpglDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT); | |
1576 mpglGetIntegerv(GL_DRAW_BUFFER, &buffer); | |
1577 switch (buffer) { | |
1578 case GL_FRONT: | |
1579 case GL_FRONT_LEFT: | |
1580 case GL_FRONT_RIGHT: | |
1581 buffer = GL_FRONT; | |
1582 break; | |
1583 case GL_BACK: | |
1584 case GL_BACK_LEFT: | |
1585 case GL_BACK_RIGHT: | |
1586 buffer = GL_BACK; | |
1587 break; | |
1588 } | |
1589 mpglDrawBuffer(buffer); | |
1590 break; | |
1591 } | |
1592 } | |
1593 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1594 /** |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1595 * \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
|
1596 * \param x screen top coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1597 * \param y screen left coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1598 * \param w screen width coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1599 * \param h screen height coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1600 * \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
|
1601 * \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
|
1602 * \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
|
1603 * \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
|
1604 * \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
|
1605 * \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
|
1606 * \param rect_tex whether this texture uses texture_rectangle extension |
30097 | 1607 * \param is_yv12 if != 0, also draw the textures from units 1 and 2, |
1608 * bits 8 - 15 and 16 - 23 specify the x and y scaling of those textures | |
17220 | 1609 * \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
|
1610 * \ingroup gltexture |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1611 */ |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1612 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
|
1613 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th, |
17220 | 1614 int sx, int sy, int rect_tex, int is_yv12, int flip) { |
30097 | 1615 int chroma_x_shift = (is_yv12 >> 8) & 31; |
1616 int chroma_y_shift = (is_yv12 >> 16) & 31; | |
1617 GLfloat xscale = 1 << chroma_x_shift; | |
1618 GLfloat yscale = 1 << chroma_y_shift; | |
1619 GLfloat tx2 = tx / xscale, ty2 = ty / yscale, tw2 = tw / xscale, th2 = th / yscale; | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1620 if (!rect_tex) { |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1621 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
|
1622 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
|
1623 } |
17220 | 1624 if (flip) { |
1625 y += h; | |
1626 h = -h; | |
1627 } | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1628 mpglBegin(GL_QUADS); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1629 mpglTexCoord2f(tx, ty); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1630 if (is_yv12) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1631 mpglMultiTexCoord2f(GL_TEXTURE1, tx2, ty2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1632 mpglMultiTexCoord2f(GL_TEXTURE2, tx2, ty2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1633 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1634 mpglVertex2f(x, y); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1635 mpglTexCoord2f(tx, ty + th); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1636 if (is_yv12) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1637 mpglMultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1638 mpglMultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1639 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1640 mpglVertex2f(x, y + h); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1641 mpglTexCoord2f(tx + tw, ty + th); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1642 if (is_yv12) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1643 mpglMultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1644 mpglMultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1645 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1646 mpglVertex2f(x + w, y + h); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1647 mpglTexCoord2f(tx + tw, ty); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1648 if (is_yv12) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1649 mpglMultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1650 mpglMultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1651 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1652 mpglVertex2f(x + w, y); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1653 mpglEnd(); |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1654 } |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1655 |
30023 | 1656 #ifdef CONFIG_GL_WIN32 |
17116 | 1657 #include "w32_common.h" |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1658 /** |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29183
diff
changeset
|
1659 * \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
|
1660 * getProcAddress |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1661 * \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
|
1662 * \return function pointer returned by wglGetProcAddress |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1663 */ |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1664 static void *w32gpa(const GLubyte *procName) { |
25953 | 1665 HMODULE oglmod; |
1666 void *res = wglGetProcAddress(procName); | |
1667 if (res) return res; | |
1668 oglmod = GetModuleHandle("opengl32.dll"); | |
1669 return GetProcAddress(oglmod, procName); | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1670 } |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1671 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1672 static int setGlWindow_w32(MPGLContext *ctx) |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1673 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1674 HWND win = vo_w32_window; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1675 int *vinfo = &ctx->vinfo.w32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1676 HGLRC *context = &ctx->context.w32; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1677 int new_vinfo; |
29904
f529a2bb299d
Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents:
29902
diff
changeset
|
1678 HDC windc = vo_w32_get_dc(win); |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1679 HGLRC new_context = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1680 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
|
1681 int res = SET_WINDOW_FAILED; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1682 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1683 // 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
|
1684 // 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
|
1685 if (*context) |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1686 mpglFinish(); |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1687 new_vinfo = GetPixelFormat(windc); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1688 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1689 // we can keep the wglContext |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1690 new_context = *context; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1691 keep_context = 1; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1692 } else { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1693 // create a context |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1694 new_context = wglCreateContext(windc); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1695 if (!new_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1696 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
|
1697 goto out; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1698 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1699 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1700 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1701 // set context |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1702 if (!wglMakeCurrent(windc, new_context)) { |
28036 | 1703 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
|
1704 if (!keep_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1705 wglDeleteContext(new_context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1706 } |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1707 goto out; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1708 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1709 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1710 // set new values |
21631 | 1711 vo_w32_window = win; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1712 { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1713 RECT rect; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1714 GetClientRect(win, &rect); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1715 vo_dwidth = rect.right; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1716 vo_dheight = rect.bottom; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1717 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1718 if (!keep_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1719 if (*context) |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1720 wglDeleteContext(*context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1721 *context = new_context; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1722 *vinfo = new_vinfo; |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1723 getFunctions(w32gpa, NULL); |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1724 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1725 // 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
|
1726 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
|
1727 } else |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1728 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
|
1729 |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1730 out: |
29904
f529a2bb299d
Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents:
29902
diff
changeset
|
1731 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
|
1732 return res; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1733 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1734 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1735 static void releaseGlContext_w32(MPGLContext *ctx) { |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1736 int *vinfo = &ctx->vinfo.w32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1737 HGLRC *context = &ctx->context.w32; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1738 *vinfo = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1739 if (*context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1740 wglMakeCurrent(0, 0); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1741 wglDeleteContext(*context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1742 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1743 *context = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1744 } |
17116 | 1745 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1746 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
|
1747 HDC vo_hdc = vo_w32_get_dc(vo_w32_window); |
17116 | 1748 SwapBuffers(vo_hdc); |
29904
f529a2bb299d
Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents:
29902
diff
changeset
|
1749 vo_w32_release_dc(vo_w32_window, vo_hdc); |
17116 | 1750 } |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1751 #endif |
30023 | 1752 #ifdef CONFIG_GL_X11 |
17116 | 1753 #include "x11_common.h" |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1754 |
13843 | 1755 /** |
14269 | 1756 * \brief Returns the XVisualInfo associated with Window win. |
13843 | 1757 * \param win Window whose XVisualInfo is returne. |
1758 * \return XVisualInfo of the window. Caller must use XFree to free it. | |
1759 */ | |
1760 static XVisualInfo *getWindowVisualInfo(Window win) { | |
1761 XWindowAttributes xw_attr; | |
1762 XVisualInfo vinfo_template; | |
1763 int tmp; | |
1764 XGetWindowAttributes(mDisplay, win, &xw_attr); | |
1765 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual); | |
1766 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp); | |
1767 } | |
1768 | |
29679
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1769 static void appendstr(char **dst, const char *str) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1770 { |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1771 int newsize; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1772 char *newstr; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1773 if (!str) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1774 return; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1775 newsize = strlen(*dst) + 1 + strlen(str) + 1; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1776 newstr = realloc(*dst, newsize); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1777 if (!newstr) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1778 return; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1779 *dst = newstr; |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1780 strcat(*dst, " "); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1781 strcat(*dst, str); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1782 } |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1783 |
13843 | 1784 /** |
1785 * \brief Changes the window in which video is displayed. | |
1786 * If possible only transfers the context to the new window, otherwise | |
1787 * creates a new one, which must be initialized by the caller. | |
1788 * \param vinfo Currently used visual. | |
1789 * \param context Currently used context. | |
1790 * \param win window that should be used for drawing. | |
1791 * \return one of SET_WINDOW_FAILED, SET_WINDOW_OK or SET_WINDOW_REINIT. | |
1792 * In case of SET_WINDOW_REINIT the context could not be transfered | |
1793 * 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
|
1794 * \ingroup glcontext |
13843 | 1795 */ |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1796 static int setGlWindow_x11(MPGLContext *ctx) |
13843 | 1797 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1798 XVisualInfo **vinfo = &ctx->vinfo.x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1799 GLXContext *context = &ctx->context.x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1800 Window win = vo_window; |
13843 | 1801 XVisualInfo *new_vinfo; |
1802 GLXContext new_context = NULL; | |
1803 int keep_context = 0; | |
1804 | |
1805 // should only be needed when keeping context, but not doing glFinish | |
1806 // 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
|
1807 if (*context) |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1808 mpglFinish(); |
13843 | 1809 new_vinfo = getWindowVisualInfo(win); |
1810 if (*context && *vinfo && new_vinfo && | |
1811 (*vinfo)->visualid == new_vinfo->visualid) { | |
1812 // we can keep the GLXContext | |
1813 new_context = *context; | |
1814 XFree(new_vinfo); | |
1815 new_vinfo = *vinfo; | |
1816 keep_context = 1; | |
1817 } else { | |
1818 // create a context | |
1819 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True); | |
1820 if (!new_context) { | |
1821 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GLX context!\n"); | |
1822 XFree(new_vinfo); | |
1823 return SET_WINDOW_FAILED; | |
1824 } | |
1825 } | |
1826 | |
1827 // set context | |
1828 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) { | |
28036 | 1829 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not set GLX context!\n"); |
13843 | 1830 if (!keep_context) { |
28036 | 1831 glXDestroyContext(mDisplay, new_context); |
13843 | 1832 XFree(new_vinfo); |
1833 } | |
1834 return SET_WINDOW_FAILED; | |
1835 } | |
1836 | |
1837 // set new values | |
1838 vo_window = win; | |
27885
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27865
diff
changeset
|
1839 vo_x11_update_geometry(); |
13843 | 1840 if (!keep_context) { |
16588 | 1841 void *(*getProcAddress)(const GLubyte *); |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1842 const char *(*glXExtStr)(Display *, int); |
29679
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1843 char *glxstr = strdup(""); |
13843 | 1844 if (*context) |
1845 glXDestroyContext(mDisplay, *context); | |
1846 *context = new_context; | |
1847 if (*vinfo) | |
1848 XFree(*vinfo); | |
1849 *vinfo = new_vinfo; | |
30946 | 1850 getProcAddress = getdladdr("glXGetProcAddress"); |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1851 if (!getProcAddress) |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1852 getProcAddress = getdladdr("glXGetProcAddressARB"); |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1853 glXExtStr = getdladdr("glXQueryExtensionsString"); |
29679
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1854 if (glXExtStr) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1855 appendstr(&glxstr, glXExtStr(mDisplay, DefaultScreen(mDisplay))); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1856 glXExtStr = getdladdr("glXGetClientString"); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1857 if (glXExtStr) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1858 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS)); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1859 glXExtStr = getdladdr("glXGetServerString"); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1860 if (glXExtStr) |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1861 appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS)); |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1862 |
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1863 getFunctions(getProcAddress, glxstr); |
30952
994f301a13f6
Try to detect and work around broken glXGetProcAddress on at
reimar
parents:
30951
diff
changeset
|
1864 if (!mpglGenPrograms && mpglGetString && |
31024 | 1865 getProcAddress && |
30952
994f301a13f6
Try to detect and work around broken glXGetProcAddress on at
reimar
parents:
30951
diff
changeset
|
1866 strstr(mpglGetString(GL_EXTENSIONS), "GL_ARB_vertex_program")) { |
994f301a13f6
Try to detect and work around broken glXGetProcAddress on at
reimar
parents:
30951
diff
changeset
|
1867 mp_msg(MSGT_VO, MSGL_WARN, "Broken glXGetProcAddress detected, trying workaround\n"); |
31024 | 1868 getFunctions(NULL, glxstr); |
30952
994f301a13f6
Try to detect and work around broken glXGetProcAddress on at
reimar
parents:
30951
diff
changeset
|
1869 } |
29679
465247b46e39
Also check GLX client and server strings for extensions
reimar
parents:
29263
diff
changeset
|
1870 free(glxstr); |
13843 | 1871 |
1872 // and inform that reinit is neccessary | |
1873 return SET_WINDOW_REINIT; | |
1874 } | |
1875 return SET_WINDOW_OK; | |
1876 } | |
1877 | |
1878 /** | |
1879 * \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
|
1880 * \ingroup glcontext |
13843 | 1881 */ |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1882 static void releaseGlContext_x11(MPGLContext *ctx) { |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1883 XVisualInfo **vinfo = &ctx->vinfo.x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1884 GLXContext *context = &ctx->context.x11; |
13843 | 1885 if (*vinfo) |
1886 XFree(*vinfo); | |
1887 *vinfo = NULL; | |
1888 if (*context) | |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1889 { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30840
diff
changeset
|
1890 mpglFinish(); |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1891 glXMakeCurrent(mDisplay, None, NULL); |
13843 | 1892 glXDestroyContext(mDisplay, *context); |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1893 } |
13843 | 1894 *context = 0; |
1895 } | |
17116 | 1896 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1897 static void swapGlBuffers_x11(MPGLContext *ctx) { |
17116 | 1898 glXSwapBuffers(mDisplay, vo_window); |
1899 } | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1900 |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1901 static int x11_check_events(void) { |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1902 return vo_x11_check_events(mDisplay); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1903 } |
13843 | 1904 #endif |
1905 | |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1906 #ifdef CONFIG_GL_SDL |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1907 #include "sdl_common.h" |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1908 |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1909 static void swapGlBuffers_sdl(MPGLContext *ctx) { |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1910 SDL_GL_SwapBuffers(); |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1911 } |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1912 |
31031
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1913 static void *sdlgpa(const GLubyte *name) { |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1914 return SDL_GL_GetProcAddress(name); |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1915 } |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1916 |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1917 static int setGlWindow_sdl(MPGLContext *ctx) { |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
1918 if (sdl_set_mode(0, SDL_OPENGL | SDL_RESIZABLE) < 0) |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
1919 return SET_WINDOW_FAILED; |
31031
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1920 SDL_GL_LoadLibrary(NULL); |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1921 getFunctions(sdlgpa, NULL); |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1922 return SET_WINDOW_OK; |
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
1923 } |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1924 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1925 static int sdl_check_events(void) { |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1926 int res = 0; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1927 SDL_Event event; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1928 while (SDL_PollEvent(&event)) { |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1929 res |= sdl_default_handle_event(&event); |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1930 } |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31041
diff
changeset
|
1931 // poll "events" from within MPlayer code |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31041
diff
changeset
|
1932 res |= sdl_default_handle_event(NULL); |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
1933 if (res & VO_EVENT_RESIZE) |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
1934 sdl_set_mode(0, SDL_OPENGL | SDL_RESIZABLE); |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1935 return res; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1936 } |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
1937 |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1938 #endif |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1939 |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1940 static int setGlWindow_dummy(MPGLContext *ctx) { |
31024 | 1941 getFunctions(NULL, NULL); |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1942 return SET_WINDOW_OK; |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1943 } |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1944 |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1945 static void releaseGlContext_dummy(MPGLContext *ctx) { |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1946 } |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1947 |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1948 static int dummy_check_events(void) { |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1949 return 0; |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1950 } |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1951 |
31035 | 1952 static void dummy_update_xinerama_info(void) { |
1953 if (vo_screenwidth <= 0 || vo_screenheight <= 0) { | |
31041 | 1954 mp_msg(MSGT_VO, MSGL_ERR, "You must specify the screen dimensions " |
31035 | 1955 "with -screenw and -screenh\n"); |
1956 vo_screenwidth = 1280; | |
1957 vo_screenheight = 768; | |
1958 } | |
1959 aspect_save_screenres(vo_screenwidth, vo_screenheight); | |
1960 } | |
1961 | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1962 int init_mpglcontext(MPGLContext *ctx, enum MPGLType type) { |
31044 | 1963 if (type == GLTYPE_AUTO) { |
1964 int res = init_mpglcontext(ctx, GLTYPE_W32); | |
1965 if (res) return res; | |
1966 res = init_mpglcontext(ctx, GLTYPE_X11); | |
1967 if (res) return res; | |
1968 res = init_mpglcontext(ctx, GLTYPE_SDL); | |
1969 return res; | |
1970 } | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1971 memset(ctx, 0, sizeof(*ctx)); |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1972 ctx->setGlWindow = setGlWindow_dummy; |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1973 ctx->releaseGlContext = releaseGlContext_dummy; |
31035 | 1974 ctx->update_xinerama_info = dummy_update_xinerama_info; |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
1975 ctx->check_events = dummy_check_events; |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1976 ctx->type = type; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1977 switch (ctx->type) { |
30023 | 1978 #ifdef CONFIG_GL_WIN32 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1979 case GLTYPE_W32: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1980 ctx->setGlWindow = setGlWindow_w32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1981 ctx->releaseGlContext = releaseGlContext_w32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1982 ctx->swapGlBuffers = swapGlBuffers_w32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1983 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
|
1984 ctx->border = vo_w32_border; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1985 ctx->check_events = vo_w32_check_events; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1986 ctx->fullscreen = vo_w32_fullscreen; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1987 ctx->ontop = vo_w32_ontop; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1988 return vo_w32_init(); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1989 #endif |
30023 | 1990 #ifdef CONFIG_GL_X11 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1991 case GLTYPE_X11: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1992 ctx->setGlWindow = setGlWindow_x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1993 ctx->releaseGlContext = releaseGlContext_x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1994 ctx->swapGlBuffers = swapGlBuffers_x11; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1995 ctx->update_xinerama_info = update_xinerama_info; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1996 ctx->border = vo_x11_border; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1997 ctx->check_events = x11_check_events; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1998 ctx->fullscreen = vo_x11_fullscreen; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
1999 ctx->ontop = vo_x11_ontop; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2000 return vo_init(); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2001 #endif |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2002 #ifdef CONFIG_GL_SDL |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2003 case GLTYPE_SDL: |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2004 SDL_Init(SDL_INIT_VIDEO); |
31031
d94eeec25c47
Use SDL_GL_ProcAddress to work around conflicts between -lGL
reimar
parents:
31030
diff
changeset
|
2005 ctx->setGlWindow = setGlWindow_sdl; |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2006 ctx->swapGlBuffers = swapGlBuffers_sdl; |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
31031
diff
changeset
|
2007 ctx->check_events = sdl_check_events; |
31035 | 2008 ctx->fullscreen = vo_sdl_fullscreen; |
31037 | 2009 return vo_sdl_init(); |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2010 #endif |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2011 default: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2012 return 0; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2013 } |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2014 } |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2015 |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2016 void uninit_mpglcontext(MPGLContext *ctx) { |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2017 ctx->releaseGlContext(ctx); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2018 switch (ctx->type) { |
30023 | 2019 #ifdef CONFIG_GL_WIN32 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2020 case GLTYPE_W32: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2021 vo_w32_uninit(); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2022 break; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2023 #endif |
30023 | 2024 #ifdef CONFIG_GL_X11 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2025 case GLTYPE_X11: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2026 vo_x11_uninit(); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2027 break; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2028 #endif |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2029 #ifdef CONFIG_GL_SDL |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2030 case GLTYPE_SDL: |
31037 | 2031 vo_sdl_uninit(); |
31020
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2032 break; |
529614f44431
First steps to support -vo gl with SDL-based Window handling.
reimar
parents:
30964
diff
changeset
|
2033 #endif |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2034 } |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2035 memset(ctx, 0, sizeof(*ctx)); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29905
diff
changeset
|
2036 } |