Chris Wilson writes:
 > On Wed, Sep 24, 2014 at 08:17:59AM +0200, Egbert Eich wrote:
 > > From: Egbert Eich <e...@suse.de>
 > > 
 > > copy_front() calls sna_pixmap_force_to_gpu() which may fail. If we pretend
 > > to have been successful and continue the caller sna_mode_resize() may 
 > > finish
 > > successfully pretending a mode change has succeeded which might leave a 
 > > mode
 > > behind which is unusable.
 > 
 > Show me the actual bug. If the copy fails, the new framebuffer contents
 > are just left uninitialised (normal X behaviour) until they get
 > "immediately" redrawn. The subsequent modeset does not depend upon the screen
 > Pixmap fitting into GPU memory, but that it can fit individual CRTC into
 > the GTT.

Then the mode should have failed somewhere else maybe.

The underlying issue of the problem was fixed by the other
patch I have sent today. This problem caused kgem_surface_size() 
to return NULL and thus kgem_create_2d() and ulitmately 
sna_pixmap_force_to_gpu() to fail.
With the the other fix applied kgem_surface_size() doesn't
fail any longer for my test case - still it may fail for other 
reasons.

Here is the test scenario:

Pineview Chipset, start a bare X server (without the other patch applied
to the driver), start xterm on it.

On my system 'xrandr -q' gives:

Screen 0: minimum 8 x 8, current 1366 x 768, maximum 32767 x 32767
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 222mm x 
125mm
   1366x768       60.0*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

now run 'xrandr --output LVDS1 --panning 3048x768' (or whatever
other output it uses).

Without the other patch applied kgem_surface_size() fails, without
*both* patches applied the mode set succeeds and 'xandr -q' now gives:

Screen 0: minimum 8 x 8, current 3048 x 768, maximum 32767 x 32767
LVDS1 connected 3048x768+0+0 (normal left inverted right x axis y axis) 222mm x 
125mm panning 3048x768+0+0
   1366x768       60.0*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Observation 1:
Screen doesn't pan: when moving the cursor to the right edge,
screen and cursor become out of sync, screen content doesnt get
update ie. starting a new application (like xclock) succeeds but
nothing is drawn).

Observation 2:
Terminating xterm makes the server reset which fails with

intel(0): [intel] Failed to allocate video resources for front buffer 3048x768 
at depth 24

in sna_create_screen_resources() due to sna_pixmap_force_to_gpu()
failing. The reason for the failure is the same as described above.

As I said: these failures go away with the other patch I posted today
and which you OKed and the code in this patch is no longer triggered.
Still there are other conditions under which kgem_surface_size() may 
return 0. 
For panning one needs to be able to draw into the screen pixmap outside 
of the area exposed by the crtc.

Cheers,
        Egbert.
_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to