summaryrefslogtreecommitdiff
path: root/src/amdgpu_pixmap.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/amdgpu_pixmap.h')
-rw-r--r--src/amdgpu_pixmap.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/amdgpu_pixmap.h b/src/amdgpu_pixmap.h
index a8de26a..00fb5bf 100644
--- a/src/amdgpu_pixmap.h
+++ b/src/amdgpu_pixmap.h
@@ -35,6 +35,7 @@ struct amdgpu_pixmap {
uint64_t tiling_info;
struct amdgpu_buffer *bo;
+ struct drmmode_fb *fb;
/* GEM handle for pixmaps shared via DRI2/3 */
Bool handle_valid;
@@ -56,6 +57,8 @@ static inline void amdgpu_set_pixmap_private(PixmapPtr pixmap,
static inline Bool amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo)
{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pPix->drawable.pScreen);
+ AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn);
struct amdgpu_pixmap *priv;
priv = amdgpu_get_pixmap_private(pPix);
@@ -71,6 +74,8 @@ static inline Bool amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo
priv->handle_valid = FALSE;
}
+ drmmode_fb_reference(pAMDGPUEnt->fd, &priv->fb, NULL);
+
if (!bo) {
free(priv);
priv = NULL;
@@ -98,6 +103,59 @@ static inline struct amdgpu_buffer *amdgpu_get_pixmap_bo(PixmapPtr pPix)
return priv ? priv->bo : NULL;
}
+static inline struct drmmode_fb*
+amdgpu_fb_create(int drm_fd, uint32_t width, uint32_t height, uint8_t depth,
+ uint8_t bpp, uint32_t pitch, uint32_t handle)
+{
+ struct drmmode_fb *fb = malloc(sizeof(*fb));
+
+ if (!fb)
+ return NULL;
+
+ fb->refcnt = 1;
+ if (drmModeAddFB(drm_fd, width, height, depth, bpp, pitch, handle,
+ &fb->handle) == 0)
+ return fb;
+
+ free(fb);
+ return NULL;
+}
+
+static inline struct drmmode_fb*
+amdgpu_pixmap_create_fb(int drm_fd, PixmapPtr pix)
+{
+ uint32_t handle;
+
+ if (!amdgpu_pixmap_get_handle(pix, &handle))
+ return NULL;
+
+ return amdgpu_fb_create(drm_fd, pix->drawable.width, pix->drawable.height,
+ pix->drawable.depth, pix->drawable.bitsPerPixel,
+ pix->devKind, handle);
+}
+
+static inline struct drmmode_fb*
+amdgpu_pixmap_get_fb(PixmapPtr pix)
+{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen);
+ AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn);
+ AMDGPUInfoPtr info = AMDGPUPTR(scrn);
+
+ if (info->use_glamor) {
+ struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pix);
+
+ if (!priv)
+ return NULL;
+
+ if (!priv->fb)
+ priv->fb = amdgpu_pixmap_create_fb(pAMDGPUEnt->fd, pix);
+
+ return priv->fb;
+ }
+
+ return NULL;
+}
+
enum {
AMDGPU_CREATE_PIXMAP_DRI2 = 0x08000000,
AMDGPU_CREATE_PIXMAP_LINEAR = 0x04000000,