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