annotate vidix/mach64_vid.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents b451fd2b2520
children e8af7338a462
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1 /*
23046
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
2 * VIDIX driver for ATI Mach64 and 3DRage chipsets.
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
3 * Copyright (C) 2002 Nick Kurshev
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
4 *
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
5 * This file is part of MPlayer.
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
6 *
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
7 * MPlayer is free software; you can redistribute it and/or modify
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
8 * it under the terms of the GNU General Public License as published by
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
10 * (at your option) any later version.
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
11 *
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
12 * MPlayer is distributed in the hope that it will be useful,
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
15 * GNU General Public License for more details.
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
16 *
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
17 * You should have received a copy of the GNU General Public License
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
18 * along with MPlayer; if not, write to the Free Software
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
20 *
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
21 * This file is based on sources from
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
22 * GATOS (gatos.sf.net) and X11 (www.xfree86.org)
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
23 */
82216ef041e0 updated vidix files headers whenever it's possible to have a clear GPL statement
ben
parents: 22905
diff changeset
24
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
25 #include <errno.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
26 #include <stdio.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
27 #include <stdlib.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
28 #include <string.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
29 #include <math.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
30 #include <inttypes.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
31 #include <fcntl.h>
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
32
22905
f34e5d778267 consistent include paths for config.h et al.
diego
parents: 22901
diff changeset
33 #include "config.h"
f34e5d778267 consistent include paths for config.h et al.
diego
parents: 22901
diff changeset
34 #include "libavutil/common.h"
f34e5d778267 consistent include paths for config.h et al.
diego
parents: 22901
diff changeset
35 #include "mpbswap.h"
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
36 #include "vidix.h"
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
37 #include "vidixlib.h"
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
38 #include "fourcc.h"
22901
a7605669b114 renamed libdha.[hc] to dha.[hc]
ben
parents: 22900
diff changeset
39 #include "dha.h"
22900
a9e111b88c4a merged libdha and libvidix, moved all files from libdha to vidix directory
ben
parents: 22858
diff changeset
40 #include "pci_ids.h"
a9e111b88c4a merged libdha and libvidix, moved all files from libdha to vidix directory
ben
parents: 22858
diff changeset
41 #include "pci_names.h"
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
42
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
43 #include "mach64.h"
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
44
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
45 #define UNUSED(x) ((void)(x)) /**< Removes warning about unused arguments */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
46
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
47 static void *mach64_mmio_base = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
48 static void *mach64_mem_base = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
49 static int32_t mach64_overlay_offset = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
50 static uint32_t mach64_ram_size = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
51 static uint32_t mach64_buffer_base[10][3];
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
52 static int num_mach64_buffers=-1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
53 static int supports_planar=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
54 static int supports_lcd_v_stretch=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
55
23053
a74bda857a3c declare variable as static
ben
parents: 23048
diff changeset
56 static pciinfo_t pci_info;
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
57 static int probed = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
58 static int __verbose = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
59
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
60 #define VERBOSE_LEVEL 1
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
61
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
62 typedef struct bes_registers_s
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
63 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
64 /* base address of yuv framebuffer */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
65 uint32_t yuv_base;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
66 uint32_t fourcc;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
67 /* YUV BES registers */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
68 uint32_t reg_load_cntl;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
69 uint32_t scale_inc;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
70 uint32_t y_x_start;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
71 uint32_t y_x_end;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
72 uint32_t vid_buf_pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
73 uint32_t height_width;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
74
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
75 uint32_t scale_cntl;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
76 uint32_t exclusive_horz;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
77 uint32_t auto_flip_cntl;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
78 uint32_t filter_cntl;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
79 uint32_t key_cntl;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
80 uint32_t test;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
81 /* Configurable stuff */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
82
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
83 int brightness;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
84 int saturation;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
85
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
86 int ckey_on;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
87 uint32_t graphics_key_clr;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
88 uint32_t graphics_key_msk;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
89
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
90 int deinterlace_on;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
91 uint32_t deinterlace_pattern;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
92
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
93 } bes_registers_t;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
94
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
95 static bes_registers_t besr;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
96
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
97 typedef struct video_registers_s
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
98 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
99 const char * sname;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
100 uint32_t name;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
101 uint32_t value;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
102 }video_registers_t;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
103
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
104 /* Graphic keys */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
105 static vidix_grkey_t mach64_grkey;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
106
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
107 #define DECLARE_VREG(name) { #name, name, 0 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
108 static video_registers_t vregs[] =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
109 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
110 DECLARE_VREG(OVERLAY_SCALE_INC),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
111 DECLARE_VREG(OVERLAY_Y_X_START),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
112 DECLARE_VREG(OVERLAY_Y_X_END),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
113 DECLARE_VREG(OVERLAY_SCALE_CNTL),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
114 DECLARE_VREG(OVERLAY_EXCLUSIVE_HORZ),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
115 DECLARE_VREG(OVERLAY_EXCLUSIVE_VERT),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
116 DECLARE_VREG(OVERLAY_TEST),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
117 DECLARE_VREG(SCALER_BUF_PITCH),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
118 DECLARE_VREG(SCALER_HEIGHT_WIDTH),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
119 DECLARE_VREG(SCALER_BUF0_OFFSET),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
120 DECLARE_VREG(SCALER_BUF0_OFFSET_U),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
121 DECLARE_VREG(SCALER_BUF0_OFFSET_V),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
122 DECLARE_VREG(SCALER_BUF1_OFFSET),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
123 DECLARE_VREG(SCALER_BUF1_OFFSET_U),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
124 DECLARE_VREG(SCALER_BUF1_OFFSET_V),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
125 DECLARE_VREG(SCALER_H_COEFF0),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
126 DECLARE_VREG(SCALER_H_COEFF1),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
127 DECLARE_VREG(SCALER_H_COEFF2),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
128 DECLARE_VREG(SCALER_H_COEFF3),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
129 DECLARE_VREG(SCALER_H_COEFF4),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
130 DECLARE_VREG(SCALER_COLOUR_CNTL),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
131 DECLARE_VREG(SCALER_THRESHOLD),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
132 DECLARE_VREG(VIDEO_FORMAT),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
133 DECLARE_VREG(VIDEO_CONFIG),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
134 DECLARE_VREG(VIDEO_SYNC_TEST),
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
135 DECLARE_VREG(VIDEO_SYNC_TEST_B)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
136 };
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
137
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
138 /* have to restore it on exit */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
139 static uint32_t SAVED_OVERLAY_GRAPHICS_KEY_CLR;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
140
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
141 /* VIDIX exports */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
142
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
143 /* MMIO space*/
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
144 #define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ))))
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
145 #define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
146
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
147 #define INREG8(addr) GETREG(uint8_t,(uint8_t *)mach64_mmio_base,((addr)^0x100)<<2)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
148 #define OUTREG8(addr,val) SETREG(uint8_t,(uint8_t *)mach64_mmio_base,((addr)^0x100)<<2,val)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
149
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
150 static inline uint32_t INREG (uint32_t addr) {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
151 uint32_t tmp = GETREG(uint32_t,(uint8_t *)mach64_mmio_base,((addr)^0x100)<<2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
152 return le2me_32(tmp);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
153 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
154 #define OUTREG(addr,val) SETREG(uint32_t,(uint8_t *)mach64_mmio_base,((addr)^0x100)<<2,le2me_32(val))
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
155
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
156 #define OUTREGP(addr,val,mask) \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
157 do { \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
158 unsigned int _tmp = INREG(addr); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
159 _tmp &= (mask); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
160 _tmp |= (val); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
161 OUTREG(addr, _tmp); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
162 } while (0)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
163
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
164 static __inline__ int ATIGetMach64LCDReg(int _Index)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
165 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
166 OUTREG8(LCD_INDEX, _Index);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
167 return INREG(LCD_DATA);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
168 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
169
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
170 static __inline__ uint32_t INPLL(uint32_t addr)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
171 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
172 uint32_t res;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
173 uint32_t in;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
174
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
175 in= INREG(CLOCK_CNTL);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
176 in &= ~((PLL_WR_EN | PLL_ADDR)); //clean some stuff
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
177 OUTREG(CLOCK_CNTL, in | (addr<<10));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
178
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
179 /* read the register value */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
180 res = (INREG(CLOCK_CNTL)>>16)&0xFF;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
181 return res;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
182 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
183
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
184 static __inline__ void OUTPLL(uint32_t addr,uint32_t val)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
185 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
186 //FIXME buggy but its not used
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
187 /* write addr byte */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
188 OUTREG8(CLOCK_CNTL + 1, (addr << 2) | PLL_WR_EN);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
189 /* write the register value */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
190 OUTREG(CLOCK_CNTL + 2, val);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
191 OUTREG8(CLOCK_CNTL + 1, (addr << 2) & ~PLL_WR_EN);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
192 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
193
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
194 #define OUTPLLP(addr,val,mask) \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
195 do { \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
196 unsigned int _tmp = INPLL(addr); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
197 _tmp &= (mask); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
198 _tmp |= (val); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
199 OUTPLL(addr, _tmp); \
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
200 } while (0)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
201
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
202 static void mach64_fifo_wait(unsigned n)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
203 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
204 while ((INREG(FIFO_STAT) & 0xffff) > ((uint32_t)(0x8000 >> n)));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
205 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
206
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
207 static void mach64_wait_for_idle( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
208 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
209 mach64_fifo_wait(16);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
210 while ((INREG(GUI_STAT) & 1)!= 0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
211 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
212
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
213 static void mach64_wait_vsync( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
214 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
215 int i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
216
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
217 for(i=0; i<2000000; i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
218 if( (INREG(CRTC_INT_CNTL)&CRTC_VBLANK)==0 ) break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
219 for(i=0; i<2000000; i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
220 if( (INREG(CRTC_INT_CNTL)&CRTC_VBLANK) ) break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
221
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
222 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
223
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
224 static vidix_capability_t mach64_cap =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
225 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
226 "BES driver for Mach64/3DRage cards",
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
227 "Nick Kurshev and Michael Niedermayer",
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
228 TYPE_OUTPUT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
229 { 0, 0, 0, 0 },
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
230 2048,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
231 2048,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
232 4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
233 4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
234 -1,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
235 FLAG_UPSCALER|FLAG_DOWNSCALER,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
236 VENDOR_ATI,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
237 -1,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
238 { 0, 0, 0, 0 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
239 };
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
240
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
241 static uint32_t mach64_vid_get_dbpp( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
242 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
243 uint32_t dbpp,retval;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
244 dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0x7;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
245 switch(dbpp)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
246 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
247 case 1: retval = 4; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
248 case 2: retval = 8; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
249 case 3: retval = 15; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
250 case 4: retval = 16; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
251 case 5: retval = 24; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
252 default: retval=32; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
253 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
254 return retval;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
255 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
256
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
257 static int mach64_is_dbl_scan( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
258 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
259 return INREG(CRTC_GEN_CNTL) & CRTC_DBL_SCAN_EN;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
260 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
261
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
262 static int mach64_is_interlace( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
263 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
264 return INREG(CRTC_GEN_CNTL) & CRTC_INTERLACE_EN;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
265 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
266
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
267 static uint32_t mach64_get_xres( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
268 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
269 /* FIXME: currently we extract that from CRTC!!!*/
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
270 uint32_t xres,h_total;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
271 h_total = INREG(CRTC_H_TOTAL_DISP);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
272 xres = (h_total >> 16) & 0xffff;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
273 return (xres + 1)*8;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
274 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
275
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
276 static uint32_t mach64_get_yres( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
277 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
278 /* FIXME: currently we extract that from CRTC!!!*/
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
279 uint32_t yres,v_total;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
280 v_total = INREG(CRTC_V_TOTAL_DISP);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
281 yres = (v_total >> 16) & 0xffff;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
282 return yres + 1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
283 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
284
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
285 // returns the verical stretch factor in 16.16
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
286 static int mach64_get_vert_stretch(void)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
287 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
288 int lcd_index;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
289 int vert_stretching;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
290 int ext_vert_stretch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
291 int ret;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
292 int yres= mach64_get_yres();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
293
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
294 if(!supports_lcd_v_stretch){
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
295 if(__verbose>0) printf("[mach64] vertical stretching not supported\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
296 return 1<<16;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
297 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
298
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
299 lcd_index= INREG(LCD_INDEX);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
300
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
301 vert_stretching= ATIGetMach64LCDReg(LCD_VERT_STRETCHING);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
302 if(!(vert_stretching&VERT_STRETCH_EN)) ret= 1<<16;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
303 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
304 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
305 int panel_size;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
306
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
307 ext_vert_stretch= ATIGetMach64LCDReg(LCD_EXT_VERT_STRETCH);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
308 panel_size= (ext_vert_stretch&VERT_PANEL_SIZE)>>11;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
309 panel_size++;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
310
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
311 ret= ((yres<<16) + (panel_size>>1))/panel_size;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
312 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
313
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
314 // lcd_gen_ctrl = ATIGetMach64LCDReg(LCD_GEN_CNTL);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
315
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
316 OUTREG(LCD_INDEX, lcd_index);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
317
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
318 if(__verbose>0) printf("[mach64] vertical stretching factor= %d\n", ret);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
319
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
320 return ret;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
321 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
322
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
323 static void mach64_vid_make_default(void)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
324 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
325 mach64_fifo_wait(5);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
326 OUTREG(SCALER_COLOUR_CNTL,0x00101000);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
327
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
328 besr.ckey_on=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
329 besr.graphics_key_msk=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
330 besr.graphics_key_clr=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
331
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
332 OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
333 OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
334 OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
335
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
336 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
337
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
338 static void mach64_vid_dump_regs( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
339 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
340 size_t i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
341 printf("[mach64] *** Begin of DRIVER variables dump ***\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
342 printf("[mach64] mach64_mmio_base=%p\n",mach64_mmio_base);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
343 printf("[mach64] mach64_mem_base=%p\n",mach64_mem_base);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
344 printf("[mach64] mach64_overlay_off=%08X\n",mach64_overlay_offset);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
345 printf("[mach64] mach64_ram_size=%08X\n",mach64_ram_size);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
346 printf("[mach64] video mode: %ux%u@%u\n",mach64_get_xres(),mach64_get_yres(),mach64_vid_get_dbpp());
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
347 printf("[mach64] *** Begin of OV0 registers dump ***\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
348 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
349 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
350 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
351 printf("[mach64] %s = %08X\n",vregs[i].sname,INREG(vregs[i].name));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
352 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
353 printf("[mach64] *** End of OV0 registers dump ***\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
354 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
355
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
356
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
357 static unsigned short ati_card_ids[] =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
358 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
359 DEVICE_ATI_215CT_MACH64_CT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
360 DEVICE_ATI_210888CX_MACH64_CX,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
361 DEVICE_ATI_210888ET_MACH64_ET,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
362 DEVICE_ATI_MACH64_VT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
363 DEVICE_ATI_210888GX_MACH64_GX,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
364 DEVICE_ATI_264LT_MACH64_LT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
365 DEVICE_ATI_264VT_MACH64_VT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
366 DEVICE_ATI_264VT3_MACH64_VT3,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
367 DEVICE_ATI_264VT4_MACH64_VT4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
368 /**/
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
369 DEVICE_ATI_3D_RAGE_PRO,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
370 DEVICE_ATI_3D_RAGE_PRO2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
371 DEVICE_ATI_3D_RAGE_PRO3,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
372 DEVICE_ATI_3D_RAGE_PRO4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
373 DEVICE_ATI_RAGE_XC,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
374 DEVICE_ATI_RAGE_XL_AGP,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
375 DEVICE_ATI_RAGE_XC_AGP,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
376 DEVICE_ATI_RAGE_XL,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
377 DEVICE_ATI_3D_RAGE_PRO5,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
378 DEVICE_ATI_3D_RAGE_PRO6,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
379 DEVICE_ATI_RAGE_XL2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
380 DEVICE_ATI_RAGE_XC2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
381 DEVICE_ATI_3D_RAGE_I_II,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
382 DEVICE_ATI_3D_RAGE_II,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
383 DEVICE_ATI_3D_RAGE_IIC,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
384 DEVICE_ATI_3D_RAGE_IIC2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
385 DEVICE_ATI_3D_RAGE_IIC3,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
386 DEVICE_ATI_3D_RAGE_IIC4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
387 DEVICE_ATI_3D_RAGE_LT,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
388 DEVICE_ATI_3D_RAGE_LT2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
389 DEVICE_ATI_3D_RAGE_LT_G,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
390 DEVICE_ATI_3D_RAGE_LT3,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
391 DEVICE_ATI_RAGE_MOBILITY_P_M,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
392 DEVICE_ATI_RAGE_MOBILITY_L,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
393 DEVICE_ATI_3D_RAGE_LT4,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
394 DEVICE_ATI_3D_RAGE_LT5,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
395 DEVICE_ATI_RAGE_MOBILITY_P_M2,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
396 DEVICE_ATI_RAGE_MOBILITY_L2
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
397 };
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
398
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
399 static int find_chip(unsigned chip_id)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
400 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
401 unsigned i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
402 for(i = 0;i < sizeof(ati_card_ids)/sizeof(unsigned short);i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
403 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
404 if(chip_id == ati_card_ids[i]) return i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
405 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
406 return -1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
407 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
408
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
409 static int mach64_probe(int verbose,int force)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
410 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
411 pciinfo_t lst[MAX_PCI_DEVICES];
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
412 unsigned i,num_pci;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
413 int err;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
414 __verbose = verbose;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
415 err = pci_scan(lst,&num_pci);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
416 if(err)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
417 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
418 printf("[mach64] Error occurred during pci scan: %s\n",strerror(err));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
419 return err;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
420 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
421 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
422 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
423 err = ENXIO;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
424 for(i=0;i<num_pci;i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
425 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
426 if(lst[i].vendor == VENDOR_ATI)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
427 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
428 int idx;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
429 const char *dname;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
430 idx = find_chip(lst[i].device);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
431 if(idx == -1 && force == PROBE_NORMAL) continue;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
432 dname = pci_device_name(VENDOR_ATI,lst[i].device);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
433 dname = dname ? dname : "Unknown chip";
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
434 printf("[mach64] Found chip: %s\n",dname);
23167
2ab3eac7f6da synced with upstream vidix, prevented some drivers to work on some configs/archs
ben
parents: 23060
diff changeset
435 #if 0
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
436 if ((lst[i].command & PCI_COMMAND_IO) == 0)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
437 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
438 printf("[mach64] Device is disabled, ignoring\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
439 continue;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
440 }
23167
2ab3eac7f6da synced with upstream vidix, prevented some drivers to work on some configs/archs
ben
parents: 23060
diff changeset
441 #endif
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
442 if(force > PROBE_NORMAL)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
443 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
444 printf("[mach64] Driver was forced. Was found %sknown chip\n",idx == -1 ? "un" : "");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
445 if(idx == -1)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
446 printf("[mach64] Assuming it as Mach64\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
447 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
448 mach64_cap.device_id = lst[i].device;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
449 err = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
450 memcpy(&pci_info,&lst[i],sizeof(pciinfo_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
451 probed=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
452 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
453 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
454 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
455 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
456 if(err && verbose) printf("[mach64] Can't find chip\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
457 return err;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
458 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
459
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
460 static void reset_regs( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
461 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
462 size_t i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
463 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
464 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
465 mach64_fifo_wait(2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
466 OUTREG(vregs[i].name,0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
467 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
468 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
469
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
470
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
471 static int mach64_init(void)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
472 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
473 int err;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
474 if(!probed)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
475 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
476 printf("[mach64] Driver was not probed but is being initializing\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
477 return EINTR;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
478 }
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
479 if(__verbose>0) printf("[mach64] version %d\n", VIDIX_VERSION);
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
480
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
481 if((mach64_mmio_base = map_phys_mem(pci_info.base2,0x1000))==(void *)-1) return ENOMEM;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
482 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
483 mach64_ram_size = INREG(MEM_CNTL) & CTL_MEM_SIZEB;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
484 if (mach64_ram_size < 8) mach64_ram_size = (mach64_ram_size + 1) * 512;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
485 else if (mach64_ram_size < 12) mach64_ram_size = (mach64_ram_size - 3) * 1024;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
486 else mach64_ram_size = (mach64_ram_size - 7) * 2048;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
487 mach64_ram_size *= 0x400; /* KB -> bytes */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
488 if((mach64_mem_base = map_phys_mem(pci_info.base0,mach64_ram_size))==(void *)-1) return ENOMEM;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
489 memset(&besr,0,sizeof(bes_registers_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
490 printf("[mach64] Video memory = %uMb\n",mach64_ram_size/0x100000);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
491 err = mtrr_set_type(pci_info.base0,mach64_ram_size,MTRR_TYPE_WRCOMB);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
492 if(!err) printf("[mach64] Set write-combining type of video memory\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
493
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
494 /* save this */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
495 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
496 SAVED_OVERLAY_GRAPHICS_KEY_CLR = INREG(OVERLAY_GRAPHICS_KEY_CLR);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
497
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
498 /* check if planar formats are supported */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
499 supports_planar=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
500 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
501 mach64_fifo_wait(2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
502 if(INREG(SCALER_BUF0_OFFSET_U)) supports_planar=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
503 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
504 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
505 OUTREG(SCALER_BUF0_OFFSET_U, -1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
506
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
507 mach64_wait_vsync();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
508 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
509 mach64_fifo_wait(2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
510
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
511 if(INREG(SCALER_BUF0_OFFSET_U)) supports_planar=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
512 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
513 if(supports_planar) printf("[mach64] Planar YUV formats are supported :)\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
514 else printf("[mach64] Planar YUV formats are not supported :(\n");
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
515
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
516 if( mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_P_M
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
517 || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_P_M2
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
518 || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_L
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
519 || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_L2)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
520 supports_lcd_v_stretch=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
521 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
522 supports_lcd_v_stretch=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
523
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
524 reset_regs();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
525 mach64_vid_make_default();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
526
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
527 if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
528 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
529 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
530
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
531 static void mach64_destroy(void)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
532 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
533 /*restore this*/
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
534 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
535 OUTREG(OVERLAY_GRAPHICS_KEY_CLR,SAVED_OVERLAY_GRAPHICS_KEY_CLR);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
536
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
537 unmap_phys_mem(mach64_mem_base,mach64_ram_size);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
538 unmap_phys_mem(mach64_mmio_base,0x1000);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
539 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
540
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
541 static int mach64_get_caps(vidix_capability_t *to)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
542 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
543 memcpy(to, &mach64_cap, sizeof(vidix_capability_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
544 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
545 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
546
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
547 static unsigned mach64_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
548 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
549 unsigned pitch,spy,spv,spu;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
550 spy = spv = spu = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
551 switch(spitch->y)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
552 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
553 case 16:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
554 case 32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
555 case 64:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
556 case 128:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
557 case 256: spy = spitch->y; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
558 default: break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
559 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
560 switch(spitch->u)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
561 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
562 case 16:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
563 case 32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
564 case 64:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
565 case 128:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
566 case 256: spu = spitch->u; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
567 default: break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
568 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
569 switch(spitch->v)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
570 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
571 case 16:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
572 case 32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
573 case 64:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
574 case 128:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
575 case 256: spv = spitch->v; break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
576 default: break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
577 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
578 switch(fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
579 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
580 /* 4:2:0 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
581 case IMGFMT_IYUV:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
582 case IMGFMT_YV12:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
583 case IMGFMT_I420:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
584 if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
585 else pitch = 32;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
586 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
587 case IMGFMT_YVU9:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
588 if(spy > 32 && spu == spy/4 && spv == spy/4) pitch = spy;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
589 else pitch = 64;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
590 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
591 default:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
592 if(spy >= 16) pitch = spy;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
593 else pitch = 16;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
594 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
595 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
596 return pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
597 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
598
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
599 static void mach64_compute_framesize(vidix_playback_t *info)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
600 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
601 unsigned pitch,awidth;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
602 pitch = mach64_query_pitch(info->fourcc,&info->src.pitch);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
603 switch(info->fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
604 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
605 case IMGFMT_I420:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
606 case IMGFMT_YV12:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
607 case IMGFMT_IYUV:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
608 awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
609 info->frame_size = awidth*(info->src.h+info->src.h/2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
610 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
611 case IMGFMT_YVU9:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
612 awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
613 info->frame_size = awidth*(info->src.h+info->src.h/8);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
614 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
615 // case IMGFMT_RGB32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
616 case IMGFMT_BGR32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
617 awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
618 info->frame_size = (awidth*info->src.h);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
619 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
620 /* YUY2 YVYU, RGB15, RGB16 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
621 default:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
622 awidth = (info->src.w*2 + (pitch-1)) & ~(pitch-1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
623 info->frame_size = (awidth*info->src.h);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
624 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
625 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
626 info->frame_size+=256; // so we have some space for alignment & such
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
627 info->frame_size&=~16;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
628 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
629
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
630 static void mach64_vid_stop_video( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
631 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
632 mach64_fifo_wait(14);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
633 OUTREG(OVERLAY_SCALE_CNTL, 0x80000000);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
634 OUTREG(OVERLAY_EXCLUSIVE_HORZ, 0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
635 OUTREG(OVERLAY_EXCLUSIVE_VERT, 0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
636 OUTREG(SCALER_H_COEFF0, 0x00002000);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
637 OUTREG(SCALER_H_COEFF1, 0x0D06200D);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
638 OUTREG(SCALER_H_COEFF2, 0x0D0A1C0D);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
639 OUTREG(SCALER_H_COEFF3, 0x0C0E1A0C);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
640 OUTREG(SCALER_H_COEFF4, 0x0C14140C);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
641 OUTREG(VIDEO_FORMAT, 0xB000B);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
642 OUTREG(OVERLAY_TEST, 0x0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
643 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
644
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
645 static void mach64_vid_display_video( void )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
646 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
647 uint32_t vf;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
648 mach64_fifo_wait(14);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
649
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
650 OUTREG(OVERLAY_Y_X_START, besr.y_x_start);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
651 OUTREG(OVERLAY_Y_X_END, besr.y_x_end);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
652 OUTREG(OVERLAY_SCALE_INC, besr.scale_inc);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
653 OUTREG(SCALER_BUF_PITCH, besr.vid_buf_pitch);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
654 OUTREG(SCALER_HEIGHT_WIDTH, besr.height_width);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
655 OUTREG(SCALER_BUF0_OFFSET, mach64_buffer_base[0][0]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
656 OUTREG(SCALER_BUF0_OFFSET_U, mach64_buffer_base[0][1]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
657 OUTREG(SCALER_BUF0_OFFSET_V, mach64_buffer_base[0][2]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
658 OUTREG(SCALER_BUF1_OFFSET, mach64_buffer_base[0][0]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
659 OUTREG(SCALER_BUF1_OFFSET_U, mach64_buffer_base[0][1]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
660 OUTREG(SCALER_BUF1_OFFSET_V, mach64_buffer_base[0][2]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
661 mach64_wait_vsync();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
662
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
663 mach64_fifo_wait(4);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
664 OUTREG(OVERLAY_SCALE_CNTL, 0xC4000003);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
665 // OVERLAY_SCALE_CNTL bits & what they seem to affect
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
666 // bit 0 no effect
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
667 // bit 1 yuv2rgb coeff related
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
668 // bit 2 horizontal interpolation if 0
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
669 // bit 3 vertical interpolation if 0
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
670 // bit 4 chroma encoding (0-> 128=neutral / 1-> 0->neutral)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
671 // bit 5-6 gamma correction
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
672 // bit 7 nothing visible if set
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
673 // bit 8-27 no effect
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
674 // bit 28-31 nothing interresting just crashed my system when i played with them :(
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
675
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
676 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
677 vf = INREG(VIDEO_FORMAT);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
678
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
679 // Bits 16-19 seem to select the format
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
680 // 0x0 dunno behaves strange
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
681 // 0x1 dunno behaves strange
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
682 // 0x2 dunno behaves strange
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
683 // 0x3 BGR15
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
684 // 0x4 BGR16
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
685 // 0x5 BGR16 (hmm, that need investigation, 2 BGR16 formats, i guess 1 will have only 5bits for green)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
686 // 0x6 BGR32
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
687 // 0x7 BGR32 with somehow mixed even / odd pixels ?
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
688 // 0x8 YYYYUVUV
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
689 // 0x9 YVU9
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
690 // 0xA YV12
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
691 // 0xB YUY2
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
692 // 0xC UYVY
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
693 // 0xD UYVY (no difference is visible if i switch between C/D for every even/odd frame)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
694 // 0xE dunno behaves strange
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
695 // 0xF dunno behaves strange
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
696 // Bit 28 all values are assumed to be 7 bit with chroma=64 for black (tested with YV12 & YUY2)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
697 // the remaining bits seem to have no effect
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
698
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
699
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
700 switch(besr.fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
701 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
702 /* BGR formats */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
703 case IMGFMT_BGR15: OUTREG(VIDEO_FORMAT, 0x00030000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
704 case IMGFMT_BGR16: OUTREG(VIDEO_FORMAT, 0x00040000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
705 case IMGFMT_BGR32: OUTREG(VIDEO_FORMAT, 0x00060000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
706 /* 4:2:0 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
707 case IMGFMT_IYUV:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
708 case IMGFMT_I420:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
709 case IMGFMT_YV12: OUTREG(VIDEO_FORMAT, 0x000A0000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
710
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
711 case IMGFMT_YVU9: OUTREG(VIDEO_FORMAT, 0x00090000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
712 /* 4:2:2 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
713 case IMGFMT_YVYU:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
714 case IMGFMT_UYVY: OUTREG(VIDEO_FORMAT, 0x000C0000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
715 case IMGFMT_YUY2:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
716 default: OUTREG(VIDEO_FORMAT, 0x000B0000); break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
717 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
718 if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
719 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
720
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
721 static int mach64_vid_init_video( vidix_playback_t *config )
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
722 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
723 uint32_t src_w,src_h,dest_w,dest_h,pitch,h_inc,v_inc,left,leftUV,top,ecp,y_pos;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
724 int is_420,best_pitch,mpitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
725 int src_offset_y, src_offset_u, src_offset_v;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
726 unsigned int i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
727
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
728 mach64_vid_stop_video();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
729 /* warning, if left or top are != 0 this will fail, as the framesize is too small then */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
730 left = config->src.x;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
731 top = config->src.y;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
732 src_h = config->src.h;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
733 src_w = config->src.w;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
734 is_420 = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
735 if(config->fourcc == IMGFMT_YV12 ||
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
736 config->fourcc == IMGFMT_I420 ||
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
737 config->fourcc == IMGFMT_IYUV) is_420 = 1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
738 best_pitch = mach64_query_pitch(config->fourcc,&config->src.pitch);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
739 mpitch = best_pitch-1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
740 switch(config->fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
741 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
742 case IMGFMT_YVU9:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
743 /* 4:2:0 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
744 case IMGFMT_IYUV:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
745 case IMGFMT_YV12:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
746 case IMGFMT_I420: pitch = (src_w + mpitch) & ~mpitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
747 config->dest.pitch.y =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
748 config->dest.pitch.u =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
749 config->dest.pitch.v = best_pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
750 besr.vid_buf_pitch= pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
751 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
752 /* RGB 4:4:4:4 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
753 case IMGFMT_RGB32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
754 case IMGFMT_BGR32: pitch = (src_w*4 + mpitch) & ~mpitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
755 config->dest.pitch.y =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
756 config->dest.pitch.u =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
757 config->dest.pitch.v = best_pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
758 besr.vid_buf_pitch= pitch>>2;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
759 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
760 /* 4:2:2 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
761 default: /* RGB15, RGB16, YVYU, UYVY, YUY2 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
762 pitch = ((src_w*2) + mpitch) & ~mpitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
763 config->dest.pitch.y =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
764 config->dest.pitch.u =
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
765 config->dest.pitch.v = best_pitch;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
766 besr.vid_buf_pitch= pitch>>1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
767 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
768 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
769 dest_w = config->dest.w;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
770 dest_h = config->dest.h;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
771 besr.fourcc = config->fourcc;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
772 ecp = (INPLL(PLL_VCLK_CNTL) & PLL_ECP_DIV) >> 4;
23048
7973a6935234 removed useless code from vidix drivers
ben
parents: 23046
diff changeset
773
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
774 if(__verbose>0) printf("[mach64] ecp: %d\n", ecp);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
775 v_inc = src_h * mach64_get_vert_stretch();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
776
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
777 if(mach64_is_interlace()) v_inc<<=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
778 if(mach64_is_dbl_scan() ) v_inc>>=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
779 v_inc>>=4; // convert 16.16 -> 20.12
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
780 v_inc/= dest_h;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
781
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
782 h_inc = (src_w << (12+ecp)) / dest_w;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
783 /* keep everything in 16.16 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
784 config->offsets[0] = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
785 for(i=1; i<config->num_frames; i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
786 config->offsets[i] = config->offsets[i-1] + config->frame_size;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
787
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
788 /*FIXME the left / top stuff is broken (= zoom a src rectangle from a larger one)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
789 1. the framesize isn't known as the outer src rectangle dimensions aren't known
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
790 2. the mach64 needs aligned addresses so it can't work anyway
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
791 -> so we could shift the outer buffer to compensate that but that would mean
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
792 alignment problems for the code which writes into it
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
793 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
794
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
795 if(is_420)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
796 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
797 config->offset.y= 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
798 config->offset.u= (pitch*src_h + 15)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
799 config->offset.v= (config->offset.u + (pitch*src_h>>2) + 15)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
800
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
801 if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
802 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
803 uint32_t tmp;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
804 tmp = config->offset.u;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
805 config->offset.u = config->offset.v;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
806 config->offset.v = tmp;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
807 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
808
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
809 src_offset_y= config->offset.y + top*pitch + left;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
810 src_offset_u= config->offset.u + (top*pitch>>2) + (left>>1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
811 src_offset_v= config->offset.v + (top*pitch>>2) + (left>>1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
812 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
813 else if(besr.fourcc == IMGFMT_YVU9)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
814 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
815 config->offset.y= 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
816 config->offset.u= (pitch*src_h + 15)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
817 config->offset.v= (config->offset.u + (pitch*src_h>>4) + 15)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
818
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
819 src_offset_y= config->offset.y + top*pitch + left;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
820 src_offset_u= config->offset.u + (top*pitch>>4) + (left>>1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
821 src_offset_v= config->offset.v + (top*pitch>>4) + (left>>1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
822 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
823 else if(besr.fourcc == IMGFMT_BGR32)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
824 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
825 config->offset.y = config->offset.u = config->offset.v = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
826 src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 2);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
827 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
828 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
829 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
830 config->offset.y = config->offset.u = config->offset.v = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
831 src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 1);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
832 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
833
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
834 num_mach64_buffers= config->num_frames;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
835 for(i=0; i<config->num_frames; i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
836 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
837 mach64_buffer_base[i][0]= (mach64_overlay_offset + config->offsets[i] + src_offset_y)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
838 mach64_buffer_base[i][1]= (mach64_overlay_offset + config->offsets[i] + src_offset_u)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
839 mach64_buffer_base[i][2]= (mach64_overlay_offset + config->offsets[i] + src_offset_v)&~15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
840 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
841
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
842 leftUV = (left >> 17) & 15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
843 left = (left >> 16) & 15;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
844 besr.scale_inc = ( h_inc << 16 ) | v_inc;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
845 y_pos = config->dest.y;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
846 if(mach64_is_dbl_scan()) y_pos*=2;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
847 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
848 if(mach64_is_interlace()) y_pos/=2;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
849 besr.y_x_start = y_pos | (config->dest.x << 16);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
850 y_pos =config->dest.y + dest_h;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
851 if(mach64_is_dbl_scan()) y_pos*=2;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
852 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
853 if(mach64_is_interlace()) y_pos/=2;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
854 besr.y_x_end = y_pos | ((config->dest.x + dest_w) << 16);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
855 besr.height_width = ((src_w - left)<<16) | (src_h - top);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
856
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
857 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
858 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
859
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
860 static int is_supported_fourcc(uint32_t fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
861 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
862 switch(fourcc)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
863 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
864 case IMGFMT_YV12:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
865 case IMGFMT_I420:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
866 case IMGFMT_YVU9:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
867 case IMGFMT_IYUV:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
868 return supports_planar;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
869 case IMGFMT_YUY2:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
870 case IMGFMT_UYVY:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
871 case IMGFMT_BGR15:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
872 case IMGFMT_BGR16:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
873 case IMGFMT_BGR32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
874 return 1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
875 default:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
876 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
877 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
878 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
879
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
880 static int mach64_query_fourcc(vidix_fourcc_t *to)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
881 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
882 if(is_supported_fourcc(to->fourcc))
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
883 {
23060
91ad6d4d6a54 simplified depth definition
ben
parents: 23053
diff changeset
884 to->depth = VID_DEPTH_ALL;
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
885 to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
886 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
887 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
888 else to->depth = to->flags = 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
889 return ENOSYS;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
890 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
891
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
892 static int mach64_config_playback(vidix_playback_t *info)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
893 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
894 if(!is_supported_fourcc(info->fourcc)) return ENOSYS;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
895
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
896 mach64_compute_framesize(info);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
897
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
898 if(info->num_frames>4) info->num_frames=4;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
899 for(;info->num_frames>0; info->num_frames--)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
900 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
901 mach64_overlay_offset = mach64_ram_size - info->frame_size*info->num_frames;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
902 mach64_overlay_offset &= 0xffff0000;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
903 if(mach64_overlay_offset>0) break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
904 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
905 if(info->num_frames <= 0) return EINVAL;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
906
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
907 info->dga_addr = (char *)mach64_mem_base + mach64_overlay_offset;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
908 mach64_vid_init_video(info);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
909 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
910 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
911
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
912 static int mach64_playback_on(void)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
913 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
914 mach64_vid_display_video();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
915 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
916 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
917
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
918 static int mach64_playback_off(void)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
919 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
920 mach64_vid_stop_video();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
921 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
922 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
923
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
924 static int mach64_frame_sel(unsigned int frame)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
925 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
926 uint32_t off[6];
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
927 int i;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
928 int last_frame= (frame-1+num_mach64_buffers) % num_mach64_buffers;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
929 //printf("Selecting frame %d\n", frame);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
930 /*
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
931 buf3-5 always should point onto second buffer for better
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
932 deinterlacing and TV-in
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
933 */
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
934 if(num_mach64_buffers==1) return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
935
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
936 for(i=0; i<3; i++)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
937 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
938 off[i] = mach64_buffer_base[frame][i];
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
939 off[i+3]= mach64_buffer_base[last_frame][i];
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
940 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
941
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
942 mach64_wait_for_idle();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
943 mach64_fifo_wait(7);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
944
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
945 OUTREG(SCALER_BUF0_OFFSET, off[0]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
946 OUTREG(SCALER_BUF0_OFFSET_U, off[1]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
947 OUTREG(SCALER_BUF0_OFFSET_V, off[2]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
948 OUTREG(SCALER_BUF1_OFFSET, off[3]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
949 OUTREG(SCALER_BUF1_OFFSET_U, off[4]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
950 OUTREG(SCALER_BUF1_OFFSET_V, off[5]);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
951 if(num_mach64_buffers==2) mach64_wait_vsync(); //only wait for vsync if we do double buffering
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
952
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
953 if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs();
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
954 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
955 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
956
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
957 static vidix_video_eq_t equal =
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
958 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
959 VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
960 ,
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
961 0, 0, 0, 0, 0, 0, 0, 0 };
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
962
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
963 static int mach64_get_eq( vidix_video_eq_t * eq)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
964 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
965 memcpy(eq,&equal,sizeof(vidix_video_eq_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
966 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
967 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
968
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
969 static int mach64_set_eq( const vidix_video_eq_t * eq)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
970 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
971 int br,sat;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
972 if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
973 if(eq->cap & VEQ_CAP_CONTRAST) equal.contrast = eq->contrast;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
974 if(eq->cap & VEQ_CAP_SATURATION) equal.saturation = eq->saturation;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
975 if(eq->cap & VEQ_CAP_HUE) equal.hue = eq->hue;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
976 if(eq->cap & VEQ_CAP_RGB_INTENSITY)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
977 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
978 equal.red_intensity = eq->red_intensity;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
979 equal.green_intensity = eq->green_intensity;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
980 equal.blue_intensity = eq->blue_intensity;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
981 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
982 equal.flags = eq->flags;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
983 br = equal.brightness * 64 / 1000;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
984 if(br < -64) br = -64; if(br > 63) br = 63;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
985 sat = (equal.saturation + 1000) * 16 / 1000;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
986 if(sat < 0) sat = 0; if(sat > 31) sat = 31;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
987 OUTREG(SCALER_COLOUR_CNTL, (br & 0x7f) | (sat << 8) | (sat << 16));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
988 return 0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
989 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
990
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
991 static int mach64_get_gkeys(vidix_grkey_t *grkey)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
992 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
993 memcpy(grkey, &mach64_grkey, sizeof(vidix_grkey_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
994 return(0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
995 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
996
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
997 static int mach64_set_gkeys(const vidix_grkey_t *grkey)
22850
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
998 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
999 memcpy(&mach64_grkey, grkey, sizeof(vidix_grkey_t));
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1000
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1001 if(mach64_grkey.ckey.op == CKEY_TRUE)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1002 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1003 besr.ckey_on=1;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1004
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1005 switch(mach64_vid_get_dbpp())
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1006 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1007 case 15:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1008 besr.graphics_key_msk=0x7FFF;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1009 besr.graphics_key_clr=
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1010 ((mach64_grkey.ckey.blue &0xF8)>>3)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1011 | ((mach64_grkey.ckey.green&0xF8)<<2)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1012 | ((mach64_grkey.ckey.red &0xF8)<<7);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1013 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1014 case 16:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1015 besr.graphics_key_msk=0xFFFF;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1016 besr.graphics_key_clr=
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1017 ((mach64_grkey.ckey.blue &0xF8)>>3)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1018 | ((mach64_grkey.ckey.green&0xFC)<<3)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1019 | ((mach64_grkey.ckey.red &0xF8)<<8);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1020 //besr.graphics_key_clr=le2me_32(besr.graphics_key_clr);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1021 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1022 case 24:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1023 besr.graphics_key_msk=0xFFFFFF;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1024 besr.graphics_key_clr=
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1025 ((mach64_grkey.ckey.blue &0xFF))
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1026 | ((mach64_grkey.ckey.green&0xFF)<<8)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1027 | ((mach64_grkey.ckey.red &0xFF)<<16);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1028 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1029 case 32:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1030 besr.graphics_key_msk=0xFFFFFF;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1031 besr.graphics_key_clr=
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1032 ((mach64_grkey.ckey.blue &0xFF))
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1033 | ((mach64_grkey.ckey.green&0xFF)<<8)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1034 | ((mach64_grkey.ckey.red &0xFF)<<16);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1035 break;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1036 default:
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1037 besr.ckey_on=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1038 besr.graphics_key_msk=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1039 besr.graphics_key_clr=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1040 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1041 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1042 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1043 {
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1044 besr.ckey_on=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1045 besr.graphics_key_msk=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1046 besr.graphics_key_clr=0;
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1047 }
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1048
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1049 mach64_fifo_wait(4);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1050 OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1051 OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1052 // OUTREG(OVERLAY_VIDEO_KEY_MSK, 0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1053 // OUTREG(OVERLAY_VIDEO_KEY_CLR, 0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1054 if(besr.ckey_on)
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1055 OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1056 else
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1057 OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1058
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1059 return(0);
9a1e26fef45b Move driver files directly into the vidix directory.
diego
parents:
diff changeset
1060 }
22857
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1061
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1062 VDXDriver mach64_drv = {
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1063 "mach64",
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1064 NULL,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1065 .probe = mach64_probe,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1066 .get_caps = mach64_get_caps,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1067 .query_fourcc = mach64_query_fourcc,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1068 .init = mach64_init,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1069 .destroy = mach64_destroy,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1070 .config_playback = mach64_config_playback,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1071 .playback_on = mach64_playback_on,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1072 .playback_off = mach64_playback_off,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1073 .frame_sel = mach64_frame_sel,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1074 .get_eq = mach64_get_eq,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1075 .set_eq = mach64_set_eq,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1076 .get_gkey = mach64_get_gkeys,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1077 .set_gkey = mach64_set_gkeys,
77def5093daf switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
ben
parents: 22850
diff changeset
1078 };