On Tue, Nov 05, 2013 at 12:20:58AM +0100, Thomas Richter wrote: > Hi Daniel, dear intel experts, > > the following is a "solution" for the flicker on i830 panning. To > remind you, when panning is enabled on an i830, > the display shows an annoying 30Hz flicker on some "forbidden" > positions. On such positions, half of the frames > is black, and the other half shows a screen that is "ripped in > half", with one half scrolled to the wrong > position, and the other half displayed correctly, with a > discontinuity in the middle. > That is, every other frame is black, and the ones that are not black > are "wrong". > > The patch is, arguably, ugly as hell, and creates a certain > "yerkiness", though it does its job. One of the side > effects this flicker causes is complete crashes and lockups with > video overlays which are avoided by the patch. > That is, if you play a video with xine, and then pan over a > forbidden position, the machine crashes and comes > to a complete stop. > > Sorry if the patch format isn't quite right, and the patch is not > quite in a final state (not yet fully tested on all possible > combinations of panning dimensions and display depths), but it's a > start and "works good enough for me". Patch is pretty badly whitespace mangled please format it according to Documentation/SubmittingPatches (git format-patch preferred). Also I think we should conditionalize this on i830M only, I don't see any other reports. One thing to try out still: Does this still work if you tell the ddx to use a linear frontbuffer? -Daniel > > For that, patch: i9xx_update_plane(...) in intel_display.c, > > if (INTEL_INFO(dev)->gen >= 4) { > I915_MODIFY_DISPBASE(DSPSURF(plane), > i915_gem_obj_ggtt_offset(obj) + > intel_crtc->dspaddr_offset); > I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); > I915_WRITE(DSPLINOFF(plane), linear_offset); > + } else if (INTEL_INFO(dev)->gen == 2) { > + int xflick = (x >> 4) & 0x03; > + if (xflick == 3) { /* in forbidden column, probably a > i830 bug */ > + int xfix = 16 + (x & ~(0x3f)); > + int fix_offset = y * fb->pitches[0] + xfix * > (fb->bits_per_pixel / 8); > + I915_WRITE(DSPADDR(plane), i915_gem_obj_ggtt_offset(obj) + > fix_offset); > + POSTING_READ(reg); > + intel_wait_for_vblank(dev, intel_crtc->pipe); > + } > + I915_WRITE(DSPADDR(plane), i915_gem_obj_ggtt_offset(obj) + > linear_offset); > } else > I915_WRITE(DSPADDR(plane), i915_gem_obj_ggtt_offset(obj) + > linear_offset); > POSTING_READ(reg); > > The trick is, as you see, first to display the one frame the display > scrolled off *before* the forbidden column, and > then scroll to the right position, going to the right. )-: > > *Why* that works is unclear to me. Don't ask, just observation. > > An improvement would be to check whether the x position did change, > and if it did not, just avoid all the hack to > allow smooth vertical scrolling. Still to be done. Maybe later the > week if the above also works on the R31 > (affected by the same problem). > > Greetings, > Thomas > -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx