📄 radeon_video.c
字号:
(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 + -