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

📄 radeon_video.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	    (gamma_curve_r100[gamma].GAMMA_10_1F_OFFSET << 0x00000000) |	    (gamma_curve_r100[gamma].GAMMA_10_1F_SLOPE << 0x00000010));    	OUTREG(RADEON_OV0_GAMMA_020_03F,	    (gamma_curve_r100[gamma].GAMMA_20_3F_OFFSET << 0x00000000) |	    (gamma_curve_r100[gamma].GAMMA_20_3F_SLOPE << 0x00000010));    	OUTREG(RADEON_OV0_GAMMA_040_07F,	    (gamma_curve_r100[gamma].GAMMA_40_7F_OFFSET << 0x00000000) |	    (gamma_curve_r100[gamma].GAMMA_40_7F_SLOPE << 0x00000010));    	OUTREG(RADEON_OV0_GAMMA_380_3BF,	    (gamma_curve_r100[gamma].GAMMA_380_3BF_OFFSET << 0x00000000) |	    (gamma_curve_r100[gamma].GAMMA_380_3BF_SLOPE << 0x00000010));    	OUTREG(RADEON_OV0_GAMMA_3C0_3FF,	    (gamma_curve_r100[gamma].GAMMA_3C0_3FF_OFFSET << 0x00000000) |	    (gamma_curve_r100[gamma].GAMMA_3C0_3FF_SLOPE << 0x00000010));    }}/**************************************************************************** * 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 - intensity of red component                    * *            green_intensity - intensity of green component                * *            blue_intensity - intensity of blue component                  * *            ref - index to the table of refernce transforms               * *            user_gamma - gamma value x 1000 (e.g., 1200 = gamma of 1.2)   * *   Outputs: NONE                                                          * ****************************************************************************/static void RADEONSetTransform (ScrnInfoPtr pScrn,				float	    bright,				float	    cont,				float	    sat,				float	    hue,				float	    red_intensity,				float	    green_intensity,				float	    blue_intensity,				CARD32	    ref,				CARD32      user_gamma){    RADEONInfoPtr    info = RADEONPTR(pScrn);    unsigned char   *RADEONMMIO = info->MMIO;    float	    OvHueSin, OvHueCos;    float	    CAdjLuma, CAdjOff;    float	    CAdjRCb, CAdjRCr;    float	    CAdjGCb, CAdjGCr;    float	    CAdjBCb, CAdjBCr;    float	    RedAdj,GreenAdj,BlueAdj;    float	    OvLuma, OvROff, OvGOff, OvBOff;    float	    OvRCb, OvRCr;    float	    OvGCb, OvGCr;    float	    OvBCb, OvBCr;    float	    Loff = 64.0;    float	    Coff = 512.0f;    CARD32	    dwOvLuma, dwOvROff, dwOvGOff, dwOvBOff;    CARD32	    dwOvRCb, dwOvRCr;    CARD32	    dwOvGCb, dwOvGCr;    CARD32	    dwOvBCb, dwOvBCr;    CARD32	    gamma = 0;    if (ref >= 2)	return;    /* translate from user_gamma (gamma x 1000) to radeon gamma table index value */    if (user_gamma <= 925)       /* 0.85 */	gamma = 1;    else if (user_gamma <= 1050) /* 1.0  */	gamma = 0;    else if (user_gamma <= 1150) /* 1.1  */	gamma = 2;    else if (user_gamma <= 1325) /* 1.2  */	gamma = 3;    else if (user_gamma <= 1575) /* 1.45 */	gamma = 4;    else if (user_gamma <= 1950) /* 1.7  */	gamma = 5;    else if (user_gamma <= 2350) /* 2.2  */	gamma = 6;    else if (user_gamma > 2350)  /* 2.5  */	gamma = 7;    if (gamma >= 8) 	return;    OvHueSin = sin(hue);    OvHueCos = cos(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 * gamma_curve_r100[gamma].OvGammaCont;    OvRCb = CAdjRCb * gamma_curve_r100[gamma].OvGammaCont;    OvRCr = CAdjRCr * gamma_curve_r100[gamma].OvGammaCont;    OvGCb = CAdjGCb * gamma_curve_r100[gamma].OvGammaCont;    OvGCr = CAdjGCr * gamma_curve_r100[gamma].OvGammaCont;    OvBCb = CAdjBCb * gamma_curve_r100[gamma].OvGammaCont;    OvBCr = CAdjBCr * gamma_curve_r100[gamma].OvGammaCont;    OvROff = CAdjOff * gamma_curve_r100[gamma].OvGammaCont - 	OvLuma * Loff - (OvRCb + OvRCr) * Coff;    OvGOff = CAdjOff * gamma_curve_r100[gamma].OvGammaCont - 	OvLuma * Loff - (OvGCb + OvGCr) * Coff;    OvBOff = CAdjOff * gamma_curve_r100[gamma].OvGammaCont - 	OvLuma * Loff - (OvBCb + OvBCr) * Coff;#if 0 /* default constants */    OvROff = -888.5;    OvGOff = 545;    OvBOff = -1104;#endif    OvROff = ClipValue(OvROff, -2048.0, 2047.5);    OvGOff = ClipValue(OvGOff, -2048.0, 2047.5);    OvBOff = ClipValue(OvBOff, -2048.0, 2047.5);    dwOvROff = ((INT32)(OvROff * 2.0)) & 0x1fff;    dwOvGOff = ((INT32)(OvGOff * 2.0)) & 0x1fff;    dwOvBOff = ((INT32)(OvBOff * 2.0)) & 0x1fff;    if(info->ChipFamily == CHIP_FAMILY_RADEON)    {	dwOvLuma =(((INT32)(OvLuma * 2048.0))&0x7fff)<<17;	dwOvRCb = (((INT32)(OvRCb * 2048.0))&0x7fff)<<1;	dwOvRCr = (((INT32)(OvRCr * 2048.0))&0x7fff)<<17;	dwOvGCb = (((INT32)(OvGCb * 2048.0))&0x7fff)<<1;	dwOvGCr = (((INT32)(OvGCr * 2048.0))&0x7fff)<<17;	dwOvBCb = (((INT32)(OvBCb * 2048.0))&0x7fff)<<1;	dwOvBCr = (((INT32)(OvBCr * 2048.0))&0x7fff)<<17;    }    else    {	dwOvLuma = (((INT32)(OvLuma * 256.0))&0xfff)<<20;	dwOvRCb = (((INT32)(OvRCb * 256.0))&0xfff)<<4;	dwOvRCr = (((INT32)(OvRCr * 256.0))&0xfff)<<20;	dwOvGCb = (((INT32)(OvGCb * 256.0))&0xfff)<<4;	dwOvGCr = (((INT32)(OvGCr * 256.0))&0xfff)<<20;	dwOvBCb = (((INT32)(OvBCb * 256.0))&0xfff)<<4;	dwOvBCr = (((INT32)(OvBCr * 256.0))&0xfff)<<20;    }    /* set gamma */    RADEONSetOverlayGamma(pScrn, gamma);    /* color transforms */    OUTREG(RADEON_OV0_LIN_TRANS_A, dwOvRCb | dwOvLuma);    OUTREG(RADEON_OV0_LIN_TRANS_B, dwOvROff | dwOvRCr);    OUTREG(RADEON_OV0_LIN_TRANS_C, dwOvGCb | dwOvLuma);    OUTREG(RADEON_OV0_LIN_TRANS_D, dwOvGOff | dwOvGCr);    OUTREG(RADEON_OV0_LIN_TRANS_E, dwOvBCb | dwOvLuma);    OUTREG(RADEON_OV0_LIN_TRANS_F, dwOvBOff | dwOvBCr);}static void RADEONSetOverlayAlpha(ScrnInfoPtr pScrn, int ov_alpha, int gr_alpha, int alpha_mode){    RADEONInfoPtr info = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    if (alpha_mode == 0) { /* key mode */    	OUTREG(RADEON_OV0_KEY_CNTL, 		RADEON_GRAPHIC_KEY_FN_EQ | /* what does this do? */		RADEON_VIDEO_KEY_FN_FALSE | /* what does this do? */		RADEON_CMP_MIX_OR);    	/* crtc 1 */    	OUTREG(RADEON_DISP_MERGE_CNTL,		(RADEON_DISP_ALPHA_MODE_KEY & 		RADEON_DISP_ALPHA_MODE_MASK) |		((gr_alpha << 0x00000010) & 		RADEON_DISP_GRPH_ALPHA_MASK) |		((ov_alpha << 0x00000018) & 		RADEON_DISP_OV0_ALPHA_MASK));    	/* crtc 2 */    	OUTREG(RADEON_DISP2_MERGE_CNTL,		(RADEON_DISP_ALPHA_MODE_KEY & 		RADEON_DISP_ALPHA_MODE_MASK) |		((gr_alpha << 0x00000010) & 		RADEON_DISP_GRPH_ALPHA_MASK) |		((ov_alpha << 0x00000018) & 		RADEON_DISP_OV0_ALPHA_MASK));    } else { /* global mode */    	OUTREG(RADEON_OV0_KEY_CNTL, 		RADEON_GRAPHIC_KEY_FN_FALSE |   /* what does this do? */		RADEON_VIDEO_KEY_FN_FALSE |   /* what does this do? */		RADEON_CMP_MIX_AND);    	/* crtc 2 */    	OUTREG(RADEON_DISP2_MERGE_CNTL,		(RADEON_DISP_ALPHA_MODE_GLOBAL & 		RADEON_DISP_ALPHA_MODE_MASK) |		((gr_alpha << 0x00000010) & 		RADEON_DISP_GRPH_ALPHA_MASK) |		((ov_alpha << 0x00000018) & 		RADEON_DISP_OV0_ALPHA_MASK));    	/* crtc 1 */    	OUTREG(RADEON_DISP_MERGE_CNTL,		(RADEON_DISP_ALPHA_MODE_GLOBAL & 		RADEON_DISP_ALPHA_MODE_MASK) |		((gr_alpha << 0x00000010) & 		RADEON_DISP_GRPH_ALPHA_MASK) |		((ov_alpha << 0x00000018) & 		RADEON_DISP_OV0_ALPHA_MASK));    }     /* per-pixel mode - RADEON_DISP_ALPHA_MODE_PER_PIXEL */     /* not yet supported */}static void RADEONSetColorKey(ScrnInfoPtr pScrn, CARD32 colorKey){    RADEONInfoPtr info = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    CARD32 min, max;    CARD8 r, g, b;    if (info->CurrentLayout.depth > 8)    {	CARD32	rbits, gbits, bbits;	rbits = (colorKey & pScrn->mask.red) >> pScrn->offset.red;	gbits = (colorKey & pScrn->mask.green) >> pScrn->offset.green;	bbits = (colorKey & pScrn->mask.blue) >> pScrn->offset.blue;	r = rbits << (8 - pScrn->weight.red);	g = gbits << (8 - pScrn->weight.green);	b = bbits << (8 - pScrn->weight.blue);    }    else    {	CARD32	bits;	bits = colorKey & ((1 << info->CurrentLayout.depth) - 1);	r = bits;	g = bits;	b = bits;    }    min = (r << 16) | (g << 8) | (b);    max = (0xff << 24) | (r << 16) | (g << 8) | (b);    RADEONWaitForFifo(pScrn, 2);    OUTREG(RADEON_OV0_GRAPHICS_KEY_CLR_HIGH, max);    OUTREG(RADEON_OV0_GRAPHICS_KEY_CLR_LOW, min);}voidRADEONResetVideo(ScrnInfoPtr pScrn){    RADEONInfoPtr   info      = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    RADEONPortPrivPtr pPriv = info->adaptor->pPortPrivates[0].ptr;    char tmp[200];    /* this function is called from ScreenInit. pScreen is used        by XAA internally, but not valid until ScreenInit finishs.    */    if (info->accelOn && pScrn->pScreen)	RADEON_SYNC(info, pScrn);    /* this is done here because each time the server is reset these       could change.. Otherwise they remain constant */    xvInstanceID = MAKE_ATOM("XV_INSTANCE_ID");    xvDeviceID = MAKE_ATOM("XV_DEVICE_ID");    xvLocationID = MAKE_ATOM("XV_LOCATION_ID");    xvDumpStatus = MAKE_ATOM("XV_DUMP_STATUS");     xvBrightness   = MAKE_ATOM("XV_BRIGHTNESS");    xvSaturation   = MAKE_ATOM("XV_SATURATION");    xvColor        = MAKE_ATOM("XV_COLOR");    xvContrast     = MAKE_ATOM("XV_CONTRAST");    xvColorKey     = MAKE_ATOM("XV_COLORKEY");    xvDoubleBuffer = MAKE_ATOM("XV_DOUBLE_BUFFER");    xvHue          = MAKE_ATOM("XV_HUE");    xvRedIntensity   = MAKE_ATOM("XV_RED_INTENSITY");    xvGreenIntensity = MAKE_ATOM("XV_GREEN_INTENSITY");    xvBlueIntensity  = MAKE_ATOM("XV_BLUE_INTENSITY");    xvGamma          = MAKE_ATOM("XV_GAMMA");    xvColorspace     = MAKE_ATOM("XV_COLORSPACE");    xvAutopaintColorkey = MAKE_ATOM("XV_AUTOPAINT_COLORKEY");    xvSetDefaults       = MAKE_ATOM("XV_SET_DEFAULTS");    xvSwitchCRT         = MAKE_ATOM("XV_SWITCHCRT");    xvOvAlpha	      = MAKE_ATOM("XV_OVERLAY_ALPHA");    xvGrAlpha	      = MAKE_ATOM("XV_GRAPHICS_ALPHA");    xvAlphaMode       = MAKE_ATOM("XV_ALPHA_MODE");    xvOverlayDeinterlacingMethod = MAKE_ATOM("XV_OVERLAY_DEINTERLACING_METHOD");    xvDecBrightness   = MAKE_ATOM("XV_DEC_BRIGHTNESS");    xvDecSaturation   = MAKE_ATOM("XV_DEC_SATURATION");    xvDecColor        = MAKE_ATOM("XV_DEC_COLOR");    xvDecContrast     = MAKE_ATOM("XV_DEC_CONTRAST");    xvDecHue          = MAKE_ATOM("XV_DEC_HUE");    xvEncoding        = MAKE_ATOM("XV_ENCODING");    xvFrequency       = MAKE_ATOM("XV_FREQ");    xvTunerStatus     = MAKE_ATOM("XV_TUNER_STATUS");    xvVolume          = MAKE_ATOM("XV_VOLUME");    xvMute            = MAKE_ATOM("XV_MUTE");    xvSAP             = MAKE_ATOM("XV_SAP");    xvAdjustment      = MAKE_ATOM("XV_DEBUG_ADJUSTMENT");    sprintf(tmp, "RXXX:%d.%d.%d", info->PciInfo->vendor, info->PciInfo->chipType, info->PciInfo->chipRev);    pPriv->device_id = MAKE_ATOM(tmp);    sprintf(tmp, "PCI:%02d:%02d.%d", info->PciInfo->bus, info->PciInfo->device, info->PciInfo->func);    pPriv->location_id = MAKE_ATOM(tmp);    sprintf(tmp, "INSTANCE:%d", pScrn->scrnIndex);    pPriv->instance_id = MAKE_ATOM(tmp);    OUTREG(RADEON_OV0_SCALE_CNTL, RADEON_SCALER_SOFT_RESET);    OUTREG(RADEON_OV0_AUTO_FLIP_CNTL, 0);   /* maybe */    OUTREG(RADEON_OV0_EXCLUSIVE_HORZ, 0);    OUTREG(RADEON_OV0_FILTER_CNTL, RADEON_FILTER_PROGRAMMABLE_COEF);    OUTREG(RADEON_OV0_KEY_CNTL, RADEON_GRAPHIC_KEY_FN_EQ |				RADEON_VIDEO_KEY_FN_FALSE |				RADEON_CMP_MIX_OR);    OUTREG(RADEON_OV0_TEST, 0);    OUTREG(RADEON_FCP_CNTL, RADEON_FCP0_SRC_GND);    OUTREG(RADEON_CAP0_TRIG_CNTL, 0);    RADEONSetColorKey(pScrn, pPriv->colorKey);    if (info->ChipFamily == CHIP_FAMILY_RADEON) {	OUTREG(RADEON_OV0_LIN_TRANS_A, 0x12a00000);	OUTREG(RADEON_OV0_LIN_TRANS_B, 0x1990190e);	OUTREG(RADEON_OV0_LIN_TRANS_C, 0x12a0f9c0);	OUTREG(RADEON_OV0_LIN_TRANS_D, 0xf3000442);	OUTREG(RADEON_OV0_LIN_TRANS_E, 0x12a02040);	OUTREG(RADEON_OV0_LIN_TRANS_F, 0x175f);    } else {	OUTREG(RADEON_OV0_LIN_TRANS_A, 0x12a20000);	OUTREG(RADEON_OV0_LIN_TRANS_B, 0x198a190e);	OUTREG(RADEON_OV0_LIN_TRANS_C, 0x12a2f9da);	OUTREG(RADEON_OV0_LIN_TRANS_D, 0xf2fe0442);	OUTREG(RADEON_OV0_LIN_TRANS_E, 0x12a22046);	OUTREG(RADEON_OV0_LIN_TRANS_F, 0x175f);    }	/*	 * Set default Gamma ramp:	 *	 * Of 18 segments for gamma curve, all segments in R200 (and	 * newer) are programmable, while only lower 4 and upper 2	 * segments are programmable in the older Radeons.	 */    RADEONSetOverlayGamma(pScrn, 0); /* gamma = 1.0 */    if(pPriv->VIP!=NULL){        RADEONVIP_reset(pScrn,pPriv);        }        if(pPriv->theatre != NULL) {        xf86_InitTheatre(pPriv->theatre);/*      xf86_ResetTheatreRegsForNoTVout(pPriv->theatre); */        }        if(pPriv->i2c != NULL){        RADEONResetI2C(pScrn, pPriv);        }}static void RADEONSetupTheatre(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv){    RADEONInfoPtr info = RADEONPTR(pScrn);    RADEONPLLPtr  pll = &(info->pll);    TheatrePtr t;

⌨️ 快捷键说明

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