summaryrefslogtreecommitdiff
path: root/linux-core/intel_fb.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2008-03-07 13:03:42 +1100
committerDave Airlie <airlied@redhat.com>2008-03-07 13:03:42 +1100
commit33cb42a9f7c7c4f4dd91756af55de7352944efa4 (patch)
treefcec87b8a691cdb146320d9631e1f94c53a48e16 /linux-core/intel_fb.c
parentcf28ca4212662c3c7e4bfbe51aee307ac539fb3d (diff)
make startup of Xorg smoother if the mode doesn't change.
just flip the framebuffer in when required.
Diffstat (limited to 'linux-core/intel_fb.c')
-rw-r--r--linux-core/intel_fb.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c
index e33494c6..931bc1b6 100644
--- a/linux-core/intel_fb.c
+++ b/linux-core/intel_fb.c
@@ -228,6 +228,7 @@ static int intelfb_set_par(struct fb_info *info)
struct drm_output *output = NULL;
struct fb_var_screeninfo *var = &info->var;
int found = 0;
+ int changed = 0;
DRM_DEBUG("\n");
@@ -310,11 +311,22 @@ static int intelfb_set_par(struct fb_info *info)
}
/* re-attach fb */
- if (!par->crtc->fb)
+ if (!par->crtc->fb) {
par->crtc->fb = par->fb;
+ changed = 1;
+ }
- if (!drm_crtc_set_mode(par->crtc, drm_mode, var->xoffset, var->yoffset))
- return -EINVAL;
+ if (par->crtc->x != var->xoffset || par->crtc->y != var->yoffset)
+ changed = 1;
+
+ drm_mode_debug_printmodeline(dev, drm_mode);
+ drm_mode_debug_printmodeline(dev, &par->crtc->mode);
+ if (!drm_mode_equal(drm_mode, &par->crtc->mode))
+ changed = 1;
+
+ if (changed)
+ if (!drm_crtc_set_mode(par->crtc, drm_mode, var->xoffset, var->yoffset))
+ return -EINVAL;
return 0;
}
@@ -469,16 +481,21 @@ static int intelfb_pan_display(struct fb_var_screeninfo *var,
{
struct intelfb_par *par = info->par;
struct drm_crtc *crtc = par->crtc;
-
+ int changed = 0;
DRM_DEBUG("\n");
/* TODO add check size and pos*/
+ if (par->crtc->x != var->xoffset || par->crtc->y != var->yoffset)
+ changed = 1;
/* re-attach fb */
- if (!crtc->fb)
+ if (!crtc->fb) {
crtc->fb = par->fb;
+ changed = 1;
+ }
- drm_crtc_set_mode(crtc, &crtc->mode, var->xoffset, var->yoffset);
+ if (changed)
+ drm_crtc_set_mode(crtc, &crtc->mode, var->xoffset, var->yoffset);
info->var.xoffset = var->xoffset;
info->var.yoffset = var->yoffset;