[PATCH v2 xserver 09/11] modesetting: dri2 allocate linear backbuffer

Qiang Yu Qiang.Yu at amd.com
Sat Jan 7 08:01:30 UTC 2017


This is for different render/display settings to be able
to flip the screen buffer for display.

Signed-off-by: Qiang Yu <Qiang.Yu at amd.com>
---
 hw/xfree86/drivers/modesetting/dri2.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index a01ef27..e93a805 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -123,6 +123,7 @@ ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
                        unsigned int attachment, unsigned int format)
 {
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+    modesettingPtr ms = modesettingPTR(scrn);
     DRI2Buffer2Ptr buffer;
     PixmapPtr pixmap;
     CARD32 size;
@@ -152,6 +153,7 @@ ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
         int pixmap_width = drawable->width;
         int pixmap_height = drawable->height;
         int pixmap_cpp = (format != 0) ? format : drawable->depth;
+        int flags = 0;
 
         /* Assume that non-color-buffers require special
          * device-specific handling.  Mesa currently makes no requests
@@ -180,11 +182,34 @@ ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
             return NULL;
         }
 
+        /* We're trying to allocate a back buffer which may be used to flip
+         * the front buffer when DRI2SwapBuffer. For different render/display
+         * settings, this back buffer should be linear too as the front buffer.
+         */
+        if (ms->rfd >= 0 &&
+            attachment == DRI2BufferBackLeft &&
+            drawable->type == DRAWABLE_WINDOW &&
+            ms->drmmode.pageflip &&
+            scrn->vtSema) {
+            PixmapPtr pWinPixmap = get_drawable_pixmap(drawable);
+
+            /* drawable window must match screen pixmap.
+             * We could use DRI2CanFlip but currently the window clipList
+             * has not been set by XFixes request yet.
+             */
+            if (pWinPixmap == screen->GetScreenPixmap(screen) &&
+                drawable->x == 0 && drawable->y == 0 &&
+                drawable->width == pWinPixmap->drawable.width &&
+                drawable->height == pWinPixmap->drawable.height) {
+                flags |= CREATE_PIXMAP_USAGE_SHARED;
+            }
+        }
+
         pixmap = screen->CreatePixmap(screen,
                                       pixmap_width,
                                       pixmap_height,
                                       pixmap_cpp,
-                                      0);
+                                      flags);
         if (pixmap == NULL) {
             free(private);
             free(buffer);
@@ -536,7 +561,6 @@ can_exchange(ScrnInfoPtr scrn, DrawablePtr draw,
     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
     int num_crtcs_on = 0;
     int i;
-    modesettingPtr ms = modesettingPTR(scrn);
 
     for (i = 0; i < config->num_crtc; i++) {
         drmmode_crtc_private_ptr drmmode_crtc = config->crtc[i]->driver_private;
@@ -573,9 +597,6 @@ can_exchange(ScrnInfoPtr scrn, DrawablePtr draw,
     if (front_pixmap->devKind != back_pixmap->devKind)
         return FALSE;
 
-    if (ms->rfd >= 0)
-        return FALSE;
-
     return TRUE;
 }
 
-- 
2.7.4



More information about the xorg-devel mailing list