Mercurial > mplayer.hg
annotate libvo/vo_gl2.c @ 34634:0ef7177a063b
Fix linking after FFmpeg merge.
Protocols that are available only when librtmp is present
are no longer disabled in the code, so we have to remove
them in our configure.
author | iive |
---|---|
date | Tue, 14 Feb 2012 16:50:42 +0000 |
parents | f8c523d09e5e |
children | 5e29e950d918 |
rev | line source |
---|---|
23651 | 1 /* |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
2 * X11/OpenGL interface |
2124 | 3 * based on video_out_x11 by Aaron Holtzman, |
4 * and WS opengl window manager by Pontscho/Fresh! | |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
5 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
6 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
7 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
11 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
12 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
16 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
17 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27927
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
2124 | 21 */ |
22 | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <string.h> | |
26 | |
27 #include "config.h" | |
11087 | 28 #include "mp_msg.h" |
16475 | 29 #include "subopt-helper.h" |
2124 | 30 #include "video_out.h" |
31 #include "video_out_internal.h" | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
32 #include "libmpcodecs/vf.h" |
32467 | 33 #include "sub/sub.h" |
2124 | 34 |
18742 | 35 #include "gl_common.h" |
36 #include "aspect.h" | |
12382 | 37 |
12750
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
38 #undef TEXTUREFORMAT_ALWAYS |
25397
084619331d92
Replace some more broken SYS_DARWIN preprocessor conditionals with __APPLE__.
diego
parents:
25220
diff
changeset
|
39 #ifdef __APPLE__ |
12842 | 40 #define TEXTUREFORMAT_ALWAYS GL_RGBA8 |
12750
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
41 #endif |
10143
fd3cbeb388f0
removed broken swscaler support, added runtime fullscreens switching ability, and some other general cleanup thingies
alex
parents:
8254
diff
changeset
|
42 |
16594
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
43 //! force texture height, useful for debugging |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
44 #define TEXTURE_HEIGHT 128 |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
45 #undef TEXTURE_HEIGHT |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
46 //! force texture width, useful for debugging |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
47 #define TEXTURE_WIDTH 128 |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
48 #undef TEXTURE_WIDTH |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
49 |
25216 | 50 static const vo_info_t info = |
2124 | 51 { |
23651 | 52 "X11 (OpenGL) - multiple textures version", |
53 "gl2", | |
54 "Arpad Gereoffy & Sven Goethel", | |
55 "" | |
2124 | 56 }; |
57 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
58 const LIBVO_EXTERN(gl2) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8123
diff
changeset
|
59 |
2124 | 60 /* local data */ |
61 static unsigned char *ImageData=NULL; | |
62 | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
63 static MPGLContext glctx; |
2124 | 64 |
65 static uint32_t image_width; | |
66 static uint32_t image_height; | |
67 static uint32_t image_format; | |
68 static uint32_t image_bpp; | |
69 static uint32_t image_bytes; | |
70 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10604
diff
changeset
|
71 static int int_pause; |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10604
diff
changeset
|
72 |
2124 | 73 static uint32_t texture_width; |
74 static uint32_t texture_height; | |
12448 | 75 static int texnumx, texnumy, raw_line_len; |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
76 static int texdirty; |
13540 | 77 static struct TexSquare * texgrid = NULL; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
78 static GLuint fragprog; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
79 static GLuint lookupTex; |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
80 static GLint gl_internal_format; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
81 static int rgb_sz, r_sz, g_sz, b_sz, a_sz; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16282
diff
changeset
|
82 static GLenum gl_bitmap_format; |
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16282
diff
changeset
|
83 static GLenum gl_bitmap_type; |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
84 static int isGL12 = GL_FALSE; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
85 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
86 static int gl_bilinear=1; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
87 static int gl_antialias=0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
88 static int use_yuv; |
30097 | 89 static int is_yuv; |
16475 | 90 static int use_glFinish; |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
91 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
92 static void (*draw_alpha_fnc) |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
93 (int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); |
2124 | 94 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10604
diff
changeset
|
95 |
2124 | 96 /* The squares that are tiled to make up the game screen polygon */ |
97 | |
98 struct TexSquare | |
99 { | |
100 GLubyte *texture; | |
101 GLuint texobj; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
102 GLuint uvtexobjs[2]; |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
103 GLfloat fx, fy, fw, fh; |
2124 | 104 }; |
105 | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
106 static GLint getInternalFormat(void) |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
107 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
108 switch (glctx.type) { |
30023 | 109 #ifdef CONFIG_GL_WIN32 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
110 case GLTYPE_W32: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
111 { |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
112 PIXELFORMATDESCRIPTOR pfd; |
29904
f529a2bb299d
Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents:
29647
diff
changeset
|
113 HDC vo_hdc = vo_w32_get_dc(vo_w32_window); |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
114 int pf = GetPixelFormat(vo_hdc); |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
115 if (!DescribePixelFormat(vo_hdc, pf, sizeof pfd, &pfd)) { |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
116 r_sz = g_sz = b_sz = a_sz = 0; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
117 } else { |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
118 r_sz = pfd.cRedBits; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
119 g_sz = pfd.cGreenBits; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
120 b_sz = pfd.cBlueBits; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
121 a_sz = pfd.cAlphaBits; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
122 } |
29904
f529a2bb299d
Add support for Windows OpenGL rendering onto a device instead of into a window.
reimar
parents:
29647
diff
changeset
|
123 vo_w32_release_dc(vo_w32_window, vo_hdc); |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
124 } |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
125 break; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
126 #endif |
30023 | 127 #ifdef CONFIG_GL_X11 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
128 case GLTYPE_X11: |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
129 if (glXGetConfig(mDisplay, glctx.vinfo.x11, GLX_RED_SIZE, &r_sz) != 0) r_sz = 0; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
130 if (glXGetConfig(mDisplay, glctx.vinfo.x11, GLX_GREEN_SIZE, &g_sz) != 0) g_sz = 0; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
131 if (glXGetConfig(mDisplay, glctx.vinfo.x11, GLX_BLUE_SIZE, &b_sz) != 0) b_sz = 0; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
132 if (glXGetConfig(mDisplay, glctx.vinfo.x11, GLX_ALPHA_SIZE, &a_sz) != 0) a_sz = 0; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
133 break; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
134 #endif |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
135 } |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
136 |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
137 rgb_sz=r_sz+g_sz+b_sz; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
138 if(rgb_sz<=0) rgb_sz=24; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
139 |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
140 #ifdef TEXTUREFORMAT_ALWAYS |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
141 return TEXTUREFORMAT_ALWAYS; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
142 #else |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
143 if(r_sz==3 && g_sz==3 && b_sz==2 && a_sz==0) |
23651 | 144 return GL_R3_G3_B2; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
145 if(r_sz==4 && g_sz==4 && b_sz==4 && a_sz==0) |
23651 | 146 return GL_RGB4; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
147 if(r_sz==5 && g_sz==5 && b_sz==5 && a_sz==0) |
23651 | 148 return GL_RGB5; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
149 if(r_sz==8 && g_sz==8 && b_sz==8 && a_sz==0) |
23651 | 150 return GL_RGB8; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
151 if(r_sz==10 && g_sz==10 && b_sz==10 && a_sz==0) |
23651 | 152 return GL_RGB10; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
153 if(r_sz==2 && g_sz==2 && b_sz==2 && a_sz==2) |
23651 | 154 return GL_RGBA2; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
155 if(r_sz==4 && g_sz==4 && b_sz==4 && a_sz==4) |
23651 | 156 return GL_RGBA4; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
157 if(r_sz==5 && g_sz==5 && b_sz==5 && a_sz==1) |
23651 | 158 return GL_RGB5_A1; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
159 if(r_sz==8 && g_sz==8 && b_sz==8 && a_sz==8) |
23651 | 160 return GL_RGBA8; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
161 if(r_sz==10 && g_sz==10 && b_sz==10 && a_sz==2) |
23651 | 162 return GL_RGB10_A2; |
14090
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
163 #endif |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
164 return GL_RGB; |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
165 } |
e84643be7bd0
Move selection of internal texture format to appropriate place, should
reimar
parents:
14078
diff
changeset
|
166 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
167 static int initTextures(void) |
2124 | 168 { |
169 struct TexSquare *tsq=0; | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
170 GLfloat texpercx, texpercy; |
16221 | 171 int s; |
2124 | 172 int x=0, y=0; |
173 | |
16222 | 174 // textures smaller than 64x64 might not be supported |
175 s=64; | |
16220
1effc23b2cb8
10l, texture_width/height initialization was removed, so use
reimar
parents:
16214
diff
changeset
|
176 while (s<image_width) |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
177 s*=2; |
2124 | 178 texture_width=s; |
179 | |
16222 | 180 s=64; |
16220
1effc23b2cb8
10l, texture_width/height initialization was removed, so use
reimar
parents:
16214
diff
changeset
|
181 while (s<image_height) |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
182 s*=2; |
2124 | 183 texture_height=s; |
184 | |
30097 | 185 if (!is_yuv) |
30970 | 186 gl_internal_format = getInternalFormat(); |
2124 | 187 |
188 /* Test the max texture size */ | |
23651 | 189 do { |
30971
9d024ceb45e3
Check texture dimensions instead of internal format in max texture
reimar
parents:
30970
diff
changeset
|
190 GLint w; |
2124 | 191 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, |
23651 | 192 gl_internal_format, |
193 texture_width, texture_height, | |
194 0, gl_bitmap_format, gl_bitmap_type, NULL); | |
2124 | 195 |
196 glGetTexLevelParameteriv | |
30971
9d024ceb45e3
Check texture dimensions instead of internal format in max texture
reimar
parents:
30970
diff
changeset
|
197 (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); |
2124 | 198 |
30971
9d024ceb45e3
Check texture dimensions instead of internal format in max texture
reimar
parents:
30970
diff
changeset
|
199 if (w >= texture_width) |
30969 | 200 break; |
201 | |
30970 | 202 mp_msg (MSGT_VO, MSGL_V, "[gl2] Needed texture [%dx%d] too big, trying ", |
203 texture_width, texture_height); | |
2124 | 204 |
30970 | 205 if (texture_width > texture_height) |
206 texture_width /= 2; | |
207 else | |
208 texture_height /= 2; | |
2124 | 209 |
30970 | 210 mp_msg (MSGT_VO, MSGL_V, "[%dx%d] !\n", texture_width, texture_height); |
2124 | 211 |
30970 | 212 if(texture_width < 64 || texture_height < 64) { |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31684
diff
changeset
|
213 mp_msg (MSGT_VO, MSGL_FATAL, "[gl2] Give up .. usable texture size not available, or texture config error !\n"); |
30970 | 214 return -1; |
215 } | |
216 } while (texture_width > 1 && texture_height > 1); | |
16594
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
217 #ifdef TEXTURE_WIDTH |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
218 texture_width = TEXTURE_WIDTH; |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
219 #endif |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
220 #ifdef TEXTURE_HEIGHT |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
221 texture_height = TEXTURE_HEIGHT; |
7b30ec73e83e
debugging/testing helpers: allow forcing a certain width/height for textures
reimar
parents:
16590
diff
changeset
|
222 #endif |
2124 | 223 |
224 texnumx = image_width / texture_width; | |
225 if ((image_width % texture_width) > 0) | |
226 texnumx++; | |
227 | |
228 texnumy = image_height / texture_height; | |
229 if ((image_height % texture_height) > 0) | |
230 texnumy++; | |
231 | |
11988 | 232 mp_msg(MSGT_VO, MSGL_V, "[gl2] Creating %dx%d textures of size %dx%d ...\n", |
23651 | 233 texnumx, texnumy, texture_width,texture_height); |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
234 |
2124 | 235 /* Allocate the texture memory */ |
236 | |
237 texpercx = (GLfloat) texture_width / (GLfloat) image_width; | |
238 texpercy = (GLfloat) texture_height / (GLfloat) image_height; | |
239 | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
240 free(texgrid); |
23647 | 241 texgrid = calloc (texnumx * texnumy, sizeof (struct TexSquare)); |
2124 | 242 |
12448 | 243 raw_line_len = image_width * image_bytes; |
2124 | 244 |
11988 | 245 mp_msg (MSGT_VO, MSGL_DBG2, "[gl2] texture-usage %d*width=%d, %d*height=%d\n", |
23651 | 246 (int) texnumx, (int) texture_width, (int) texnumy, |
247 (int) texture_height); | |
2124 | 248 |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
249 tsq = texgrid; |
23651 | 250 for (y = 0; y < texnumy; y++) { |
251 for (x = 0; x < texnumx; x++) { | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
252 tsq->fx = x * texpercx; |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
253 tsq->fy = y * texpercy; |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
254 tsq->fw = texpercx; |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
255 tsq->fh = texpercy; |
2124 | 256 |
257 tsq->texobj=0; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
258 tsq->uvtexobjs[0] = tsq->uvtexobjs[1] = 0; |
2124 | 259 |
260 glGenTextures (1, &(tsq->texobj)); | |
261 | |
262 glBindTexture (GL_TEXTURE_2D, tsq->texobj); | |
30097 | 263 if (is_yuv) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
264 glGenTextures(2, tsq->uvtexobjs); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
265 mpglActiveTexture(GL_TEXTURE1); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
266 glBindTexture (GL_TEXTURE_2D, tsq->uvtexobjs[0]); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
267 mpglActiveTexture(GL_TEXTURE2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
268 glBindTexture (GL_TEXTURE_2D, tsq->uvtexobjs[1]); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
269 mpglActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
270 } |
2124 | 271 |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27343
diff
changeset
|
272 glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR, |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
273 texture_width, texture_height, 0); |
2124 | 274 |
275 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | |
30097 | 276 if (is_yuv) { |
33416
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
277 int xs, ys, depth; |
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
278 int chroma_clear_val = 128; |
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
279 mp_get_chroma_shift(image_format, &xs, &ys, &depth); |
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
280 chroma_clear_val >>= -depth & 7; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
281 mpglActiveTexture(GL_TEXTURE1); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27343
diff
changeset
|
282 glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR, |
33416
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
283 texture_width >> xs, texture_height >> ys, |
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
284 chroma_clear_val); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
285 mpglActiveTexture(GL_TEXTURE2); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27343
diff
changeset
|
286 glCreateClearTex(GL_TEXTURE_2D, gl_internal_format, gl_bitmap_format, gl_bitmap_type, GL_LINEAR, |
33416
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
287 texture_width >> xs, texture_height >> ys, |
b7b169f5abda
Fix clear/border color of chroma texture for 9- and 10-bit formats.
reimar
parents:
33414
diff
changeset
|
288 chroma_clear_val); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
289 mpglActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
290 } |
2124 | 291 |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
292 tsq++; |
23651 | 293 } /* for all texnumx */ |
2124 | 294 } /* for all texnumy */ |
23651 | 295 |
10604 | 296 return 0; |
2124 | 297 } |
298 | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
299 static void resetTexturePointers(unsigned char *imageSource) |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
300 { |
12448 | 301 unsigned char *texdata_start, *line_start; |
302 struct TexSquare *tsq = texgrid; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
303 int x=0, y=0; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
304 |
12448 | 305 line_start = (unsigned char *) imageSource; |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
306 |
23651 | 307 for (y = 0; y < texnumy; y++) { |
12448 | 308 texdata_start = line_start; |
23651 | 309 for (x = 0; x < texnumx; x++) { |
12448 | 310 tsq->texture = texdata_start; |
311 texdata_start += texture_width * image_bytes; | |
312 tsq++; | |
23651 | 313 } /* for all texnumx */ |
12448 | 314 line_start += texture_height * raw_line_len; |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
315 } /* for all texnumy */ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
316 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
317 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
318 static void gl_set_bilinear (int val) |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
319 { |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
320 int x, y; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
321 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
322 if(val>=0) |
23651 | 323 gl_bilinear = val; |
324 else | |
325 gl_bilinear++; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
326 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
327 gl_bilinear=gl_bilinear%2; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
328 /* no mipmap yet .. */ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
329 |
23651 | 330 for (y = 0; y < texnumy; y++) { |
331 for (x = 0; x < texnumx; x++) { | |
332 glBindTexture (GL_TEXTURE_2D, texgrid[y * texnumx + x].texobj); | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
333 |
23651 | 334 switch (gl_bilinear) { |
335 case 0: | |
336 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
337 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
338 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] bilinear off\n"); | |
339 break; | |
340 case 1: | |
341 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
342 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |
343 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] bilinear linear\n"); | |
344 break; | |
345 case 2: | |
346 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); | |
347 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); | |
348 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] bilinear mipmap nearest\n"); | |
349 break; | |
350 case 3: | |
351 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); | |
352 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); | |
353 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] bilinear mipmap linear\n"); | |
354 break; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
355 } |
23651 | 356 } |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
357 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
358 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
359 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
360 static void gl_set_antialias (int val) |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
361 { |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
362 gl_antialias=val; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
363 |
23651 | 364 if (gl_antialias) { |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
365 glShadeModel (GL_SMOOTH); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
366 glEnable (GL_POLYGON_SMOOTH); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
367 glEnable (GL_LINE_SMOOTH); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
368 glEnable (GL_POINT_SMOOTH); |
11988 | 369 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] antialiasing on\n"); |
23651 | 370 } else { |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
371 glShadeModel (GL_FLAT); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
372 glDisable (GL_POLYGON_SMOOTH); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
373 glDisable (GL_LINE_SMOOTH); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
374 glDisable (GL_POINT_SMOOTH); |
11988 | 375 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] antialiasing off\n"); |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
376 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
377 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
378 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
379 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
380 static void drawTextureDisplay (void) |
2124 | 381 { |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
382 struct TexSquare *square = texgrid; |
23645
6f2f38eb4e0a
Remove some unused code and useless error checking that only clutters the code
reimar
parents:
23077
diff
changeset
|
383 int x, y; |
2124 | 384 |
34061
fe03e0d5c7d0
Remove usage of glColor3f, there is not really a point in it.
reimar
parents:
33416
diff
changeset
|
385 glColor4f(1.0,1.0,1.0,1.0); |
2124 | 386 |
30097 | 387 if (is_yuv) |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
388 glEnableYUVConversion(GL_TEXTURE_2D, use_yuv); |
23651 | 389 for (y = 0; y < texnumy; y++) { |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
390 int thish = texture_height; |
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
391 if (y == texnumy - 1 && image_height % texture_height) |
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
392 thish = image_height % texture_height; |
23651 | 393 for (x = 0; x < texnumx; x++) { |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
394 int thisw = texture_width; |
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
395 if (x == texnumx - 1 && image_width % texture_width) |
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
396 thisw = image_width % texture_width; |
2124 | 397 glBindTexture (GL_TEXTURE_2D, square->texobj); |
30097 | 398 if (is_yuv) { |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
399 mpglActiveTexture(GL_TEXTURE1); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
400 glBindTexture (GL_TEXTURE_2D, square->uvtexobjs[0]); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
401 mpglActiveTexture(GL_TEXTURE2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
402 glBindTexture (GL_TEXTURE_2D, square->uvtexobjs[1]); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
403 mpglActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
404 } |
2124 | 405 |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
406 if (texdirty) { |
23651 | 407 glUploadTex(GL_TEXTURE_2D, gl_bitmap_format, gl_bitmap_type, |
408 square->texture, image_width * image_bytes, | |
409 0, 0, thisw, thish, 0); | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
410 } |
2124 | 411 |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
412 glDrawTex(square->fx, square->fy, square->fw, square->fh, |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
413 0, 0, texture_width, texture_height, |
17220 | 414 texture_width, texture_height, |
30097 | 415 0, is_yuv, 0); |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
416 square++; |
2124 | 417 } /* for all texnumx */ |
418 } /* for all texnumy */ | |
30097 | 419 if (is_yuv) |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
420 glDisableYUVConversion(GL_TEXTURE_2D, use_yuv); |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
421 texdirty = 0; |
2124 | 422 } |
423 | |
424 | |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
425 static void resize(int x,int y){ |
34337
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
426 // simple orthogonal projection for 0-1;0-1 |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
427 static const float matrix[16] = { |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
428 2, 0, 0, 0, |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
429 0, -2, 0, 0, |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
430 0, 0, 0, 0, |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
431 -1, 1, 0, 1, |
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
432 }; |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
433 mp_msg(MSGT_VO,MSGL_V,"[gl2] Resize: %dx%d\n",x,y); |
29525
41ac62d6f913
Make gl2 code capable of windowed aspect and panscan (no user option to enable it yet though).
reimar
parents:
29523
diff
changeset
|
434 if(aspect_scaling()) { |
23651 | 435 glClear(GL_COLOR_BUFFER_BIT); |
29525
41ac62d6f913
Make gl2 code capable of windowed aspect and panscan (no user option to enable it yet though).
reimar
parents:
29523
diff
changeset
|
436 aspect(&x, &y, A_WINZOOM); |
41ac62d6f913
Make gl2 code capable of windowed aspect and panscan (no user option to enable it yet though).
reimar
parents:
29523
diff
changeset
|
437 panscan_calc_windowed(); |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
438 x += vo_panscan_x; |
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
439 y += vo_panscan_y; |
29523 | 440 glViewport( (vo_dwidth-x)/2, (vo_dheight-y)/2, x, y); |
23651 | 441 } else { |
442 //aspect(x, y, A_NOZOOM); | |
443 if (WinID >= 0) { | |
31684
6547d064bded
Use identical code to -vo gl for -wid mode in gl2.
reimar
parents:
31315
diff
changeset
|
444 int left = 0, top = 0, w = x, h = y; |
6547d064bded
Use identical code to -vo gl for -wid mode in gl2.
reimar
parents:
31315
diff
changeset
|
445 geometry(&left, &top, &w, &h, vo_dwidth, vo_dheight); |
6547d064bded
Use identical code to -vo gl for -wid mode in gl2.
reimar
parents:
31315
diff
changeset
|
446 top = y - h - top; |
6547d064bded
Use identical code to -vo gl for -wid mode in gl2.
reimar
parents:
31315
diff
changeset
|
447 glViewport(left, top, w, h); |
23651 | 448 } else |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
449 glViewport( 0, 0, x, y ); |
10905 | 450 } |
2124 | 451 |
452 glMatrixMode(GL_PROJECTION); | |
34337
f8c523d09e5e
Use glLoadMatrixf. This makes it easier to support OpenGL ES.
reimar
parents:
34061
diff
changeset
|
453 glLoadMatrixf(matrix); |
2124 | 454 |
455 glMatrixMode(GL_MODELVIEW); | |
456 glLoadIdentity(); | |
457 } | |
458 | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
459 static void draw_alpha_32(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
460 vo_draw_alpha_rgb32(w,h,src,srca,stride,ImageData+4*(y0*image_width+x0),4*image_width); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
461 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
462 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
463 static void draw_alpha_24(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
464 vo_draw_alpha_rgb24(w,h,src,srca,stride,ImageData+3*(y0*image_width+x0),3*image_width); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
465 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
466 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
467 static void draw_alpha_16(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
468 vo_draw_alpha_rgb16(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
469 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
470 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
471 static void draw_alpha_15(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
472 vo_draw_alpha_rgb15(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
473 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
474 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
475 static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
476 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
477 |
30023 | 478 #ifdef CONFIG_GL_WIN32 |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
479 |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
480 static int config_w32(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) { |
23651 | 481 if (!vo_w32_config(d_width, d_height, flags)) |
482 return -1; | |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
483 |
23651 | 484 return 0; |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
485 } |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
486 |
31027 | 487 #endif |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
488 |
31027 | 489 #ifdef CONFIG_GL_X11 |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
490 static int choose_glx_visual(Display *dpy, int scr, XVisualInfo *res_vi) |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
491 { |
23651 | 492 XVisualInfo template, *vi_list; |
493 int vi_num, i, best_i, best_weight; | |
12709 | 494 |
23651 | 495 template.screen = scr; |
496 vi_list = XGetVisualInfo(dpy, VisualScreenMask, &template, &vi_num); | |
497 if (!vi_list) return -1; | |
498 best_weight = 1000000; best_i=0; | |
499 for (i = 0; i < vi_num; i++) { | |
500 int val, res, w = 0; | |
501 /* of course, the visual must support OpenGL rendering... */ | |
502 res = glXGetConfig(dpy, vi_list + i, GLX_USE_GL, &val); | |
503 if (res || val == False) continue; | |
504 /* also it must be doublebuffered ... */ | |
505 res = glXGetConfig(dpy, vi_list + i, GLX_DOUBLEBUFFER, &val); | |
506 if (res || val == False) continue; | |
507 /* furthermore it must be RGBA (not color indexed) ... */ | |
508 res = glXGetConfig(dpy, vi_list + i, GLX_RGBA, &val); | |
509 if (res || val == False) continue; | |
510 /* prefer less depth buffer size, */ | |
511 res = glXGetConfig(dpy, vi_list + i, GLX_DEPTH_SIZE, &val); | |
512 if (res) continue; | |
513 w += val*2; | |
514 /* stencil buffer size */ | |
515 res = glXGetConfig(dpy, vi_list + i, GLX_STENCIL_SIZE, &val); | |
516 if (res) continue; | |
517 w += val*2; | |
518 /* and colorbuffer alpha size */ | |
519 res = glXGetConfig(dpy, vi_list + i, GLX_ALPHA_SIZE, &val); | |
520 if (res) continue; | |
521 w += val; | |
522 /* and finally, prefer DirectColor-ed visuals to allow color corrections */ | |
523 if (vi_list[i].class != DirectColor) w += 100; | |
12709 | 524 |
23651 | 525 // avoid bad-looking visual with less that 8bit per color |
526 res = glXGetConfig(dpy, vi_list + i, GLX_RED_SIZE, &val); | |
527 if (res) continue; | |
528 if (val < 8) w += 50; | |
529 res = glXGetConfig(dpy, vi_list + i, GLX_GREEN_SIZE, &val); | |
530 if (res) continue; | |
531 if (val < 8) w += 70; | |
532 res = glXGetConfig(dpy, vi_list + i, GLX_BLUE_SIZE, &val); | |
533 if (res) continue; | |
534 if (val < 8) w += 50; | |
535 | |
536 if (w < best_weight) { | |
537 best_weight = w; | |
538 best_i = i; | |
539 } | |
540 } | |
541 if (best_weight < 1000000) *res_vi = vi_list[best_i]; | |
542 XFree(vi_list); | |
543 return (best_weight < 1000000) ? 0 : -1; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
544 } |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
545 |
12750
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
546 static int config_glx(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) { |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23651
diff
changeset
|
547 XVisualInfo *vinfo, vinfo_buf; |
23651 | 548 vinfo = choose_glx_visual(mDisplay,mScreen,&vinfo_buf) < 0 ? NULL : &vinfo_buf; |
549 if (vinfo == NULL) { | |
550 mp_msg(MSGT_VO, MSGL_FATAL, "[gl2] no GLX support present\n"); | |
551 return -1; | |
552 } | |
2124 | 553 |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23651
diff
changeset
|
554 vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23651
diff
changeset
|
555 flags, vo_x11_create_colormap(vinfo), "gl2", title); |
2124 | 556 |
23651 | 557 return 0; |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
558 } |
18949 | 559 #endif |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
560 |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
561 static int initGl(uint32_t d_width, uint32_t d_height) |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
562 { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
563 fragprog = lookupTex = 0; |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
564 if (initTextures() < 0) |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
565 return -1; |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
566 |
23651 | 567 glDisable(GL_BLEND); |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
568 glDisable(GL_DEPTH_TEST); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
569 glDepthMask(GL_FALSE); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
570 glDisable(GL_CULL_FACE); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
571 glEnable (GL_TEXTURE_2D); |
30097 | 572 if (is_yuv) { |
33414 | 573 int xs, ys, depth; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26823
diff
changeset
|
574 gl_conversion_params_t params = {GL_TEXTURE_2D, use_yuv, |
30293
aeab18b1923d
Add support for adjustable TV <-> PC level conversion.
reimar
parents:
30122
diff
changeset
|
575 {-1, -1, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0}, |
30097 | 576 texture_width, texture_height, 0, 0, 0}; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
577 switch (use_yuv) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
578 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
579 glGenTextures(1, &lookupTex); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
580 mpglActiveTexture(GL_TEXTURE3); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
581 glBindTexture(GL_TEXTURE_2D, lookupTex); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
582 mpglActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
583 glBindTexture(GL_TEXTURE_2D, 0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
584 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
585 case YUV_CONVERSION_FRAGMENT: |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
586 if (!mpglGenPrograms || !mpglBindProgram) { |
18584
212999db0203
Avoid crash with e.g. -vo gl2:yuv=2 when no fragment program functions are available
reimar
parents:
18116
diff
changeset
|
587 mp_msg(MSGT_VO, MSGL_ERR, "[gl] fragment program functions missing!\n"); |
212999db0203
Avoid crash with e.g. -vo gl2:yuv=2 when no fragment program functions are available
reimar
parents:
18116
diff
changeset
|
588 break; |
212999db0203
Avoid crash with e.g. -vo gl2:yuv=2 when no fragment program functions are available
reimar
parents:
18116
diff
changeset
|
589 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
590 mpglGenPrograms(1, &fragprog); |
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
591 mpglBindProgram(GL_FRAGMENT_PROGRAM, fragprog); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
592 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
593 } |
33414 | 594 mp_get_chroma_shift(image_format, &xs, &ys, &depth); |
30097 | 595 params.chrom_texw = params.texw >> xs; |
596 params.chrom_texh = params.texh >> ys; | |
33414 | 597 params.csp_params.input_shift = -depth & 7; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26823
diff
changeset
|
598 glSetupYUVConversion(¶ms); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
599 } |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
600 |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
601 gl_set_antialias(0); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
602 gl_set_bilinear(1); |
23651 | 603 |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13926
diff
changeset
|
604 mp_msg(MSGT_VO, MSGL_V, "[gl2] Using image_bpp=%d, image_bytes=%d, \n\tgl_bitmap_format=%s, gl_bitmap_type=%s, \n\trgb_size=%d (%d,%d,%d), a_sz=%d, \n\tgl_internal_format=%s\n", |
23651 | 605 image_bpp, image_bytes, |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13926
diff
changeset
|
606 glValName(gl_bitmap_format), glValName(gl_bitmap_type), |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13926
diff
changeset
|
607 rgb_sz, r_sz, g_sz, b_sz, a_sz, glValName(gl_internal_format)); |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
608 |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
609 resize(d_width, d_height); |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
610 |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
611 glClearColor( 0.0f,0.0f,0.0f,0.0f ); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
612 glClear( GL_COLOR_BUFFER_BIT ); |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
613 |
13926
b7ba9bcd1916
Avoid drawing before transformation matrices are set up.
reimar
parents:
13877
diff
changeset
|
614 drawTextureDisplay (); |
b7ba9bcd1916
Avoid drawing before transformation matrices are set up.
reimar
parents:
13877
diff
changeset
|
615 |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
616 return 0; |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
617 } |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
618 |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
619 /* connect to server, create and map window, |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
620 * allocate colors and (shared) memory |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
621 */ |
23651 | 622 static int |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
623 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
624 { |
30097 | 625 int xs, ys; |
23651 | 626 const unsigned char * glVersion; |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
627 |
23651 | 628 image_height = height; |
629 image_width = width; | |
630 image_format = format; | |
33365
706871635af7
Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents:
33305
diff
changeset
|
631 is_yuv = mp_get_chroma_shift(image_format, &xs, &ys, NULL) > 0; |
30097 | 632 is_yuv |= (xs << 8) | (ys << 16); |
23651 | 633 |
634 int_pause = 0; | |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
635 |
30023 | 636 #ifdef CONFIG_GL_WIN32 |
23651 | 637 if (config_w32(width, height, d_width, d_height, flags, title, format) == -1) |
31027 | 638 #endif |
639 #ifdef CONFIG_GL_X11 | |
23651 | 640 if (config_glx(width, height, d_width, d_height, flags, title, format) == -1) |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
641 #endif |
23651 | 642 return -1; |
643 | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
644 if (glctx.setGlWindow(&glctx) == SET_WINDOW_FAILED) |
29570
eb2567b65311
Check setGlWindow return value to fail properly instead of crashing if e.g.
reimar
parents:
29525
diff
changeset
|
645 return -1; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14090
diff
changeset
|
646 |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
647 glVersion = glGetString(GL_VERSION); |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
648 |
11988 | 649 mp_msg(MSGT_VO, MSGL_V, "[gl2] OpenGL Driver Information:\n"); |
23651 | 650 mp_msg(MSGT_VO, MSGL_V, "\tvendor: %s,\n\trenderer %s,\n\tversion %s\n", |
651 glGetString(GL_VENDOR), glGetString(GL_RENDERER), glVersion); | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
652 |
23651 | 653 if(glVersion[0]>'1' || (glVersion[0]=='1' && glVersion[2]>='2') ) |
654 isGL12 = GL_TRUE; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
655 else |
23651 | 656 isGL12 = GL_FALSE; |
2124 | 657 |
23651 | 658 if(isGL12) { |
659 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] You have OpenGL >= 1.2 capable drivers, GOOD (16bpp and BGR is ok!)\n"); | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
660 } else { |
23651 | 661 mp_msg(MSGT_VO, MSGL_INFO, "[gl2] You have OpenGL < 1.2 drivers, BAD (16bpp and BGR may be damaged!)\n"); |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
662 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
663 |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
664 glFindFormat(format, &image_bpp, &gl_internal_format, &gl_bitmap_format, &gl_bitmap_type); |
2124 | 665 |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
666 image_bytes=(image_bpp+7)/8; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
667 |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
668 draw_alpha_fnc=draw_alpha_null; |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
669 |
23651 | 670 switch(image_bpp) { |
671 case 15: | |
672 draw_alpha_fnc=draw_alpha_15; break; | |
673 case 16: | |
674 draw_alpha_fnc=draw_alpha_16; break; | |
675 case 24: | |
676 draw_alpha_fnc=draw_alpha_24; break; | |
677 case 32: | |
678 draw_alpha_fnc=draw_alpha_32; break; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
679 } |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
680 |
15748 | 681 if (initGl(vo_dwidth, vo_dheight) == -1) |
23651 | 682 return -1; |
2124 | 683 |
23651 | 684 return 0; |
2124 | 685 } |
686 | |
31027 | 687 #ifdef CONFIG_GL_X11 |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
688 static int gl_handlekey(int key) |
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
689 { |
23651 | 690 if(key=='a'||key=='A') { |
691 gl_set_antialias(!gl_antialias); | |
692 return 0; | |
693 } else if(key=='b'||key=='B') { | |
694 gl_set_bilinear(-1); | |
695 return 0; | |
696 } | |
697 return 1; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
698 } |
27720
66d7ea3f5a78
Surround conditionally used function with corresponding #ifdef, fixes:
diego
parents:
27621
diff
changeset
|
699 #endif |
2124 | 700 |
701 static void check_events(void) | |
702 { | |
23651 | 703 int e; |
31027 | 704 #ifdef CONFIG_GL_X11 |
23651 | 705 XEvent Event; |
706 char buf[100]; | |
707 KeySym keySym; | |
708 int key; | |
709 static XComposeStatus stat; | |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
710 |
23651 | 711 while ( XPending( mDisplay ) ) { |
712 XNextEvent( mDisplay,&Event ); | |
713 if( Event.type == KeyPress ) { | |
714 XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); | |
715 key = (keySym&0xff00) != 0 ? (keySym&0x00ff) + 256 : keySym; | |
716 if(gl_handlekey(key)) | |
717 XPutBackEvent(mDisplay, &Event); | |
718 break; | |
719 } else { | |
720 XPutBackEvent(mDisplay, &Event); | |
721 break; | |
722 } | |
723 } | |
17116 | 724 #endif |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
725 e=glctx.check_events(); |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
726 if(e&VO_EVENT_RESIZE) resize(vo_dwidth, vo_dheight); |
23651 | 727 if(e&VO_EVENT_EXPOSE && int_pause) flip_page(); |
2124 | 728 } |
729 | |
730 static void draw_osd(void) | |
12446
59cd81e2e1ef
fixed memory leak and removed unnecessary static variable
reimar
parents:
12394
diff
changeset
|
731 { |
59cd81e2e1ef
fixed memory leak and removed unnecessary static variable
reimar
parents:
12394
diff
changeset
|
732 if (ImageData) |
59cd81e2e1ef
fixed memory leak and removed unnecessary static variable
reimar
parents:
12394
diff
changeset
|
733 vo_draw_text(image_width,image_height,draw_alpha_fnc); |
59cd81e2e1ef
fixed memory leak and removed unnecessary static variable
reimar
parents:
12394
diff
changeset
|
734 } |
2124 | 735 |
736 static void | |
737 flip_page(void) | |
738 { | |
739 drawTextureDisplay(); | |
740 | |
741 // glFlush(); | |
16475 | 742 if (use_glFinish) |
2124 | 743 glFinish(); |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
744 glctx.swapGlBuffers(&glctx); |
12394
b3ff1a576b8c
clear buffer after (glX)SwapBuffers in fullscreen to avoid flickering borders
reimar
parents:
12382
diff
changeset
|
745 |
29525
41ac62d6f913
Make gl2 code capable of windowed aspect and panscan (no user option to enable it yet though).
reimar
parents:
29523
diff
changeset
|
746 if (aspect_scaling()) // Avoid flickering borders in fullscreen mode |
12394
b3ff1a576b8c
clear buffer after (glX)SwapBuffers in fullscreen to avoid flickering borders
reimar
parents:
12382
diff
changeset
|
747 glClear (GL_COLOR_BUFFER_BIT); |
2124 | 748 } |
749 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15748
diff
changeset
|
750 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
2124 | 751 { |
16583
84356c6d997b
Fix crashes and green border when using YV12 input format
reimar
parents:
16488
diff
changeset
|
752 uint8_t *yptr = src[0], *uptr = src[1], *vptr = src[2]; |
84356c6d997b
Fix crashes and green border when using YV12 input format
reimar
parents:
16488
diff
changeset
|
753 int ystride = stride[0], ustride = stride[1], vstride = stride[2]; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
754 int rem_h = h; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
755 struct TexSquare *texline = &texgrid[y / texture_height * texnumx]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
756 int subtex_y = y % texture_width; |
30097 | 757 int xs, ys; |
33365
706871635af7
Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents:
33305
diff
changeset
|
758 mp_get_chroma_shift(image_format, &xs, &ys, NULL); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
759 while (rem_h > 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
760 int rem_w = w; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
761 struct TexSquare *tsq = &texline[x / texture_width]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
762 int subtex_x = x % texture_height; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
763 int subtex_h = rem_h; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
764 if (subtex_y + subtex_h > texture_height) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
765 subtex_h = texture_height - subtex_y; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
766 while (rem_w > 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
767 int subtex_w = rem_w; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
768 if (subtex_x + subtex_w > texture_width) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
769 subtex_w = texture_width - subtex_x; |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
770 mpglActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
771 glBindTexture(GL_TEXTURE_2D, tsq->texobj); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
772 glUploadTex(GL_TEXTURE_2D, gl_bitmap_format, gl_bitmap_type, |
16583
84356c6d997b
Fix crashes and green border when using YV12 input format
reimar
parents:
16488
diff
changeset
|
773 yptr, ystride, subtex_x, subtex_y, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
774 subtex_w, subtex_h, 0); |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
775 mpglActiveTexture(GL_TEXTURE1); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
776 glBindTexture(GL_TEXTURE_2D, tsq->uvtexobjs[0]); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
777 glUploadTex(GL_TEXTURE_2D, gl_bitmap_format, gl_bitmap_type, |
30097 | 778 uptr, ustride, subtex_x >> xs, subtex_y >> ys, |
779 subtex_w >> xs, subtex_h >> ys, 0); | |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
780 mpglActiveTexture(GL_TEXTURE2); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
781 glBindTexture(GL_TEXTURE_2D, tsq->uvtexobjs[1]); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
782 glUploadTex(GL_TEXTURE_2D, gl_bitmap_format, gl_bitmap_type, |
30097 | 783 vptr, vstride, subtex_x >> xs, subtex_y >> ys, |
784 subtex_w >> xs, subtex_h >> ys, 0); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
785 subtex_x = 0; |
16583
84356c6d997b
Fix crashes and green border when using YV12 input format
reimar
parents:
16488
diff
changeset
|
786 yptr += subtex_w; |
30097 | 787 uptr += subtex_w >> xs; |
788 vptr += subtex_w >> xs; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
789 tsq++; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
790 rem_w -= subtex_w; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
791 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
792 subtex_y = 0; |
16583
84356c6d997b
Fix crashes and green border when using YV12 input format
reimar
parents:
16488
diff
changeset
|
793 yptr += subtex_h * ystride - w; |
30097 | 794 uptr += (subtex_h >> ys) * ustride - (w >> xs); |
795 vptr += (subtex_h >> ys) * vstride - (w >> xs); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
796 texline += texnumx; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
797 rem_h -= subtex_h; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
798 } |
30945
55917a674d7d
Add mpgl prefix to all OpenGL-related function pointers.
reimar
parents:
30711
diff
changeset
|
799 mpglActiveTexture(GL_TEXTURE0); |
2276
558a9397c250
improved gl, please check performance and correct display
sven
parents:
2249
diff
changeset
|
800 return 0; |
2124 | 801 } |
802 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15748
diff
changeset
|
803 static int |
2124 | 804 draw_frame(uint8_t *src[]) |
805 { | |
30097 | 806 if (is_yuv) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
807 mp_msg(MSGT_VO, MSGL_ERR, "[gl2] error: draw_frame called for YV12!\n"); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
808 return 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
809 } |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
810 ImageData=(unsigned char *)src[0]; |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
811 resetTexturePointers(ImageData); |
23649
404d35495770
Remove overly complex and unused per-subtexture "dirty" handling
reimar
parents:
23648
diff
changeset
|
812 texdirty = 1; |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16171
diff
changeset
|
813 return 0; |
2124 | 814 } |
815 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15748
diff
changeset
|
816 static int |
2124 | 817 query_format(uint32_t format) |
818 { | |
33365
706871635af7
Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents:
33305
diff
changeset
|
819 int depth; |
706871635af7
Make mp_get_chroma_shift simpler/more generic and add an argument
reimar
parents:
33305
diff
changeset
|
820 if (use_yuv && mp_get_chroma_shift(format, NULL, NULL, &depth) && |
33414 | 821 (depth == 8 || depth == 16 || glYUVLargeRange(use_yuv)) && |
30110 | 822 (IMGFMT_IS_YUVP16_NE(format) || !IMGFMT_IS_YUVP16(format))) |
30097 | 823 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | |
824 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_ACCEPT_STRIDE; | |
23651 | 825 switch(format) { |
25397
084619331d92
Replace some more broken SYS_DARWIN preprocessor conditionals with __APPLE__.
diego
parents:
25220
diff
changeset
|
826 #ifdef __APPLE__ |
12750
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
827 case IMGFMT_RGB32: |
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
828 #else |
10143
fd3cbeb388f0
removed broken swscaler support, added runtime fullscreens switching ability, and some other general cleanup thingies
alex
parents:
8254
diff
changeset
|
829 case IMGFMT_RGB24: |
fd3cbeb388f0
removed broken swscaler support, added runtime fullscreens switching ability, and some other general cleanup thingies
alex
parents:
8254
diff
changeset
|
830 case IMGFMT_BGR24: |
fd3cbeb388f0
removed broken swscaler support, added runtime fullscreens switching ability, and some other general cleanup thingies
alex
parents:
8254
diff
changeset
|
831 // case IMGFMT_RGB32: |
fd3cbeb388f0
removed broken swscaler support, added runtime fullscreens switching ability, and some other general cleanup thingies
alex
parents:
8254
diff
changeset
|
832 // case IMGFMT_BGR32: |
12750
38c660174053
removed XFlush() before XSync(), made config_glx return-type signed, force 32bit on Darwin, idea from a patch by Marc Hoffman (mmh <at> pleasantst.com).
reimar
parents:
12709
diff
changeset
|
833 #endif |
6212 | 834 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD; |
23651 | 835 } |
836 return 0; | |
2124 | 837 } |
838 | |
839 | |
840 static void | |
841 uninit(void) | |
842 { | |
6095 | 843 if ( !vo_config_count ) return; |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
844 free(texgrid); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
845 texgrid = NULL; |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
846 uninit_mpglcontext(&glctx); |
2124 | 847 } |
4352 | 848 |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
28446
diff
changeset
|
849 static const opt_t subopts[] = { |
30122
1772a5171ac7
Fix function declarations to avoid casting function pointers.
reimar
parents:
30110
diff
changeset
|
850 {"yuv", OPT_ARG_INT, &use_yuv, int_non_neg}, |
16475 | 851 {"glfinish", OPT_ARG_BOOL, &use_glFinish, NULL}, |
852 {NULL} | |
853 }; | |
854 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15748
diff
changeset
|
855 static int preinit(const char *arg) |
4352 | 856 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
857 enum MPGLType gltype = GLTYPE_X11; |
16475 | 858 // set defaults |
30023 | 859 #ifdef CONFIG_GL_WIN32 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
860 gltype = GLTYPE_W32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
861 #endif |
30711 | 862 use_yuv = -1; |
16475 | 863 use_glFinish = 1; |
864 if (subopt_parse(arg, subopts) != 0) { | |
865 mp_msg(MSGT_VO, MSGL_FATAL, | |
866 "\n-vo gl2 command line help:\n" | |
867 "Example: mplayer -vo gl2:noglfinish\n" | |
868 "\nOptions:\n" | |
869 " noglfinish\n" | |
870 " Do not call glFinish() before swapping buffers\n" | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
871 " yuv=<n>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
872 " 0: use software YUV to RGB conversion.\n" |
16626 | 873 " 1: use register combiners (nVidia only, for older cards).\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
874 " 2: use fragment program.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
875 " 3: use fragment program with gamma correction.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16475
diff
changeset
|
876 " 4: use fragment program with gamma correction via lookup.\n" |
16626 | 877 " 5: use ATI-specific method (for older cards).\n" |
16475 | 878 "\n" ); |
879 return -1; | |
880 } | |
30711 | 881 if(!init_mpglcontext(&glctx, gltype)) goto err_out; |
882 if (use_yuv == -1) { | |
883 #ifdef CONFIG_GL_WIN32 | |
884 if (config_w32(320, 200, 320, 200, VOFLAG_HIDDEN, "", 0) == -1) | |
31027 | 885 #endif |
886 #ifdef CONFIG_GL_X11 | |
30711 | 887 if (config_glx(320, 200, 320, 200, VOFLAG_HIDDEN, "", 0) == -1) |
888 #endif | |
889 goto err_out; | |
890 if (glctx.setGlWindow(&glctx) == SET_WINDOW_FAILED) | |
891 goto err_out; | |
30964
a5c6b37b3af6
Factor out the YUV->RGB conversion auto-selection and also
reimar
parents:
30945
diff
changeset
|
892 use_yuv = glAutodetectYUVConversion(); |
30711 | 893 } |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
894 return 0; |
30711 | 895 |
896 err_out: | |
897 uninit(); | |
898 return -1; | |
4352 | 899 } |
900 | |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
901 static int control(uint32_t request, void *data) |
4352 | 902 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4440
diff
changeset
|
903 switch (request) { |
26823 | 904 case VOCTRL_PAUSE: |
905 case VOCTRL_RESUME: | |
906 int_pause = (request == VOCTRL_PAUSE); | |
907 return VO_TRUE; | |
23651 | 908 case VOCTRL_QUERY_FORMAT: |
909 return query_format(*((uint32_t*)data)); | |
910 case VOCTRL_GUISUPPORT: | |
911 return VO_TRUE; | |
912 case VOCTRL_ONTOP: | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
913 glctx.ontop(); |
23651 | 914 return VO_TRUE; |
915 case VOCTRL_FULLSCREEN: | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
916 glctx.fullscreen(); |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
917 if (glctx.setGlWindow(&glctx) == SET_WINDOW_REINIT) |
23651 | 918 initGl(vo_dwidth, vo_dheight); |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
919 resize(vo_dwidth, vo_dheight); |
23651 | 920 return VO_TRUE; |
921 case VOCTRL_BORDER: | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
922 glctx.border(); |
23651 | 923 return VO_TRUE; |
924 case VOCTRL_GET_PANSCAN: | |
925 return VO_TRUE; | |
926 case VOCTRL_SET_PANSCAN: | |
29522
26ca161275d6
-vo gl2 resize does not need to modify its arguments, so pass int instead of int *.
reimar
parents:
29520
diff
changeset
|
927 resize(vo_dwidth, vo_dheight); |
23651 | 928 return VO_TRUE; |
31027 | 929 #ifdef CONFIG_GL_X11 |
23651 | 930 case VOCTRL_SET_EQUALIZER: |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
931 { |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
932 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
933 return vo_x11_set_equalizer(eq->item, eq->value); |
23651 | 934 } |
935 case VOCTRL_GET_EQUALIZER: | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
936 { |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
937 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
938 return vo_x11_get_equalizer(eq->item, &eq->value); |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7931
diff
changeset
|
939 } |
10880
ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10757
diff
changeset
|
940 #endif |
23651 | 941 case VOCTRL_UPDATE_SCREENINFO: |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29904
diff
changeset
|
942 glctx.update_xinerama_info(); |
23651 | 943 return VO_TRUE; |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4440
diff
changeset
|
944 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4440
diff
changeset
|
945 return VO_NOTIMPL; |
4352 | 946 } |