Retry get_fb_ptr in get_fb

If get_fb_ptr returns NULL, try again after pixmap_get_handle, it should
work then.

Fixes spurious Present page flipping failures using "normal" pixmaps
which aren't shared with direct rendering clients, e.g. with a
compositor using the RENDER extension.

Bugzilla: https://bugs.freedesktop.org/110417
(Ported from amdgpu commit bf61e6d7ac1a5754b1026d7f80acf25ef622c491)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Michel Dänzer
2019-04-24 12:25:39 +02:00
parent 36703f66c3
commit d1d8e3c8d0

View File

@@ -877,21 +877,22 @@ static inline struct drmmode_fb*
radeon_pixmap_get_fb(PixmapPtr pix)
{
struct drmmode_fb **fb_ptr = radeon_pixmap_get_fb_ptr(pix);
uint32_t handle;
if (!fb_ptr)
return NULL;
if (fb_ptr && *fb_ptr)
return *fb_ptr;
if (radeon_get_pixmap_handle(pix, &handle)) {
ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
if (!*fb_ptr) {
uint32_t handle;
if (!fb_ptr)
fb_ptr = radeon_pixmap_get_fb_ptr(pix);
if (radeon_get_pixmap_handle(pix, &handle)) {
ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
*fb_ptr = radeon_fb_create(scrn, pRADEONEnt->fd, pix->drawable.width,
pix->drawable.height, pix->devKind,
handle);
}
*fb_ptr = radeon_fb_create(scrn, pRADEONEnt->fd,
pix->drawable.width,
pix->drawable.height, pix->devKind,
handle);
}
return *fb_ptr;