From: Michel Dänzer <[email protected]>

We can't create our own struct amdgpu_buffer representation in this case
because destroying that would make the GEM handle inaccessible to glamor
as well. So just get the handle directly via dma-buf.

(ported from radeon commit 391900a670addec39515f924265bfa9f8bfa9ec0)

Signed-off-by: Michel Dänzer <[email protected]>
---
 src/amdgpu_bo_helper.c | 40 +++++++++++++++++++++++++++++++++++++---
 src/amdgpu_dri3.c      | 10 ++++++++++
 src/amdgpu_pixmap.h    |  5 +++++
 3 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/src/amdgpu_bo_helper.c b/src/amdgpu_bo_helper.c
index ad56197..01b0d87 100644
--- a/src/amdgpu_bo_helper.c
+++ b/src/amdgpu_bo_helper.c
@@ -133,12 +133,46 @@ Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, 
uint32_t *handle)
 
 Bool amdgpu_pixmap_get_handle(PixmapPtr pixmap, uint32_t *handle)
 {
-       struct amdgpu_buffer *bo = amdgpu_get_pixmap_bo(pixmap);
+#ifdef USE_GLAMOR
+       ScreenPtr screen = pixmap->drawable.pScreen;
+       ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+       AMDGPUInfoPtr info = AMDGPUPTR(scrn);
+#endif
+       struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap);
+
+       if (!priv) {
+               priv = calloc(1, sizeof(*priv));
+               amdgpu_set_pixmap_private(pixmap, priv);
+       }
 
-       if (!bo)
+       if (priv->handle_valid)
+               goto success;
+       
+#ifdef USE_GLAMOR
+       if (info->use_glamor) {
+               AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn);
+               CARD16 stride;
+               CARD32 size;
+               int fd, r;
+
+               fd = glamor_fd_from_pixmap(screen, pixmap, &stride, &size);
+               if (fd < 0)
+                       return FALSE;
+
+               r = drmPrimeFDToHandle(pAMDGPUEnt->fd, fd, &priv->handle);
+               close(fd);
+               if (r == 0)
+                       goto success;
+       }
+#endif
+
+       if (!priv->bo || !amdgpu_bo_get_handle(priv->bo, &priv->handle))
                return FALSE;
 
-       return amdgpu_bo_get_handle(bo, handle);
+ success:
+       priv->handle_valid = TRUE;
+       *handle = priv->handle;
+       return TRUE;
 }
 
 int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo)
diff --git a/src/amdgpu_dri3.c b/src/amdgpu_dri3.c
index c4b40d0..65d4899 100644
--- a/src/amdgpu_dri3.c
+++ b/src/amdgpu_dri3.c
@@ -125,6 +125,16 @@ static PixmapPtr amdgpu_dri3_pixmap_from_fd(ScreenPtr 
screen,
 {
        PixmapPtr pixmap;
 
+#ifdef USE_GLAMOR
+       /* Avoid generating a GEM flink name if possible */
+       if (AMDGPUPTR(xf86ScreenToScrn(screen))->use_glamor) {
+               pixmap = glamor_pixmap_from_fd(screen, fd, width, height,
+                                              stride, depth, bpp);
+               if (pixmap)
+                       return pixmap;
+       }
+#endif
+
        if (depth < 8)
                return NULL;
 
diff --git a/src/amdgpu_pixmap.h b/src/amdgpu_pixmap.h
index 7e0e449..6fd5ef1 100644
--- a/src/amdgpu_pixmap.h
+++ b/src/amdgpu_pixmap.h
@@ -33,6 +33,10 @@ struct amdgpu_pixmap {
        uint_fast32_t gpu_write;
 
        struct amdgpu_buffer *bo;
+
+       /* GEM handle for pixmaps shared via DRI3 */
+       Bool handle_valid;
+       uint32_t handle;
 };
 
 #if HAS_DEVPRIVATEKEYREC
@@ -70,6 +74,7 @@ static inline void amdgpu_set_pixmap_bo(PixmapPtr pPix, 
struct amdgpu_buffer *bo
 
                if (priv->bo) {
                        amdgpu_bo_unref(&priv->bo);
+                       priv->handle_valid = FALSE;
                }
 
                if (!bo) {
-- 
2.7.0

_______________________________________________
xorg-driver-ati mailing list
[email protected]
https://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to