diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2017-08-24 17:10:29 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2017-08-29 16:34:54 +0900 |
commit | 20f6b56fdb74d88086e8e094013fedbb14e50a24 (patch) | |
tree | 08d49caa0eaff62a0e5bf9c035ab475fd9fd4cae /src | |
parent | 4bc992c31059eb50e22df4ebf5b92d08411f41ef (diff) |
Create radeon_pixmap_get_fb_ptr helper
Preparatory, no functional change intended yet.
Also inline radeon_pixmap_create_fb into radeon_pixmap_get_fb, since
there's only one call-site anymore.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/radeon.h | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/src/radeon.h b/src/radeon.h index 71123c7c..5ce9999a 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -842,24 +842,10 @@ radeon_fb_create(int drm_fd, uint32_t width, uint32_t height, uint8_t depth, return NULL; } -static inline struct drmmode_fb* -radeon_pixmap_create_fb(int drm_fd, PixmapPtr pix) -{ - uint32_t handle; - - if (!radeon_get_pixmap_handle(pix, &handle)) - return NULL; - - return radeon_fb_create(drm_fd, pix->drawable.width, pix->drawable.height, - pix->drawable.depth, pix->drawable.bitsPerPixel, - pix->devKind, handle); -} - -static inline struct drmmode_fb* -radeon_pixmap_get_fb(PixmapPtr pix) +static inline struct drmmode_fb** +radeon_pixmap_get_fb_ptr(PixmapPtr pix) { ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); RADEONInfoPtr info = RADEONPTR(scrn); #ifdef USE_GLAMOR @@ -869,10 +855,7 @@ radeon_pixmap_get_fb(PixmapPtr pix) if (!priv) return NULL; - if (!priv->fb) - priv->fb = radeon_pixmap_create_fb(pRADEONEnt->fd, pix); - - return priv->fb; + return &priv->fb; } else #endif if (info->accelOn) @@ -883,15 +866,37 @@ radeon_pixmap_get_fb(PixmapPtr pix) if (!driver_priv) return NULL; - if (!driver_priv->fb) - driver_priv->fb = radeon_pixmap_create_fb(pRADEONEnt->fd, pix); - - return driver_priv->fb; + return &driver_priv->fb; } return NULL; } +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(pRADEONEnt->fd, pix->drawable.width, + pix->drawable.height, pix->drawable.depth, + pix->drawable.bitsPerPixel, pix->devKind, + handle); + } + } + + return *fb_ptr; +} + #define CP_PACKET0(reg, n) \ (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) #define CP_PACKET1(reg0, reg1) \ |