summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2019-04-18 19:21:40 +0200
committerMichel Dänzer <michel@daenzer.net>2019-04-18 19:21:40 +0200
commitbf61e6d7ac1a5754b1026d7f80acf25ef622c491 (patch)
treea1ada473cb489b9b8e8c8633b278202e52e96540
parentbd4ffd4ebbdf1c43ab9e1ef9ba8b812fd2dde4a4 (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.h25
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;