From: Michel Dänzer <michel.daen...@amd.com>

This should allow using multiple CRTCs via RandR 1.4 even with xserver
< 1.17. It also simplifies the code a little, and paves the way for
following changes.

(Ported from radeon commits 4cfa4615f79f64062e5e771cd45dd7048f48b4f6
 and a92c27484703abc7c410b6ae0e4b8d1efbbb8e6f)

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/amdgpu_kms.c      | 19 ++++++++-----
 src/drmmode_display.c | 76 +++++++++++++++------------------------------------
 src/drmmode_display.h |  1 -
 3 files changed, 34 insertions(+), 62 deletions(-)

diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 1bce781..9670c3f 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -595,15 +595,20 @@ static void AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
        (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS);
        pScreen->BlockHandler = AMDGPUBlockHandler_KMS;
 
-       for (c = 0; c < xf86_config->num_crtc; c++) {
-               if (info->tear_free)
-                       amdgpu_scanout_flip(pScreen, info, 
xf86_config->crtc[c]);
-               else if (info->shadow_primary
+#ifdef AMDGPU_PIXMAP_SHARING
+       if (!pScreen->isGPU)
+#endif
+       {
+               for (c = 0; c < xf86_config->num_crtc; c++) {
+                       if (info->tear_free)
+                               amdgpu_scanout_flip(pScreen, info, 
xf86_config->crtc[c]);
+                       else if (info->shadow_primary
 #if XF86_CRTC_VERSION >= 4
-                                || 
xf86_config->crtc[c]->driverIsPerformingTransform
+                                        || 
xf86_config->crtc[c]->driverIsPerformingTransform
 #endif
-                       )
-                       amdgpu_scanout_update(xf86_config->crtc[c]);
+                               )
+                               amdgpu_scanout_update(xf86_config->crtc[c]);
+               }
        }
 
        if (info->use_glamor)
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 491599f..a8ee5f0 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -705,18 +705,22 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                fb_id = drmmode->fb_id;
 #ifdef AMDGPU_PIXMAP_SHARING
                if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap) {
-                       x = drmmode_crtc->prime_pixmap_x;
-                       y = 0;
+                       fb_id = drmmode_crtc->scanout[0].fb_id;
+                       x = y = 0;
                } else
 #endif
                if (drmmode_crtc->rotate.fb_id) {
                        fb_id = drmmode_crtc->rotate.fb_id;
                        x = y = 0;
-               } else if (info->tear_free ||
+               } else if (
+#ifdef AMDGPU_PIXMAP_SHARING
+                          !pScreen->isGPU &&
+#endif
+                          (info->tear_free ||
 #if XF86_CRTC_VERSION >= 4
-                          crtc->driverIsPerformingTransform ||
+                           crtc->driverIsPerformingTransform ||
 #endif
-                          info->shadow_primary) {
+                           info->shadow_primary)) {
                        for (i = 0; i < (info->tear_free ? 2 : 1); i++) {
                                drmmode_crtc_scanout_create(crtc,
                                                            
&drmmode_crtc->scanout[i],
@@ -1058,66 +1062,30 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t * 
red, uint16_t * green,
 #ifdef AMDGPU_PIXMAP_SHARING
 static Bool drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
 {
-       ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
-       PixmapPtr screenpix = screen->GetScreenPixmap(screen);
-       xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-       int c, total_width = 0, max_height = 0, this_x = 0;
 
        if (!ppix) {
                if (crtc->randr_crtc->scanout_pixmap)
-                       PixmapStopDirtyTracking(crtc->
-                                               randr_crtc->scanout_pixmap,
-                                               screenpix);
-               drmmode_crtc->prime_pixmap_x = 0;
+                       
PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap,
+                                               
drmmode_crtc->scanout[0].pixmap);
+               drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode,
+                                            &drmmode_crtc->scanout[0]);
                return TRUE;
        }
 
-       /* iterate over all the attached crtcs -
-          work out bounding box */
-       for (c = 0; c < xf86_config->num_crtc; c++) {
-               xf86CrtcPtr iter = xf86_config->crtc[c];
-               if (!iter->enabled && iter != crtc)
-                       continue;
-               if (iter == crtc) {
-                       this_x = total_width;
-                       total_width += ppix->drawable.width;
-                       if (max_height < ppix->drawable.height)
-                               max_height = ppix->drawable.height;
-               } else {
-                       total_width += iter->mode.HDisplay;
-                       if (max_height < iter->mode.VDisplay)
-                               max_height = iter->mode.VDisplay;
-               }
-#if !defined(HAS_DIRTYTRACKING_ROTATION) && !defined(HAS_DIRTYTRACKING2)
-               if (iter != crtc) {
-                       ErrorF
-                           ("Cannot do multiple crtcs without X server dirty 
tracking 2 interface\n");
-                       return FALSE;
-               }
-#endif
-       }
-
-       if (total_width != screenpix->drawable.width ||
-           max_height != screenpix->drawable.height) {
-               Bool ret;
-               ret =
-                   drmmode_xf86crtc_resize(crtc->scrn, total_width,
-                                           max_height);
-               if (ret == FALSE)
-                       return FALSE;
+       if (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
+                                        ppix->drawable.width,
+                                        ppix->drawable.height))
+               return FALSE;
 
-               screenpix = screen->GetScreenPixmap(screen);
-               screen->width = screenpix->drawable.width = total_width;
-               screen->height = screenpix->drawable.height = max_height;
-       }
-       drmmode_crtc->prime_pixmap_x = this_x;
 #ifdef HAS_DIRTYTRACKING_ROTATION
-       PixmapStartDirtyTracking(ppix, screenpix, 0, 0, this_x, 0, RR_Rotate_0);
+       PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap,
+                                0, 0, 0, 0, RR_Rotate_0);
 #elif defined(HAS_DIRTYTRACKING2)
-       PixmapStartDirtyTracking2(ppix, screenpix, 0, 0, this_x, 0);
+       PixmapStartDirtyTracking2(ppix, drmmode_crtc->scanout[0].pixmap,
+                                 0, 0, 0, 0);
 #else
-       PixmapStartDirtyTracking(ppix, screenpix, 0, 0);
+       PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap, 0, 0);
 #endif
        return TRUE;
 }
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 14fbcfc..e739382 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -94,7 +94,6 @@ typedef struct {
        uint32_t dpms_last_seq;
        int dpms_last_fps;
        uint32_t interpolated_vblanks;
-       int prime_pixmap_x;
 
        /* Modeset needed for DPMS on */
        Bool need_modeset;
-- 
2.9.3

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to