diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2019-04-24 12:25:39 +0200 |
---|---|---|
committer | Michel Dänzer <michel.daenzer@amd.com> | 2019-04-24 12:25:39 +0200 |
commit | d1d8e3c8d0a0a0394d395eba171460501745209b (patch) | |
tree | 1b548bd8f243e529019ed518bfa81825953c59a8 | |
parent | 36703f66c3b06875651606a6280d5dc9d9dad51e (diff) |
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>
-rw-r--r-- | src/radeon.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/src/radeon.h b/src/radeon.h index 74454c30..008a59f3 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -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); - - if (!fb_ptr) - return NULL; - - if (!*fb_ptr) { - uint32_t handle; - - 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); - } + uint32_t handle; + + 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) + fb_ptr = radeon_pixmap_get_fb_ptr(pix); + + *fb_ptr = radeon_fb_create(scrn, pRADEONEnt->fd, + pix->drawable.width, + pix->drawable.height, pix->devKind, + handle); } return *fb_ptr; |