annotate vidix/drivers/mach64_vid.c @ 5589:8f2b7e0a8b1f

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