⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_vid.c

📁 原名叫avifile
💻 C
📖 第 1 页 / 共 5 页
字号:
 DEVICE_ATI_RAGE_128_PR_PRO, DEVICE_ATI_RAGE_128_PS_PRO, DEVICE_ATI_RAGE_128_PT_PRO, DEVICE_ATI_RAGE_128_PU_PRO, DEVICE_ATI_RAGE_128_PV_PRO, DEVICE_ATI_RAGE_128_PW_PRO, DEVICE_ATI_RAGE_128_PX_PRO,/* Rage128 GL */ DEVICE_ATI_RAGE_128_RE_SG, DEVICE_ATI_RAGE_128_RF_SG, DEVICE_ATI_RAGE_128_RG, DEVICE_ATI_RAGE_128_RK_VR, DEVICE_ATI_RAGE_128_RL_VR, DEVICE_ATI_RAGE_128_SE_4X, DEVICE_ATI_RAGE_128_SF_4X, DEVICE_ATI_RAGE_128_SG_4X, DEVICE_ATI_RAGE_128_SH, DEVICE_ATI_RAGE_128_SK_4X, DEVICE_ATI_RAGE_128_SL_4X, DEVICE_ATI_RAGE_128_SM_4X, DEVICE_ATI_RAGE_128_4X, DEVICE_ATI_RAGE_128_PRO, DEVICE_ATI_RAGE_128_PRO2, DEVICE_ATI_RAGE_128_PRO3,/* these seem to be based on rage 128 instead of mach64 */ DEVICE_ATI_RAGE_MOBILITY_M3, DEVICE_ATI_RAGE_MOBILITY_M32#else/* Radeons (indeed: Rage 256 Pro ;) */ DEVICE_ATI_RADEON_R100_QD, DEVICE_ATI_RADEON_R100_QE, DEVICE_ATI_RADEON_R100_QF, DEVICE_ATI_RADEON_R100_QG, DEVICE_ATI_RADEON_VE_QY, DEVICE_ATI_RADEON_VE_QZ, DEVICE_ATI_RADEON_MOBILITY_M7, DEVICE_ATI_RADEON_MOBILITY_M72, DEVICE_ATI_RADEON_MOBILITY_M6, DEVICE_ATI_RADEON_MOBILITY_M62, DEVICE_ATI_RADEON_R200_BB, DEVICE_ATI_RADEON_R200_QH, DEVICE_ATI_RADEON_R200_QI, DEVICE_ATI_RADEON_R200_QJ, DEVICE_ATI_RADEON_R200_QK, DEVICE_ATI_RADEON_R200_QL, DEVICE_ATI_RADEON_R200_QH2, DEVICE_ATI_RADEON_R200_QI2, DEVICE_ATI_RADEON_R200_QJ2, DEVICE_ATI_RADEON_R200_QK2, DEVICE_ATI_RADEON_RV200_QW, DEVICE_ATI_RADEON_RV200_QX, DEVICE_ATI_RADEON_R250_ID, DEVICE_ATI_RADEON_R250_IE, DEVICE_ATI_RADEON_R250_IF, DEVICE_ATI_RADEON_R250_IG, DEVICE_ATI_RADEON_R250_LD, DEVICE_ATI_RADEON_R250_LE, DEVICE_ATI_RADEON_R250_LF, DEVICE_ATI_RADEON_R250_LG, DEVICE_ATI_RADEON_R300_ND, DEVICE_ATI_RADEON_R300_NE, DEVICE_ATI_RADEON_R300_NF, DEVICE_ATI_RADEON_R300_NG#endif};static int find_chip(unsigned chip_id){  unsigned i;  for(i = 0;i < sizeof(ati_card_ids)/sizeof(unsigned short);i++)  {    if(chip_id == ati_card_ids[i]) return i;  }  return -1;}static pciinfo_t pci_info;static int probed=0;vidix_capability_t def_cap = {#ifdef RAGE128    "BES driver for rage128 cards",#else    "BES driver for radeon cards",#endif    "Nick Kurshev",    TYPE_OUTPUT | TYPE_FX,    { 0, 0, 0, 0 },    2048,    2048,    4,    4,    -1,    FLAG_UPSCALER | FLAG_DOWNSCALER | FLAG_EQUALIZER,    VENDOR_ATI,    0,    { 0, 0, 0, 0}};int VIDIX_NAME(vixProbe)( int verbose,int force ){  pciinfo_t lst[MAX_PCI_DEVICES];  unsigned i,num_pci;  int err;  __verbose = verbose;  err = pci_scan(lst,&num_pci);  if(err)  {    printf(RADEON_MSG" Error occured during pci scan: %s\n",strerror(err));    return err;  }  else  {    err = ENXIO;    for(i=0;i<num_pci;i++)    {      if(lst[i].vendor == VENDOR_ATI)      {	int idx;	const char *dname;	idx = find_chip(lst[i].device);	if(idx == -1 && force == PROBE_NORMAL) continue;	dname = pci_device_name(VENDOR_ATI,lst[i].device);	dname = dname ? dname : "Unknown chip";	printf(RADEON_MSG" Found chip: %s\n",dname);#ifndef RAGE128 	if(idx != -1)	{          switch(ati_card_ids[idx]) {            /* Original radeon */            case DEVICE_ATI_RADEON_R100_QD:            case DEVICE_ATI_RADEON_R100_QE:            case DEVICE_ATI_RADEON_R100_QF:            case DEVICE_ATI_RADEON_R100_QG:              RadeonFamily = 100;              break;                          /* Radeon VE / Radeon Mobility */            case DEVICE_ATI_RADEON_VE_QY:            case DEVICE_ATI_RADEON_VE_QZ:            case DEVICE_ATI_RADEON_MOBILITY_M6:            case DEVICE_ATI_RADEON_MOBILITY_M62:              RadeonFamily = 120;              break;                          /* Radeon 7500 / Radeon Mobility 7500 */            case DEVICE_ATI_RADEON_RV200_QW:            case DEVICE_ATI_RADEON_RV200_QX:             case DEVICE_ATI_RADEON_MOBILITY_M7:            case DEVICE_ATI_RADEON_MOBILITY_M72:              RadeonFamily = 150;              break;                          /* Radeon 8500 */            case DEVICE_ATI_RADEON_R200_BB:            case DEVICE_ATI_RADEON_R200_QH:            case DEVICE_ATI_RADEON_R200_QI:            case DEVICE_ATI_RADEON_R200_QJ:            case DEVICE_ATI_RADEON_R200_QK:            case DEVICE_ATI_RADEON_R200_QL:            case DEVICE_ATI_RADEON_R200_QH2:            case DEVICE_ATI_RADEON_R200_QI2:            case DEVICE_ATI_RADEON_R200_QJ2:            case DEVICE_ATI_RADEON_R200_QK2:              RadeonFamily = 200;              break;                          /* Radeon 9000 */            case DEVICE_ATI_RADEON_R250_ID:            case DEVICE_ATI_RADEON_R250_IE:            case DEVICE_ATI_RADEON_R250_IF:            case DEVICE_ATI_RADEON_R250_IG:            case DEVICE_ATI_RADEON_R250_LD:            case DEVICE_ATI_RADEON_R250_LE:            case DEVICE_ATI_RADEON_R250_LF:            case DEVICE_ATI_RADEON_R250_LG:              RadeonFamily = 250;              break;                          /* Radeon 9700 */            case DEVICE_ATI_RADEON_R300_ND:            case DEVICE_ATI_RADEON_R300_NE:            case DEVICE_ATI_RADEON_R300_NF:            case DEVICE_ATI_RADEON_R300_NG:              RadeonFamily = 300;              break;            default:              break;          }	}#endif	if(force > PROBE_NORMAL)	{	    printf(RADEON_MSG" Driver was forced. Was found %sknown chip\n",idx == -1 ? "un" : "");	    if(idx == -1)#ifdef RAGE128		printf(RADEON_MSG" Assuming it as Rage128\n");#else		printf(RADEON_MSG" Assuming it as Radeon1\n");#endif	}	def_cap.device_id = lst[i].device;	err = 0;	memcpy(&pci_info,&lst[i],sizeof(pciinfo_t));	probed=1;	break;      }    }  }  if(err && verbose) printf(RADEON_MSG" Can't find chip\n");  return err;}#ifndef RAGE128enum radeon_montype{    MT_NONE,    MT_CRT, /* CRT-(cathode ray tube) analog monitor. (15-pin VGA connector) */    MT_LCD, /* Liquid Crystal Display */    MT_DFP, /* DFP-digital flat panel monitor. (24-pin DVI-I connector) */    MT_CTV, /* Composite TV out (not in VE) */    MT_STV  /* S-Video TV out (probably in VE only) */};typedef struct radeon_info_s{	int hasCRTC2;	int crtDispType;	int dviDispType;}rinfo_t;static rinfo_t rinfo;static char * GET_MON_NAME(int type){  char *pret;  switch(type)  {    case MT_NONE: pret = "no"; break;    case MT_CRT:  pret = "CRT"; break;    case MT_DFP:  pret = "DFP"; break;    case MT_LCD:  pret = "LCD"; break;    case MT_CTV:  pret = "CTV"; break;    case MT_STV:  pret = "STV"; break;    default:	  pret = "Unknown";  }  return pret;}static void radeon_get_moninfo (rinfo_t *rinfo){	unsigned int tmp;	tmp = INREG(RADEON_BIOS_4_SCRATCH);	if (rinfo->hasCRTC2) {		/* primary DVI port */		if (tmp & 0x08)			rinfo->dviDispType = MT_DFP;		else if (tmp & 0x4)			rinfo->dviDispType = MT_LCD;		else if (tmp & 0x200)			rinfo->dviDispType = MT_CRT;		else if (tmp & 0x10)			rinfo->dviDispType = MT_CTV;		else if (tmp & 0x20)			rinfo->dviDispType = MT_STV;		/* secondary CRT port */		if (tmp & 0x2)			rinfo->crtDispType = MT_CRT;		else if (tmp & 0x800)			rinfo->crtDispType = MT_DFP;		else if (tmp & 0x400)			rinfo->crtDispType = MT_LCD;		else if (tmp & 0x1000)			rinfo->crtDispType = MT_CTV;		else if (tmp & 0x2000)			rinfo->crtDispType = MT_STV;	} else {		rinfo->dviDispType = MT_NONE;		tmp = INREG(FP_GEN_CNTL);		if (tmp & FP_EN_TMDS)			rinfo->crtDispType = MT_DFP;		else			rinfo->crtDispType = MT_CRT;	}}#endiftypedef struct saved_regs_s{    uint32_t ov0_vid_key_clr;    uint32_t ov0_vid_key_msk;    uint32_t ov0_graphics_key_clr;    uint32_t ov0_graphics_key_msk;    uint32_t ov0_key_cntl;}saved_regs_t;static saved_regs_t savreg;static void save_regs( void ){    radeon_fifo_wait(6);    savreg.ov0_vid_key_clr	= INREG(OV0_VID_KEY_CLR);    savreg.ov0_vid_key_msk	= INREG(OV0_VID_KEY_MSK);    savreg.ov0_graphics_key_clr = INREG(OV0_GRAPHICS_KEY_CLR);    savreg.ov0_graphics_key_msk = INREG(OV0_GRAPHICS_KEY_MSK);    savreg.ov0_key_cntl		= INREG(OV0_KEY_CNTL);}static void restore_regs( void ){    radeon_fifo_wait(6);    OUTREG(OV0_VID_KEY_CLR,savreg.ov0_vid_key_clr);    OUTREG(OV0_VID_KEY_MSK,savreg.ov0_vid_key_msk);    OUTREG(OV0_GRAPHICS_KEY_CLR,savreg.ov0_graphics_key_clr);    OUTREG(OV0_GRAPHICS_KEY_MSK,savreg.ov0_graphics_key_msk);    OUTREG(OV0_KEY_CNTL,savreg.ov0_key_cntl);}int VIDIX_NAME(vixInit)( const char *args ){  int err;  if(!probed)   {    printf(RADEON_MSG" Driver was not probed but is being initializing\n");    return EINTR;  }      if((radeon_mmio_base = map_phys_mem(pci_info.base2,0xFFFF))==(void *)-1) return ENOMEM;  radeon_ram_size = INREG(CONFIG_MEMSIZE);  /* mem size is bits [28:0], mask off the rest. Range: from 1Mb up to 512 Mb */  radeon_ram_size &=  CONFIG_MEMSIZE_MASK;  if((radeon_mem_base = map_phys_mem(pci_info.base0,radeon_ram_size))==(void *)-1) return ENOMEM;  memset(&besr,0,sizeof(bes_registers_t));  radeon_vid_make_default();  printf(RADEON_MSG" Video memory = %uMb\n",radeon_ram_size/0x100000);  err = mtrr_set_type(pci_info.base0,radeon_ram_size,MTRR_TYPE_WRCOMB);  if(!err) printf(RADEON_MSG" Set write-combining type of video memory\n");#ifndef RAGE128  {    memset(&rinfo,0,sizeof(rinfo_t));    if(RadeonFamily > 100) rinfo.hasCRTC2 = 1;      switch(RadeonFamily)    {    case 100:    case 120:    case 150:    case 250:      is_shift_required=1;      break;    default:      break;    }    radeon_get_moninfo(&rinfo);	if(rinfo.hasCRTC2) {	    printf(RADEON_MSG" DVI port has %s monitor connected\n",GET_MON_NAME(rinfo.dviDispType));	    printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType));	}	else	    printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType));  }#endif#ifdef RADEON_ENABLE_BM  if(bm_open() == 0)  {	if((dma_phys_addrs = malloc(radeon_ram_size*sizeof(unsigned long)/4096)) != 0)					    def_cap.flags |= FLAG_DMA | FLAG_EQ_DMA;	else		printf(RADEON_MSG" Can't allocate temopary buffer for DMA\n");  }  else    if(__verbose) printf(RADEON_MSG" Can't initialize busmastering: %s\n",strerror(errno));#endif  save_regs();  return 0;  }void VIDIX_NAME(vixDestroy)( void ){  restore_regs();  unmap_phys_mem(radeon_mem_base,radeon_ram_size);  unmap_phys_mem(radeon_mmio_base,0xFFFF);  bm_close();}int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to){  memcpy(to,&def_cap,sizeof(vidix_capability_t));  return 0; }/*  Full list of fourcc which are supported by Win2K radeon driver:  YUY2, UYVY, DDES, OGLT, OGL2, OGLS, OGLB, OGNT, OGNZ, OGNS,  IF09, YVU9, IMC4, M2IA, IYUV, VBID, DXT1, DXT2, DXT3, DXT4, DXT5*/typedef struct fourcc_desc_s{    uint32_t fourcc;    unsigned max_srcw;}fourcc_desc_t;fourcc_desc_t supported_fourcc[] = {  { IMGFMT_Y800, 1567 },  { IMGFMT_YVU9, 1567 },  { IMGFMT_IF09, 1567 },  { IMGFMT_YV12, 1567 },  { IMGFMT_I420, 1567 },  { IMGFMT_IYUV, 1567 },   { IMGFMT_UYVY, 1551 },  { IMGFMT_YUY2, 1551 },  { IMGFMT_YVYU, 1551 },  { IMGFMT_RGB15, 1551 },  { IMGFMT_BGR15, 1551 },  { IMGFMT_RGB16, 1551 },  { IMGFMT_BGR16, 1551 },  { IMGFMT_RGB32, 775 },  { IMGFMT_BGR32, 775 }};__inline__ static int is_supported_fourcc(uint32_t fourcc,unsigned srcw)

⌨️ 快捷键说明

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