Mercurial > mplayer.hg
annotate libvo/vo_gl.c @ 29938:eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
Works in the currently supported cases for only Win32 and only X11,
the mixed case is not working yet though.
But applied anyway since the code is slightly less messy than the current one.
author | reimar |
---|---|
date | Tue, 08 Dec 2009 06:42:46 +0000 |
parents | 31fe2176a8ef |
children | 319b62d55feb |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
2 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
7 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
8 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
12 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
13 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
17 */ |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28424
diff
changeset
|
18 |
1 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
22 #include <math.h> |
1 | 23 |
16221 | 24 #include "config.h" |
11988 | 25 #include "mp_msg.h" |
14286 | 26 #include "subopt-helper.h" |
1 | 27 #include "video_out.h" |
28 #include "video_out_internal.h" | |
13585 | 29 #include "font_load.h" |
30 #include "sub.h" | |
1 | 31 |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
32 #include "gl_common.h" |
2057 | 33 #include "aspect.h" |
27343 | 34 #ifdef CONFIG_GUI |
23077 | 35 #include "gui/interface.h" |
13843 | 36 #endif |
26681 | 37 #include "fastmemcpy.h" |
19578 | 38 #include "libass/ass.h" |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
39 #include "libass/ass_mp.h" |
31 | 40 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28939
diff
changeset
|
41 static const vo_info_t info = |
1 | 42 { |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
43 "X11 (OpenGL)", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
44 "gl", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
45 "Arpad Gereoffy <arpi@esp-team.scene.hu>", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
46 "" |
1 | 47 }; |
48 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
49 const LIBVO_EXTERN(gl) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7931
diff
changeset
|
50 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
51 #ifdef CONFIG_X11 |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
52 static int wsGLXAttrib[] = { GLX_RGBA, |
1 | 53 GLX_RED_SIZE,1, |
54 GLX_GREEN_SIZE,1, | |
55 GLX_BLUE_SIZE,1, | |
56 GLX_DOUBLEBUFFER, | |
57 None }; | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
58 #endif |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
59 static MPGLContext glctx; |
1 | 60 |
13599 | 61 static int use_osd; |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
62 static int scaled_osd; |
14269 | 63 //! How many parts the OSD may consist of at most |
13585 | 64 #define MAX_OSD_PARTS 20 |
14269 | 65 //! Textures for OSD |
13599 | 66 static GLuint osdtex[MAX_OSD_PARTS]; |
13585 | 67 #ifndef FAST_OSD |
14269 | 68 //! Alpha textures for OSD |
13599 | 69 static GLuint osdatex[MAX_OSD_PARTS]; |
13585 | 70 #endif |
19578 | 71 static GLuint *eosdtex; |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
72 #define LARGE_EOSD_TEX_SIZE 512 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
73 #define TINYTEX_SIZE 16 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
74 #define TINYTEX_COLS (LARGE_EOSD_TEX_SIZE/TINYTEX_SIZE) |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
75 #define TINYTEX_MAX (TINYTEX_COLS*TINYTEX_COLS) |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
76 #define SMALLTEX_SIZE 32 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
77 #define SMALLTEX_COLS (LARGE_EOSD_TEX_SIZE/SMALLTEX_SIZE) |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
78 #define SMALLTEX_MAX (SMALLTEX_COLS*SMALLTEX_COLS) |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
79 static GLuint largeeosdtex[2]; |
14269 | 80 //! Display lists that draw the OSD parts |
13599 | 81 static GLuint osdDispList[MAX_OSD_PARTS]; |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
82 #ifndef FAST_OSD |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
83 static GLuint osdaDispList[MAX_OSD_PARTS]; |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
84 #endif |
19578 | 85 static GLuint eosdDispList; |
14269 | 86 //! How many parts the OSD currently consists of |
16433 | 87 static int osdtexCnt; |
19578 | 88 static int eosdtexCnt; |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
89 static int osd_color; |
1 | 90 |
13601 | 91 static int use_aspect; |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28035
diff
changeset
|
92 static int use_ycbcr; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
93 static int use_yuv; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
94 static int lscale; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
95 static int cscale; |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
96 static float filter_strength; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
97 static int yuvconvtype; |
16099 | 98 static int use_rectangle; |
99 static int err_shown; | |
1 | 100 static uint32_t image_width; |
101 static uint32_t image_height; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
102 static uint32_t image_format; |
12159 | 103 static int many_fmts; |
26677
e3ae3a37ea8a
Add ati-hack suboption that aligns the lines to 32/64 bytes for PBO transfers
reimar
parents:
26624
diff
changeset
|
104 static int ati_hack; |
26681 | 105 static int force_pbo; |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
106 static int mesa_buffer; |
16235 | 107 static int use_glFinish; |
16268 | 108 static int swap_interval; |
16099 | 109 static GLenum gl_target; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16282
diff
changeset
|
110 static GLint gl_texfmt; |
12159 | 111 static GLenum gl_format; |
112 static GLenum gl_type; | |
16434 | 113 static GLuint gl_buffer; |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
114 static GLuint gl_buffer_uv[2]; |
16099 | 115 static int gl_buffersize; |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
116 static int gl_buffersize_uv; |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
117 static void *gl_bufferptr; |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
118 static void *gl_bufferptr_uv[2]; |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
119 static int mesa_buffersize; |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
120 static void *mesa_bufferptr; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
121 static GLuint fragprog; |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
122 static GLuint default_texs[22]; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
123 static char *custom_prog; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
124 static char *custom_tex; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
125 static int custom_tlin; |
18963 | 126 static int custom_trect; |
1 | 127 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
128 static int int_pause; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
129 static int eq_bri = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
130 static int eq_cont = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
131 static int eq_sat = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
132 static int eq_hue = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
133 static int eq_rgamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
134 static int eq_ggamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
135 static int eq_bgamma = 0; |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
136 |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
137 static int texture_width; |
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
138 static int texture_height; |
17220 | 139 static int mpi_flipped; |
18996 | 140 static int vo_flipped; |
22149
7b4f17dc2689
Avoid calling aspect on each frame and make ass subtitles work better with panscan
reimar
parents:
22087
diff
changeset
|
141 static int ass_border_x, ass_border_y; |
1 | 142 |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
143 static unsigned int slice_height = 1; |
8654
2c4cebb8637d
- optional slice height for -vo gl (example: -vo gl:32)
arpi
parents:
8148
diff
changeset
|
144 |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
145 static void redraw(void); |
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
146 |
612 | 147 static void resize(int x,int y){ |
11988 | 148 mp_msg(MSGT_VO, MSGL_V, "[gl] Resize: %dx%d\n",x,y); |
15748 | 149 if (WinID >= 0) { |
150 int top = 0, left = 0, w = x, h = y; | |
151 geometry(&top, &left, &w, &h, vo_screenwidth, vo_screenheight); | |
152 glViewport(top, left, w, h); | |
153 } else | |
1 | 154 glViewport( 0, 0, x, y ); |
155 | |
156 glMatrixMode(GL_PROJECTION); | |
157 glLoadIdentity(); | |
28590
d1ca19ff9b52
100l, reset ass_border when switching out of fullscreen mode.
reimar
parents:
28446
diff
changeset
|
158 ass_border_x = ass_border_y = 0; |
29524
b1a437cdc60d
Add infrastructure and test code to enable aspect scaling and panscan in windowed mode.
reimar
parents:
29521
diff
changeset
|
159 if (aspect_scaling() && use_aspect) { |
13601 | 160 int new_w, new_h; |
161 GLdouble scale_x, scale_y; | |
29524
b1a437cdc60d
Add infrastructure and test code to enable aspect scaling and panscan in windowed mode.
reimar
parents:
29521
diff
changeset
|
162 aspect(&new_w, &new_h, A_WINZOOM); |
b1a437cdc60d
Add infrastructure and test code to enable aspect scaling and panscan in windowed mode.
reimar
parents:
29521
diff
changeset
|
163 panscan_calc_windowed(); |
13601 | 164 new_w += vo_panscan_x; |
165 new_h += vo_panscan_y; | |
28035 | 166 scale_x = (GLdouble)new_w / (GLdouble)x; |
167 scale_y = (GLdouble)new_h / (GLdouble)y; | |
13601 | 168 glScaled(scale_x, scale_y, 1); |
29519
0421934c81ac
Simplify and fix ass border calculations for -vo gl and -wid -fs mode.
reimar
parents:
29514
diff
changeset
|
169 ass_border_x = (vo_dwidth - new_w) / 2; |
0421934c81ac
Simplify and fix ass border calculations for -vo gl and -wid -fs mode.
reimar
parents:
29514
diff
changeset
|
170 ass_border_y = (vo_dheight - new_h) / 2; |
13601 | 171 } |
1 | 172 glOrtho(0, image_width, image_height, 0, -1,1); |
173 | |
174 glMatrixMode(GL_MODELVIEW); | |
175 glLoadIdentity(); | |
13585 | 176 |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
177 if (!scaled_osd) { |
27393 | 178 #ifdef CONFIG_FREETYPE |
15086
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
179 // adjust font size to display size |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
180 force_load_font = 1; |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
181 #endif |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
182 vo_osd_changed(OSDTYPE_OSD); |
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
183 } |
25911 | 184 glClear(GL_COLOR_BUFFER_BIT); |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
185 redraw(); |
1 | 186 } |
187 | |
16099 | 188 static void texSize(int w, int h, int *texw, int *texh) { |
189 if (use_rectangle) { | |
190 *texw = w; *texh = h; | |
191 } else { | |
192 *texw = 32; | |
193 while (*texw < w) | |
194 *texw *= 2; | |
195 *texh = 32; | |
196 while (*texh < h) | |
197 *texh *= 2; | |
198 } | |
28073 | 199 if (mesa_buffer) *texw = (*texw + 63) & ~63; |
28074
24871084fad6
ati_hack only makes sense when PBOs are used, not with mesa_buffer.
reimar
parents:
28073
diff
changeset
|
200 else if (ati_hack) *texw = (*texw + 511) & ~511; |
16099 | 201 } |
202 | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16593
diff
changeset
|
203 //! maximum size of custom fragment program |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
204 #define MAX_CUSTOM_PROG_SIZE (1024 * 1024) |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
205 static void update_yuvconv(void) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
206 float bri = eq_bri / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
207 float cont = (eq_cont + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
208 float hue = eq_hue / 100.0 * 3.1415927; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
209 float sat = (eq_sat + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
210 float rgamma = exp(log(8.0) * eq_rgamma / 100.0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
211 float ggamma = exp(log(8.0) * eq_ggamma / 100.0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
212 float bgamma = exp(log(8.0) * eq_bgamma / 100.0); |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26823
diff
changeset
|
213 gl_conversion_params_t params = {gl_target, yuvconvtype, |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26823
diff
changeset
|
214 bri, cont, hue, sat, rgamma, ggamma, bgamma, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
215 texture_width, texture_height, filter_strength}; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26823
diff
changeset
|
216 glSetupYUVConversion(¶ms); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
217 if (custom_prog) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
218 FILE *f = fopen(custom_prog, "r"); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
219 if (!f) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
220 mp_msg(MSGT_VO, MSGL_WARN, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
221 "[gl] Could not read customprog %s\n", custom_prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
222 else { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
223 char *prog = calloc(1, MAX_CUSTOM_PROG_SIZE + 1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
224 fread(prog, 1, MAX_CUSTOM_PROG_SIZE, f); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
225 fclose(f); |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18619
diff
changeset
|
226 loadGPUProgram(GL_FRAGMENT_PROGRAM, prog); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
227 free(prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
228 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
229 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 0, |
18960 | 230 1.0 / texture_width, 1.0 / texture_height, |
231 texture_width, texture_height); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
232 } |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
233 if (custom_tex) { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
234 FILE *f = fopen(custom_tex, "r"); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
235 if (!f) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
236 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
237 "[gl] Could not read customtex %s\n", custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
238 else { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
239 int width, height, maxval; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
240 ActiveTexture(GL_TEXTURE3); |
18963 | 241 if (glCreatePPMTex(custom_trect?GL_TEXTURE_RECTANGLE:GL_TEXTURE_2D, 0, |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
242 custom_tlin?GL_LINEAR:GL_NEAREST, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
243 f, &width, &height, &maxval)) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
244 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 1, |
18960 | 245 1.0 / width, 1.0 / height, width, height); |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
246 else |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
247 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
248 "[gl] Error parsing customtex %s\n", custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
249 fclose(f); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
250 ActiveTexture(GL_TEXTURE0); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
251 } |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
252 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
253 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
254 |
16436 | 255 /** |
256 * \brief remove all OSD textures and display-lists, thus clearing it. | |
257 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
258 static void clearOSD(void) { |
16433 | 259 int i; |
17871
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
260 if (!osdtexCnt) |
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
261 return; |
16433 | 262 glDeleteTextures(osdtexCnt, osdtex); |
263 #ifndef FAST_OSD | |
264 glDeleteTextures(osdtexCnt, osdatex); | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
265 for (i = 0; i < osdtexCnt; i++) |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
266 glDeleteLists(osdaDispList[i], 1); |
16433 | 267 #endif |
268 for (i = 0; i < osdtexCnt; i++) | |
269 glDeleteLists(osdDispList[i], 1); | |
270 osdtexCnt = 0; | |
271 } | |
272 | |
273 /** | |
19578 | 274 * \brief remove textures, display list and free memory used by EOSD |
275 */ | |
276 static void clearEOSD(void) { | |
19934 | 277 if (eosdDispList) |
278 glDeleteLists(eosdDispList, 1); | |
279 eosdDispList = 0; | |
280 if (eosdtexCnt) | |
281 glDeleteTextures(eosdtexCnt, eosdtex); | |
282 eosdtexCnt = 0; | |
19578 | 283 free(eosdtex); |
284 eosdtex = NULL; | |
285 } | |
286 | |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
287 static void do_render_osd(int); |
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
288 |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
289 static inline int is_tinytex(ass_image_t *i, int tinytexcur) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
290 return i->w < TINYTEX_SIZE && i->h < TINYTEX_SIZE && tinytexcur < TINYTEX_MAX; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
291 } |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
292 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
293 static inline int is_smalltex(ass_image_t *i, int smalltexcur) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
294 return i->w < SMALLTEX_SIZE && i->h < SMALLTEX_SIZE && smalltexcur < SMALLTEX_MAX; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
295 } |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
296 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
297 static inline void tinytex_pos(int tinytexcur, int *x, int *y) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
298 *x = (tinytexcur % TINYTEX_COLS) * TINYTEX_SIZE; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
299 *y = (tinytexcur / TINYTEX_COLS) * TINYTEX_SIZE; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
300 } |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
301 |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
302 static inline void smalltex_pos(int smalltexcur, int *x, int *y) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
303 *x = (smalltexcur % SMALLTEX_COLS) * SMALLTEX_SIZE; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
304 *y = (smalltexcur / SMALLTEX_COLS) * SMALLTEX_SIZE; |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
305 } |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
306 |
19578 | 307 /** |
308 * \brief construct display list from ass image list | |
309 * \param img image list to create OSD from. | |
310 * A value of NULL has the same effect as clearEOSD() | |
311 */ | |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
312 static void genEOSD(mp_eosd_images_t *imgs) { |
19578 | 313 int sx, sy; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
314 int tinytexcur = 0; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
315 int smalltexcur = 0; |
19578 | 316 GLuint *curtex; |
28035 | 317 GLint scale_type = scaled_osd ? GL_LINEAR : GL_NEAREST; |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
318 ass_image_t *img = imgs->imgs; |
19578 | 319 ass_image_t *i; |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
320 |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
321 if (imgs->changed == 0) // there are elements, but they are unchanged |
28808
49aaf6f7052b
Simplify EOSD code by rendering it in VOCTRL_DRAW_EOSD instead of genEOSD,
reimar
parents:
28803
diff
changeset
|
322 return; |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
323 if (img && imgs->changed == 1) // there are elements, but they just moved |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
324 goto skip_upload; |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
325 |
19578 | 326 clearEOSD(); |
19935
698b1d68ac83
Make genEOSD behaviour with NULL data more explicit
reimar
parents:
19934
diff
changeset
|
327 if (!img) |
698b1d68ac83
Make genEOSD behaviour with NULL data more explicit
reimar
parents:
19934
diff
changeset
|
328 return; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
329 if (!largeeosdtex[0]) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
330 glGenTextures(2, largeeosdtex); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
331 BindTexture(gl_target, largeeosdtex[0]); |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
332 glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, LARGE_EOSD_TEX_SIZE, LARGE_EOSD_TEX_SIZE, 0); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
333 BindTexture(gl_target, largeeosdtex[1]); |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
334 glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, LARGE_EOSD_TEX_SIZE, LARGE_EOSD_TEX_SIZE, 0); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
335 } |
19578 | 336 for (i = img; i; i = i->next) |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
337 { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
338 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
339 continue; |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
340 if (is_tinytex(i, tinytexcur)) |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
341 tinytexcur++; |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
342 else if (is_smalltex(i, smalltexcur)) |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
343 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
344 else |
19939 | 345 eosdtexCnt++; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
346 } |
20084 | 347 mp_msg(MSGT_VO, MSGL_DBG2, "EOSD counts (tiny, small, all): %i, %i, %i\n", |
348 tinytexcur, smalltexcur, eosdtexCnt); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
349 if (eosdtexCnt) { |
19939 | 350 eosdtex = calloc(eosdtexCnt, sizeof(GLuint)); |
351 glGenTextures(eosdtexCnt, eosdtex); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
352 } |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
353 tinytexcur = smalltexcur = 0; |
19937
34796c9b8667
Cosmetics: move curtex++ out of for () into code body, needed for coming patch
reimar
parents:
19936
diff
changeset
|
354 for (i = img, curtex = eosdtex; i; i = i->next) { |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
355 int x = 0, y = 0; |
19578 | 356 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) { |
357 mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n"); | |
358 continue; | |
359 } | |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
360 if (is_tinytex(i, tinytexcur)) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
361 tinytex_pos(tinytexcur, &x, &y); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
362 BindTexture(gl_target, largeeosdtex[0]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
363 tinytexcur++; |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
364 } else if (is_smalltex(i, smalltexcur)) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
365 smalltex_pos(smalltexcur, &x, &y); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
366 BindTexture(gl_target, largeeosdtex[1]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
367 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
368 } else { |
19939 | 369 texSize(i->w, i->h, &sx, &sy); |
370 BindTexture(gl_target, *curtex++); | |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27393
diff
changeset
|
371 glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
372 } |
19578 | 373 glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, i->bitmap, i->stride, |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
374 x, y, i->w, i->h, 0); |
19578 | 375 } |
376 eosdDispList = glGenLists(1); | |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
377 skip_upload: |
19578 | 378 glNewList(eosdDispList, GL_COMPILE); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
379 tinytexcur = smalltexcur = 0; |
19937
34796c9b8667
Cosmetics: move curtex++ out of for () into code body, needed for coming patch
reimar
parents:
19936
diff
changeset
|
380 for (i = img, curtex = eosdtex; i; i = i->next) { |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
381 int x = 0, y = 0; |
19578 | 382 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) |
383 continue; | |
384 glColor4ub(i->color >> 24, (i->color >> 16) & 0xff, (i->color >> 8) & 0xff, 255 - (i->color & 0xff)); | |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
385 if (is_tinytex(i, tinytexcur)) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
386 tinytex_pos(tinytexcur, &x, &y); |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
387 sx = sy = LARGE_EOSD_TEX_SIZE; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
388 BindTexture(gl_target, largeeosdtex[0]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
389 tinytexcur++; |
28814
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
390 } else if (is_smalltex(i, smalltexcur)) { |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
391 smalltex_pos(smalltexcur, &x, &y); |
aa16560de0e7
Refactor smalltex/tinytex EOSD optimization in vo_gl
reimar
parents:
28808
diff
changeset
|
392 sx = sy = LARGE_EOSD_TEX_SIZE; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
393 BindTexture(gl_target, largeeosdtex[1]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
394 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
395 } else { |
19939 | 396 texSize(i->w, i->h, &sx, &sy); |
397 BindTexture(gl_target, *curtex++); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
398 } |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
399 glDrawTex(i->dst_x, i->dst_y, i->w, i->h, x, y, i->w, i->h, sx, sy, use_rectangle == 1, 0, 0); |
19578 | 400 } |
401 glEndList(); | |
402 BindTexture(gl_target, 0); | |
403 } | |
404 | |
405 /** | |
16433 | 406 * \brief uninitialize OpenGL context, freeing textures, buffers etc. |
407 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
408 static void uninitGl(void) { |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
409 int i = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
410 if (DeletePrograms && fragprog) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
411 DeletePrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
412 fragprog = 0; |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
413 while (default_texs[i] != 0) |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
414 i++; |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
415 if (i) |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
416 glDeleteTextures(i, default_texs); |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
417 default_texs[0] = 0; |
16433 | 418 clearOSD(); |
19578 | 419 clearEOSD(); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
420 if (largeeosdtex[0]) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
421 glDeleteTextures(2, largeeosdtex); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
422 largeeosdtex[0] = 0; |
16433 | 423 if (DeleteBuffers && gl_buffer) |
424 DeleteBuffers(1, &gl_buffer); | |
425 gl_buffer = 0; gl_buffersize = 0; | |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
426 gl_bufferptr = NULL; |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
427 if (DeleteBuffers && gl_buffer_uv[0]) |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
428 DeleteBuffers(2, gl_buffer_uv); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
429 gl_buffer_uv[0] = gl_buffer_uv[1] = 0; gl_buffersize_uv = 0; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
430 gl_bufferptr_uv[0] = gl_bufferptr_uv[1] = 0; |
29648
74f94f407c31
Re-add some ifdefs, partially reverting r29688, since mDisplay and
reimar
parents:
29646
diff
changeset
|
431 #ifdef CONFIG_X11 |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
432 if (mesa_bufferptr) |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
433 FreeMemoryMESA(mDisplay, mScreen, mesa_bufferptr); |
29648
74f94f407c31
Re-add some ifdefs, partially reverting r29688, since mDisplay and
reimar
parents:
29646
diff
changeset
|
434 #endif |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
435 mesa_bufferptr = NULL; |
16433 | 436 err_shown = 0; |
437 } | |
438 | |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
439 static void autodetectGlExtensions(void) { |
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
440 const char *extensions = glGetString(GL_EXTENSIONS); |
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
441 const char *vendor = glGetString(GL_VENDOR); |
28423
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
442 const char *version = glGetString(GL_VERSION); |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
443 int is_ati = strstr(vendor, "ATI") != NULL; |
28423
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
444 int ati_broken_pbo = 0; |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
445 if (is_ati && strncmp(version, "2.1.", 4) == 0) { |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
446 int ver = atoi(version + 4); |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
447 mp_msg(MSGT_VO, MSGL_V, "[gl] Detected ATI driver version: %i\n", ver); |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
448 ati_broken_pbo = ver && ver < 8395; |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
449 } |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
450 if (ati_hack == -1) ati_hack = ati_broken_pbo; |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
451 if (force_pbo == -1) force_pbo = strstr(extensions, "_pixel_buffer_object") ? is_ati : 0; |
28152
712225607a2c
Do not default to rectangle=2, it is at least for ATI HD4850 cards with 8.12 drivers 20% slower at HD resolutions
reimar
parents:
28091
diff
changeset
|
452 if (use_rectangle == -1) use_rectangle = strstr(extensions, "_texture_non_power_of_two") ? 0 : 0; |
28153
1c34bd14e6b6
Warn when using features that are broken due to ATI driver bugs.
reimar
parents:
28152
diff
changeset
|
453 if (is_ati && (lscale == 1 || lscale == 2 || cscale == 1 || cscale == 2)) |
28424 | 454 mp_msg(MSGT_VO, MSGL_WARN, "[gl] Selected scaling mode may be broken on ATI cards.\n" |
28153
1c34bd14e6b6
Warn when using features that are broken due to ATI driver bugs.
reimar
parents:
28152
diff
changeset
|
455 "Tell _them_ to fix GL_REPEAT if you have issues.\n"); |
28423
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
456 mp_msg(MSGT_VO, MSGL_V, "[gl] Settings after autodetection: ati-hack = %i, force-pbo = %i, rectangle = %i\n", |
395034c15a4b
Latest 9.1 ATI drivers finally fixed PBOs, thus do not need ati-hack and are much
reimar
parents:
28255
diff
changeset
|
457 ati_hack, force_pbo, use_rectangle); |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
458 } |
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
459 |
13843 | 460 /** |
461 * \brief Initialize a (new or reused) OpenGL context. | |
16433 | 462 * set global gl-related variables to their default values |
13843 | 463 */ |
464 static int initGl(uint32_t d_width, uint32_t d_height) { | |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
465 autodetectGlExtensions(); |
16099 | 466 texSize(image_width, image_height, &texture_width, &texture_height); |
13843 | 467 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28939
diff
changeset
|
468 glDisable(GL_BLEND); |
13843 | 469 glDisable(GL_DEPTH_TEST); |
470 glDepthMask(GL_FALSE); | |
471 glDisable(GL_CULL_FACE); | |
16099 | 472 glEnable(gl_target); |
16458 | 473 glDrawBuffer(vo_doublebuffering?GL_BACK:GL_FRONT); |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
474 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |
13843 | 475 |
476 mp_msg(MSGT_VO, MSGL_V, "[gl] Creating %dx%d texture...\n", | |
477 texture_width, texture_height); | |
478 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
479 if (image_format == IMGFMT_YV12) { |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
480 int i; |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
481 glGenTextures(21, default_texs); |
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
482 default_texs[21] = 0; |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
483 for (i = 0; i < 7; i++) { |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
484 ActiveTexture(GL_TEXTURE1 + i); |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
485 BindTexture(GL_TEXTURE_2D, default_texs[i]); |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
486 BindTexture(GL_TEXTURE_RECTANGLE, default_texs[i + 7]); |
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
487 BindTexture(GL_TEXTURE_3D, default_texs[i + 14]); |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
488 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
489 ActiveTexture(GL_TEXTURE1); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27393
diff
changeset
|
490 glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
491 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
492 ActiveTexture(GL_TEXTURE2); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27393
diff
changeset
|
493 glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
494 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
495 switch (use_yuv) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
496 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
497 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
498 case YUV_CONVERSION_FRAGMENT: |
18579
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
499 if (!GenPrograms || !BindProgram) { |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
500 mp_msg(MSGT_VO, MSGL_ERR, "[gl] fragment program functions missing!\n"); |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
501 break; |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
502 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
503 GenPrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
504 BindProgram(GL_FRAGMENT_PROGRAM, fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
505 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
506 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
507 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
508 BindTexture(gl_target, 0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
509 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
510 } |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27393
diff
changeset
|
511 glCreateClearTex(gl_target, gl_texfmt, gl_format, gl_type, GL_LINEAR, |
16117 | 512 texture_width, texture_height, 0); |
13843 | 513 |
514 resize(d_width, d_height); | |
515 | |
516 glClearColor( 0.0f,0.0f,0.0f,0.0f ); | |
517 glClear( GL_COLOR_BUFFER_BIT ); | |
16271 | 518 if (SwapInterval && swap_interval >= 0) |
16268 | 519 SwapInterval(swap_interval); |
13920 | 520 return 1; |
13843 | 521 } |
522 | |
1 | 523 /* connect to server, create and map window, |
524 * allocate colors and (shared) memory | |
525 */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28939
diff
changeset
|
526 static int |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
7111
diff
changeset
|
527 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
1 | 528 { |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
529 image_height = height; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
530 image_width = width; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
531 image_format = format; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
532 glFindFormat(format, NULL, &gl_texfmt, &gl_format, &gl_type); |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
533 |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
534 int_pause = 0; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
535 vo_flipped = !!(flags & VOFLAG_FLIPPING); |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
536 |
27343 | 537 #ifdef CONFIG_GUI |
13843 | 538 if (use_gui) { |
539 // GUI creates and manages window for us | |
540 guiGetEvent(guiSetShVideo, 0); | |
15748 | 541 goto glconfig; |
13843 | 542 } |
543 #endif | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
544 #ifdef GL_WIN32 |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
545 if (glctx.type == GLTYPE_W32 && !vo_w32_config(d_width, d_height, flags)) |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
546 return -1; |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
547 #endif |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
548 #ifdef CONFIG_X11 |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
549 if (glctx.type == GLTYPE_X11) { |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
550 XVisualInfo *vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib ); |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
551 if (vinfo == NULL) |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
552 { |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
553 mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n"); |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
554 return -1; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
555 } |
29906
31fe2176a8ef
Print which visual glXChooseVisual chose when running in verbose mode.
reimar
parents:
29681
diff
changeset
|
556 mp_msg(MSGT_VO, MSGL_V, "[gl] GLX chose visual with ID 0x%x\n", (int)vinfo->visualid); |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1109
diff
changeset
|
557 |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
558 vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
559 XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone), |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
560 "gl", title); |
13843 | 561 } |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
562 #endif |
15748 | 563 |
564 glconfig: | |
16433 | 565 if (vo_config_count) |
566 uninitGl(); | |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
567 if (glctx.setGlWindow(&glctx) == SET_WINDOW_FAILED) |
29570
eb2567b65311
Check setGlWindow return value to fail properly instead of crashing if e.g.
reimar
parents:
29524
diff
changeset
|
568 return -1; |
29680
57ed11e0d3ce
Print error instead of crashing when mesa-buffer is used on systems
reimar
parents:
29648
diff
changeset
|
569 if (mesa_buffer && !AllocateMemoryMESA) { |
57ed11e0d3ce
Print error instead of crashing when mesa-buffer is used on systems
reimar
parents:
29648
diff
changeset
|
570 mp_msg(MSGT_VO, MSGL_ERR, "Can not enable mesa-buffer because AllocateMemoryMESA was not found\n"); |
57ed11e0d3ce
Print error instead of crashing when mesa-buffer is used on systems
reimar
parents:
29648
diff
changeset
|
571 mesa_buffer = 0; |
57ed11e0d3ce
Print error instead of crashing when mesa-buffer is used on systems
reimar
parents:
29648
diff
changeset
|
572 } |
13843 | 573 initGl(vo_dwidth, vo_dheight); |
11542 | 574 |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
575 return 0; |
1 | 576 } |
577 | |
31 | 578 static void check_events(void) |
1 | 579 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
580 int e=glctx.check_events(); |
31 | 581 if(e&VO_EVENT_RESIZE) resize(vo_dwidth,vo_dheight); |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
582 if(e&VO_EVENT_EXPOSE && int_pause) redraw(); |
31 | 583 } |
1 | 584 |
13585 | 585 /** |
586 * Creates the textures and the display list needed for displaying | |
587 * an OSD part. | |
588 * Callback function for vo_draw_text(). | |
589 */ | |
590 static void create_osd_texture(int x0, int y0, int w, int h, | |
591 unsigned char *src, unsigned char *srca, | |
592 int stride) | |
593 { | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
594 // initialize to 8 to avoid special-casing on alignment |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
595 int sx = 8, sy = 8; |
28035 | 596 GLint scale_type = scaled_osd ? GL_LINEAR : GL_NEAREST; |
17875
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
597 |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
598 if (w <= 0 || h <= 0 || stride < w) { |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
599 mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n"); |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
600 return; |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
601 } |
16099 | 602 texSize(w, h, &sx, &sy); |
13585 | 603 |
604 if (osdtexCnt >= MAX_OSD_PARTS) { | |
605 mp_msg(MSGT_VO, MSGL_ERR, "Too many OSD parts, contact the developers!\n"); | |
606 return; | |
607 } | |
608 | |
609 // create Textures for OSD part | |
610 glGenTextures(1, &osdtex[osdtexCnt]); | |
16099 | 611 BindTexture(gl_target, osdtex[osdtexCnt]); |
27621
53b5cf466361
Change glCreateClearTex to use the same host data format as later uploads.
reimar
parents:
27393
diff
changeset
|
612 glCreateClearTex(gl_target, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0); |
16117 | 613 glUploadTex(gl_target, GL_LUMINANCE, GL_UNSIGNED_BYTE, src, stride, |
614 0, 0, w, h, 0); | |
13585 | 615 |
616 #ifndef FAST_OSD | |
617 glGenTextures(1, &osdatex[osdtexCnt]); | |
16099 | 618 BindTexture(gl_target, osdatex[osdtexCnt]); |
28002
bcb567424fbc
100l, OSD alpha textures were cleared to the wrong value.
reimar
parents:
27987
diff
changeset
|
619 glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0); |
16117 | 620 { |
16221 | 621 int i; |
18878 | 622 char *tmp = malloc(stride * h); |
16272 | 623 // convert alpha from weird MPlayer scale. |
624 // in-place is not possible since it is reused for future OSDs | |
20420
0c63edaa7714
Fix single-black-pixel-in-upper-left-corner bug (how do people notice a single
reimar
parents:
20084
diff
changeset
|
625 for (i = h * stride - 1; i >= 0; i--) |
25951 | 626 tmp[i] = -srca[i]; |
16117 | 627 glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, tmp, stride, |
628 0, 0, w, h, 0); | |
629 free(tmp); | |
630 } | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
631 #endif |
13585 | 632 |
16099 | 633 BindTexture(gl_target, 0); |
13585 | 634 |
635 // Create a list for rendering this OSD part | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
636 #ifndef FAST_OSD |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
637 osdaDispList[osdtexCnt] = glGenLists(1); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
638 glNewList(osdaDispList[osdtexCnt], GL_COMPILE); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
639 // render alpha |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
640 BindTexture(gl_target, osdatex[osdtexCnt]); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
641 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
642 glEndList(); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
643 #endif |
13585 | 644 osdDispList[osdtexCnt] = glGenLists(1); |
645 glNewList(osdDispList[osdtexCnt], GL_COMPILE); | |
646 // render OSD | |
16099 | 647 BindTexture(gl_target, osdtex[osdtexCnt]); |
17220 | 648 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
13585 | 649 glEndList(); |
650 | |
651 osdtexCnt++; | |
652 } | |
653 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
654 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
655 { |
13585 | 656 if (!use_osd) return; |
657 if (vo_osd_changed(0)) { | |
16221 | 658 int osd_h, osd_w; |
16433 | 659 clearOSD(); |
28035 | 660 osd_w = scaled_osd ? image_width : vo_dwidth; |
661 osd_h = scaled_osd ? image_height : vo_dheight; | |
28255
aeefca2deed3
Change vo_draw_text to a vo_draw_text_ext function which draws DVD navigation
reimar
parents:
28164
diff
changeset
|
662 vo_draw_text_ext(osd_w, osd_h, ass_border_x, ass_border_y, ass_border_x, ass_border_y, |
aeefca2deed3
Change vo_draw_text to a vo_draw_text_ext function which draws DVD navigation
reimar
parents:
28164
diff
changeset
|
663 image_width, image_height, create_osd_texture); |
13585 | 664 } |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
665 if (vo_doublebuffering) do_render_osd(1); |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
666 } |
31 | 667 |
26840 | 668 static void do_render(void) { |
1 | 669 // glEnable(GL_TEXTURE_2D); |
670 // glBindTexture(GL_TEXTURE_2D, texture_id); | |
671 | |
672 glColor3f(1,1,1); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
673 if (image_format == IMGFMT_YV12) |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
674 glEnableYUVConversion(gl_target, yuvconvtype); |
16584 | 675 glDrawTex(0, 0, image_width, image_height, |
676 0, 0, image_width, image_height, | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
677 texture_width, texture_height, |
18996 | 678 use_rectangle == 1, image_format == IMGFMT_YV12, |
679 mpi_flipped ^ vo_flipped); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
680 if (image_format == IMGFMT_YV12) |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
681 glDisableYUVConversion(gl_target, yuvconvtype); |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
682 } |
1 | 683 |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
684 /** |
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
685 * \param type bit 0: render OSD, bit 1: render EOSD |
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
686 */ |
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
687 static void do_render_osd(int type) { |
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
688 if (((type & 1) && osdtexCnt > 0) || ((type & 2) && eosdDispList)) { |
13585 | 689 // set special rendering parameters |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
690 if (!scaled_osd) { |
19939 | 691 glMatrixMode(GL_PROJECTION); |
692 glPushMatrix(); | |
693 glLoadIdentity(); | |
694 glOrtho(0, vo_dwidth, vo_dheight, 0, -1, 1); | |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
695 } |
13585 | 696 glEnable(GL_BLEND); |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
697 if ((type & 2) && eosdDispList) { |
19578 | 698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
699 glCallList(eosdDispList); | |
700 } | |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
701 if ((type & 1) && osdtexCnt > 0) { |
25951 | 702 glColor4ub((osd_color >> 16) & 0xff, (osd_color >> 8) & 0xff, osd_color & 0xff, 0xff - (osd_color >> 24)); |
19579 | 703 // draw OSD |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
704 #ifndef FAST_OSD |
25951 | 705 glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); |
19579 | 706 glCallLists(osdtexCnt, GL_UNSIGNED_INT, osdaDispList); |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
707 #endif |
25951 | 708 glBlendFunc(GL_SRC_ALPHA, GL_ONE); |
19579 | 709 glCallLists(osdtexCnt, GL_UNSIGNED_INT, osdDispList); |
710 } | |
13585 | 711 // set rendering parameters back to defaults |
28035 | 712 glDisable(GL_BLEND); |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
713 if (!scaled_osd) |
19939 | 714 glPopMatrix(); |
16099 | 715 BindTexture(gl_target, 0); |
13585 | 716 } |
26840 | 717 } |
13585 | 718 |
26840 | 719 static void flip_page(void) { |
26841
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
720 if (vo_doublebuffering) { |
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
721 if (use_glFinish) glFinish(); |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
722 glctx.swapGlBuffers(&glctx); |
29524
b1a437cdc60d
Add infrastructure and test code to enable aspect scaling and panscan in windowed mode.
reimar
parents:
29521
diff
changeset
|
723 if (aspect_scaling() && use_aspect) |
26841
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
724 glClear(GL_COLOR_BUFFER_BIT); |
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
725 } else { |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
726 do_render(); |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
727 do_render_osd(3); |
26841
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
728 if (use_glFinish) glFinish(); |
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
729 else glFlush(); |
3822def2c61d
Reorder flip_page to make moving around do_render call easier
reimar
parents:
26840
diff
changeset
|
730 } |
1 | 731 } |
732 | |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
733 static void redraw(void) { |
28803
6887c715c4fa
Do not rely on draw_osd to render the EOSD, instead draw it already at the
reimar
parents:
28590
diff
changeset
|
734 if (vo_doublebuffering) { do_render(); do_render_osd(3); } |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
735 flip_page(); |
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
736 } |
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
737 |
1 | 738 //static inline uint32_t draw_slice_x11(uint8_t *src[], uint32_t slice_num) |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
739 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
1 | 740 { |
28035 | 741 mpi_flipped = stride[0] < 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
742 glUploadTex(gl_target, gl_format, gl_type, src[0], stride[0], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
743 x, y, w, h, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
744 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
745 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
746 glUploadTex(gl_target, gl_format, gl_type, src[1], stride[1], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
747 x / 2, y / 2, w / 2, h / 2, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
748 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
749 glUploadTex(gl_target, gl_format, gl_type, src[2], stride[2], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
750 x / 2, y / 2, w / 2, h / 2, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
751 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
752 } |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
753 return 0; |
1 | 754 } |
755 | |
16099 | 756 static uint32_t get_image(mp_image_t *mpi) { |
28065 | 757 int needed_size; |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
758 if (!GenBuffers || !BindBuffer || !BufferData || !MapBuffer) { |
16099 | 759 if (!err_shown) |
760 mp_msg(MSGT_VO, MSGL_ERR, "[gl] extensions missing for dr\n" | |
761 "Expect a _major_ speed penalty\n"); | |
16113 | 762 err_shown = 1; |
16099 | 763 return VO_FALSE; |
764 } | |
765 if (mpi->flags & MP_IMGFLAG_READABLE) return VO_FALSE; | |
28939
cbf56e4c9662
Check mpi type before returning an DR buffer in get_image, fixes jerkiness
reimar
parents:
28828
diff
changeset
|
766 if (mpi->type != MP_IMGTYPE_STATIC && mpi->type != MP_IMGTYPE_TEMP && |
cbf56e4c9662
Check mpi type before returning an DR buffer in get_image, fixes jerkiness
reimar
parents:
28828
diff
changeset
|
767 (mpi->type != MP_IMGTYPE_NUMBERED || mpi->number)) |
cbf56e4c9662
Check mpi type before returning an DR buffer in get_image, fixes jerkiness
reimar
parents:
28828
diff
changeset
|
768 return VO_FALSE; |
28074
24871084fad6
ati_hack only makes sense when PBOs are used, not with mesa_buffer.
reimar
parents:
28073
diff
changeset
|
769 if (mesa_buffer) mpi->width = texture_width; |
24871084fad6
ati_hack only makes sense when PBOs are used, not with mesa_buffer.
reimar
parents:
28073
diff
changeset
|
770 else if (ati_hack) { |
27874
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
771 mpi->width = texture_width; |
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
772 mpi->height = texture_height; |
27169
78d837adc71e
100l: finally understood ATI PBO problem: width must be a power of two.
reimar
parents:
27168
diff
changeset
|
773 } |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
774 mpi->stride[0] = mpi->width * mpi->bpp / 8; |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
775 needed_size = mpi->stride[0] * mpi->height; |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
776 if (mesa_buffer) { |
29648
74f94f407c31
Re-add some ifdefs, partially reverting r29688, since mDisplay and
reimar
parents:
29646
diff
changeset
|
777 #ifdef CONFIG_X11 |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
778 if (mesa_bufferptr && needed_size > mesa_buffersize) { |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
779 FreeMemoryMESA(mDisplay, mScreen, mesa_bufferptr); |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
780 mesa_bufferptr = NULL; |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
781 } |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
782 if (!mesa_bufferptr) |
29681
8b35d8f6b063
Set sensible write frequency/priority values for AllocateMemoryMESA
reimar
parents:
29680
diff
changeset
|
783 mesa_bufferptr = AllocateMemoryMESA(mDisplay, mScreen, needed_size, 0, 1.0, 1.0); |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
784 mesa_buffersize = needed_size; |
29648
74f94f407c31
Re-add some ifdefs, partially reverting r29688, since mDisplay and
reimar
parents:
29646
diff
changeset
|
785 #endif |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
786 mpi->planes[0] = mesa_bufferptr; |
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
787 } else { |
28068 | 788 if (!gl_buffer) |
789 GenBuffers(1, &gl_buffer); | |
790 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); | |
791 if (needed_size > gl_buffersize) { | |
792 gl_buffersize = needed_size; | |
793 BufferData(GL_PIXEL_UNPACK_BUFFER, gl_buffersize, | |
794 NULL, GL_DYNAMIC_DRAW); | |
795 } | |
796 if (!gl_bufferptr) | |
797 gl_bufferptr = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); | |
798 mpi->planes[0] = gl_bufferptr; | |
799 BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); | |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
800 } |
28035 | 801 if (!mpi->planes[0]) { |
16113 | 802 if (!err_shown) |
25754 | 803 mp_msg(MSGT_VO, MSGL_ERR, "[gl] could not acquire buffer for dr\n" |
16113 | 804 "Expect a _major_ speed penalty\n"); |
805 err_shown = 1; | |
806 return VO_FALSE; | |
807 } | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
808 if (mpi->imgfmt == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
809 // YV12 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
810 mpi->flags |= MP_IMGFLAG_COMMON_STRIDE | MP_IMGFLAG_COMMON_PLANE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
811 mpi->stride[0] = mpi->width; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
812 mpi->planes[1] = mpi->planes[0] + mpi->stride[0] * mpi->height; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
813 mpi->stride[1] = mpi->width >> 1; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
814 mpi->planes[2] = mpi->planes[1] + mpi->stride[1] * (mpi->height >> 1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
815 mpi->stride[2] = mpi->width >> 1; |
28074
24871084fad6
ati_hack only makes sense when PBOs are used, not with mesa_buffer.
reimar
parents:
28073
diff
changeset
|
816 if (ati_hack && !mesa_buffer) { |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
817 mpi->flags &= ~MP_IMGFLAG_COMMON_PLANE; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
818 if (!gl_buffer_uv[0]) GenBuffers(2, gl_buffer_uv); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
819 if (mpi->stride[1] * mpi->height > gl_buffersize_uv) { |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
820 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
821 BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[1] * mpi->height, |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
822 NULL, GL_DYNAMIC_DRAW); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
823 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
824 BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[1] * mpi->height, |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
825 NULL, GL_DYNAMIC_DRAW); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
826 gl_buffersize_uv = mpi->stride[1] * mpi->height; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
827 } |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
828 if (!gl_bufferptr_uv[0]) { |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
829 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
830 gl_bufferptr_uv[0] = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
831 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
832 gl_bufferptr_uv[1] = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
833 } |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
834 mpi->planes[1] = gl_bufferptr_uv[0]; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
835 mpi->planes[2] = gl_bufferptr_uv[1]; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
836 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
837 } |
16099 | 838 mpi->flags |= MP_IMGFLAG_DIRECT; |
839 return VO_TRUE; | |
840 } | |
841 | |
28164 | 842 static void clear_border(uint8_t *dst, int start, int stride, int height, int full_height, int value) { |
843 int right_border = stride - start; | |
844 int bottom_border = full_height - height; | |
845 while (height > 0) { | |
846 memset(dst + start, value, right_border); | |
847 dst += stride; | |
848 height--; | |
849 } | |
850 if (bottom_border > 0) | |
851 memset(dst, value, stride * bottom_border); | |
852 } | |
853 | |
16092 | 854 static uint32_t draw_image(mp_image_t *mpi) { |
16117 | 855 int slice = slice_height; |
26681 | 856 int stride[3]; |
857 unsigned char *planes[3]; | |
858 mp_image_t mpi2 = *mpi; | |
27874
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
859 int w = mpi->w, h = mpi->h; |
16092 | 860 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
861 goto skip_upload; |
26681 | 862 mpi2.flags = 0; mpi2.type = MP_IMGTYPE_TEMP; |
863 mpi2.width = mpi2.w; mpi2.height = mpi2.h; | |
864 if (force_pbo && !(mpi->flags & MP_IMGFLAG_DIRECT) && !gl_bufferptr && get_image(&mpi2) == VO_TRUE) { | |
27089 | 865 int bpp = mpi->imgfmt == IMGFMT_YV12 ? 8 : mpi->bpp; |
866 memcpy_pic(mpi2.planes[0], mpi->planes[0], mpi->w * bpp / 8, mpi->h, mpi2.stride[0], mpi->stride[0]); | |
26681 | 867 if (mpi->imgfmt == IMGFMT_YV12) { |
868 memcpy_pic(mpi2.planes[1], mpi->planes[1], mpi->w >> 1, mpi->h >> 1, mpi2.stride[1], mpi->stride[1]); | |
869 memcpy_pic(mpi2.planes[2], mpi->planes[2], mpi->w >> 1, mpi->h >> 1, mpi2.stride[2], mpi->stride[2]); | |
870 } | |
28164 | 871 if (ati_hack) { // since we have to do a full upload we need to clear the borders |
872 clear_border(mpi2.planes[0], mpi->w * bpp / 8, mpi2.stride[0], mpi->h, mpi2.height, 0); | |
873 if (mpi->imgfmt == IMGFMT_YV12) { | |
874 clear_border(mpi2.planes[1], mpi->w >> 1, mpi2.stride[1], mpi->h >> 1, mpi2.height >> 1, 128); | |
875 clear_border(mpi2.planes[2], mpi->w >> 1, mpi2.stride[2], mpi->h >> 1, mpi2.height >> 1, 128); | |
876 } | |
877 } | |
26681 | 878 mpi = &mpi2; |
879 } | |
880 stride[0] = mpi->stride[0]; stride[1] = mpi->stride[1]; stride[2] = mpi->stride[2]; | |
881 planes[0] = mpi->planes[0]; planes[1] = mpi->planes[1]; planes[2] = mpi->planes[2]; | |
28035 | 882 mpi_flipped = stride[0] < 0; |
28070
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
883 if (mpi->flags & MP_IMGFLAG_DIRECT) { |
28073 | 884 if (mesa_buffer) { |
885 glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); | |
886 w = texture_width; | |
887 } else { | |
28071 | 888 intptr_t base = (intptr_t)planes[0]; |
28072 | 889 if (ati_hack) { w = texture_width; h = texture_height; } |
28071 | 890 if (mpi_flipped) |
891 base += (mpi->h - 1) * stride[0]; | |
892 planes[0] -= base; | |
893 planes[1] -= base; | |
894 planes[2] -= base; | |
895 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); | |
896 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); | |
897 gl_bufferptr = NULL; | |
898 if (!(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) | |
899 planes[0] = planes[1] = planes[2] = NULL; | |
28070
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
900 } |
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
901 slice = 0; // always "upload" full texture |
16099 | 902 } |
18995 | 903 glUploadTex(gl_target, gl_format, gl_type, planes[0], stride[0], |
27874
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
904 mpi->x, mpi->y, w, h, slice); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
905 if (mpi->imgfmt == IMGFMT_YV12) { |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
906 if ((mpi->flags & MP_IMGFLAG_DIRECT) && !(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) { |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
907 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
908 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
909 gl_bufferptr_uv[0] = NULL; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
910 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
911 ActiveTexture(GL_TEXTURE1); |
18995 | 912 glUploadTex(gl_target, gl_format, gl_type, planes[1], stride[1], |
27874
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
913 mpi->x / 2, mpi->y / 2, w / 2, h / 2, slice); |
27987
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
914 if ((mpi->flags & MP_IMGFLAG_DIRECT) && !(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) { |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
915 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
916 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
917 gl_bufferptr_uv[1] = NULL; |
292b260ac2df
More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets.
reimar
parents:
27927
diff
changeset
|
918 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
919 ActiveTexture(GL_TEXTURE2); |
18995 | 920 glUploadTex(gl_target, gl_format, gl_type, planes[2], stride[2], |
27874
b59875975f93
Fix ati-hack to work again with ATI 8.9 and later drivers.
reimar
parents:
27621
diff
changeset
|
921 mpi->x / 2, mpi->y / 2, w / 2, h / 2, slice); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
922 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
923 } |
28070
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
924 if (mpi->flags & MP_IMGFLAG_DIRECT) { |
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
925 if (mesa_buffer) glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 0); |
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
926 else BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); |
9c1fdc6420be
100l, forgot setting GL_UNPACK_CLIENT_STORAGE_APPLE for mesa-buffer mode.
reimar
parents:
28069
diff
changeset
|
927 } |
26842
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
928 skip_upload: |
c675462d66d9
Render everything as early as possible, doing as little as possible in
reimar
parents:
26841
diff
changeset
|
929 if (vo_doublebuffering) do_render(); |
16092 | 930 return VO_TRUE; |
931 } | |
1 | 932 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
933 static int |
10138
5e286cc6ad21
Removed YUV (YV12) and BGR support, leaving the native RGB support. Also cleaned some other parts.
alex
parents:
8654
diff
changeset
|
934 draw_frame(uint8_t *src[]) |
1 | 935 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28939
diff
changeset
|
936 return VO_ERROR; |
1 | 937 } |
938 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
939 static int |
1 | 940 query_format(uint32_t format) |
941 { | |
16092 | 942 int caps = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | |
18996 | 943 VFCAP_FLIP | |
16092 | 944 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_ACCEPT_STRIDE; |
13585 | 945 if (use_osd) |
23135
960434b7d963
Do not set VFCAP_EOSD_UNSCALED if we use scaled-osd
reimar
parents:
23134
diff
changeset
|
946 caps |= VFCAP_OSD | VFCAP_EOSD | (scaled_osd ? 0 : VFCAP_EOSD_UNSCALED); |
28035 | 947 if (format == IMGFMT_RGB24 || format == IMGFMT_RGBA) |
13585 | 948 return caps; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
949 if (use_yuv && format == IMGFMT_YV12) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
950 return caps; |
19356
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
951 // HACK, otherwise we get only b&w with some filters (e.g. -vf eq) |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
952 // ideally MPlayer should be fixed instead not to use Y800 when it has the choice |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
953 if (!use_yuv && (format == IMGFMT_Y8 || format == IMGFMT_Y800)) |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
954 return 0; |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28035
diff
changeset
|
955 if (!use_ycbcr && (format == IMGFMT_UYVY || format == IMGFMT_YUY2)) |
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28035
diff
changeset
|
956 return 0; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
957 if (many_fmts && |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
958 glFindFormat(format, NULL, NULL, NULL, NULL)) |
13585 | 959 return caps; |
1 | 960 return 0; |
961 } | |
962 | |
963 | |
964 static void | |
965 uninit(void) | |
966 { | |
28035 | 967 if (!vo_config_count) return; |
16433 | 968 uninitGl(); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
969 if (custom_prog) free(custom_prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
970 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
971 if (custom_tex) free(custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
972 custom_tex = NULL; |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
973 uninit_mpglcontext(&glctx); |
1 | 974 } |
4352 | 975 |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
28814
diff
changeset
|
976 static const opt_t subopts[] = { |
14286 | 977 {"manyfmts", OPT_ARG_BOOL, &many_fmts, NULL}, |
978 {"osd", OPT_ARG_BOOL, &use_osd, NULL}, | |
979 {"scaled-osd", OPT_ARG_BOOL, &scaled_osd, NULL}, | |
980 {"aspect", OPT_ARG_BOOL, &use_aspect, NULL}, | |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28035
diff
changeset
|
981 {"ycbcr", OPT_ARG_BOOL, &use_ycbcr, NULL}, |
14286 | 982 {"slice-height", OPT_ARG_INT, &slice_height, (opt_test_f)int_non_neg}, |
16099 | 983 {"rectangle", OPT_ARG_INT, &use_rectangle,(opt_test_f)int_non_neg}, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
984 {"yuv", OPT_ARG_INT, &use_yuv, (opt_test_f)int_non_neg}, |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
985 {"lscale", OPT_ARG_INT, &lscale, (opt_test_f)int_non_neg}, |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
986 {"cscale", OPT_ARG_INT, &cscale, (opt_test_f)int_non_neg}, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
987 {"filter-strength", OPT_ARG_FLOAT, &filter_strength, NULL}, |
26677
e3ae3a37ea8a
Add ati-hack suboption that aligns the lines to 32/64 bytes for PBO transfers
reimar
parents:
26624
diff
changeset
|
988 {"ati-hack", OPT_ARG_BOOL, &ati_hack, NULL}, |
26681 | 989 {"force-pbo", OPT_ARG_BOOL, &force_pbo, NULL}, |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
990 {"mesa-buffer", OPT_ARG_BOOL, &mesa_buffer, NULL}, |
16235 | 991 {"glfinish", OPT_ARG_BOOL, &use_glFinish, NULL}, |
16268 | 992 {"swapinterval", OPT_ARG_INT, &swap_interval,NULL}, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
993 {"customprog", OPT_ARG_MSTRZ,&custom_prog, NULL}, |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
994 {"customtex", OPT_ARG_MSTRZ,&custom_tex, NULL}, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
995 {"customtlin", OPT_ARG_BOOL, &custom_tlin, NULL}, |
18963 | 996 {"customtrect", OPT_ARG_BOOL, &custom_trect, NULL}, |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
997 {"osdcolor", OPT_ARG_INT, &osd_color, NULL}, |
14286 | 998 {NULL} |
999 }; | |
1000 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
1001 static int preinit(const char *arg) |
4352 | 1002 { |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1003 enum MPGLType gltype = GLTYPE_X11; |
14286 | 1004 // set defaults |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1005 #ifdef GL_WIN32 |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1006 gltype = GLTYPE_W32; |
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1007 #endif |
16012 | 1008 many_fmts = 1; |
13585 | 1009 use_osd = 1; |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
1010 scaled_osd = 0; |
13601 | 1011 use_aspect = 1; |
28059
8f43ff543dc6
Add support for YCBCR MESA texture format to vo_gl.
reimar
parents:
28035
diff
changeset
|
1012 use_ycbcr = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1013 use_yuv = 0; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1014 lscale = 0; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1015 cscale = 0; |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1016 filter_strength = 0.5; |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
1017 use_rectangle = -1; |
16235 | 1018 use_glFinish = 0; |
28091
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
1019 ati_hack = -1; |
c6ead2b85569
Try to auto-detect several vo_gl settings (ati-hack, force-pbo and rectangle).
reimar
parents:
28074
diff
changeset
|
1020 force_pbo = -1; |
28067
7511f7328d93
Add experimental support for glXAllocateMemoryMESA
reimar
parents:
28065
diff
changeset
|
1021 mesa_buffer = 0; |
16268 | 1022 swap_interval = 1; |
23878
e64c59f73527
Set -vo gl slice-height default to 0, the current default of 4 seems
reimar
parents:
23655
diff
changeset
|
1023 slice_height = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1024 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
1025 custom_tex = NULL; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
1026 custom_tlin = 1; |
18963 | 1027 custom_trect = 0; |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
1028 osd_color = 0xffffff; |
14286 | 1029 if (subopt_parse(arg, subopts) != 0) { |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
1030 mp_msg(MSGT_VO, MSGL_FATAL, |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1031 "\n-vo gl command line help:\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1032 "Example: mplayer -vo gl:slice-height=4\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1033 "\nOptions:\n" |
22087 | 1034 " nomanyfmts\n" |
1035 " Disable extended color formats for OpenGL 1.2 and later\n" | |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1036 " slice-height=<0-...>\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1037 " Slice size for texture transfer, 0 for whole image\n" |
13585 | 1038 " noosd\n" |
1039 " Do not use OpenGL OSD code\n" | |
28060
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1040 " scaled-osd\n" |
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1041 " Render OSD at movie resolution and scale it\n" |
13601 | 1042 " noaspect\n" |
1043 " Do not do aspect scaling\n" | |
16099 | 1044 " rectangle=<0,1,2>\n" |
1045 " 0: use power-of-two textures\n" | |
1046 " 1: use texture_rectangle\n" | |
1047 " 2: use texture_non_power_of_two\n" | |
26677
e3ae3a37ea8a
Add ati-hack suboption that aligns the lines to 32/64 bytes for PBO transfers
reimar
parents:
26624
diff
changeset
|
1048 " ati-hack\n" |
e3ae3a37ea8a
Add ati-hack suboption that aligns the lines to 32/64 bytes for PBO transfers
reimar
parents:
26624
diff
changeset
|
1049 " Workaround ATI bug with PBOs\n" |
26681 | 1050 " force-pbo\n" |
1051 " Force use of PBO even if this involves an extra memcpy\n" | |
16235 | 1052 " glfinish\n" |
1053 " Call glFinish() before swapping buffers\n" | |
16268 | 1054 " swapinterval=<n>\n" |
1055 " Interval in displayed frames between to buffer swaps.\n" | |
1056 " 1 is equivalent to enable VSYNC, 0 to disable VSYNC.\n" | |
1057 " Requires GLX_SGI_swap_control support to work.\n" | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1058 " yuv=<n>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1059 " 0: use software YUV to RGB conversion.\n" |
16626 | 1060 " 1: use register combiners (nVidia only, for older cards).\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1061 " 2: use fragment program.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1062 " 3: use fragment program with gamma correction.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1063 " 4: use fragment program with gamma correction via lookup.\n" |
16626 | 1064 " 5: use ATI-specific method (for older cards).\n" |
22087 | 1065 " 6: use lookup via 3D texture.\n" |
18695 | 1066 " lscale=<n>\n" |
1067 " 0: use standard bilinear scaling for luma.\n" | |
1068 " 1: use improved bicubic scaling for luma.\n" | |
22489 | 1069 " 2: use cubic in X, linear in Y direction scaling for luma.\n" |
25728 | 1070 " 3: as 1 but without using a lookup texture.\n" |
28060
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1071 " 4: experimental unsharp masking (sharpening).\n" |
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1072 " 5: experimental unsharp masking (sharpening) with larger radius.\n" |
18695 | 1073 " cscale=<n>\n" |
1074 " as lscale but for chroma (2x slower with little visible effect).\n" | |
28060
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1075 " filter-strength=<value>\n" |
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1076 " set the effect strength for some lscale/cscale filters\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1077 " customprog=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1078 " use a custom YUV conversion program\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1079 " customtex=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1080 " use a custom YUV conversion lookup texture\n" |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
1081 " nocustomtlin\n" |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
1082 " use GL_NEAREST scaling for customtex texture\n" |
18963 | 1083 " customtrect\n" |
1084 " use texture_rectangle for customtex texture\n" | |
25952 | 1085 " osdcolor=<0xAARRGGBB>\n" |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
1086 " use the given color for the OSD\n" |
28060
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1087 " ycbcr\n" |
70a2108520eb
Add some forgotten documentation for gl suboptions
reimar
parents:
28059
diff
changeset
|
1088 " also try to use the GL_MESA_ycbcr_texture extension\n" |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1089 "\n" ); |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1090 return -1; |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1091 } |
16099 | 1092 if (use_rectangle == 1) |
1093 gl_target = GL_TEXTURE_RECTANGLE; | |
1094 else | |
1095 gl_target = GL_TEXTURE_2D; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1096 yuvconvtype = use_yuv | lscale << YUV_LUM_SCALER_SHIFT | cscale << YUV_CHROM_SCALER_SHIFT; |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1097 if (many_fmts) |
28035 | 1098 mp_msg(MSGT_VO, MSGL_INFO, "[gl] using extended formats. " |
16880
1267964a4dfa
10l typo, nomanyfmts should be used against playback problems.
reimar
parents:
16879
diff
changeset
|
1099 "Use -vo gl:nomanyfmts if playback fails.\n"); |
28035 | 1100 mp_msg(MSGT_VO, MSGL_V, "[gl] Using %d as slice height " |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
1101 "(0 means image height).\n", slice_height); |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1102 if (!init_mpglcontext(&glctx, gltype)) return -1; |
7777 | 1103 |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
1104 return 0; |
4352 | 1105 } |
1106 | |
26822 | 1107 #define MASK_ALL_YUV (~(1 << YUV_CONVERSION_NONE)) |
1108 #define MASK_NOT_COMBINERS (~((1 << YUV_CONVERSION_NONE) | (1 << YUV_CONVERSION_COMBINERS) | (1 << YUV_CONVERSION_COMBINERS_ATI))) | |
1109 #define MASK_GAMMA_SUPPORT (MASK_NOT_COMBINERS & ~(1 << YUV_CONVERSION_FRAGMENT)) | |
1110 | |
1111 static const struct { | |
1112 const char *name; | |
1113 int *value; | |
1114 int supportmask; | |
1115 } eq_map[] = { | |
1116 {"brightness", &eq_bri, MASK_NOT_COMBINERS}, | |
1117 {"contrast", &eq_cont, MASK_NOT_COMBINERS}, | |
1118 {"saturation", &eq_sat, MASK_ALL_YUV }, | |
1119 {"hue", &eq_hue, MASK_ALL_YUV }, | |
1120 {"gamma", &eq_rgamma, MASK_GAMMA_SUPPORT}, | |
1121 {"red_gamma", &eq_rgamma, MASK_GAMMA_SUPPORT}, | |
1122 {"green_gamma", &eq_ggamma, MASK_GAMMA_SUPPORT}, | |
1123 {"blue_gamma", &eq_bgamma, MASK_GAMMA_SUPPORT}, | |
1124 {NULL, NULL, 0 } | |
1125 }; | |
1126 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
1127 static int control(uint32_t request, void *data, ...) |
4352 | 1128 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1129 switch (request) { |
26823 | 1130 case VOCTRL_PAUSE: |
1131 case VOCTRL_RESUME: | |
1132 int_pause = (request == VOCTRL_PAUSE); | |
1133 return VO_TRUE; | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1134 case VOCTRL_QUERY_FORMAT: |
28035 | 1135 return query_format(*(uint32_t*)data); |
16099 | 1136 case VOCTRL_GET_IMAGE: |
1137 return get_image(data); | |
16092 | 1138 case VOCTRL_DRAW_IMAGE: |
1139 return draw_image(data); | |
19578 | 1140 case VOCTRL_DRAW_EOSD: |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
1141 if (!data) |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
1142 return VO_FALSE; |
19578 | 1143 genEOSD(data); |
28808
49aaf6f7052b
Simplify EOSD code by rendering it in VOCTRL_DRAW_EOSD instead of genEOSD,
reimar
parents:
28803
diff
changeset
|
1144 if (vo_doublebuffering) do_render_osd(2); |
19578 | 1145 return VO_TRUE; |
1146 case VOCTRL_GET_EOSD_RES: | |
1147 { | |
1148 mp_eosd_res_t *r = data; | |
29521
f17b515cb326
Simplify -vo gl ass border etc. dimension calculation one bit more.
reimar
parents:
29519
diff
changeset
|
1149 r->w = vo_dwidth; r->h = vo_dheight; |
19578 | 1150 r->mt = r->mb = r->ml = r->mr = 0; |
1151 if (scaled_osd) {r->w = image_width; r->h = image_height;} | |
29524
b1a437cdc60d
Add infrastructure and test code to enable aspect scaling and panscan in windowed mode.
reimar
parents:
29521
diff
changeset
|
1152 else if (aspect_scaling()) { |
24787
02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
eugeni
parents:
23987
diff
changeset
|
1153 r->ml = r->mr = ass_border_x; |
02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
eugeni
parents:
23987
diff
changeset
|
1154 r->mt = r->mb = ass_border_y; |
19578 | 1155 } |
1156 } | |
1157 return VO_TRUE; | |
13843 | 1158 case VOCTRL_GUISUPPORT: |
1159 return VO_TRUE; | |
11542 | 1160 case VOCTRL_ONTOP: |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1161 glctx.ontop(); |
11542 | 1162 return VO_TRUE; |
6095 | 1163 case VOCTRL_FULLSCREEN: |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1164 glctx.fullscreen(); |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1165 resize(vo_dwidth, vo_dheight); |
6095 | 1166 return VO_TRUE; |
17006
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
1167 case VOCTRL_BORDER: |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1168 glctx.border(); |
25912 | 1169 resize(vo_dwidth, vo_dheight); |
17006
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
1170 return VO_TRUE; |
13601 | 1171 case VOCTRL_GET_PANSCAN: |
1172 if (!use_aspect) return VO_NOTIMPL; | |
1173 return VO_TRUE; | |
1174 case VOCTRL_SET_PANSCAN: | |
1175 if (!use_aspect) return VO_NOTIMPL; | |
28035 | 1176 resize(vo_dwidth, vo_dheight); |
13601 | 1177 return VO_TRUE; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1178 case VOCTRL_GET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1179 if (image_format == IMGFMT_YV12) { |
26822 | 1180 int i; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1181 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1182 int *value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1183 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1184 value = va_arg(va, int *); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1185 va_end(va); |
26822 | 1186 for (i = 0; eq_map[i].name; i++) |
1187 if (strcmp(data, eq_map[i].name) == 0) break; | |
1188 if (!(eq_map[i].supportmask & (1 << use_yuv))) | |
1189 break; | |
1190 *value = *eq_map[i].value; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1191 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1192 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1193 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1194 case VOCTRL_SET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1195 if (image_format == IMGFMT_YV12) { |
26822 | 1196 int i; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1197 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1198 int value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1199 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1200 value = va_arg(va, int); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1201 va_end(va); |
26822 | 1202 for (i = 0; eq_map[i].name; i++) |
1203 if (strcmp(data, eq_map[i].name) == 0) break; | |
1204 if (!(eq_map[i].supportmask & (1 << use_yuv))) | |
1205 break; | |
1206 *eq_map[i].value = value; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1207 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1208 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1209 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1210 break; |
22232 | 1211 case VOCTRL_UPDATE_SCREENINFO: |
29938
eb6c70e2cbea
Very preliminary code to allow selecting the OpenGL backend at runtime.
reimar
parents:
29906
diff
changeset
|
1212 glctx.update_xinerama_info(); |
22232 | 1213 return VO_TRUE; |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1214 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1215 return VO_NOTIMPL; |
4352 | 1216 } |