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

Preparatory, no functional change intended yet.

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/drmmode_display.c | 82 ++++++++++++++++++++++++++++++---------------------
 src/drmmode_display.h |  3 ++
 2 files changed, 52 insertions(+), 33 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 387d9e094..791d59986 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -860,6 +860,52 @@ drmmode_crtc_gamma_do_set(xf86CrtcPtr crtc, uint16_t *red, 
uint16_t *green,
                            blue);
 }
 
+Bool
+drmmode_set_mode(xf86CrtcPtr crtc, struct drmmode_fb *fb, DisplayModePtr mode,
+                int x, int y)
+{
+       ScrnInfoPtr scrn = crtc->scrn;
+       RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
+       xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+       drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+       uint32_t *output_ids = calloc(sizeof(uint32_t), 
xf86_config->num_output);
+       int output_count = 0;
+       drmModeModeInfo kmode;
+       Bool ret;
+       int i;
+
+       if (!output_ids)
+               return FALSE;
+
+       for (i = 0; i < xf86_config->num_output; i++) {
+               xf86OutputPtr output = xf86_config->output[i];
+               drmmode_output_private_ptr drmmode_output = 
output->driver_private;
+
+               if (output->crtc != crtc)
+                       continue;
+
+               output_ids[output_count] = 
drmmode_output->mode_output->connector_id;
+               output_count++;
+       }
+
+       drmmode_ConvertToKMode(scrn, &kmode, mode);
+
+       ret = drmModeSetCrtc(pRADEONEnt->fd,
+                            drmmode_crtc->mode_crtc->crtc_id,
+                            fb->handle, x, y, output_ids,
+                            output_count, &kmode) == 0;
+
+       if (ret) {
+               drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, fb);
+       } else {
+               xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                          "failed to set mode: %s\n", strerror(errno));
+       }
+
+       free(output_ids);
+       return ret;
+}
+
 static Bool
 drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
                     Rotation rotation, int x, int y)
@@ -875,12 +921,9 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
        int saved_x, saved_y;
        Rotation saved_rotation;
        DisplayModeRec saved_mode;
-       uint32_t *output_ids = NULL;
-       int output_count = 0;
        Bool ret = FALSE;
        int i;
        struct drmmode_fb *fb = NULL;
-       drmModeModeInfo kmode;
 
        /* The root window contents may be undefined before the WindowExposures
         * hook is called for it, so bail if we get here before that
@@ -899,22 +942,6 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                crtc->y = y;
                crtc->rotation = rotation;
 
-               output_ids = calloc(sizeof(uint32_t), xf86_config->num_output);
-               if (!output_ids)
-                       goto done;
-
-               for (i = 0; i < xf86_config->num_output; i++) {
-                       xf86OutputPtr output = xf86_config->output[i];
-                       drmmode_output_private_ptr drmmode_output;
-
-                       if (output->crtc != crtc)
-                               continue;
-
-                       drmmode_output = output->driver_private;
-                       output_ids[output_count] = 
drmmode_output->mode_output->connector_id;
-                       output_count++;
-               }
-
                if (!drmmode_handle_transform(crtc))
                        goto done;
 
@@ -925,8 +952,6 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                drmmode_crtc_gamma_do_set(crtc, crtc->gamma_red, 
crtc->gamma_green,
                                          crtc->gamma_blue, crtc->gamma_size);
 
-               drmmode_ConvertToKMode(crtc->scrn, &kmode, mode);
-
 #ifdef RADEON_PIXMAP_SHARING
                if (drmmode_crtc->prime_scanout_pixmap) {
                        drmmode_crtc_prime_scanout_update(crtc, mode, 
scanout_id,
@@ -967,17 +992,10 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
                                                drmmode_crtc->flip_pending);
 
-               if (drmModeSetCrtc(pRADEONEnt->fd,
-                                  drmmode_crtc->mode_crtc->crtc_id,
-                                  fb->handle, x, y, output_ids,
-                                  output_count, &kmode) != 0) {
-                       xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
-                                  "failed to set mode: %s\n", strerror(errno));
+               if (!drmmode_set_mode(crtc, fb, mode, x, y))
                        goto done;
-               } else {
-                       ret = TRUE;
-                       drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, 
fb);
-               }
+
+               ret = TRUE;
 
                if (pScreen)
                        xf86CrtcSetScreenSubpixelOrder(pScreen);
@@ -1032,8 +1050,6 @@ done:
                }
        }
 
-       free(output_ids);
-
        return ret;
 }
 
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index a6db87f8e..00b5e8119 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -220,6 +220,9 @@ extern void drmmode_scanout_free(ScrnInfoPtr scrn);
 extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
 extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
 
+Bool drmmode_set_mode(xf86CrtcPtr crtc, struct drmmode_fb *fb,
+                     DisplayModePtr mode, int x, int y);
+
 extern int drmmode_get_crtc_id(xf86CrtcPtr crtc);
 extern int drmmode_get_height_align(ScrnInfoPtr scrn, uint32_t tiling);
 extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling);
-- 
2.14.1

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

Reply via email to