annotate vidix/mach64_vid.c @ 29653:19ae7725dcf9

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