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 + -
显示快捷键?