diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2019-04-18 19:21:40 +0200 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2019-04-18 19:21:40 +0200 |
commit | bf61e6d7ac1a5754b1026d7f80acf25ef622c491 (patch) | |
tree | a1ada473cb489b9b8e8c8633b278202e52e96540 | |
parent | bd4ffd4ebbdf1c43ab9e1ef9ba8b812fd2dde4a4 (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
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/amdgpu_pixmap.h | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/amdgpu_pixmap.h b/src/amdgpu_pixmap.h index 0cff195..6720458 100644 --- a/src/amdgpu_pixmap.h +++ b/src/amdgpu_pixmap.h @@ -143,21 +143,22 @@ static inline struct drmmode_fb* amdgpu_pixmap_get_fb(PixmapPtr pix) { struct drmmode_fb **fb_ptr = amdgpu_pixmap_get_fb_ptr(pix); + uint32_t handle; - if (!fb_ptr) - return NULL; - - if (!*fb_ptr) { - uint32_t handle; + if (fb_ptr && *fb_ptr) + return *fb_ptr; + + if (amdgpu_pixmap_get_handle(pix, &handle)) { + ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); - if (amdgpu_pixmap_get_handle(pix, &handle)) { - ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); - AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); + if (!fb_ptr) + fb_ptr = amdgpu_pixmap_get_fb_ptr(pix); - *fb_ptr = amdgpu_fb_create(scrn, pAMDGPUEnt->fd, pix->drawable.width, - pix->drawable.height, pix->devKind, - handle); - } + *fb_ptr = amdgpu_fb_create(scrn, pAMDGPUEnt->fd, + pix->drawable.width, + pix->drawable.height, pix->devKind, + handle); } return *fb_ptr; |