radeon_vid.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,049 行 · 第 1/5 页

C
2,049
字号
/* * VIDIX driver for ATI Rage128 and Radeon chipsets. * Copyright (C) 2002 Nick Kurshev * * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MPlayer; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * This file is based on sources from *   GATOS (gatos.sf.net) and X11 (www.xfree86.org) * * Changes: *  - 31.12.2002 *    added support for fglrx drivers by Marcel Naziri (zwobbl@zwobbl.de) *  - 6.04.2004 *    fixes to allow compiling vidix without X11 (broken in original patch) *  - PowerPC support by Alex Beregszaszi */#include <errno.h>#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <math.h>#include <inttypes.h>#include "config.h"#include "libavutil/common.h"#include "mpbswap.h"#include "pci_ids.h"#include "pci_names.h"#include "vidix.h"#include "vidixlib.h"#include "fourcc.h"#include "dha.h"#include "radeon.h"#undef memcpy#define memcpy uc_memcpy#if !defined(RAGE128) && defined(HAVE_X11)#include <X11/Xlib.h>static uint32_t firegl_shift = 0;#endif#ifdef RAGE128#define RADEON_MSG "[rage128]"#define X_ADJUST 0#else#define RADEON_MSG "[radeon]"#define X_ADJUST (((besr.chip_flags&R_OVL_SHIFT)==R_OVL_SHIFT)?8:0)#ifndef RADEON#define RADEON#endif#endif#define RADEON_ASSERT(msg) printf(RADEON_MSG"################# FATAL:"msg);#define VERBOSE_LEVEL 0static int __verbose = 0;typedef struct bes_registers_s{  /* base address of yuv framebuffer */  uint32_t yuv_base;  uint32_t fourcc;  uint32_t surf_id;  int load_prg_start;  int horz_pick_nearest;  int vert_pick_nearest;  int swap_uv; /* for direct support of bgr fourccs */  uint32_t dest_bpp;  /* YUV BES registers */  uint32_t reg_load_cntl;  uint32_t h_inc;  uint32_t step_by;  uint32_t y_x_start;  uint32_t y_x_end;  uint32_t v_inc;  uint32_t p1_blank_lines_at_top;  uint32_t p23_blank_lines_at_top;  uint32_t vid_buf_pitch0_value;  uint32_t vid_buf_pitch1_value;  uint32_t p1_x_start_end;  uint32_t p2_x_start_end;  uint32_t p3_x_start_end;  uint32_t base_addr;  uint32_t vid_buf_base_adrs_y[VID_PLAY_MAXFRAMES];  uint32_t vid_buf_base_adrs_u[VID_PLAY_MAXFRAMES];  uint32_t vid_buf_base_adrs_v[VID_PLAY_MAXFRAMES];  uint32_t vid_nbufs;  uint32_t p1_v_accum_init;  uint32_t p1_h_accum_init;  uint32_t p23_v_accum_init;  uint32_t p23_h_accum_init;  uint32_t scale_cntl;  uint32_t exclusive_horz;  uint32_t auto_flip_cntl;  uint32_t filter_cntl;  uint32_t four_tap_coeff[5];  uint32_t key_cntl;  uint32_t test;  /* Configurable stuff */  int double_buff;    int brightness;  int saturation;    int ckey_on;  uint32_t graphics_key_clr;  uint32_t graphics_key_msk;  uint32_t ckey_cntl;  uint32_t merge_cntl;    int deinterlace_on;  uint32_t deinterlace_pattern;    unsigned chip_flags;} bes_registers_t;typedef struct video_registers_s{  const char * sname;  uint32_t name;  uint32_t value;}video_registers_t;static bes_registers_t besr;#define DECLARE_VREG(name) { #name, name, 0 }static video_registers_t vregs[] = {  DECLARE_VREG(VIDEOMUX_CNTL),  DECLARE_VREG(VIPPAD_MASK),  DECLARE_VREG(VIPPAD1_A),  DECLARE_VREG(VIPPAD1_EN),  DECLARE_VREG(VIPPAD1_Y),  DECLARE_VREG(OV0_Y_X_START),  DECLARE_VREG(OV0_Y_X_END),  DECLARE_VREG(OV1_Y_X_START),  DECLARE_VREG(OV1_Y_X_END),  DECLARE_VREG(OV0_PIPELINE_CNTL),  DECLARE_VREG(OV0_EXCLUSIVE_HORZ),  DECLARE_VREG(OV0_EXCLUSIVE_VERT),  DECLARE_VREG(OV0_REG_LOAD_CNTL),  DECLARE_VREG(OV0_SCALE_CNTL),  DECLARE_VREG(OV0_V_INC),  DECLARE_VREG(OV0_P1_V_ACCUM_INIT),  DECLARE_VREG(OV0_P23_V_ACCUM_INIT),  DECLARE_VREG(OV0_P1_BLANK_LINES_AT_TOP),  DECLARE_VREG(OV0_P23_BLANK_LINES_AT_TOP),#ifdef RADEON  DECLARE_VREG(OV0_BASE_ADDR),#endif  DECLARE_VREG(OV0_VID_BUF0_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF1_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF2_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF3_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF4_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF5_BASE_ADRS),  DECLARE_VREG(OV0_VID_BUF_PITCH0_VALUE),  DECLARE_VREG(OV0_VID_BUF_PITCH1_VALUE),  DECLARE_VREG(OV0_AUTO_FLIP_CNTL),  DECLARE_VREG(OV0_DEINTERLACE_PATTERN),  DECLARE_VREG(OV0_SUBMIT_HISTORY),  DECLARE_VREG(OV0_H_INC),  DECLARE_VREG(OV0_STEP_BY),  DECLARE_VREG(OV0_P1_H_ACCUM_INIT),  DECLARE_VREG(OV0_P23_H_ACCUM_INIT),  DECLARE_VREG(OV0_P1_X_START_END),  DECLARE_VREG(OV0_P2_X_START_END),  DECLARE_VREG(OV0_P3_X_START_END),  DECLARE_VREG(OV0_FILTER_CNTL),  DECLARE_VREG(OV0_FOUR_TAP_COEF_0),  DECLARE_VREG(OV0_FOUR_TAP_COEF_1),  DECLARE_VREG(OV0_FOUR_TAP_COEF_2),  DECLARE_VREG(OV0_FOUR_TAP_COEF_3),  DECLARE_VREG(OV0_FOUR_TAP_COEF_4),  DECLARE_VREG(OV0_FLAG_CNTL),#ifdef RAGE128  DECLARE_VREG(OV0_COLOUR_CNTL),#else  DECLARE_VREG(OV0_SLICE_CNTL),#endif  DECLARE_VREG(OV0_VID_KEY_CLR),  DECLARE_VREG(OV0_VID_KEY_MSK),  DECLARE_VREG(OV0_GRAPHICS_KEY_CLR),  DECLARE_VREG(OV0_GRAPHICS_KEY_MSK),  DECLARE_VREG(OV0_KEY_CNTL),  DECLARE_VREG(OV0_TEST),  DECLARE_VREG(OV0_LIN_TRANS_A),  DECLARE_VREG(OV0_LIN_TRANS_B),  DECLARE_VREG(OV0_LIN_TRANS_C),  DECLARE_VREG(OV0_LIN_TRANS_D),  DECLARE_VREG(OV0_LIN_TRANS_E),  DECLARE_VREG(OV0_LIN_TRANS_F),  DECLARE_VREG(OV0_GAMMA_0_F),  DECLARE_VREG(OV0_GAMMA_10_1F),  DECLARE_VREG(OV0_GAMMA_20_3F),  DECLARE_VREG(OV0_GAMMA_40_7F),  DECLARE_VREG(OV0_GAMMA_380_3BF),  DECLARE_VREG(OV0_GAMMA_3C0_3FF),  DECLARE_VREG(SUBPIC_CNTL),  DECLARE_VREG(SUBPIC_DEFCOLCON),  DECLARE_VREG(SUBPIC_Y_X_START),  DECLARE_VREG(SUBPIC_Y_X_END),  DECLARE_VREG(SUBPIC_V_INC),  DECLARE_VREG(SUBPIC_H_INC),  DECLARE_VREG(SUBPIC_BUF0_OFFSET),  DECLARE_VREG(SUBPIC_BUF1_OFFSET),  DECLARE_VREG(SUBPIC_LC0_OFFSET),  DECLARE_VREG(SUBPIC_LC1_OFFSET),  DECLARE_VREG(SUBPIC_PITCH),  DECLARE_VREG(SUBPIC_BTN_HLI_COLCON),  DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_START),  DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_END),  DECLARE_VREG(SUBPIC_PALETTE_INDEX),  DECLARE_VREG(SUBPIC_PALETTE_DATA),  DECLARE_VREG(SUBPIC_H_ACCUM_INIT),  DECLARE_VREG(SUBPIC_V_ACCUM_INIT),  DECLARE_VREG(IDCT_RUNS),  DECLARE_VREG(IDCT_LEVELS),  DECLARE_VREG(IDCT_AUTH_CONTROL),  DECLARE_VREG(IDCT_AUTH),  DECLARE_VREG(IDCT_CONTROL),#ifdef RAGE128  DECLARE_VREG(BM_FRAME_BUF_OFFSET),  DECLARE_VREG(BM_SYSTEM_MEM_ADDR),  DECLARE_VREG(BM_COMMAND),  DECLARE_VREG(BM_STATUS),  DECLARE_VREG(BM_QUEUE_STATUS),  DECLARE_VREG(BM_QUEUE_FREE_STATUS),  DECLARE_VREG(BM_CHUNK_0_VAL),  DECLARE_VREG(BM_CHUNK_1_VAL),  DECLARE_VREG(BM_VIP0_BUF),  DECLARE_VREG(BM_VIP0_ACTIVE),  DECLARE_VREG(BM_VIP1_BUF),  DECLARE_VREG(BM_VIP1_ACTIVE),  DECLARE_VREG(BM_VIP2_BUF),  DECLARE_VREG(BM_VIP2_ACTIVE),  DECLARE_VREG(BM_VIP3_BUF),  DECLARE_VREG(BM_VIP3_ACTIVE),  DECLARE_VREG(BM_VIDCAP_BUF0),  DECLARE_VREG(BM_VIDCAP_BUF1),  DECLARE_VREG(BM_VIDCAP_BUF2),  DECLARE_VREG(BM_VIDCAP_ACTIVE),  DECLARE_VREG(BM_GUI),  DECLARE_VREG(BM_ABORT)#else  DECLARE_VREG(DMA_GUI_TABLE_ADDR),  DECLARE_VREG(DMA_GUI_SRC_ADDR),  DECLARE_VREG(DMA_GUI_DST_ADDR),  DECLARE_VREG(DMA_GUI_COMMAND),  DECLARE_VREG(DMA_GUI_STATUS),  DECLARE_VREG(DMA_GUI_ACT_DSCRPTR),  DECLARE_VREG(DMA_VID_SRC_ADDR),  DECLARE_VREG(DMA_VID_DST_ADDR),  DECLARE_VREG(DMA_VID_COMMAND),  DECLARE_VREG(DMA_VID_STATUS),  DECLARE_VREG(DMA_VID_ACT_DSCRPTR),#endif};#define R_FAMILY	0x000000FF#define R_100		0x00000001#define R_120		0x00000002#define R_150		0x00000003#define R_200		0x00000004#define R_250		0x00000005#define R_280		0x00000006#define R_300		0x00000007#define R_350		0x00000008#define R_370		0x00000010#define R_380		0x00000020#define R_420		0x00000040#define R_430		0x00000080#define R_480		0x00000100#define R_520		0x00000200#define R_530		0x00000400#define R_580		0x00000800#define R_OVL_SHIFT	0x01000000#define R_INTEGRATED	0x02000000#define R_PCIE		0x04000000typedef struct ati_card_ids_s{    unsigned short id;    unsigned flags;}ati_card_ids_t;static const ati_card_ids_t ati_card_ids[] = {#ifdef RAGE128 /*    This driver should be compatible with Rage128 (pro) chips.    (include adaptive deinterlacing!!!).    Moreover: the same logic can be used with Mach64 chips.    (I mean: mach64xx, 3d rage, 3d rage IIc, 3D rage pro, 3d rage mobility).    but they are incompatible by i/o ports. So if enthusiasts will want    then they can redefine OUTREG and INREG macros and redefine OV0_*    constants. Also it seems that mach64 chips supports only: YUY2, YV12, UYVY    fourccs (422 and 420 formats only).  *//* Rage128 Pro GL */ { DEVICE_ATI_RAGE_128_PA_PRO, 0 }, { DEVICE_ATI_RAGE_128_PB_PRO, 0 }, { DEVICE_ATI_RAGE_128_PC_PRO, 0 }, { DEVICE_ATI_RAGE_128_PD_PRO, 0 }, { DEVICE_ATI_RAGE_128_PE_PRO, 0 }, { DEVICE_ATI_RAGE_128_PF_PRO, 0 },/* Rage128 Pro VR */ { DEVICE_ATI_RAGE_128_PG_PRO, 0 }, { DEVICE_ATI_RAGE_128_PH_PRO, 0 }, { DEVICE_ATI_RAGE_128_PI_PRO, 0 }, { DEVICE_ATI_RAGE_128_PJ_PRO, 0 }, { DEVICE_ATI_RAGE_128_PK_PRO, 0 }, { DEVICE_ATI_RAGE_128_PL_PRO, 0 }, { DEVICE_ATI_RAGE_128_PM_PRO, 0 }, { DEVICE_ATI_RAGE_128_PN_PRO, 0 }, { DEVICE_ATI_RAGE_128_PO_PRO, 0 }, { DEVICE_ATI_RAGE_128_PP_PRO, 0 }, { DEVICE_ATI_RAGE_128_PQ_PRO, 0 }, { DEVICE_ATI_RAGE_128_PR_PRO, 0 }, { DEVICE_ATI_RAGE_128_PS_PRO, 0 }, { DEVICE_ATI_RAGE_128_PT_PRO, 0 }, { DEVICE_ATI_RAGE_128_PU_PRO, 0 }, { DEVICE_ATI_RAGE_128_PV_PRO, 0 }, { DEVICE_ATI_RAGE_128_PW_PRO, 0 }, { DEVICE_ATI_RAGE_128_PX_PRO, 0 },/* Rage128 GL */ { DEVICE_ATI_RAGE_128_RE_SG, 0 }, { DEVICE_ATI_RAGE_128_RF_SG, 0 }, { DEVICE_ATI_RAGE_128_RG, 0 }, { DEVICE_ATI_RAGE_128_RK_VR, 0 }, { DEVICE_ATI_RAGE_128_RL_VR, 0 }, { DEVICE_ATI_RAGE_128_SE_4X, 0 }, { DEVICE_ATI_RAGE_128_SF_4X, 0 }, { DEVICE_ATI_RAGE_128_SG_4X, 0 }, { DEVICE_ATI_RAGE_128_SH, 0 }, { DEVICE_ATI_RAGE_128_SK_4X, 0 }, { DEVICE_ATI_RAGE_128_SL_4X, 0 }, { DEVICE_ATI_RAGE_128_SM_4X, 0 }, { DEVICE_ATI_RAGE_128_4X, 0 }, { DEVICE_ATI_RAGE_128_PRO, 0 }, { DEVICE_ATI_RAGE_128_PRO2, 0 }, { DEVICE_ATI_RAGE_128_PRO3, 0 },/* these seem to be based on rage 128 instead of mach64 */ { DEVICE_ATI_RAGE_MOBILITY_M3, 0 }, { DEVICE_ATI_RAGE_MOBILITY_M32, 0 },#else/* Radeon1 (indeed: Rage 256 Pro ;) */ { DEVICE_ATI_RADEON_R100_QD,		R_100|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R100_QE,		R_100|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R100_QF,		R_100|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R100_QG,		R_100|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_IGP_320,		R_150|R_OVL_SHIFT|R_INTEGRATED }, { DEVICE_ATI_RADEON_MOBILITY_U1,	R_150|R_OVL_SHIFT|R_INTEGRATED }, { DEVICE_ATI_RADEON_RV100_QY,		R_120|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV100_QZ,		R_120|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_MOBILITY_M7,	R_150|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV200_LX,		R_150|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_MOBILITY_M6,	R_120|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_MOBILITY_M62,	R_120|R_OVL_SHIFT },/* Radeon2 (indeed: Rage 512 Pro ;) */ { DEVICE_ATI_R200_BB_RADEON,		R_200 }, { DEVICE_ATI_R200_BC_RADEON,		R_200 }, { DEVICE_ATI_RADEON_R200_QH,		R_200 }, { DEVICE_ATI_RADEON_R200_QI,		R_200 }, { DEVICE_ATI_RADEON_R200_QJ,		R_200 }, { DEVICE_ATI_RADEON_R200_QK,		R_200 }, { DEVICE_ATI_RADEON_R200_QL,		R_200 }, { DEVICE_ATI_RADEON_R200_QM,		R_200 }, { DEVICE_ATI_RADEON_R200_QN,		R_200 }, { DEVICE_ATI_RADEON_R200_QO,		R_200 }, { DEVICE_ATI_RADEON_R200_QH2,		R_200 }, { DEVICE_ATI_RADEON_R200_QI2,		R_200 }, { DEVICE_ATI_RADEON_R200_QJ2,		R_200 }, { DEVICE_ATI_RADEON_R200_QK2,		R_200 }, { DEVICE_ATI_RADEON_R200_QL2,		R_200 }, { DEVICE_ATI_RADEON_RV200_QW,		R_150|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV200_QX,		R_150|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_IGP330_340_350,R_200|R_INTEGRATED }, { DEVICE_ATI_RADEON_IGP_330M_340M_350M,R_200|R_INTEGRATED }, { DEVICE_ATI_RADEON_RV250_IG,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_7000_IGP,		R_250|R_OVL_SHIFT|R_INTEGRATED }, { DEVICE_ATI_RADEON_MOBILITY_7000,	R_250|R_OVL_SHIFT|R_INTEGRATED }, { DEVICE_ATI_RADEON_RV250_ID,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV250_IE,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV250_IF,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV250_IG,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R250_LD,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R250_LE,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R250_MOBILITY,	R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_R250_LG,		R_250|R_OVL_SHIFT }, { DEVICE_ATI_RV250_RADEON_9000,	R_250|R_OVL_SHIFT }, { DEVICE_ATI_RADEON_RV250_RADEON2,	R_250|R_OVL_SHIFT }, { DEVICE_ATI_RV280_RADEON_9200,	R_280 }, { DEVICE_ATI_RV280_RADEON_92002,	R_280 }, { DEVICE_ATI_RV280_RADEON_92003,	R_280 }, { DEVICE_ATI_RV280_RADEON_92004,	R_280 }, { DEVICE_ATI_RV280_RADEON_92005,	R_280 },

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?