Rework dummy output 96/24996/2
authorAndrii Sokolenko <a.sokolenko@samsung.com>
Fri, 25 Jul 2014 07:28:36 +0000 (10:28 +0300)
committerAndrii Sokolenko <a.sokolenko@samsung.com>
Fri, 25 Jul 2014 07:47:50 +0000 (10:47 +0300)
Change-Id: I7ac290440ce2098658120bdeaf36d2fe86ecf6a4

src/crtcconfig/sec_crtc.c
src/crtcconfig/sec_display.c
src/crtcconfig/sec_display.h
src/crtcconfig/sec_dummy.c
src/crtcconfig/sec_dummy.h
src/crtcconfig/sec_output.c
src/sec.c

index 1230847..51dd942 100644 (file)
@@ -1723,15 +1723,7 @@ static const xf86CrtcFuncsRec sec_crtc_funcs =
     .gamma_set = SECCrtcGammaSet,
     .destroy = SECCrtcDestroy,
 };
-#if 0
-xf86CrtcPtr
-secCrtcDummyInit (ScrnInfoPtr pScrn)
-{
-    xf86CrtcPtr pCrtc = NULL;
-    pCrtc = xf86CrtcCreate (pScrn, &sec_crtc_funcs);
-    return pCrtc;
-}
-#endif //NO_CRTC_MODE
+
 void
 secCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode, int num)
 {
@@ -1848,6 +1840,9 @@ secCrtcApply(xf86CrtcPtr pCrtc)
         /* modify the physical size of monitor */
 #if 0
         if (!strcmp(pOutput->name, "LVDS1"))
+        {
+            secDisplaySetDispConnMode(pScrn, DISPLAY_CONN_MODE_LVDS);
+        }
 #endif
         {
             pOutput->mm_width = pOutputPriv->mode_output->mmWidth;
@@ -1910,12 +1905,9 @@ secCrtcApply(xf86CrtcPtr pCrtc)
     /* for cache control */
     tbm_bo_map (bo, TBM_DEVICE_2D, TBM_OPTION_READ);
     tbm_bo_unmap (bo);
-    if (pCrtcPriv->is_dummy == FALSE)
-        ret = drmModeSetCrtc(pSecMode->fd, secCrtcID(pCrtcPriv),
+    ret = drmModeSetCrtc(pSecMode->fd, secCrtcID(pCrtcPriv),
                          fb_id, x, y, output_ids, output_count,
                          &pCrtcPriv->kmode);
-    else
-        ret = 0;
     if (ret)
     {
         XDBG_INFO (MDISP, "failed to set mode: %s\n", strerror (-ret));
@@ -1946,7 +1938,9 @@ secCrtcApply(xf86CrtcPtr pCrtc)
             pOutputPriv->dpms_mode = DPMSModeOn;
 
             /* update mode_encoder */
+#ifdef NO_CRTC_MODE
             if (pOutputPriv->is_dummy == FALSE)
+#endif
             {
                 drmModeFreeEncoder (pOutputPriv->mode_encoder);
                 pOutputPriv->mode_encoder =
@@ -1984,7 +1978,7 @@ secCrtcApply(xf86CrtcPtr pCrtc)
     }
 
     secOutputDrmUpdate (pScrn);
-#if 0
+#if 1
     if (pScrn->pScreen)
         xf86_reload_cursors (pScrn->pScreen);
 #endif
@@ -2700,11 +2694,14 @@ secCrtcTurn (xf86CrtcPtr pCrtc, Bool onoff, Bool always, Bool user)
         }
 
     /* 0 : normal, 1 : blank, 2 : defer */
-    if (!secUtilSetDrmProperty (pSecMode, crtc_id,
-                                DRM_MODE_OBJECT_CRTC, "mode", mode))
+    if (pCrtcPriv->is_dummy == FALSE)
     {
-        XDBG_ERROR (MDISP, "SetDrmProperty failed. crtc(%d) onoff(%d) \n", crtc_id, onoff);
-        return FALSE;
+        if (!secUtilSetDrmProperty (pSecMode, crtc_id,
+                                    DRM_MODE_OBJECT_CRTC, "mode", mode))
+        {
+            XDBG_ERROR (MDISP, "SetDrmProperty failed. crtc(%d) onoff(%d) \n", crtc_id, onoff);
+            return FALSE;
+        }
     }
 
     pCrtcPriv->onoff = onoff;
index 0248a79..b72f0b8 100644 (file)
@@ -526,12 +526,8 @@ secModePreInit (ScrnInfoPtr pScrn, int drm_fd)
 #endif
     for (i = 0; i < pSecMode->plane_res->count_planes; i++)
         secPlaneInit (pScrn, pSecMode, i);
-#ifdef NO_CRTC_MODE
-    if (pSecMode->num_real_crtc == 0 ||
-        pSecMode->num_real_output == 0)
-    {
-        secDummyOutputInit(pScrn, pSecMode, FALSE);
-    }
+#if 0
+    secDummyOutputInit(pScrn, pSecMode, FALSE);
 #endif //NO_CRTC_MODE
     _secSetMainMode (pScrn, pSecMode);
 
@@ -548,9 +544,7 @@ secModePreInit (ScrnInfoPtr pScrn, int drm_fd)
     _secDisplaySetDrmEventCtx(pSecMode);
 
     pSec->pSecMode = pSecMode;
-#if 1
-    pSec->useAsyncSwap = TRUE;
-#endif
+
     /* virtaul x and virtual y of the screen is ones from main lcd mode */
     pScrn->virtualX = pSecMode->main_lcd_mode.hdisplay;
     pScrn->virtualY = pSecMode->main_lcd_mode.vdisplay;
@@ -1436,11 +1430,6 @@ secDisplayGetCurMSC (ScrnInfoPtr pScrn, int pipe, CARD64 *ust, CARD64 *msc)
     SECModePtr pSecMode = pSec->pSecMode;
 
     /* if lcd is off, return true with msc = 0 */
-#if 1
-        *ust = 0;
-        *msc = 0;
-        return TRUE;
-#endif
 #ifdef NO_CRTC_MODE
     if (pSec->isCrtcOn == FALSE)
     {
@@ -1448,7 +1437,6 @@ secDisplayGetCurMSC (ScrnInfoPtr pScrn, int pipe, CARD64 *ust, CARD64 *msc)
         *msc = 0;
         return TRUE;
     }
-    else
 #endif //NO_CRTC_MODE
     if (pSec->isLcdOff)
     {
index fbf5c0e..810c92e 100644 (file)
@@ -48,8 +48,10 @@ typedef enum
 typedef enum
 {
     DISPLAY_CONN_MODE_NONE,
+    DISPLAY_CONN_MODE_LVDS,
     DISPLAY_CONN_MODE_HDMI,
     DISPLAY_CONN_MODE_VIRTUAL,
+    DISPLAY_CONN_MODE_DUMMY,
     DISPLAY_CONN_MODE_MAX,
 } SECDisplayConnMode;
 
index 2dea29f..ed14dcb 100644 (file)
@@ -30,7 +30,7 @@
 #include "sec_util.h"
 #include "sec_display.h"
 #include "sec_accel.h"
-
+#ifdef NO_CRTC_MODE
 static void
 _dummyFlipPixmapInit (xf86CrtcPtr pCrtc)
 {
@@ -97,6 +97,8 @@ SECDummyCrtcSetModeMajor(xf86CrtcPtr pCrtc, DisplayModePtr pMode,
     SECPtr pSec = SECPTR (pScrn);
     SECFbPtr pFb = pSec->pFb;
     SECCrtcPrivPtr pCrtcPriv = pCrtc->driver_private;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR (pCrtc->scrn);
+    int i = 0;
     if (pCrtcPriv == NULL)
     {
         return TRUE;
@@ -107,7 +109,6 @@ SECDummyCrtcSetModeMajor(xf86CrtcPtr pCrtc, DisplayModePtr pMode,
     int saved_x, saved_y;
     Rotation saved_rotation;
     DisplayModeRec saved_mode;
-    Bool ret = FALSE;
 
     XDBG_DEBUG(MDOUT,
                "SetModeMajor pMode:%d cur(%dx%d+%d+%d),rot:%d new(%dx%d+%d+%d),refresh(%f)rot:%d\n",
@@ -153,28 +154,53 @@ SECDummyCrtcSetModeMajor(xf86CrtcPtr pCrtc, DisplayModePtr pMode,
     bo = secFbGetBo(pFb, x, y, pMode->HDisplay, pMode->VDisplay, FALSE);
     XDBG_GOTO_IF_FAIL (bo != NULL, fail);
     pCrtcPriv->front_bo = bo;
+    if (pCrtcPriv->bAccessibility || pCrtcPriv->screen_rotate_degree > 0)
+    {
+        tbm_bo temp;
+        bo = pCrtcPriv->accessibility_back_bo;
+        temp = pCrtcPriv->accessibility_front_bo;
+        pCrtcPriv->accessibility_front_bo = pCrtcPriv->accessibility_back_bo;
+        pCrtcPriv->accessibility_back_bo = temp;
+    }
+
+    /* turn off the crtc if the same crtc is set already by another display mode
+     * before the set crtcs
+     */
+    secDisplaySetDispSetMode(pScrn, DISPLAY_SET_MODE_OFF);
+
+    if (!pCrtcPriv->onoff)
+        secCrtcTurn (pCrtc, TRUE, FALSE, FALSE);
+
+    /* for cache control */
+    tbm_bo_map (bo, TBM_DEVICE_2D, TBM_OPTION_READ);
+    tbm_bo_unmap (bo);
+    for (i = 0; i < xf86_config->num_output; i++)
+    {
+        xf86OutputPtr pOutput = xf86_config->output[i];
+        SECOutputPrivPtr pOutputPriv;
+
+        if (pOutput->crtc != pCrtc)
+            continue;
+
+        pOutputPriv = pOutput->driver_private;
+
+#if 1
+        memcpy (&pSecMode->main_lcd_mode, pOutputPriv->mode_output->modes, sizeof(drmModeModeInfo));
+#endif
+
+        pOutputPriv->dpms_mode = DPMSModeOn;
+    }
+    secOutputDrmUpdate (pScrn);
+    if (pScrn->pScreen)
+        xf86_reload_cursors (pScrn->pScreen);
 
-    ret = secCrtcApply(pCrtc);
-    XDBG_GOTO_IF_FAIL (ret == TRUE, fail);
 #ifdef NO_CRTC_MODE
     pSec->isCrtcOn = secCrtcCheckInUseAll(pScrn);
 #endif
     /* set the default external mode */
     secDisplayModeToKmode (pCrtc->scrn, &pSecMode->ext_connector_mode, pMode);
 
-   /* accessibility */
-    if (pCrtcPriv->bAccessibility || pCrtcPriv->screen_rotate_degree > 0)
-    {
-        if (ret)
-        {
-            if (old_bo_accessibility[0])
-                secRenderBoUnref (old_bo_accessibility[0]);
-            if (old_bo_accessibility[1])
-                secRenderBoUnref (old_bo_accessibility[1]);
-        }
-    }
-
-    return ret;
+    return TRUE;
 fail:
     XDBG_ERROR(MDOUT, "Fail crtc apply(crtc_id:%d, rotate:%d, %dx%d+%d+%d\n",
                secCrtcID(pCrtcPriv), rotation, x, y, pCrtc->mode.HDisplay, pCrtc->mode.VDisplay);
@@ -203,7 +229,7 @@ fail:
     pCrtc->y = saved_y;
     pCrtc->rotation = saved_rotation;
 
-    return ret;
+    return FALSE;
 }
 
 static void
@@ -315,14 +341,22 @@ SECDummyCrtcDestroy(xf86CrtcPtr pCrtc)
 static xf86OutputStatus
 SECDummyOutputDetect(xf86OutputPtr pOutput)
 {
-    /* go to the hw and retrieve a new output struct */
-    XDBG_DEBUG(MDOUT,"\n");
     SECOutputPrivPtr pOutputPriv = pOutput->driver_private;
-
     if (pOutputPriv == NULL)
     {
         return XF86OutputStatusUnknown;
     }
+    SECPtr pSec = SECPTR (pOutput->scrn);
+    if (pSec == NULL)
+    {
+        return XF86OutputStatusUnknown;
+    }
+    SECModePtr pSecMode = pSec->pSecMode;
+    if (pSecMode == NULL)
+    {
+        return XF86OutputStatusUnknown;
+    }
+#if 0
     if (pOutput->randr_output && pOutput->randr_output->numUserModes)
     {
         xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pOutput->scrn);
@@ -333,6 +367,18 @@ SECDummyOutputDetect(xf86OutputPtr pOutput)
             secDummyOutputInit(pOutput->scrn, pSec->pSecMode, TRUE);
         }
     }
+#endif
+    SECOutputPrivPtr pCur = NULL, pNext = NULL;
+    xorg_list_for_each_entry_safe (pCur, pNext, &pSecMode->outputs, link)
+    {
+        if (pCur->is_dummy == FALSE && pCur->mode_output->connection == DRM_MODE_CONNECTED)
+        {
+            return XF86OutputStatusDisconnected;
+/* TODO: Need to change flag useAsyncSwap not here */
+            pSec->useAsyncSwap = FALSE;
+        }
+    }
+    pSec->useAsyncSwap = TRUE;
     return XF86OutputStatusConnected;
 }
 
@@ -425,16 +471,58 @@ SECDummyOutputGetProperty(xf86OutputPtr pOutput, Atom property)
     return FALSE;
 }
 
+static void
+SECDummyCrtcSetCursorColors(xf86CrtcPtr pCrtc, int bg, int fg)
+{
+    XDBG_TRACE (MDOUT, "[%p]  \n", pCrtc);
+}
+
+static void
+SECDummyCrtcSetCursorPosition (xf86CrtcPtr pCrtc, int x, int y)
+{
+    XDBG_TRACE (MDOUT, "[%p]  \n", pCrtc);
+    return;
+}
+
+static void
+SECDummyCrtcShowCursor (xf86CrtcPtr pCrtc)
+{
+    XDBG_TRACE (MDOUT, "[%p]  \n", pCrtc);
+    return;
+}
+
+static void
+SECDummyCrtcHideCursor (xf86CrtcPtr pCrtc)
+{
+    XDBG_TRACE (MDOUT, "[%p]  \n", pCrtc);
+    return;
+}
+
+#ifdef LATEST_XORG
+static Bool
+#else
+static void
+#endif
+SECDummyCrtcLoadCursorArgb(xf86CrtcPtr pCrtc, CARD32 *image)
+{
+    XDBG_TRACE (MDOUT, "[%p]  \n", pCrtc);
+#ifdef LATEST_XORG
+    return TRUE;
+#else
+    return;
+#endif
+}
+
 static const xf86CrtcFuncsRec sec_crtc_dummy_funcs =
 {
     .dpms = SECDummyCrtcDpms,
     .set_mode_major = SECDummyCrtcSetModeMajor,
+    .set_cursor_colors = SECDummyCrtcSetCursorColors,
+    .set_cursor_position = SECDummyCrtcSetCursorPosition,
+    .show_cursor = SECDummyCrtcShowCursor,
+    .hide_cursor = SECDummyCrtcHideCursor,
+    .load_cursor_argb = SECDummyCrtcLoadCursorArgb,
 #if 0
-    .set_cursor_colors = SECCrtcSetCursorColors,
-    .set_cursor_position = SECCrtcSetCursorPosition,
-    .show_cursor = SECCrtcShowCursor,
-    .hide_cursor = SECCrtcHideCursor,
-    .load_cursor_argb = SECCrtcLoadCursorArgb,
     .shadow_create = SECCrtcShadowCreate,
     .shadow_allocate = SECCrtcShadowAllocate,
     .shadow_destroy = SECCrtcShadowDestroy,
@@ -516,35 +604,34 @@ secDummyOutputInit (ScrnInfoPtr pScrn, SECModePtr pSecMode, Bool late)
     pOutput->possible_crtcs = ~((1 << pSecMode->num_real_crtc) - 1);
     pOutput->possible_clones = ~((1 << pSecMode->num_real_output) - 1);
     pOutputPriv->is_dummy = TRUE;
-    pOutputPriv->output_id = pSecMode->num_real_output+pSecMode->num_dummy_output;
+    pOutputPriv->output_id = 1000+pSecMode->num_dummy_output;
 
     pOutputPriv->mode_output = calloc(1, sizeof(drmModeConnector));
     if (pOutputPriv->mode_output == NULL)
         goto err;
     pOutputPriv->mode_output->connector_type = DRM_MODE_CONNECTOR_Unknown;
     pOutputPriv->mode_output->connector_type_id = pSecMode->num_dummy_output+1;
-    pOutputPriv->mode_output->connector_id = pSecMode->num_real_output+pSecMode->num_dummy_output;
+    pOutputPriv->mode_output->connector_id = 1000+pSecMode->num_dummy_output;
+    pOutputPriv->mode_output->connection = DRM_MODE_UNKNOWNCONNECTION;
     pOutputPriv->mode_output->count_props = 0;
     pOutputPriv->mode_output->count_encoders = 0;
-    pOutputPriv->mode_output->count_modes = 2;
+    pOutputPriv->mode_encoder = NULL;
+    pOutputPriv->mode_output->count_modes = 1;
     pOutputPriv->mode_output->modes = calloc(2, sizeof(drmModeModeInfo));
     if (pOutputPriv->mode_output->modes == NULL)
         goto err;
+#if 0
     pOutputPriv->mode_encoder = calloc(1, sizeof(drmModeEncoder));
     if (pOutputPriv->mode_encoder == NULL)
         goto err;
-
     pOutputPriv->mode_encoder->possible_clones = ~((1 << pSecMode->num_real_output) - 1);
     pOutputPriv->mode_encoder->possible_crtcs = ~((1 << pSecMode->num_real_crtc) - 1);
     pOutputPriv->mode_encoder->encoder_type = DRM_MODE_ENCODER_NONE;
+#endif
     pModes = xf86CVTMode(1024, 768, 60, 0, 0);
     secDisplayModeToKmode (pScrn,
                           &pOutputPriv->mode_output->modes[0],
                           pModes);
-    pModes = xf86CVTMode(720, 1280, 60, 0, 0);
-    secDisplayModeToKmode (pScrn,
-                          &pOutputPriv->mode_output->modes[1],
-                          pModes);
     free(pModes);
     pOutputPriv->pSecMode = pSecMode;
 
@@ -623,7 +710,7 @@ secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode)
 {
     XDBG_DEBUG(MDOUT,"\n");
     xf86CrtcPtr pCrtc = NULL;
-    DisplayModePtr pModes = NULL;
+//    DisplayModePtr pModes = NULL;
     SECCrtcPrivPtr pCrtcPriv;
 
     pCrtcPriv = calloc (sizeof (SECCrtcPrivRec), 1);
@@ -637,9 +724,9 @@ secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode)
         return NULL;
     }
     pCrtcPriv->is_dummy = TRUE;
-    pCrtcPriv->idx = pSecMode->num_real_crtc+pSecMode->num_dummy_crtc;
+    pCrtcPriv->idx = 1000 + pSecMode->num_dummy_crtc;
     pCrtcPriv->mode_crtc = calloc(1, sizeof(drmModeCrtc));
-
+#if 0
     pModes = xf86CVTMode(720, 1280, 60, 0, 0);
     secDisplayModeToKmode (pScrn,
                           &pCrtcPriv->kmode,
@@ -648,7 +735,9 @@ secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode)
                           &pCrtcPriv->mode_crtc->mode,
                           pModes);
     free(pModes);
-    pCrtcPriv->mode_crtc->crtc_id = pSecMode->num_real_crtc+pSecMode->num_dummy_crtc;
+#endif
+    /* TODO: Unique crtc_id */
+    pCrtcPriv->mode_crtc->crtc_id = 1000 + pSecMode->num_dummy_crtc;
 
     pCrtcPriv->move_layer = FALSE;
     pCrtcPriv->user_rotate = RR_Rotate_0;
@@ -656,7 +745,7 @@ secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode)
     pCrtcPriv->pSecMode = pSecMode;
     pCrtc->driver_private = pCrtcPriv;
 
-    pCrtcPriv->pipe = pSecMode->num_real_crtc+pSecMode->num_dummy_crtc;
+    pCrtcPriv->pipe = 1000 + pSecMode->num_dummy_crtc;
     pCrtcPriv->onoff = TRUE;
 
     xorg_list_init (&pCrtcPriv->pending_flips);
@@ -677,3 +766,4 @@ secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode)
     xorg_list_add(&(pCrtcPriv->link), &(pSecMode->crtcs));
     return pCrtc;
 }
+#endif //NO_CRTC_MODE
index 1c3ec3b..a7c299f 100644 (file)
@@ -9,8 +9,8 @@
 #ifndef RR_Reflect_All
 #define RR_Reflect_All (RR_Reflect_X|RR_Reflect_Y)
 #endif //RR_Reflect_All
-
+#ifdef NO_CRTC_MODE
 Bool           secDummyOutputInit  (ScrnInfoPtr pScrn, SECModePtr pSecMode, Bool late);
 xf86CrtcPtr    secDummyCrtcInit (ScrnInfoPtr pScrn, SECModePtr pSecMode);
-
+#endif
 #endif // SEC_DUMMY_H
index b019fbd..3da3737 100644 (file)
@@ -193,20 +193,6 @@ SECOutputDetect(xf86OutputPtr pOutput)
 
     if (pOutputPriv == NULL)
     {
-#if 0
-        if (pOutput->randr_output && pOutput->randr_output->numUserModes)
-        {
-            xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pOutput->scrn);
-
-            if (xf86_config->output[xf86_config->num_output-1] == pOutput)
-            {
-               SECPtr pSec = (SECPtr) pOutput->scrn->driverPrivate;
-               secOutputDummyInit(pOutput->scrn, pSec->pSecMode, TRUE);
-            }
-
-            return XF86OutputStatusConnected;
-        }
-#endif //NO_CRTC_MODE
         return XF86OutputStatusDisconnected;
     }
 
@@ -767,9 +753,6 @@ secOutputDrmUpdate (ScrnInfoPtr pScrn)
     SECModePtr pSecMode = pSec->pSecMode;
     Bool ret = TRUE;
     int i;
-#if 1
-    return TRUE;
-#endif
     for (i = 0; i < pSecMode->mode_res->count_connectors; i++)
     {
 #ifdef NO_CRTC_MODE
@@ -800,6 +783,10 @@ secOutputDrmUpdate (ScrnInfoPtr pScrn)
 #endif
         }
 #ifdef NO_CRTC_MODE
+        if (pOutputPriv->is_dummy == TRUE)
+        {
+            continue;
+        }
         pOutputPriv->pOutput->crtc = NULL;
 #endif
         koutput = drmModeGetConnector (pSecMode->fd,
index b6071d4..ce12104 100644 (file)
--- a/src/sec.c
+++ b/src/sec.c
@@ -1040,7 +1040,7 @@ SECScreenInit (ScreenPtr pScreen, int argc, char **argv)
     miDCInitialize (pScreen, xf86GetPointerScreenFuncs());
     xf86DrvMsg (pScrn->scrnIndex, X_INFO
                 , "Initializing HW Cursor\n");
-#if 0
+#if 1
     if (!xf86_cursors_init (pScreen, SEC_CURSOR_W, SEC_CURSOR_H,
                             (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
                              HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |