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