summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hilber <sparkie@lowbyte.de>2009-02-10 08:00:00 +0000
committerPaul Menzel <paulepanter@users.sourceforge.net>2009-06-06 14:45:07 +0200
commit1875e1520b6309615da60815e4d79bf66fa0702b (patch)
tree082b09459fcabe8285674c3e66ca53171940cd1b
parentea522aef817c484ec4b2919eb1862ce5f7e9a340 (diff)
downloadxf86-video-ati-frc-1875e1520b6309615da60815e4d79bf66fa0702b.tar.gz
xf86-video-ati-frc-1875e1520b6309615da60815e4d79bf66fa0702b.tar.bz2
Some minor corrections.
Signed-off-by: Thomas Hilber <sparkie@lowbyte.de> Signed-off-by: Paul Menzel <paulepanter@users.sourceforge.net>
-rw-r--r--src/radeon_video.c211
1 files changed, 109 insertions, 102 deletions
diff --git a/src/radeon_video.c b/src/radeon_video.c
index 9458a8d..3953859 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -286,14 +286,6 @@ void RADEONInitVideo(ScreenPtr pScreen)
memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr));
adaptors = newAdaptors;
-#define ENABLE_XV_OVERLAY_ADAPTOR
-
-/*
- * enable this if you either want to use
- * - recent xine-lib versions that let choose you adaptor type by configuration
- * - XV overlay adaptor type
- */
-#ifdef ENABLE_XV_OVERLAY_ADAPTOR
if (!IS_AVIVO_VARIANT) {
overlayAdaptor = RADEONSetupImageVideo(pScreen);
if (overlayAdaptor != NULL) {
@@ -303,9 +295,7 @@ void RADEONInitVideo(ScreenPtr pScreen)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to set up overlay video\n");
RADEONInitOffscreenImages(pScreen);
}
-#else
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "XV overlay adaptor disabled by #define\n");
-#endif
+
if (info->ChipFamily != CHIP_FAMILY_RV250) {
if ((info->ChipFamily < CHIP_FAMILY_RS400)
#ifdef XF86DRI
@@ -2955,7 +2945,7 @@ RADEONPutImage(
xf86CrtcPtr crtc;
#ifdef VGA_SYNC_FIELDS
- vga_sync_fields(info->dri->drmFD, info->MMIO);
+ vga_sync_fields(info->drmFD, info->MMIO);
#endif
/*
@@ -4037,28 +4027,44 @@ switch(pPriv->encoding){
/* --- 8< --- */
/*
+ * field cycle duration in usecs for PAL
+ */
+#define SYF_PAL_FIELD_CYCLE 20000
+
+/*
+ * frame cycle duration in usecs for PAL
+ */
+#define SYF_PAL_FRAME_CYCLE (SYF_PAL_FIELD_CYCLE << 1)
+
+/*
+ * dependent on interlaced (progressive) input frame rate 25 (50) fps
+ * we set this to 0 (1). other params should adjust accordingly.
+ */
+#define SYF_INPUT_DOUBLE_RATE 0
+
+/*
* prefilter to prevent stray updates.
* our software PLL will not try to lock for these.
*/
-#define SYF_CATCH_RANGE 18000
+#define SYF_CATCH_RANGE (18000 >> SYF_INPUT_DOUBLE_RATE)
/*
* updates outside time window defined by this
* value spawn warnings when in debug mode
*/
-#define SYF_STRAY_WARN 10000
+#define SYF_WARN_RANGE (15000 >> SYF_INPUT_DOUBLE_RATE)
/*
- * we average 25 frames to yield a cycle time of
+ * we average 25 (50) frames to yield a cycle time of
* about one second for analysis of frame rate data.
* this serves as frequency divider for our software PLL.
*/
-#define SYF_PLL_DIVIDER 25
+#define SYF_PLL_DIVIDER (25 << SYF_INPUT_DOUBLE_RATE)
/*
- * frame cycle duration in usecs for 25 fps
+ * input frame cycle duration in usecs for 25 (50) fps
*/
-#define SYF_FRAME_CYCLE 40000
+#define SYF_FRAME_CYCLE (SYF_PAL_FRAME_CYCLE >> SYF_INPUT_DOUBLE_RATE)
/*
* offset in usecs from double buffer switch where we try to place double
@@ -4090,6 +4096,7 @@ switch(pPriv->encoding){
* maximum absolute trim values allowed due to current
* hardware/driver contraints.
* this delimits 'maximum voltage' controlling our VCO.
+ * currently allowed range is defined symmetrically around the center voltage.
*/
#define SYF_MAX_TRIM_ABS 37
@@ -4110,10 +4117,21 @@ switch(pPriv->encoding){
#ifdef STANDALONE
#define ErrorF printf
#define B(a) (*(argv + (a)) ? *(argv + (a)) : 0)
+#define min(a, b) ((a) <= (b) ? (a) : (b))
+#define max(a, b) ((a) >= (b) ? (a) : (b))
+#define abs(a) ((a) >= 0 ? (a) : -(a))
#else
#define B(a) (a)
#endif
+typedef struct _syf {
+ int cnt;
+ int tsum;
+ int trim;
+ int drift;
+ int spoint;
+} syf_t;
+
void
meter_out(val, symb)
{
@@ -4121,7 +4139,7 @@ meter_out(val, symb)
static char headr[81] = "|<- -20ms 0 +20ms ->|";
if (!symb || symb == 1) {
- if (!symb) ErrorF("%s", headr);
+ if (!symb) ErrorF("%s", headr);
if (symb == 1) ErrorF("%s", meter);
memset(meter, '-', 80);
return;
@@ -4138,25 +4156,21 @@ vga_sync_fields(fd, RADEONMMIO)
unsigned char *RADEONMMIO;
{
static int vbl_refcnt;
- static int cnt;
- static int sum;
- static int trim;
- static int ds_usecs;
- static int sync_point_disp;
- static struct timeval skew_prev;
+ static syf_t syf, syf_clear;
+ static struct timeval skew2vbl_prev;
static drm_radeon_syncf_t syncf_prev;
- struct timeval skew;
- struct timeval drift_speed;
- struct drm_modeset_ctl vbl_activate;
drm_radeon_syncf_t syncf;
- int tmp;
+ struct timeval skew2vbl;
+ struct timeval tv_usecs;
+ int usecs;
+ struct drm_modeset_ctl vbl_activate;
if (!vbl_refcnt) {
vbl_activate.crtc = VSF_CRTC;
vbl_activate.cmd = _DRM_PRE_MODESET;
if (ioctl(fd, DRM_IOCTL_MODESET_CTL, &vbl_activate)) {
- ErrorF("DRM_IOCTL_MODESET_CTL: %s\n", strerror(errno));
+ ErrorF("DRM_IOCTL_MODESET_CTL: %s\n", strerror(errno)); exit(-1);
}
++vbl_refcnt;
}
@@ -4164,97 +4178,90 @@ vga_sync_fields(fd, RADEONMMIO)
/* --- 8< --- */
syncf.trim = 0;
if (ioctl(fd, DRM_IOCTL_RADEON_SYNCF, &syncf)) {
- ErrorF("DRM_IOCTL_RADEON_SYNCF: %s\n", strerror(errno));
+ ErrorF("DRM_IOCTL_RADEON_SYNCF: %s\n", strerror(errno)); exit(-1);
}
-#if 0
- ErrorF("%10d %10d %10d %10d %10d\n",
- (int)syncf.tv_now.tv_sec,
- (int)syncf.tv_now.tv_usec,
- (int)syncf.tv_vbl.tv_sec,
- (int)syncf.tv_vbl.tv_usec,
- syncf.trim);
-#endif
- VSF_SUB(syncf.tv_now, syncf_prev.tv_now, drift_speed);
- VSF_TV2USEC(drift_speed, tmp);
+ VSF_SUB(syncf.tv_now, syncf_prev.tv_now, tv_usecs);
+ VSF_TV2USEC(tv_usecs, usecs);
#ifdef STANDALONE
- if (syncf_prev.tv_now.tv_sec) {
- usleepv += SYF_FRAME_CYCLE - tmp;
- }
+ if (syncf_prev.tv_now.tv_sec) {
+ usleepv += SYF_FRAME_CYCLE - usecs;
+ }
#endif
- syncf_prev = syncf;
- if (tmp < SYF_FRAME_CYCLE - SYF_CATCH_RANGE || tmp > SYF_FRAME_CYCLE + SYF_CATCH_RANGE) {
-
- /*
- * toss stray intervals and reset
- */
- cnt = 0;
- sum = 0;
- trim = 0;
- ds_usecs = 0;
- sync_point_disp = 0;
- skew_prev.tv_sec = ~0;
+ syncf_prev = syncf;
+ if (abs(usecs - SYF_FRAME_CYCLE) > SYF_CATCH_RANGE) {
+
+ /*
+ * toss stray intervals and reset
+ */
+ syf = syf_clear;
+ skew2vbl_prev.tv_sec = ~0;
OUT_GRAPHIC(0, 0);
- ErrorF(" R %11d\n", tmp);
+ ErrorF(" R %11d\n", usecs);
#ifdef STANDALONE
- goto main_loop_end;
+ goto main_loop_end;
#else
- return;
+ return;
#endif
- }
- if (tmp < SYF_FRAME_CYCLE - SYF_STRAY_WARN || tmp > SYF_FRAME_CYCLE + SYF_STRAY_WARN) {
- OUT_GRAPHIC(0, 0);
- ErrorF(" W %11d\n", tmp);
- }
+ }
+ if (abs(usecs - SYF_FRAME_CYCLE) > SYF_WARN_RANGE) {
+ OUT_GRAPHIC(0, 0);
+ ErrorF(" W %11d\n", usecs);
+ }
+
#ifndef STANDALONE
{
- int vline = (INREG(RADEON_CRTC_VLINE_CRNT_VLINE) & RADEON_CRTC_CRNT_VLINE_MASK) >> RADEON_CRTC_CRNT_VLINE_SHIFT;
- int stat = INREG(RADEON_CRTC_STATUS) & RADEON_CRTC_CURRENT_FIELD;
- if (!stat) {
- usleep(64 * (311 - (vline >> 1) + 1));
- }
+ /*
+ * we must delay the next double buffer update
+ * until even field has been processed.
+ */
+ int vline = (INREG(RADEON_CRTC_VLINE_CRNT_VLINE) & RADEON_CRTC_CRNT_VLINE_MASK) >> RADEON_CRTC_CRNT_VLINE_SHIFT;
+ int stat = INREG(RADEON_CRTC_STATUS) & RADEON_CRTC_CURRENT_FIELD;
+ if (!stat) {
+ usleep(64 * (311 - (vline >> 1) + 1));
+ }
}
#endif
- VSF_SUB(syncf.tv_now, syncf.tv_vbl, skew)
- if (skew_prev.tv_sec != ~0) {
- sum += tmp;
- sync_point_disp += skew.tv_usec - SYF_SYNC_POINT;
- VSF_SUB(skew, skew_prev, drift_speed);
- VSF_TV2USEC(drift_speed, tmp);
- ds_usecs += tmp;
- ++cnt;
- }
- if (skew_prev.tv_sec != ~0 && !(cnt % SYF_PLL_DIVIDER)) {
- sync_point_disp /= SYF_PLL_DIVIDER;
+ VSF_SUB(syncf.tv_now, syncf.tv_vbl, skew2vbl)
+ if (skew2vbl_prev.tv_sec != ~0) {
+ syf.tsum += usecs;
+ syf.spoint += skew2vbl.tv_usec - SYF_SYNC_POINT;
+ VSF_SUB(skew2vbl, skew2vbl_prev, tv_usecs);
+ VSF_TV2USEC(tv_usecs, usecs);
+ syf.drift += usecs;
+ ++syf.cnt;
+ }
+ if (skew2vbl_prev.tv_sec != ~0 && !(syf.cnt % SYF_PLL_DIVIDER)) {
+ syf.spoint /= SYF_PLL_DIVIDER;
OUT_GRAPHIC(0, '+');
- OUT_GRAPHIC(sync_point_disp, '|');
- OUT_GRAPHIC(ds_usecs, '*');
+ OUT_GRAPHIC(syf.spoint, '|');
+ OUT_GRAPHIC(syf.drift, '*');
OUT_GRAPHIC(0, 1);
- trim = (ds_usecs + sync_point_disp / SYF_DISP_DRIFT_FACTOR) / SYF_MIN_STEP_USEC;
- trim = max(trim, -SYF_MAX_TRIM_REL);
- trim = min(trim, SYF_MAX_TRIM_REL);
- ERRORF("%7d %7d [%3d%+4d] %7d\n", ds_usecs, sync_point_disp, (char)(syncf.trim & 0xff), trim, sum);
+ syf.trim = (syf.drift + syf.spoint / SYF_DISP_DRIFT_FACTOR) / SYF_MIN_STEP_USEC;
+ syf.trim = max(syf.trim, -SYF_MAX_TRIM_REL);
+ syf.trim = min(syf.trim, SYF_MAX_TRIM_REL);
+ ERRORF("%7d %7d [%3d%+4d] %7d\n", syf.drift, syf.spoint,
+ (char)(syncf.trim & 0xff), syf.trim, syf.tsum);
+ syf.spoint = 0;
+ syf.drift = 0;
+ syf.tsum = 0;
+ }
+ if (B(1) && syf.trim) {
+ int t = (char)(syncf.trim & 0xff);
- sync_point_disp = 0;
- ds_usecs = 0;
- sum = 0;
- }
- if (B(1) && trim) {
- tmp = (char)(syncf.trim & 0xff);
- if (trim > 0) {
- tmp = min(tmp + 1, SYF_MAX_TRIM_ABS);
- --trim;
+ if (syf.trim > 0) {
+ t = min(t + 1, SYF_MAX_TRIM_ABS);
+ --syf.trim;
} else {
- tmp = max(tmp - 1, -SYF_MAX_TRIM_ABS);
- ++trim;
+ t = max(t - 1, -SYF_MAX_TRIM_ABS);
+ ++syf.trim;
}
- syncf.trim = VSF_SET_TRIM | VSF_TEMPLATE | tmp & 0xff;
- /*ErrorF("*trim: 0x%08x\n", syncf.trim);*/
+ syncf.trim = VSF_SET_TRIM | VSF_TEMPLATE | t & 0xff;
if (ioctl(fd, DRM_IOCTL_RADEON_SYNCF, &syncf)) {
- ErrorF("DRM_IOCTL_RADEON_SYNCF: %s\n", strerror(errno));
+ ErrorF("DRM_IOCTL_RADEON_SYNCF: %s\n", strerror(errno)); exit(-1);
}
- }
- skew_prev = skew;
+ }
+ skew2vbl_prev = skew2vbl;
/* --- 8< --- */
}