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