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