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

📄 radeon_vid.c

📁 原名叫avifile
💻 C
📖 第 1 页 / 共 5 页
字号:
	radeon_engine_flush ();	clock_cntl_index = INREG(CLOCK_CNTL_INDEX);	mclk_cntl = INPLL(MCLK_CNTL);	OUTPLL(MCLK_CNTL, (mclk_cntl |			   FORCEON_MCLKA |			   FORCEON_MCLKB |			   FORCEON_YCLKA |			   FORCEON_YCLKB |			   FORCEON_MC |			   FORCEON_AIC));	rbbm_soft_reset = INREG(RBBM_SOFT_RESET);	OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset |				SOFT_RESET_CP |				SOFT_RESET_HI |				SOFT_RESET_SE |				SOFT_RESET_RE |				SOFT_RESET_PP |				SOFT_RESET_E2 |				SOFT_RESET_RB |				SOFT_RESET_HDP);	INREG(RBBM_SOFT_RESET);	OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (uint32_t)				~(SOFT_RESET_CP |				  SOFT_RESET_HI |				  SOFT_RESET_SE |				  SOFT_RESET_RE |				  SOFT_RESET_PP |				  SOFT_RESET_E2 |				  SOFT_RESET_RB |				  SOFT_RESET_HDP));	INREG(RBBM_SOFT_RESET);	OUTPLL(MCLK_CNTL, mclk_cntl);	OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);	OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset);	return;}#endifstatic void radeon_engine_restore( void ){#ifndef RAGE128    int pitch64;    uint32_t xres,yres,bpp;    radeon_fifo_wait(1);    xres = radeon_get_xres();    yres = radeon_get_yres();    bpp = radeon_vid_get_dbpp();    /* turn of all automatic flushing - we'll do it all */    OUTREG(RB2D_DSTCACHE_MODE, 0);    pitch64 = ((xres * (bpp / 8) + 0x3f)) >> 6;    radeon_fifo_wait(1);    OUTREG(DEFAULT_OFFSET, (INREG(DEFAULT_OFFSET) & 0xC0000000) |				  (pitch64 << 22));    radeon_fifo_wait(1);#if defined(WORDS_BIGENDIAN)    OUTREGP(DP_DATATYPE,	    HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN);#else    OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN);#endif    radeon_fifo_wait(1);    OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX				    | DEFAULT_SC_BOTTOM_MAX));    radeon_fifo_wait(1);    OUTREG(DP_GUI_MASTER_CNTL, (INREG(DP_GUI_MASTER_CNTL)				       | GMC_BRUSH_SOLID_COLOR				       | GMC_SRC_DATATYPE_COLOR));    radeon_fifo_wait(7);    OUTREG(DST_LINE_START,    0);    OUTREG(DST_LINE_END,      0);    OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff);    OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000);    OUTREG(DP_SRC_FRGD_CLR,   0xffffffff);    OUTREG(DP_SRC_BKGD_CLR,   0x00000000);    OUTREG(DP_WRITE_MASK,     0xffffffff);    radeon_engine_idle();#endif}#ifdef RAGE128static void _radeon_fifo_wait (unsigned entries){    unsigned i;    for(;;)    {	for (i=0; i<2000000; i++)		if ((INREG(GUI_STAT) & GUI_FIFOCNT_MASK) >= entries)			return;	radeon_engine_reset();	radeon_engine_restore();    }}static void _radeon_engine_idle ( void ){    unsigned i;    /* ensure FIFO is empty before waiting for idle */    radeon_fifo_wait (64);    for(;;)    {	for (i=0; i<2000000; i++) {		if ((INREG(GUI_STAT) & GUI_ACTIVE) == 0) {			radeon_engine_flush ();			return;		}	}	radeon_engine_reset();	radeon_engine_restore();    }}#elsestatic void _radeon_fifo_wait (unsigned entries){    unsigned i;    for(;;)    {	for (i=0; i<2000000; i++)		if ((INREG(RBBM_STATUS) & RBBM_FIFOCNT_MASK) >= entries)			return;	radeon_engine_reset();	radeon_engine_restore();    }}static void _radeon_engine_idle ( void ){    int i;    /* ensure FIFO is empty before waiting for idle */    radeon_fifo_wait (64);    for(;;)    {	for (i=0; i<2000000; i++) {		if (((INREG(RBBM_STATUS) & RBBM_ACTIVE)) == 0) {			radeon_engine_flush ();			return;		}	}	radeon_engine_reset();	radeon_engine_restore();    }}#endif#ifndef RAGE128/* Reference color space transform data */typedef struct tagREF_TRANSFORM{	float RefLuma;	float RefRCb;	float RefRCr;	float RefGCb;	float RefGCr;	float RefBCb;	float RefBCr;} REF_TRANSFORM;/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces */REF_TRANSFORM trans[2] ={	{1.1678, 0.0, 1.6007, -0.3929, -0.8154, 2.0232, 0.0}, /* BT.601 */	{1.1678, 0.0, 1.7980, -0.2139, -0.5345, 2.1186, 0.0}  /* BT.709 */};/**************************************************************************** * SetTransform								    * *  Function: Calculates and sets color space transform from supplied	    * *	      reference transform, gamma, brightness, contrast, hue and	    * *	      saturation.						    * *    Inputs: bright - brightness					    * *	      cont - contrast						    * *	      sat - saturation						    * *	      hue - hue							    * *	      red_intensity - intense of red component			    * *	      green_intensity - intense of green component		    * *	      blue_intensity - intense of blue component		    * *	      ref - index to the table of refernce transforms		    * *   Outputs: NONE							    * ****************************************************************************/static void radeon_set_transform(float bright, float cont, float sat,				 float hue, float red_intensity,				 float green_intensity,float blue_intensity,				 unsigned ref){	float OvHueSin, OvHueCos;	float CAdjLuma, CAdjOff;	float RedAdj,GreenAdj,BlueAdj;	float CAdjRCb, CAdjRCr;	float CAdjGCb, CAdjGCr;	float CAdjBCb, CAdjBCr;	float OvLuma, OvROff, OvGOff, OvBOff;	float OvRCb, OvRCr;	float OvGCb, OvGCr;	float OvBCb, OvBCr;	float Loff = 64.0;	float Coff = 512.0f;	uint32_t dwOvLuma, dwOvROff, dwOvGOff, dwOvBOff;	uint32_t dwOvRCb, dwOvRCr;	uint32_t dwOvGCb, dwOvGCr;	uint32_t dwOvBCb, dwOvBCr;	if (ref >= 2) return;	OvHueSin = sin((double)hue);	OvHueCos = cos((double)hue);	CAdjLuma = cont * trans[ref].RefLuma;	CAdjOff = cont * trans[ref].RefLuma * bright * 1023.0;	RedAdj = cont * trans[ref].RefLuma * red_intensity * 1023.0;	GreenAdj = cont * trans[ref].RefLuma * green_intensity * 1023.0;	BlueAdj = cont * trans[ref].RefLuma * blue_intensity * 1023.0;	CAdjRCb = sat * -OvHueSin * trans[ref].RefRCr;	CAdjRCr = sat * OvHueCos * trans[ref].RefRCr;	CAdjGCb = sat * (OvHueCos * trans[ref].RefGCb - OvHueSin * trans[ref].RefGCr);	CAdjGCr = sat * (OvHueSin * trans[ref].RefGCb + OvHueCos * trans[ref].RefGCr);	CAdjBCb = sat * OvHueCos * trans[ref].RefBCb;	CAdjBCr = sat * OvHueSin * trans[ref].RefBCb;    #if 0 /* default constants */	CAdjLuma = 1.16455078125;	CAdjRCb = 0.0;	CAdjRCr = 1.59619140625;	CAdjGCb = -0.39111328125;	CAdjGCr = -0.8125;	CAdjBCb = 2.01708984375;	CAdjBCr = 0;#endif	OvLuma = CAdjLuma;	OvRCb = CAdjRCb;	OvRCr = CAdjRCr;	OvGCb = CAdjGCb;	OvGCr = CAdjGCr;	OvBCb = CAdjBCb;	OvBCr = CAdjBCr;	OvROff = RedAdj + CAdjOff -		OvLuma * Loff - (OvRCb + OvRCr) * Coff;	OvGOff = GreenAdj + CAdjOff - 		OvLuma * Loff - (OvGCb + OvGCr) * Coff;	OvBOff = BlueAdj + CAdjOff - 		OvLuma * Loff - (OvBCb + OvBCr) * Coff;#if 0 /* default constants */	OvROff = -888.5;	OvGOff = 545;	OvBOff = -1104;#endif    	dwOvROff = ((int)(OvROff * 2.0)) & 0x1fff;	dwOvGOff = (int)(OvGOff * 2.0) & 0x1fff;	dwOvBOff = (int)(OvBOff * 2.0) & 0x1fff;	/* Whatever docs say about R200 having 3.8 format instead of 3.11	   as in Radeon is a lie */#if 0	if(!IsR200)	{#endif		dwOvLuma =(((int)(OvLuma * 2048.0))&0x7fff)<<17;		dwOvRCb = (((int)(OvRCb * 2048.0))&0x7fff)<<1;		dwOvRCr = (((int)(OvRCr * 2048.0))&0x7fff)<<17;		dwOvGCb = (((int)(OvGCb * 2048.0))&0x7fff)<<1;		dwOvGCr = (((int)(OvGCr * 2048.0))&0x7fff)<<17;		dwOvBCb = (((int)(OvBCb * 2048.0))&0x7fff)<<1;		dwOvBCr = (((int)(OvBCr * 2048.0))&0x7fff)<<17;#if 0	}	else	{		dwOvLuma = (((int)(OvLuma * 256.0))&0x7ff)<<20;		dwOvRCb = (((int)(OvRCb * 256.0))&0x7ff)<<4;		dwOvRCr = (((int)(OvRCr * 256.0))&0x7ff)<<20;		dwOvGCb = (((int)(OvGCb * 256.0))&0x7ff)<<4;		dwOvGCr = (((int)(OvGCr * 256.0))&0x7ff)<<20;		dwOvBCb = (((int)(OvBCb * 256.0))&0x7ff)<<4;		dwOvBCr = (((int)(OvBCr * 256.0))&0x7ff)<<20;	}#endif	OUTREG(OV0_LIN_TRANS_A, dwOvRCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_B, dwOvROff | dwOvRCr);	OUTREG(OV0_LIN_TRANS_C, dwOvGCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_D, dwOvGOff | dwOvGCr);	OUTREG(OV0_LIN_TRANS_E, dwOvBCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_F, dwOvBOff | dwOvBCr);}/* Gamma curve definition */typedef struct {	unsigned int gammaReg;	unsigned int gammaSlope;	unsigned int gammaOffset;}GAMMA_SETTINGS;/* Recommended gamma curve parameters */GAMMA_SETTINGS r200_def_gamma[18] = {	{OV0_GAMMA_0_F, 0x100, 0x0000},	{OV0_GAMMA_10_1F, 0x100, 0x0020},	{OV0_GAMMA_20_3F, 0x100, 0x0040},	{OV0_GAMMA_40_7F, 0x100, 0x0080},	{OV0_GAMMA_80_BF, 0x100, 0x0100},	{OV0_GAMMA_C0_FF, 0x100, 0x0100},	{OV0_GAMMA_100_13F, 0x100, 0x0200},	{OV0_GAMMA_140_17F, 0x100, 0x0200},	{OV0_GAMMA_180_1BF, 0x100, 0x0300},	{OV0_GAMMA_1C0_1FF, 0x100, 0x0300},	{OV0_GAMMA_200_23F, 0x100, 0x0400},	{OV0_GAMMA_240_27F, 0x100, 0x0400},	{OV0_GAMMA_280_2BF, 0x100, 0x0500},	{OV0_GAMMA_2C0_2FF, 0x100, 0x0500},	{OV0_GAMMA_300_33F, 0x100, 0x0600},	{OV0_GAMMA_340_37F, 0x100, 0x0600},	{OV0_GAMMA_380_3BF, 0x100, 0x0700},	{OV0_GAMMA_3C0_3FF, 0x100, 0x0700}};GAMMA_SETTINGS r100_def_gamma[6] = {	{OV0_GAMMA_0_F, 0x100, 0x0000},	{OV0_GAMMA_10_1F, 0x100, 0x0020},	{OV0_GAMMA_20_3F, 0x100, 0x0040},	{OV0_GAMMA_40_7F, 0x100, 0x0080},	{OV0_GAMMA_380_3BF, 0x100, 0x0100},	{OV0_GAMMA_3C0_3FF, 0x100, 0x0100}};static void make_default_gamma_correction( void ){    size_t i;    if(RadeonFamily == 100){	OUTREG(OV0_LIN_TRANS_A, 0x12A00000);	OUTREG(OV0_LIN_TRANS_B, 0x199018FE);	OUTREG(OV0_LIN_TRANS_C, 0x12A0F9B0);	OUTREG(OV0_LIN_TRANS_D, 0xF2F0043B);	OUTREG(OV0_LIN_TRANS_E, 0x12A02050);	OUTREG(OV0_LIN_TRANS_F, 0x0000174E);	for(i=0; i<6; i++){		OUTREG(r100_def_gamma[i].gammaReg,		       (r100_def_gamma[i].gammaSlope<<16) |			r100_def_gamma[i].gammaOffset);	}    }    else{	OUTREG(OV0_LIN_TRANS_A, 0x12a20000);	OUTREG(OV0_LIN_TRANS_B, 0x198a190e);	OUTREG(OV0_LIN_TRANS_C, 0x12a2f9da);	OUTREG(OV0_LIN_TRANS_D, 0xf2fe0442);	OUTREG(OV0_LIN_TRANS_E, 0x12a22046);	OUTREG(OV0_LIN_TRANS_F, 0x175f);	/* Default Gamma,	   Of 18 segments for gamma cure, all segments in R200 are programmable,	   while only lower 4 and upper 2 segments are programmable in Radeon*/	for(i=0; i<18; i++){		OUTREG(r200_def_gamma[i].gammaReg,		       (r200_def_gamma[i].gammaSlope<<16) |			r200_def_gamma[i].gammaOffset);	}    }}#endif	static void radeon_vid_make_default(void){#ifdef RAGE128  besr.saturation = 0x0F;  besr.brightness = 0;  OUTREG(OV0_COLOUR_CNTL,0x000F0F00UL); /* Default brihgtness and saturation for Rage128 */#else  make_default_gamma_correction();#endif  besr.deinterlace_pattern = 0x900AAAAA;  OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern);  besr.deinterlace_on=1;  besr.double_buff=1;  besr.ckey_on=0;  besr.graphics_key_msk=0;  besr.graphics_key_clr=0;  besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND;}unsigned VIDIX_NAME(vixGetVersion)( void ) { return VIDIX_VERSION; }static unsigned short 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, DEVICE_ATI_RAGE_128_PB_PRO, DEVICE_ATI_RAGE_128_PC_PRO, DEVICE_ATI_RAGE_128_PD_PRO, DEVICE_ATI_RAGE_128_PE_PRO, DEVICE_ATI_RAGE_128_PF_PRO,/* Rage128 Pro VR */ DEVICE_ATI_RAGE_128_PG_PRO, DEVICE_ATI_RAGE_128_PH_PRO, DEVICE_ATI_RAGE_128_PI_PRO, DEVICE_ATI_RAGE_128_PJ_PRO, DEVICE_ATI_RAGE_128_PK_PRO, DEVICE_ATI_RAGE_128_PL_PRO, DEVICE_ATI_RAGE_128_PM_PRO, DEVICE_ATI_RAGE_128_PN_PRO, DEVICE_ATI_RAGE_128_PO_PRO, DEVICE_ATI_RAGE_128_PP_PRO, DEVICE_ATI_RAGE_128_PQ_PRO,

⌨️ 快捷键说明

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