annotate libvo/vo_s3fb.c @ 18624:06c236dd604b

avoid usage of head -1/head -n 1 and use sed 1q instead
author ivo
date Wed, 07 Jun 2006 15:03:25 +0000
parents f85b5c5d5d18
children f31c0f34db76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
1 /* Copyright (C) Mark Sanderson, 2006, <mmp@kiora.ath.cx>.
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
2 * Released under the terms and conditions of the GPL.
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
3 *
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
4 * 30-Mar-2006 Modified from tdfxfb.c by Mark Zealey
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
5 *
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
6 * Hints and tricks:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
7 * - Use -dr to get direct rendering
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
8 * - Use -vf yuy2 to get yuy2 rendering, *MUCH* faster than yv12
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
9 */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
10
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
11 #include <stdio.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
12 #include <stdlib.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
13 #include <errno.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
14 #include <string.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
15 #include <unistd.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
16 #include <sys/ioctl.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
17 #include <fcntl.h>
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
18 #include <linux/fb.h>
18541
0df97a9423d0 include sys/io.h instead of asm/io.h so iopl() gets declared too
ivo
parents: 18540
diff changeset
19 #include <sys/io.h>
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
20
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
21 #include "config.h"
18540
fb07cde79487 only include sys/mman.h if HAVE_SYS_MMAN_H is defined
ivo
parents: 18535
diff changeset
22 #ifdef HAVE_SYS_MMAN_H
fb07cde79487 only include sys/mman.h if HAVE_SYS_MMAN_H is defined
ivo
parents: 18535
diff changeset
23 #include <sys/mman.h>
fb07cde79487 only include sys/mman.h if HAVE_SYS_MMAN_H is defined
ivo
parents: 18535
diff changeset
24 #endif
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
25 #include "mp_msg.h"
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
26 #include "fastmemcpy.h"
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
27 #include "video_out.h"
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
28 #include "video_out_internal.h"
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
29 #include "aspect.h"
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
30 #include "sub.h"
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
31
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
32 static vo_info_t info =
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
33 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
34 "S3 Virge over fbdev",
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
35 "s3fb",
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
36 "Mark Sanderson <mmp@kiora.ath.cx>",
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
37 ""
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
38 };
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
39
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
40 LIBVO_EXTERN(s3fb)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
41
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
42 static int fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
43 static struct fb_fix_screeninfo fb_finfo;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
44 static struct fb_var_screeninfo fb_vinfo;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
45 static uint32_t in_width, in_height, in_format, in_depth, in_s3_format,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
46 screenwidth, screenheight, screendepth, screenstride,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
47 vidwidth, vidheight, vidx, vidy, page, offset, sreg;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
48 static char *inpage, *inpage0, *smem = NULL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
49 static void (*alpha_func)();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
50
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
51 static void clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
52
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
53 /* streams registers */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
54 #define PSTREAM_CONTROL_REG 0x8180
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
55 #define COL_CHROMA_KEY_CONTROL_REG 0x8184
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
56 #define SSTREAM_CONTROL_REG 0x8190
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
57 #define CHROMA_KEY_UPPER_BOUND_REG 0x8194
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
58 #define SSTREAM_STRETCH_REG 0x8198
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
59 #define BLEND_CONTROL_REG 0x81A0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
60 #define PSTREAM_FBADDR0_REG 0x81C0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
61 #define PSTREAM_FBADDR1_REG 0x81C4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
62 #define PSTREAM_STRIDE_REG 0x81C8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
63 #define DOUBLE_BUFFER_REG 0x81CC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
64 #define SSTREAM_FBADDR0_REG 0x81D0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
65 #define SSTREAM_FBADDR1_REG 0x81D4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
66 #define SSTREAM_STRIDE_REG 0x81D8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
67 #define OPAQUE_OVERLAY_CONTROL_REG 0x81DC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
68 #define K1_VSCALE_REG 0x81E0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
69 #define K2_VSCALE_REG 0x81E4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
70 #define DDA_VERT_REG 0x81E8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
71 #define STREAMS_FIFO_REG 0x81EC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
72 #define PSTREAM_START_REG 0x81F0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
73 #define PSTREAM_WINDOW_SIZE_REG 0x81F4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
74 #define SSTREAM_START_REG 0x81F8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
75 #define SSTREAM_WINDOW_SIZE_REG 0x81FC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
76
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
77 #define S3_MEMBASE sreg
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
78 #define S3_NEWMMIO_REGBASE 0x1000000 /* 16MB */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
79 #define S3_NEWMMIO_REGSIZE 0x10000 /* 64KB */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
80 #define S3V_MMIO_REGSIZE 0x8000 /* 32KB */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
81 #define S3_NEWMMIO_VGABASE (S3_NEWMMIO_REGBASE + 0x8000)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
82
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
83 #define OUTREG(mmreg, value) *(unsigned int *)(&v.mmio[mmreg]) = value
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
84
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
85 typedef struct vga_type {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
86 int cr38, cr39, cr53;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
87 unsigned char *mmio;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
88 } vga_t;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
89
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
90 int readcrtc(int reg) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
91 outb(reg, 0x3d4);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
92 return inb(0x3d5);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
93 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
94
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
95 void writecrtc(int reg, int value) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
96 outb(reg, 0x3d4);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
97 outb(value, 0x3d5);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
98 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
99
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
100 int enable(vga_t *v) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
101 int fd;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
102
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
103 // enable registers
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
104 if (iopl(3) != 0)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
105 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
106 v->cr38 = readcrtc(0x38);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
107 v->cr39 = readcrtc(0x39);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
108 v->cr53 = readcrtc(0x53);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
109 writecrtc(0x38, 0x48);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
110 writecrtc(0x39, 0xa5);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
111 writecrtc(0x53, 0x08);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
112 fd = open("/dev/mem", O_RDWR);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
113 v->mmio = mmap(0, S3_NEWMMIO_REGSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
114 S3_MEMBASE + S3_NEWMMIO_REGBASE);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
115 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
116 return 1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
117 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
118
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
119 void disable(vga_t *v) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
120 writecrtc(0x53, v->cr53);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
121 writecrtc(0x39, v->cr39);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
122 writecrtc(0x38, v->cr38);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
123 iopl(0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
124 munmap(v->mmio, S3_NEWMMIO_REGSIZE);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
125 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
126
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
127 int yuv_on(int format, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int crop, int xres, int yres, int line_length, int offset) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
128 int tmp, pitch, start, src_wc, src_hc, bpp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
129 vga_t v;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
130
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
131 if (format == 0 || format == 7)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
132 bpp = 4;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
133 else if (format == 6)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
134 bpp = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
135 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
136 bpp = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
137
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
138 src_wc = src_w - crop * 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
139 src_hc = src_h - crop * 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
140 pitch = src_w * bpp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
141
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
142 // video card memory layout:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
143 // 0-n: visable screen memory, n = width * height * bytes per pixel
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
144 // n-m: scaler source memory, n is aligned to a page boundary
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
145 // m+: scaler source memory for multiple buffers
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
146
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
147 // offset is the first aligned byte after the screen memory, where the scaler input buffer is
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
148 tmp = (yres * line_length + 4095) & ~4095;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
149 offset += tmp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
150
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
151 // start is the top left viewable scaler input pixel
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
152 start = offset + crop * pitch + crop * bpp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
153
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
154 if (!enable(&v))
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
155 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
156
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
157 OUTREG(COL_CHROMA_KEY_CONTROL_REG, 0x47000000);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
158 OUTREG(CHROMA_KEY_UPPER_BOUND_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
159 OUTREG(BLEND_CONTROL_REG, 0x00000020);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
160 OUTREG(DOUBLE_BUFFER_REG, 0x0); /* Choose fbaddr0 as stream source. */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
161 OUTREG(OPAQUE_OVERLAY_CONTROL_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
162
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
163 OUTREG(PSTREAM_CONTROL_REG, 0x06000000);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
164 OUTREG(PSTREAM_FBADDR0_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
165 OUTREG(PSTREAM_FBADDR1_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
166 OUTREG(PSTREAM_STRIDE_REG, line_length);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
167 OUTREG(PSTREAM_START_REG, 0x00010001);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
168 OUTREG(PSTREAM_WINDOW_SIZE_REG, 0x00010001);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
169 //OUTREG(SSTREAM_WINDOW_SIZE_REG, ( ((xres-1) << 16) | yres) & 0x7ff07ff);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
170
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
171 if (dst_w == src_w)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
172 tmp = 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
173 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
174 tmp = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
175 /* format 1=YCbCr-16 2=YUV-16 3=BGR15 4=YUV-16/32(mixed 2/4byte stride) 5=BGR16 6=BGR24 0,7=BGR32 */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
176 /* The YUV format pixel has a range of value from 0 to 255, while the YCbCr format pixel values are in the range of 16 to 240. */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
177 OUTREG(SSTREAM_CONTROL_REG, tmp << 28 | (format << 24) |
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
178 ((((src_wc-1)<<1)-(dst_w-1)) & 0xfff));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
179 OUTREG(SSTREAM_STRETCH_REG,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
180 ((src_wc - 1) & 0x7ff) | (((src_wc - dst_w-1) & 0x7ff) << 16));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
181 OUTREG(SSTREAM_FBADDR0_REG, start & 0x3fffff );
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
182 OUTREG(SSTREAM_STRIDE_REG, pitch & 0xfff );
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
183 OUTREG(SSTREAM_START_REG, ((dst_x + 1) << 16) | (dst_y + 1));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
184 OUTREG(SSTREAM_WINDOW_SIZE_REG, ( ((dst_w-1) << 16) | (dst_h ) ) & 0x7ff07ff);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
185 OUTREG(K1_VSCALE_REG, src_hc - 1 );
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
186 OUTREG(K2_VSCALE_REG, (src_hc - dst_h) & 0x7ff );
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
187 /* 0xc000 = bw & vert interp */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
188 /* 0x8000 = no bw save */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
189 OUTREG(DDA_VERT_REG, (((~dst_h)-1) & 0xfff ) | 0xc000);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
190 writecrtc(0x92, (((pitch + 7) / 8) >> 8) | 0x80);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
191 writecrtc(0x93, (pitch + 7) / 8);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
192
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
193 writecrtc(0x67, readcrtc(0x67) | 0x4);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
194
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
195 disable(&v);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
196
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
197 return offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
198 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
199
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
200 void yuv_off() {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
201 vga_t v;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
202
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
203 enable(&v);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
204
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
205 writecrtc(0x67, readcrtc(0x67) & ~0xc);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
206 memset(v.mmio + 0x8180, 0, 0x80);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
207 OUTREG(0x81b8, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
208 OUTREG(0x81bc, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
209 OUTREG(0x81c8, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
210 OUTREG(0x81cc, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
211 OUTREG(0x81d8, 0x1);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
212 OUTREG(0x81f8, 0x07ff07ff);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
213 OUTREG(0x81fc, 0x00010001);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
214 writecrtc(0x92, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
215 writecrtc(0x93, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
216 disable(&v);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
217 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
218
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
219 static int preinit(const char *arg)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
220 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
221 char *name;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
222
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
223 if(arg)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
224 name = (char*)arg;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
225 else if(!(name = getenv("FRAMEBUFFER")))
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
226 name = "/dev/fb0";
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
227
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
228 if((fd = open(name, O_RDWR)) == -1) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
229 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: can't open %s: %s\n", name, strerror(errno));
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
230 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
231 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
232
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
233 if(ioctl(fd, FBIOGET_FSCREENINFO, &fb_finfo)) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
234 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: problem with FBITGET_FSCREENINFO ioctl: %s\n",
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
235 strerror(errno));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
236 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
237 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
238 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
239 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
240
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
241 if(ioctl(fd, FBIOGET_VSCREENINFO, &fb_vinfo)) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
242 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: problem with FBITGET_VSCREENINFO ioctl: %s\n",
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
243 strerror(errno));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
244 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
245 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
246 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
247 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
248
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
249 // Check the depth now as config() musn't fail
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
250 switch(fb_vinfo.bits_per_pixel) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
251 case 16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
252 case 24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
253 case 32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
254 break; // Ok
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
255 default:
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
256 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: %d bpp output is not supported\n", fb_vinfo.bits_per_pixel);
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
257 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
258 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
259 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
260 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
261
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
262 /* Open up a window to the hardware */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
263 smem = mmap(0, fb_finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
264 sreg = fb_finfo.smem_start;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
265
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
266 if((long)smem == -1) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
267 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: Couldn't map memory areas: %s\n", strerror(errno));
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
268 smem = NULL;
18553
f85b5c5d5d18 Remove dead code, and do close smem file descriptor during un-init
poirierg
parents: 18542
diff changeset
269 close(fd);
f85b5c5d5d18 Remove dead code, and do close smem file descriptor during un-init
poirierg
parents: 18542
diff changeset
270 fd = -1;
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
271 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
272 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
273
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
274 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
275 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
276
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
277 static void uninit(void)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
278 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
279 if (inpage0) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
280 clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
281 yuv_off();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
282 inpage0 = NULL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
283 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
284
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
285 /* And close our mess */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
286 if(smem) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
287 munmap(smem, fb_finfo.smem_len);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
288 smem = NULL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
289 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
290
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
291 if(fd != -1) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
292 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
293 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
294 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
295 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
296
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
297 static void clear_screen()
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
298 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
299 if (inpage0) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
300 int n;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
301
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
302 memset(smem, 0, screenheight * screenstride);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
303
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
304 if (in_format == IMGFMT_YUY2) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
305 unsigned short *ptr;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
306 int i;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
307
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
308 ptr = (unsigned short *)inpage0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
309 n = in_width * in_height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
310 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
311 n *= 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
312 for(i=0; i<n; i++)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
313 *ptr++ = 0x8000;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
314
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
315 } else {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
316 n = in_depth * in_width * in_height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
317 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
318 n *= 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
319 memset(inpage0, 0, n);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
320 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
321 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
322 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
323
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
324 /* Setup output screen dimensions etc */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
325 static void setup_screen(uint32_t full)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
326 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
327 int inpageoffset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
328
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
329 aspect(&vidwidth, &vidheight, full ? A_ZOOM : A_NOZOOM);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
330
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
331 // center picture
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
332 vidx = (screenwidth - vidwidth) / 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
333 vidy = (screenheight - vidheight) / 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
334
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
335 geometry(&vidx, &vidy, &vidwidth, &vidheight, screenwidth, screenheight);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
336 vo_fs = full;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
337
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
338 inpageoffset = yuv_on(in_s3_format, in_width, in_height, vidx, vidy, vidwidth, vidheight, 0, screenwidth, screenheight, screenstride, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
339 inpage0 = smem + inpageoffset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
340 inpage = inpage0;
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
341 mp_msg(MSGT_VO, MSGL_INFO, "s3fb: output is at %dx%d +%dx%d\n", vidx, vidy, vidwidth, vidheight);
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
342
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
343 clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
344 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
345
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
346 static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
347 uint32_t flags, char *title, uint32_t format)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
348 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
349 screenwidth = fb_vinfo.xres;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
350 screenheight = fb_vinfo.yres;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
351 screenstride = fb_finfo.line_length;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
352 aspect_save_screenres(fb_vinfo.xres,fb_vinfo.yres);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
353
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
354 in_width = width;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
355 in_height = height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
356 in_format = format;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
357 aspect_save_orig(width,height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
358
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
359 aspect_save_prescale(d_width,d_height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
360
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
361 /* Setup the screen for rendering to */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
362 screendepth = fb_vinfo.bits_per_pixel / 8;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
363
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
364 switch(in_format) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
365
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
366 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
367 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
368 in_s3_format = 1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
369 alpha_func = vo_draw_alpha_yuy2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
370 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
371
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
372 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
373 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
374 in_s3_format = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
375 alpha_func = vo_draw_alpha_rgb16;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
376 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
377
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
378 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
379 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
380 in_s3_format = 5;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
381 alpha_func = vo_draw_alpha_rgb16;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
382 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
383
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
384 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
385 in_depth = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
386 in_s3_format = 6;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
387 alpha_func = vo_draw_alpha_rgb24;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
388 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
389
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
390 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
391 in_depth = 4;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
392 in_s3_format = 7;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
393 alpha_func = vo_draw_alpha_rgb32;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
394 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
395
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
396 default:
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
397 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: Eik! Something's wrong with control().\n");
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
398 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
399 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
400
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
401 offset = in_width * in_depth * in_height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
402 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
403 page = offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
404 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
405 page = 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
406
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
407 if(screenheight * screenstride + page + offset > fb_finfo.smem_len) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
408 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: Not enough video memory to play this movie. Try at a lower resolution\n");
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
409 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
410 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
411
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
412 setup_screen(flags & VOFLAG_FULLSCREEN);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
413 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
414 inpage = inpage0 + page;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
415
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
416 mp_msg(MSGT_VO, MSGL_INFO, "s3fb: screen is %dx%d at %d bpp, in is %dx%d at %d bpp, norm is %dx%d\n",
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
417 screenwidth, screenheight, screendepth * 8,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
418 in_width, in_height, in_depth * 8,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
419 d_width, d_height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
420
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
421 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
422 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
423
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
424 static void draw_alpha(int x, int y, int w, int h, unsigned char *src,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
425 unsigned char *srca, int stride)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
426 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
427 char *dst = inpage + (y * in_width + x) * in_depth;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
428 alpha_func(w, h, src, srca, stride, dst, in_width * in_depth);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
429 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
430
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
431 static void draw_osd(void)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
432 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
433 if (!vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
434 vo_draw_text(in_width, in_height, draw_alpha);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
435 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
436
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
437 /* Render onto the screen */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
438 static void flip_page(void)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
439 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
440 if(vo_doublebuffering) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
441 vo_draw_text(in_width, in_height, draw_alpha);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
442 yuv_on(in_s3_format, in_width, in_height, vidx, vidy, vidwidth, vidheight, 0, screenwidth, screenheight, screenstride, page);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
443 page ^= offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
444 inpage = inpage0 + page;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
445 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
446 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
447
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
448 static int draw_frame(uint8_t *src[])
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
449 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
450 mem2agpcpy(inpage, src[0], in_width * in_depth * in_height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
451 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
452 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
453
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
454 static int draw_slice(uint8_t *i[], int s[], int w, int h, int x, int y)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
455 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
456 return 1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
457 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
458
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
459 /* Attempt to start doing DR */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
460 static uint32_t get_image(mp_image_t *mpi)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
461 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
462
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
463 if(mpi->flags & MP_IMGFLAG_READABLE)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
464 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
465 if(mpi->type == MP_IMGTYPE_STATIC && vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
466 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
467 if(mpi->type > MP_IMGTYPE_TEMP)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
468 return VO_FALSE; // TODO ??
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
469
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
470 switch(in_format) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
471 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
472 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
473 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
474 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
475 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
476 mpi->planes[0] = inpage;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
477 mpi->stride[0] = in_width * in_depth;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
478 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
479
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
480 default:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
481 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
482 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
483
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
484 mpi->width = in_width;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
485 mpi->flags |= MP_IMGFLAG_DIRECT;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
486
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
487 return VO_TRUE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
488 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
489
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
490 static int control(uint32_t request, void *data, ...)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
491 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
492 switch(request) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
493 case VOCTRL_GET_IMAGE:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
494 return get_image(data);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
495
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
496 case VOCTRL_QUERY_FORMAT:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
497 switch(*((uint32_t*)data)) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
498 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
499 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
500 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
501 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
502 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
503 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW |
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
504 VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
505 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
506
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
507 return 0; /* Not supported */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
508
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
509 case VOCTRL_FULLSCREEN:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
510 setup_screen(!vo_fs);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
511 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
512 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
513
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
514 return VO_NOTIMPL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
515 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
516
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
517 /* Dummy funcs */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
518 static void check_events(void) {}