annotate libvo/vo_s3fb.c @ 26227:85c37eab722b

Make FFmpeg mpeg1/2 decoder the default over libmpeg2
author reimar
date Mon, 17 Mar 2008 20:15:22 +0000
parents c9e9ac2008c2
children d97a607821f1
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
25216
3aee342be929 Make vo info structs const
reimar
parents: 24250
diff changeset
32 static const vo_info_t info =
18535
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
25220
c9e9ac2008c2 Mark the vo_functions_t definitions as const where possible.
reimar
parents: 25216
diff changeset
40 const LIBVO_EXTERN(s3fb)
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
41
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
42 typedef struct vga_type {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
43 int cr38, cr39, cr53;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
44 unsigned char *mmio;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
45 } vga_t;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
46
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
47 static vga_t *v = NULL;
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
48 static int fd = -1;
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
49 static struct fb_fix_screeninfo fb_finfo;
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
50 static struct fb_var_screeninfo fb_vinfo;
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
51 static uint32_t in_width, in_height, in_format, in_depth, in_s3_format,
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
52 screenwidth, screenheight, screendepth, screenstride,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
53 vidwidth, vidheight, vidx, vidy, page, offset, sreg;
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
54 static char *inpage, *inpage0, *smem = NULL;
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
55 static void (*alpha_func)();
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
56
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
57 static void clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
58
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
59 /* streams registers */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
60 #define PSTREAM_CONTROL_REG 0x8180
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
61 #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
62 #define SSTREAM_CONTROL_REG 0x8190
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
63 #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
64 #define SSTREAM_STRETCH_REG 0x8198
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
65 #define BLEND_CONTROL_REG 0x81A0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
66 #define PSTREAM_FBADDR0_REG 0x81C0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
67 #define PSTREAM_FBADDR1_REG 0x81C4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
68 #define PSTREAM_STRIDE_REG 0x81C8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
69 #define DOUBLE_BUFFER_REG 0x81CC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
70 #define SSTREAM_FBADDR0_REG 0x81D0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
71 #define SSTREAM_FBADDR1_REG 0x81D4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
72 #define SSTREAM_STRIDE_REG 0x81D8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
73 #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
74 #define K1_VSCALE_REG 0x81E0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
75 #define K2_VSCALE_REG 0x81E4
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
76 #define DDA_VERT_REG 0x81E8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
77 #define STREAMS_FIFO_REG 0x81EC
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
78 #define PSTREAM_START_REG 0x81F0
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
79 #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
80 #define SSTREAM_START_REG 0x81F8
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
81 #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
82
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
83 #define S3_MEMBASE sreg
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
84 #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
85 #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
86 #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
87 #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
88
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
89 #define OUTREG(mmreg, value) *(unsigned int *)(&v->mmio[mmreg]) = value
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
90
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
91 int readcrtc(int reg) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
92 outb(reg, 0x3d4);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
93 return inb(0x3d5);
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
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
96 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
97 outb(reg, 0x3d4);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
98 outb(value, 0x3d5);
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
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
101 // enable S3 registers
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
102 int enable() {
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
103 int fd;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
104
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
105 if (v)
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
106 return 1;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
107 errno = 0;
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18692
diff changeset
108 v = malloc(sizeof(vga_t));
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
109 if (v) {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
110 if (ioperm(0x3d4, 2, 1) == 0) {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
111 fd = open("/dev/mem", O_RDWR);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
112 if (fd != -1) {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
113 v->mmio = mmap(0, S3_NEWMMIO_REGSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
114 S3_MEMBASE + S3_NEWMMIO_REGBASE);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
115 close(fd);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
116 if (v->mmio != MAP_FAILED) {
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
117 v->cr38 = readcrtc(0x38);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
118 v->cr39 = readcrtc(0x39);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
119 v->cr53 = readcrtc(0x53);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
120 writecrtc(0x38, 0x48);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
121 writecrtc(0x39, 0xa5);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
122 writecrtc(0x53, 0x08);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
123 return 1;
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
124 }
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
125 }
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
126 iopl(0);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
127 }
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
128 free(v);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
129 v = NULL;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
130 }
24250
d8b1ae2c164a warning fix:
diego
parents: 18878
diff changeset
131 return 0;
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
132 }
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
133
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
134 void disable() {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
135 if (v) {
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
136 writecrtc(0x53, v->cr53);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
137 writecrtc(0x39, v->cr39);
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
138 writecrtc(0x38, v->cr38);
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
139 ioperm(0x3d4, 2, 0);
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
140 munmap(v->mmio, S3_NEWMMIO_REGSIZE);
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
141 free(v);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
142 v = NULL;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
143 }
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
144 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
145
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
146 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
147 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
148
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
149 if (format == 0 || format == 7)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
150 bpp = 4;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
151 else if (format == 6)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
152 bpp = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
153 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
154 bpp = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
155
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
156 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
157 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
158 pitch = src_w * bpp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
159
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
160 // video card memory layout:
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
161 // 0-n: visible screen memory, n = width * height * bytes per pixel
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
162 // 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
163 // 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
164
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
165 // 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
166 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
167 offset += tmp;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
168
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
169 // 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
170 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
171
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
172 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
173 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
174 OUTREG(BLEND_CONTROL_REG, 0x00000020);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
175 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
176 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
177
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
178 OUTREG(PSTREAM_CONTROL_REG, 0x06000000);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
179 OUTREG(PSTREAM_FBADDR0_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
180 OUTREG(PSTREAM_FBADDR1_REG, 0x0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
181 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
182 OUTREG(PSTREAM_START_REG, 0x00010001);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
183 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
184 //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
185
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
186 if (dst_w == src_w)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
187 tmp = 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
188 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
189 tmp = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
190 /* 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
191 /* 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
192 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
193 ((((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
194 OUTREG(SSTREAM_STRETCH_REG,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
195 ((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
196 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
197 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
198 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
199 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
200 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
201 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
202 /* 0xc000 = bw & vert interp */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
203 /* 0x8000 = no bw save */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
204 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
205 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
206 writecrtc(0x93, (pitch + 7) / 8);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
207
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
208 writecrtc(0x67, readcrtc(0x67) | 0x4);
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
209
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
210 return offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
211 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
212
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
213 void yuv_off() {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
214 writecrtc(0x67, readcrtc(0x67) & ~0xc);
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
215 memset(v->mmio + 0x8180, 0, 0x80);
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
216 OUTREG(0x81b8, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
217 OUTREG(0x81bc, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
218 OUTREG(0x81c8, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
219 OUTREG(0x81cc, 0x900);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
220 OUTREG(0x81d8, 0x1);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
221 OUTREG(0x81f8, 0x07ff07ff);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
222 OUTREG(0x81fc, 0x00010001);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
223 writecrtc(0x92, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
224 writecrtc(0x93, 0);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
225 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
226
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
227 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
228 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
229 char *name;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
230
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
231 if(arg)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
232 name = (char*)arg;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
233 else if(!(name = getenv("FRAMEBUFFER")))
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
234 name = "/dev/fb0";
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
235
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
236 if((fd = open(name, O_RDWR)) == -1) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
237 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
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_FSCREENINFO, &fb_finfo)) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
242 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
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 if(ioctl(fd, FBIOGET_VSCREENINFO, &fb_vinfo)) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
250 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
251 strerror(errno));
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
252 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
253 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
254 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
255 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
256
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
257 // 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
258 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
259 case 16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
260 case 24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
261 case 32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
262 break; // Ok
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
263 default:
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
264 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
265 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
266 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
267 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
268 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
269
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
270 /* 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
271 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
272 sreg = fb_finfo.smem_start;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
273
18692
9a3d768cb8da Fix a condition as suggested by Rich.
gpoirier
parents: 18691
diff changeset
274 if(smem == (void *)-1) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
275 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
276 smem = NULL;
18553
f85b5c5d5d18 Remove dead code, and do close smem file descriptor during un-init
poirierg
parents: 18542
diff changeset
277 close(fd);
f85b5c5d5d18 Remove dead code, and do close smem file descriptor during un-init
poirierg
parents: 18542
diff changeset
278 fd = -1;
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
279 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
280 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
281
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
282 if (!enable()) {
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
283 mp_msg(MSGT_VO, MSGL_FATAL, "s3fb: Couldn't map S3 registers: %s\n", strerror(errno));
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
284 close(fd);
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
285 fd = -1;
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
286 return -1;
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
287 }
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
288
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
289 return 0; // Success
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
290 }
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
291
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
292 /* And close our mess */
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
293 static void uninit(void)
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 if (inpage0) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
296 clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
297 yuv_off();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
298 inpage0 = NULL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
299 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
300
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
301 if(smem) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
302 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
303 smem = NULL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
304 }
18691
b08913965b6a cosmetics
gpoirier
parents: 18690
diff changeset
305
18690
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
306 disable();
f31c0f34db76 Fixes suggested by Ivo, and failure under non-root operation improved. Original patch by Mark Sanderson < mmp AH kiora P ath P cx > (reworked a bit to try to meet out commit policy).
gpoirier
parents: 18553
diff changeset
307
18535
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
308 if(fd != -1) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
309 close(fd);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
310 fd = -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
311 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
312 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
313
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
314 static void clear_screen()
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
315 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
316 if (inpage0) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
317 int n;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
318
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
319 memset(smem, 0, screenheight * screenstride);
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 if (in_format == IMGFMT_YUY2) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
322 unsigned short *ptr;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
323 int i;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
324
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
325 ptr = (unsigned short *)inpage0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
326 n = in_width * in_height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
327 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
328 n *= 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
329 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
330 *ptr++ = 0x8000;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
331
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
332 } else {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
333 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
334 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
335 n *= 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
336 memset(inpage0, 0, n);
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 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
339 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
340
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
341 /* Setup output screen dimensions etc */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
342 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
343 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
344 int inpageoffset;
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 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
347
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
348 // center picture
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
349 vidx = (screenwidth - vidwidth) / 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
350 vidy = (screenheight - vidheight) / 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
351
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
352 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
353 vo_fs = full;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
354
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
355 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
356 inpage0 = smem + inpageoffset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
357 inpage = inpage0;
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
358 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
359
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
360 clear_screen();
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
361 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
362
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
363 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
364 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
365 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
366 screenwidth = fb_vinfo.xres;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
367 screenheight = fb_vinfo.yres;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
368 screenstride = fb_finfo.line_length;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
369 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
370
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
371 in_width = width;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
372 in_height = height;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
373 in_format = format;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
374 aspect_save_orig(width,height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
375
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
376 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
377
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
378 /* 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
379 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
380
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
381 switch(in_format) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
382
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
383 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
384 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
385 in_s3_format = 1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
386 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
387 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
388
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
389 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
390 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
391 in_s3_format = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
392 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
393 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
394
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
395 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
396 in_depth = 2;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
397 in_s3_format = 5;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
398 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
399 break;
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 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
402 in_depth = 3;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
403 in_s3_format = 6;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
404 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
405 break;
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 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
408 in_depth = 4;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
409 in_s3_format = 7;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
410 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
411 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
412
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
413 default:
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
414 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
415 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
416 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
417
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
418 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
419 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
420 page = offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
421 else
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
422 page = 0;
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 if(screenheight * screenstride + page + offset > fb_finfo.smem_len) {
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
425 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
426 return -1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
427 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
428
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
429 setup_screen(flags & VOFLAG_FULLSCREEN);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
430 if (vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
431 inpage = inpage0 + page;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
432
18542
497803ff6b9c use mp_msg instead of printf
ivo
parents: 18541
diff changeset
433 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
434 screenwidth, screenheight, screendepth * 8,
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
435 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
436 d_width, d_height);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
437
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
438 return 0;
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
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
441 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
442 unsigned char *srca, int stride)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
443 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
444 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
445 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
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 void draw_osd(void)
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 if (!vo_doublebuffering)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
451 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
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 /* Render onto the screen */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
455 static void flip_page(void)
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
456 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
457 if(vo_doublebuffering) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
458 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
459 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
460 page ^= offset;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
461 inpage = inpage0 + page;
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 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
464
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
465 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
466 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
467 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
468 return 0;
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
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
471 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
472 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
473 return 1;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
474 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
475
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
476 /* Attempt to start doing DR */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
477 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
478 {
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 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
481 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
482 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
483 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
484 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
485 return VO_FALSE; // TODO ??
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 switch(in_format) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
488 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
489 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
490 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
491 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
492 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
493 mpi->planes[0] = inpage;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
494 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
495 break;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
496
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
497 default:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
498 return VO_FALSE;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
499 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
500
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
501 mpi->width = in_width;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
502 mpi->flags |= MP_IMGFLAG_DIRECT;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
503
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
504 return VO_TRUE;
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 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
508 {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
509 switch(request) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
510 case VOCTRL_GET_IMAGE:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
511 return get_image(data);
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 case VOCTRL_QUERY_FORMAT:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
514 switch(*((uint32_t*)data)) {
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
515 case IMGFMT_BGR15:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
516 case IMGFMT_BGR16:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
517 case IMGFMT_BGR24:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
518 case IMGFMT_BGR32:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
519 case IMGFMT_YUY2:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
520 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
521 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
522 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
523
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
524 return 0; /* Not supported */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
525
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
526 case VOCTRL_FULLSCREEN:
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
527 setup_screen(!vo_fs);
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
528 return 0;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
529 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
530
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
531 return VO_NOTIMPL;
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
532 }
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
533
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
534 /* Dummy funcs */
8e92dd0ff93a Add YUY2 and back end scaling on S3 Virge chips in combination with fbdev.
gpoirier
parents:
diff changeset
535 static void check_events(void) {}