Mercurial > mplayer.hg
annotate libvo/vo_3dfx.c @ 34309:119af6360b00
Discard frames where the size does not match the AVCodecContext width/height.
This avoids possible crashes on video size changes. The problem
is that we reinitialize the vo on get_buffer but due to codec
delay libavcodec might still return frames with the old size
afterwards, which the vo might no longer be able to handle.
Ideally libavcodec should not show this behaviour, since it
requires that any application using DR1 can handle frames of
different sizes simultaneously - which seems a bit extreme.
author | reimar |
---|---|
date | Mon, 05 Dec 2011 18:08:29 +0000 |
parents | ddb45e9443ec |
children |
rev | line source |
---|---|
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
1 /* |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
2 * video_out_3dfx.c |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
3 * Heavily based on video_out_mga.c of Aaron Holtzman's mpeg2dec. |
1 | 4 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
5 * Copyright (C) Colin Cross Apr 2000 |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
6 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
7 * This file is part of MPlayer. |
1 | 8 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
9 * MPlayer is free software; you can redistribute it and/or modify |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
10 * it under the terms of the GNU General Public License as published by |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
11 * the Free Software Foundation; either version 2 of the License, or |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
12 * (at your option) any later version. |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
13 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
14 * MPlayer is distributed in the hope that it will be useful, |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
17 * GNU General Public License for more details. |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
18 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
19 * You should have received a copy of the GNU General Public License along |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25220
diff
changeset
|
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
1 | 22 */ |
23 | |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <string.h> | |
27 | |
28 #include "config.h" | |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
29 #include "mp_msg.h" |
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
30 #include "help_mp.h" |
1 | 31 #include "video_out.h" |
32 #include "video_out_internal.h" | |
24251 | 33 #include "x11_common.h" |
1 | 34 |
35 #include <sys/ioctl.h> | |
36 #include <unistd.h> | |
37 #include <fcntl.h> | |
38 #include <sys/mman.h> | |
39 #include <errno.h> | |
40 #include <wchar.h> | |
41 #include <signal.h> | |
42 | |
43 #include <X11/Xlib.h> | |
44 #include <X11/extensions/xf86dga.h> | |
45 #include <X11/Xutil.h> | |
46 | |
47 //#define LOG(x) syslog(LOG_USER | LOG_DEBUG,x) | |
48 #define LOG(x) | |
49 | |
50 #include "drivers/3dfx.h" | |
51 | |
354 | 52 #include "fastmemcpy.h" |
350 | 53 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
54 static const vo_info_t info = |
1 | 55 { |
56 "3dfx (/dev/3dfx)", | |
57 "3dfx", | |
58 "Colin Cross <colin@MIT.EDU>", | |
59 "" | |
60 }; | |
61 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
62 const LIBVO_EXTERN(3dfx) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7124
diff
changeset
|
63 |
1 | 64 static uint32_t is_fullscreen = 1; |
65 | |
66 static uint32_t vidwidth; | |
67 static uint32_t vidheight; | |
68 | |
69 static uint32_t screenwidth; | |
70 static uint32_t screenheight; | |
71 static uint32_t screendepth = 2; //Only 16bpp supported right now | |
72 | |
73 static uint32_t dispwidth = 1280; // You can change these to whatever you want | |
74 static uint32_t dispheight = 720; // 16:9 screen ratio?? | |
75 static uint32_t dispx; | |
76 static uint32_t dispy; | |
77 | |
78 static uint32_t *vidpage0; | |
79 static uint32_t *vidpage1; | |
80 static uint32_t *vidpage2; | |
81 | |
82 static uint32_t vidpage0offset; | |
83 static uint32_t vidpage1offset; | |
84 static uint32_t vidpage2offset; | |
85 | |
86 // Current pointer into framebuffer where display is located | |
87 static uint32_t targetoffset; | |
88 | |
89 static uint32_t page_space; | |
90 | |
91 static voodoo_io_reg *reg_IO; | |
92 static voodoo_2d_reg *reg_2d; | |
93 static voodoo_yuv_reg *reg_YUV; | |
94 static voodoo_yuv_fb *fb_YUV; | |
95 | |
96 static uint32_t *memBase0, *memBase1; | |
97 static uint32_t baseAddr0, baseAddr1; | |
98 | |
99 | |
100 /* X11 related variables */ | |
101 static Display *display; | |
102 static Window mywindow; | |
103 static int bpp; | |
104 static XWindowAttributes attribs; | |
105 | |
17162 | 106 static int fd=-1; |
107 | |
1 | 108 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
109 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
110 restore(void) |
1 | 111 { |
112 //reg_IO->vidDesktopStartAddr = vidpage0offset; | |
113 XF86DGADirectVideo(display,0,0); | |
114 } | |
115 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
116 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
117 sighup(int foo) |
1 | 118 { |
119 //reg_IO->vidDesktopStartAddr = vidpage0offset; | |
120 XF86DGADirectVideo(display,0,0); | |
121 exit(0); | |
122 } | |
123 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
124 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
125 restore_regs(voodoo_2d_reg *regs) |
1 | 126 { |
127 reg_2d->commandExtra = regs->commandExtra; | |
128 reg_2d->clip0Min = regs->clip0Min; | |
129 reg_2d->clip0Max = regs->clip0Max; | |
130 | |
131 reg_2d->srcBaseAddr = regs->srcBaseAddr; | |
132 reg_2d->srcXY = regs->srcXY; | |
133 reg_2d->srcFormat = regs->srcFormat; | |
134 reg_2d->srcSize = regs->srcSize; | |
135 | |
136 reg_2d->dstBaseAddr = regs->dstBaseAddr; | |
137 reg_2d->dstXY = regs->dstXY; | |
138 reg_2d->dstFormat = regs->dstFormat; | |
139 | |
140 reg_2d->dstSize = regs->dstSize; | |
141 reg_2d->command = 0; | |
142 } | |
143 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
144 static uint32_t |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
145 create_window(Display *display, char *title) |
1 | 146 { |
147 int screen; | |
148 unsigned int fg, bg; | |
149 XSizeHints hint; | |
150 XVisualInfo vinfo; | |
151 XEvent xev; | |
152 | |
153 Colormap theCmap; | |
154 XSetWindowAttributes xswa; | |
155 unsigned long xswamask; | |
156 | |
157 screen = DefaultScreen(display); | |
158 | |
159 hint.x = 0; | |
160 hint.y = 10; | |
161 hint.width = dispwidth; | |
162 hint.height = dispheight; | |
163 hint.flags = PPosition | PSize; | |
164 | |
165 bg = WhitePixel(display, screen); | |
166 fg = BlackPixel(display, screen); | |
167 | |
168 XGetWindowAttributes(display, DefaultRootWindow(display), &attribs); | |
169 bpp = attribs.depth; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
170 if (bpp != 16) |
1 | 171 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
172 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_Only16BppSupported); |
1 | 173 exit(-1); |
174 } | |
175 | |
176 XMatchVisualInfo(display,screen,bpp,TrueColor,&vinfo); | |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
177 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_3DFX_VisualIdIs,vinfo.visualid); |
1 | 178 |
179 theCmap = XCreateColormap(display, RootWindow(display,screen), | |
180 vinfo.visual, AllocNone); | |
181 | |
182 xswa.background_pixel = 0; | |
183 xswa.border_pixel = 1; | |
184 xswa.colormap = theCmap; | |
185 xswamask = CWBackPixel | CWBorderPixel |CWColormap; | |
186 | |
187 | |
188 mywindow = XCreateWindow(display, RootWindow(display,screen), | |
189 hint.x, hint.y, hint.width, hint.height, 4, bpp,CopyFromParent,vinfo.visual,xswamask,&xswa); | |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
614
diff
changeset
|
190 vo_x11_classhint( display,mywindow,"3dfx" ); |
1 | 191 |
192 XSelectInput(display, mywindow, StructureNotifyMask); | |
193 | |
194 /* Tell other applications about this window */ | |
195 | |
10994 | 196 XSetStandardProperties(display, mywindow, title, title, None, NULL, 0, &hint); |
1 | 197 |
198 /* Map window. */ | |
199 | |
200 XMapWindow(display, mywindow); | |
201 | |
202 /* Wait for map. */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
203 do |
1 | 204 { |
205 XNextEvent(display, &xev); | |
206 } | |
207 while (xev.type != MapNotify || xev.xmap.event != mywindow); | |
208 | |
209 XSelectInput(display, mywindow, NoEventMask); | |
210 | |
211 XSync(display, False); | |
212 | |
213 return 0; | |
214 } | |
215 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
216 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
217 dump_yuv_planar(uint32_t *y, uint32_t *u, uint32_t *v, uint32_t to, uint32_t width, uint32_t height) |
1 | 218 { |
219 // YUV conversion works like this: | |
220 // | |
221 // We write the Y, U, and V planes separately into 3dfx YUV Planar memory | |
222 // region. The nice chip then takes these and packs them into the YUYV | |
223 // format in the regular frame buffer, starting at yuvBaseAddr, page 2 here. | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
224 // Then we tell the 3dfx to do a Screen to Screen Stretch BLT to copy all |
1 | 225 // of the data on page 2 onto page 1, converting it to 16 bpp RGB as it goes. |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
226 // The result is a nice image on page 1 ready for display. |
1 | 227 |
228 uint32_t j; | |
229 uint32_t y_imax, uv_imax, jmax; | |
230 | |
231 reg_YUV->yuvBaseAddr = to; | |
232 reg_YUV->yuvStride = screenwidth*2; | |
233 | |
234 LOG("video_out_3dfx: starting planar dump\n"); | |
235 jmax = height>>1; // vidheight/2, height of U and V planes | |
236 y_imax = width; // Y plane is twice as wide as U and V planes | |
237 uv_imax = width>>1; // vidwidth/2/4, width of U and V planes in 32-bit words | |
238 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
239 for (j=0;j<jmax;j++) |
1 | 240 { |
241 //XXX this should be hand-rolled 32 bit memcpy for safeness. | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
21977
diff
changeset
|
242 fast_memcpy(fb_YUV->U + (uint32_t) VOODOO_YUV_STRIDE* j ,((uint8_t*) u) + uv_imax* j , uv_imax); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
21977
diff
changeset
|
243 fast_memcpy(fb_YUV->V + (uint32_t) VOODOO_YUV_STRIDE* j ,((uint8_t*) v) + uv_imax* j , uv_imax); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
21977
diff
changeset
|
244 fast_memcpy(fb_YUV->Y + (uint32_t) VOODOO_YUV_STRIDE* (j<<1) ,((uint8_t*) y) + y_imax * (j<<1) , y_imax); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
21977
diff
changeset
|
245 fast_memcpy(fb_YUV->Y + (uint32_t) VOODOO_YUV_STRIDE*((j<<1)+1),((uint8_t*) y) + y_imax *((j<<1)+1), y_imax); |
1 | 246 } |
247 LOG("video_out_3dfx: done planar dump\n"); | |
248 } | |
249 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
250 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
251 screen_to_screen_stretch_blt(uint32_t to, uint32_t from, uint32_t width, uint32_t height) |
1 | 252 { |
253 //FIXME - this function should be called by a show_frame function that | |
254 // uses a series of blts to show only those areas not covered | |
255 // by another window | |
256 voodoo_2d_reg saved_regs; | |
257 | |
258 LOG("video_out_3dfx: saving registers\n"); | |
259 // Save VGA regs (so X kinda works when we're done) | |
260 saved_regs = *reg_2d; | |
261 | |
262 /* The following lines set up the screen to screen stretch blt from page2 to | |
263 page 1 | |
264 */ | |
265 | |
266 LOG("video_out_3dfx: setting blt registers\n"); | |
267 reg_2d->commandExtra = 4; //disable colorkeying, enable wait for v-refresh (0100b) | |
268 reg_2d->clip0Min = 0; | |
269 reg_2d->clip0Max = 0xFFFFFFFF; //no clipping | |
270 | |
271 reg_2d->srcBaseAddr = from; | |
272 reg_2d->srcXY = 0; | |
273 reg_2d->srcFormat = screenwidth*2 | VOODOO_BLT_FORMAT_YUYV; // | 1<<21; | |
274 reg_2d->srcSize = vidwidth | (vidheight << 16); | |
275 | |
276 reg_2d->dstBaseAddr = to; | |
277 reg_2d->dstXY = 0; | |
278 reg_2d->dstFormat = screenwidth*2 | VOODOO_BLT_FORMAT_16; | |
279 | |
280 reg_2d->dstSize = width | (height << 16); | |
281 | |
282 LOG("video_out_3dfx: starting blt\n"); | |
283 // Executes screen to screen stretch blt | |
284 reg_2d->command = 2 | 1<<8 | 0xCC<<24; | |
285 | |
286 LOG("video_out_3dfx: restoring regs\n"); | |
287 restore_regs(&saved_regs); | |
288 | |
289 LOG("video_out_3dfx: done blt\n"); | |
290 } | |
291 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
292 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
293 update_target(void) |
1 | 294 { |
295 uint32_t xp, yp, w, h, b, d; | |
296 Window root; | |
297 | |
298 XGetGeometry(display,mywindow,&root,&xp,&yp,&w,&h,&b,&d); | |
299 XTranslateCoordinates(display,mywindow,root,0,0,&xp,&yp,&root); | |
300 dispx = (uint32_t) xp; | |
301 dispy = (uint32_t) yp; | |
302 dispwidth = (uint32_t) w; | |
303 dispheight = (uint32_t) h; | |
304 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
305 if (is_fullscreen) |
1 | 306 targetoffset = vidpage0offset + (screenheight - dispheight)/2*screenwidth*screendepth + (screenwidth-dispwidth)/2*screendepth; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
307 else |
1 | 308 targetoffset = vidpage0offset + (dispy*screenwidth + dispx)*screendepth; |
309 } | |
310 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
311 static int |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
312 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format) |
1 | 313 { |
314 char *name = ":0.0"; | |
315 pioData data; | |
316 uint32_t retval; | |
317 | |
17162 | 318 //TODO use x11_common for X and window handling |
319 | |
1 | 320 if(getenv("DISPLAY")) |
321 name = getenv("DISPLAY"); | |
322 display = XOpenDisplay(name); | |
323 | |
324 screenwidth = XDisplayWidth(display,0); | |
325 screenheight = XDisplayHeight(display,0); | |
326 | |
327 page_space = screenwidth*screenheight*screendepth; | |
328 vidpage0offset = 0; | |
329 vidpage1offset = page_space; // Use third and fourth pages | |
330 vidpage2offset = page_space*2; | |
331 | |
332 signal(SIGALRM,sighup); | |
333 //alarm(120); | |
334 | |
335 // Open driver device | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
336 if ( fd == -1 ) |
1 | 337 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
338 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_UnableToOpenDevice); |
17160
ecdffaf7118c
Do not exit() if /dev/3dfx is not available, approved by Ivan.
diego
parents:
16171
diff
changeset
|
339 return -1; |
1 | 340 } |
341 | |
342 // Store sizes for later | |
343 vidwidth = width; | |
344 vidheight = height; | |
345 | |
346 is_fullscreen = fullscreen = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
347 if (!is_fullscreen) |
10994 | 348 create_window(display, title); |
1 | 349 |
350 // Ask 3dfx driver for base memory address 0 | |
351 data.port = 0x10; // PCI_BASE_ADDRESS_0_LINUX; | |
352 data.size = 4; | |
353 data.value = &baseAddr0; | |
354 data.device = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
355 if ((retval = ioctl(fd,_IOC(_IOC_READ,'3',3,0),&data)) < 0) |
1 | 356 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
357 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_Error,retval); |
17162 | 358 return -1; |
1 | 359 } |
360 | |
361 // Ask 3dfx driver for base memory address 1 | |
362 data.port = 0x14; // PCI_BASE_ADDRESS_1_LINUX; | |
363 data.size = 4; | |
364 data.value = &baseAddr1; | |
365 data.device = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
366 if ((retval = ioctl(fd,_IOC(_IOC_READ,'3',3,0),&data)) < 0) |
1 | 367 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
368 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_Error,retval); |
17162 | 369 return -1; |
1 | 370 } |
371 | |
372 // Map all 3dfx memory areas | |
373 memBase0 = mmap(0,0x1000000,PROT_READ | PROT_WRITE,MAP_SHARED,fd,baseAddr0); | |
374 memBase1 = mmap(0,3*page_space,PROT_READ | PROT_WRITE,MAP_SHARED,fd,baseAddr1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
375 if (memBase0 == (uint32_t *) 0xFFFFFFFF || memBase1 == (uint32_t *) 0xFFFFFFFF) |
1 | 376 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
377 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_CouldntMapMemoryArea, |
1 | 378 memBase0,memBase1,errno); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
379 } |
1 | 380 |
381 // Set up global pointers | |
382 reg_IO = (void *)memBase0 + VOODOO_IO_REG_OFFSET; | |
383 reg_2d = (void *)memBase0 + VOODOO_2D_REG_OFFSET; | |
384 reg_YUV = (void *)memBase0 + VOODOO_YUV_REG_OFFSET; | |
385 fb_YUV = (void *)memBase0 + VOODOO_YUV_PLANE_OFFSET; | |
386 | |
387 vidpage0 = (void *)memBase1 + (unsigned long int)vidpage0offset; | |
388 vidpage1 = (void *)memBase1 + (unsigned long int)vidpage1offset; | |
389 vidpage2 = (void *)memBase1 + (unsigned long int)vidpage2offset; | |
390 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
391 // Clear pages 1,2,3 |
1 | 392 // leave page 0, that belongs to X. |
393 // So does part of 1. Oops. | |
394 memset(vidpage1,0x00,page_space); | |
395 memset(vidpage2,0x00,page_space); | |
396 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
397 if (is_fullscreen) |
1 | 398 memset(vidpage0,0x00,page_space); |
399 | |
400 | |
401 #ifndef VOODOO_DEBUG | |
402 // Show page 0 (unblanked) | |
403 reg_IO->vidDesktopStartAddr = vidpage0offset; | |
404 | |
405 /* Stop X from messing with my video registers! | |
406 Find a better way to do this? | |
407 Currently I use DGA to tell XF86 to not screw with registers, but I can't really use it | |
408 to do FB stuff because I need to know the absolute FB position and offset FB position | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
409 to feed to BLT command |
1 | 410 */ |
411 //XF86DGADirectVideo(display,0,XF86DGADirectGraphics); //| XF86DGADirectMouse | XF86DGADirectKeyb); | |
412 #endif | |
413 | |
414 atexit(restore); | |
415 | |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
416 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_3DFX_DisplayInitialized,memBase1); |
1 | 417 return 0; |
418 } | |
419 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
420 static int |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
421 draw_frame(uint8_t *src[]) |
1 | 422 { |
423 LOG("video_out_3dfx: starting display_frame\n"); | |
424 | |
425 // Put packed data onto page 2 | |
426 dump_yuv_planar((uint32_t *)src[0],(uint32_t *)src[1],(uint32_t *)src[2], | |
427 vidpage2offset,vidwidth,vidheight); | |
428 | |
429 LOG("video_out_3dfx: done display_frame\n"); | |
430 return 0; | |
431 } | |
432 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
433 static int |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
434 //draw_slice(uint8_t *src[], uint32_t slice_num) |
1978 | 435 draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
1 | 436 { |
437 uint32_t target; | |
438 | |
1978 | 439 target = vidpage2offset + (screenwidth*2 * y); |
440 dump_yuv_planar((uint32_t *)src[0],(uint32_t *)src[1],(uint32_t *)src[2],target,vidwidth,h); | |
1 | 441 return 0; |
442 } | |
443 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
444 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
445 { |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
446 } |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
447 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
448 static void |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
449 flip_page(void) |
1 | 450 { |
451 //FIXME - update_target() should be called by event handler when window | |
452 // is resized or moved | |
453 update_target(); | |
454 LOG("video_out_3dfx: calling blt function\n"); | |
455 screen_to_screen_stretch_blt(targetoffset, vidpage2offset, dispwidth, dispheight); | |
456 } | |
457 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
13056
diff
changeset
|
458 static int |
1 | 459 query_format(uint32_t format) |
460 { | |
6207 | 461 /* does this supports scaling? up & down? */ |
1 | 462 switch(format){ |
463 case IMGFMT_YV12: | |
464 // case IMGFMT_YUY2: | |
465 // case IMGFMT_RGB|24: | |
466 // case IMGFMT_BGR|24: | |
6207 | 467 return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW; |
1 | 468 } |
469 return 0; | |
470 } | |
471 | |
472 static void | |
473 uninit(void) | |
474 { | |
17162 | 475 if( fd != -1 ) |
476 close(fd); | |
1 | 477 } |
478 | |
479 | |
31 | 480 static void check_events(void) |
481 { | |
482 } | |
483 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
13056
diff
changeset
|
484 static int preinit(const char *arg) |
4352 | 485 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
486 if ( (fd = open("/dev/3dfx",O_RDWR) ) == -1) |
17162 | 487 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
488 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_UnableToOpenDevice); |
17162 | 489 return -1; |
490 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
491 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26739
diff
changeset
|
492 if(arg) |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
493 { |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
17162
diff
changeset
|
494 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_3DFX_UnknownSubdevice,arg); |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
495 return ENOSYS; |
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
496 } |
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
497 return 0; |
4352 | 498 } |
31 | 499 |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
29263
diff
changeset
|
500 static int control(uint32_t request, void *data) |
4352 | 501 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
502 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
503 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
504 return query_format(*((uint32_t*)data)); |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
505 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
506 return VO_NOTIMPL; |
4352 | 507 } |