Mercurial > mplayer.hg
annotate libvo/vo_tdfxfb.c @ 5547:92329b5f6ff3
Some minor changes to the avcodec code.
(Michael, perhaps you could explain to me why avc_ctx->quality = 1 produces unwatachable output, and when using gop_size = 0 or 1 (intra) video will disappear after seeking)
author | mswitch |
---|---|
date | Wed, 10 Apr 2002 16:03:08 +0000 |
parents | 80d8fed6e683 |
children | cfa4a2c0366e |
rev | line source |
---|---|
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
1 /* Copyright (C) Mark Zealey, 2002, <mark@zealos.org> |
1979 | 2 * |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
3 * 30/03/02: An almost total rewrite, added DR support and support for modes |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
4 * other than 16bpp. Fixed the crash when playing multiple files |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
5 * 07/04/02: Fixed DR support, added YUY2 support, fixed OSD stuff. |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
6 * 08/04/02: Fixed a wierd sound corruption problem caused by some optomizations |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
7 * I made. |
1979 | 8 * |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
9 * TODO: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
10 * - Add DR support (for stuff other than YUY2) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
11 * - Add UYVY support |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
12 * - Add zoom support |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
13 * - Remove some of the old dud code |
1979 | 14 */ |
15 | |
16 #include <stdio.h> | |
17 #include <stdlib.h> | |
18 #include <string.h> | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4596
diff
changeset
|
19 #include <errno.h> |
1979 | 20 |
21 #include "config.h" | |
22 #include "video_out.h" | |
23 #include "video_out_internal.h" | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
24 #include "mp_image.h" |
1979 | 25 |
26 LIBVO_EXTERN(tdfxfb) | |
27 | |
28 #include <sys/ioctl.h> | |
29 #include <unistd.h> | |
30 #include <fcntl.h> | |
31 #include <sys/mman.h> | |
32 | |
33 #include <linux/fb.h> | |
34 | |
35 #include "drivers/3dfx.h" | |
36 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
37 static vo_info_t vo_info = |
1979 | 38 { |
39 "tdfxfb (/dev/fb?)", | |
40 "tdfxfb", | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
41 "Mark Zealey <mark@zealos.org>" |
1979 | 42 "" |
43 }; | |
44 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
45 /* Some registers on the card */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
46 #define S2S_STRECH_BLT 2 // BLT + Strech |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
47 #define S2S_IMMED (1 << 8) // Do it immediatly |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
48 #define S2S_ROP (0xCC << 24) // ??? |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
49 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
50 /* Stepping between the different YUV plane registers */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
51 #define YUV_STRIDE 1024 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
52 struct YUV_plane { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
53 char Y[0x0100000]; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
54 char U[0x0100000]; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
55 char V[0x0100000]; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
56 }; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
57 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
58 /* XXX: Get rid of most of these vars... */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
59 extern int verbose; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
60 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
61 static int fd; |
1979 | 62 static struct fb_fix_screeninfo fb_finfo; |
63 static struct fb_var_screeninfo fb_vinfo; | |
64 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
65 static uint32_t in_width, in_height, in_format, in_depth, in_banshee_format, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
66 screenwidth, screenheight, screendepth, vidwidth, vidheight, vidx, vidy, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
67 vid_banshee_format, *vidpage, *inpage, vidpageoffset, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
68 inpageoffset, *memBase0, *memBase1; |
1979 | 69 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
70 static volatile voodoo_io_reg *reg_IO; |
1979 | 71 static voodoo_2d_reg *reg_2d; |
72 static voodoo_yuv_reg *reg_YUV; | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
73 static struct YUV_plane *YUV; |
1979 | 74 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
75 static uint32_t preinit(const char *arg) |
1979 | 76 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
77 char *name; |
1979 | 78 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
79 if(verbose) printf("tdfxfb: Open\n"); |
1979 | 80 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
81 if(!(name = getenv("FRAMEBUFFER"))) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
82 name = "/dev/fb0"; |
1979 | 83 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
84 if (verbose) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
85 printf("tdfxfb: Opening %s\n", name); |
1979 | 86 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
87 if ((fd = open(name, O_RDWR)) == -1) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
88 printf("tdfxfb: can't open %s: %s\n", name, strerror(errno)); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
89 return -1; |
1979 | 90 } |
91 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
92 if (ioctl(fd, FBIOGET_FSCREENINFO, &fb_finfo)) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
93 printf("tdfxfb: problem with FBITGET_FSCREENINFO ioctl: %s\n", |
1979 | 94 strerror(errno)); |
95 return -1; | |
96 } | |
97 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
98 if (ioctl(fd, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
99 printf("tdfxfb: problem with FBITGET_VSCREENINFO ioctl: %s\n", |
1979 | 100 strerror(errno)); |
101 return -1; | |
102 } | |
103 | |
104 if (verbose) { | |
105 printf("fb_finfo:\n"); | |
106 printf(" id: %s\n", fb_finfo.id); | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
107 printf(" frame bufer at %x len %x (%d)\n", fb_finfo.smem_start, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
108 fb_finfo.smem_len, fb_finfo.smem_len); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
109 printf(" mem io at %x len %x\n", fb_finfo.mmio_start, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
110 fb_finfo.mmio_len); |
1979 | 111 |
112 printf("fb_vinfo:\n"); | |
113 printf(" resolution: %dx%d\n", fb_vinfo.xres, fb_vinfo.yres); | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
114 printf(" virtual res: %dx%d\n", fb_vinfo.xres_virtual, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
115 fb_vinfo.yres_virtual); |
1979 | 116 printf(" virt offset: %dx%d\n", fb_vinfo.xoffset, fb_vinfo.yoffset); |
117 } | |
118 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
119 if (fb_finfo.accel != FB_ACCEL_3DFX_BANSHEE) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
120 printf("tdfxfb: This driver is only known to support the banshee!\n"); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
121 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
122 /* Open up a window to the hardware */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
123 memBase1 = mmap(0, fb_finfo.smem_len, PROT_READ | PROT_WRITE, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
124 MAP_SHARED, fd, 0); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
125 memBase0 = mmap(0, fb_finfo.mmio_len, PROT_READ | PROT_WRITE, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
126 MAP_SHARED, fd, fb_finfo.smem_len); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
127 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
128 if((long)memBase0 == -1 || (long)memBase1 == -1) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
129 printf("tdfxfb: Couldn't map memory areas: %s\n", strerror(errno)); |
1979 | 130 return -1; |
131 } | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
132 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
133 /* Set up global pointers to the voodoo's regs */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
134 reg_IO = (void *)memBase0 + VOODOO_IO_REG_OFFSET; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
135 reg_2d = (void *)memBase0 + VOODOO_2D_REG_OFFSET; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
136 reg_YUV = (void *)memBase0 + VOODOO_YUV_REG_OFFSET; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
137 YUV = (void *)memBase0 + VOODOO_YUV_PLANE_OFFSET; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
138 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
139 return 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
140 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
141 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
142 static void uninit(void) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
143 { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
144 if(verbose) printf("tdfxfb: Close\n"); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
145 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
146 if(reg_IO) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
147 /* Restore the screen (Linux lives at 0) */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
148 reg_IO->vidDesktopStartAddr = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
149 reg_IO = NULL; |
1979 | 150 } |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
151 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
152 /* And close our mess */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
153 if(memBase1) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
154 munmap(memBase1, fb_finfo.smem_len); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
155 memBase1 = NULL; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
156 } |
1979 | 157 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
158 if(memBase0) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
159 munmap(memBase0, fb_finfo.mmio_len); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
160 memBase0 = NULL; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
161 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
162 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
163 if(fd != -1) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
164 close(fd); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
165 fd = -1; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
166 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
167 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
168 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
169 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
170 uint32_t fullscreen, char *title, uint32_t format,const vo_tune_info_t *info) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
171 { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
172 if(verbose) printf("tdfxfb: Config\n"); |
1979 | 173 |
174 screenwidth = fb_vinfo.xres; | |
175 screenheight = fb_vinfo.yres; | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
176 |
1979 | 177 in_width = width; |
178 in_height = height; | |
179 in_format = format; | |
180 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
181 /* Setup the screen for rendering to */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
182 switch(fb_vinfo.bits_per_pixel) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
183 case 16: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
184 screendepth = 2; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
185 vid_banshee_format = VOODOO_BLT_FORMAT_16; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
186 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
187 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
188 case 24: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
189 screendepth = 3; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
190 vid_banshee_format = VOODOO_BLT_FORMAT_24; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
191 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
192 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
193 case 32: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
194 screendepth = 4; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
195 vid_banshee_format = VOODOO_BLT_FORMAT_32; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
196 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
197 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
198 default: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
199 printf("tdfxfb: %d bpp output is not supported\n", fb_vinfo.bits_per_pixel); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
200 return -1; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
201 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
202 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
203 vid_banshee_format |= screenwidth * screendepth; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
204 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
205 in_banshee_format = VOODOO_BLT_FORMAT_YUYV; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
206 /* Arpi says we don't need to support RGB */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
207 switch(in_format) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
208 case IMGFMT_YV12: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
209 case IMGFMT_I420: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
210 case IMGFMT_IYUV: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
211 in_depth = 4; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
212 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
213 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
214 case IMGFMT_YUY2: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
215 in_depth = 2; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
216 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
217 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
218 default: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
219 printf("tdfxfb: Eik! Something's wrong with control().\n"); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
220 return -1; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
221 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
222 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
223 in_banshee_format |= in_width * in_depth; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
224 |
2350 | 225 if (fullscreen) { |
1979 | 226 double exrat; |
2350 | 227 |
228 vidwidth = screenwidth; | |
229 vidheight = screenheight; | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
230 |
1979 | 231 exrat = (double)in_width / in_height; |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
232 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
233 if(screenwidth / exrat <= screenheight) |
1979 | 234 vidheight = (double)screenwidth / exrat; |
235 else | |
236 vidwidth = (double)screenheight * exrat; | |
237 | |
238 vidx = (screenwidth - vidwidth) / 2; | |
239 vidy = (screenheight - vidheight) / 2; | |
240 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
241 if(verbose) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
242 printf("vidwidth = %d, vidheight = %d, vidx = %d, vidy = %d\n", |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
243 vidwidth, vidheight, vidx, vidy); |
2350 | 244 } else { |
245 if (in_width > screenwidth || in_height > screenheight) { | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
246 printf("tdfxfb: your resolution is too small to play the movie...\n"); |
2350 | 247 return -1; |
248 } | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
249 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
250 vidwidth = in_width; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
251 vidheight = in_height; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
252 vidx = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
253 vidy = 0; |
1979 | 254 } |
255 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
256 /* Linux lives in the first frame */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
257 vidpageoffset = screenwidth * screenheight * screendepth; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
258 inpageoffset = vidpageoffset + screenwidth * screenheight * screendepth; |
1979 | 259 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
260 if(inpageoffset + in_width * in_depth * in_height > fb_finfo.smem_len) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
261 printf("tdfxfb: Not enough video memory to play this movie. Try at a lower resolution\n"); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
262 return -1; |
1979 | 263 } |
264 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
265 vidpage = (void *)memBase1 + (unsigned long)vidpageoffset; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
266 inpage = (void *)memBase1 + (unsigned long)inpageoffset; |
1979 | 267 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
268 memset(vidpage, 0, screenwidth * screenheight * screendepth); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
269 memset(inpage, 0, in_width * in_height * in_depth); |
1979 | 270 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
271 printf("tdfxfb: screen is %dx%d at %d bpp, in is %dx%d at %d bpp (%p/%p)\n", |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
272 screenwidth, screenheight, screendepth * 8, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
273 in_width, in_height, in_depth * 8, |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
274 memBase0, memBase1); |
1979 | 275 |
276 return 0; | |
277 } | |
278 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
279 static const vo_info_t* get_info(void) |
1979 | 280 { |
281 return &vo_info; | |
282 } | |
283 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
284 /* Render onto the screen */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
285 static void flip_page(void) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
286 { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
287 voodoo_2d_reg regs = *reg_2d; /* Copy the regs */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
288 int i = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
289 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
290 reg_2d->commandExtra = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
291 reg_2d->clip0Min = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
292 reg_2d->clip0Max = 0xffffffff; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
293 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
294 reg_2d->srcBaseAddr = inpageoffset; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
295 reg_2d->srcXY = 0; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
296 reg_2d->srcFormat = in_banshee_format; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
297 reg_2d->srcSize = XYREG(in_width, in_height); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
298 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
299 reg_2d->dstBaseAddr = vidpageoffset; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
300 reg_2d->dstXY = XYREG(vidx, vidy); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
301 reg_2d->dstFormat = vid_banshee_format; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
302 reg_2d->dstSize = XYREG(vidwidth, vidheight); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
303 reg_2d->command = S2S_STRECH_BLT | S2S_IMMED | S2S_ROP; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
304 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
305 /* Wait for the command to finish (If we don't do this, we get wierd |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
306 * sound corruption... */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
307 while((reg_IO->status & 0x1f) < 1) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
308 /* Wait */; |
1979 | 309 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
310 *((volatile uint32_t *)((uint32_t *)reg_IO + COMMAND_3D)) = COMMAND_3D_NOP; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
311 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
312 while(i < 3) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
313 if(!(reg_IO->status & STATUS_BUSY)) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
314 i++; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
315 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
316 /* Reset the banshee to point at the video page if it got knocked off it |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
317 */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
318 reg_IO->vidDesktopStartAddr = vidpageoffset; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
319 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
320 /* Restore the old regs now */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
321 reg_2d->commandExtra = regs.commandExtra; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
322 reg_2d->clip0Min = regs.clip0Min; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
323 reg_2d->clip0Max = regs.clip0Max; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
324 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
325 reg_2d->srcBaseAddr = regs.srcBaseAddr; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
326 reg_2d->srcXY = regs.srcXY; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
327 reg_2d->srcFormat = regs.srcFormat; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
328 reg_2d->srcSize = regs.srcSize; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
329 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
330 reg_2d->dstBaseAddr = regs.dstBaseAddr; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
331 reg_2d->dstXY = regs.dstXY; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
332 reg_2d->dstFormat = regs.dstFormat; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
333 reg_2d->dstSize = regs.dstSize; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
334 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
335 reg_2d->command = 0; |
1979 | 336 } |
337 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
338 static uint32_t draw_frame(uint8_t *src[]) |
1979 | 339 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
340 switch(in_format) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
341 case IMGFMT_YUY2: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
342 memcpy(inpage, src[0], in_width * in_depth * in_height); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
343 break; |
2350 | 344 } |
345 | |
1979 | 346 return 0; |
347 } | |
348 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
349 static uint32_t draw_slice(uint8_t *i[], int s[], int w, int h, int x, int y) |
1979 | 350 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
351 switch(in_format) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
352 case IMGFMT_YV12: /* The normal case */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
353 case IMGFMT_I420: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
354 case IMGFMT_IYUV: { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
355 int j; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
356 char *base; |
1979 | 357 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
358 /* We want to render to the YUV to the input page + the location |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
359 * of the stripes we're doing */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
360 reg_YUV->yuvBaseAddr = inpageoffset + in_width * in_depth * y + x; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
361 reg_YUV->yuvStride = in_width * in_depth; |
1979 | 362 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
363 /* Put the YUV channels into the banshees internal combiner unit |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
364 * thingie */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
365 for(base = YUV->Y, j = 0; j < h; j++, base += YUV_STRIDE, i[0] += s[0]) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
366 memcpy(base, i[0], s[0]); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
367 for(base = YUV->U, j = 0; j < h / 2; j++, base += YUV_STRIDE, i[1] += s[1]) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
368 memcpy(base, i[1], s[1]); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
369 for(base = YUV->V, j = 0; j < h / 2; j++, base += YUV_STRIDE, i[2] += s[2]) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
370 memcpy(base, i[2], s[2]); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
371 break; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
372 } |
1979 | 373 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
374 /* No need for a default case, config would have handled it */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
375 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
376 |
1979 | 377 return 0; |
378 } | |
379 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
380 static void draw_alpha(int x, int y, int w, int h, unsigned char *src, |
1979 | 381 unsigned char *srca, int stride) |
382 { | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
383 /* 2... WTF... */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
384 char *dst = (char *)inpage + (y * in_width + x) * 2; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
385 vo_draw_alpha_yuy2(w, h, src, srca, stride, dst, in_width * in_depth); |
1979 | 386 } |
387 | |
2350 | 388 static void draw_osd(void) |
1979 | 389 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
390 vo_draw_text(in_width, in_height, draw_alpha); |
1979 | 391 } |
392 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
393 /* Attempt to start doing DR (Copied mostly from mga_common.c) */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
394 static uint32_t get_image(mp_image_t *mpi) |
1979 | 395 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
396 static int enabled = 0; |
2350 | 397 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
398 if(!enabled) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
399 if(mpi->flags & MP_IMGFLAG_READABLE) /* slow video ram */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
400 return VO_FALSE; |
2350 | 401 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
402 switch(in_format) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
403 case IMGFMT_YUY2: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
404 mpi->planes[0] = (char *)inpage; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
405 mpi->stride[0] = in_width * in_depth; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
406 break; |
2350 | 407 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
408 default: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
409 #if 0 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
410 if(!(mpi->flags & MP_IMGFLAG_ACCEPT_STRIDE)) |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
411 return VO_FALSE; |
2350 | 412 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
413 mpi->planes[0] = YUV->Y; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
414 mpi->planes[1] = YUV->U; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
415 mpi->planes[2] = YUV->V; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
416 mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = YUV_STRIDE; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
417 #else /* 0 */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
418 return VO_FALSE; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
419 #endif /* 0 */ |
2350 | 420 } |
421 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
422 printf("tdfxfb: get_image() SUCCESS -> Direct Rendering ENABLED\n"); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
423 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
424 enabled = 1; |
2350 | 425 } |
426 | |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
427 mpi->width = in_width; |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
428 mpi->flags |= MP_IMGFLAG_DIRECT; |
1979 | 429 |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
430 return VO_TRUE; |
4352 | 431 } |
1979 | 432 |
4596 | 433 static uint32_t control(uint32_t request, void *data, ...) |
4352 | 434 { |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
435 switch(request) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
436 case VOCTRL_GET_IMAGE: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
437 return get_image(data); |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
438 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
439 case VOCTRL_QUERY_FORMAT: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
440 switch(*((uint32_t*)data)) { |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
441 case IMGFMT_YV12: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
442 case IMGFMT_I420: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
443 case IMGFMT_IYUV: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
444 case IMGFMT_YUY2: |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
445 return 7; /* Supported without conversion, supports OSD */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
446 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
447 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
448 return 0; /* Not supported */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
449 } |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
450 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
451 return VO_NOTIMPL; |
4352 | 452 } |
5540
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
453 |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
454 /* Dummy funcs */ |
80d8fed6e683
new tdfxfb yuv driver by Mark Zealey <mark@zealos.org>
arpi
parents:
4737
diff
changeset
|
455 static void check_events(void) { } |