VirtualBox

Changeset 52199 in vbox


Ignore:
Timestamp:
Jul 25, 2014 7:47:39 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
95259
Message:

Additions/x11/vboxvideo: remove hard-coded maximum number of screens.

Location:
trunk/src/VBox/Additions/x11/vboxvideo
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/x11/vboxvideo/setmode.c

    r51393 r52199  
    117117    else
    118118        cwReal = RT_MIN((int) cWidth, pScrn->displayWidth - x);
    119     TRACE_LOG("pVBox->afDisabled[%u]=%d\n",
    120               cDisplay, (int)pVBox->afDisabled[cDisplay]);
     119    TRACE_LOG("pVBox->pScreens[%u].afDisabled=%d\n",
     120              cDisplay, (int)pVBox->pScreens[cDisplay].afDisabled);
    121121    if (cDisplay == 0)
    122122        VBoxVideoSetModeRegisters(cwReal, cHeight, pScrn->displayWidth,
    123123                                  vboxBPP(pScrn), 0, x, y);
    124124    fFlags = VBVA_SCREEN_F_ACTIVE;
    125     fFlags |= (pVBox->afDisabled[cDisplay] ? VBVA_SCREEN_F_DISABLED : 0);
     125    fFlags |= (pVBox->pScreens[cDisplay].afDisabled ? VBVA_SCREEN_F_DISABLED : 0);
    126126    VBoxHGSMIProcessDisplayInfo(&pVBox->guestCtx, cDisplay, x, y,
    127127                                offStart, pVBox->cbLine, cwReal, cHeight,
     
    175175        unsigned i;
    176176        for (i = 0; i < pVBox->cScreens; ++i)
    177             VBOXSetMode(pScrn, i, pVBox->aScreenLocation[i].cx,
    178                             pVBox->aScreenLocation[i].cy,
    179                             pVBox->aScreenLocation[i].x,
    180                             pVBox->aScreenLocation[i].y);
     177            VBOXSetMode(pScrn, i, pVBox->pScreens[i].aScreenLocation.cx,
     178                            pVBox->pScreens[i].aScreenLocation.cy,
     179                            pVBox->pScreens[i].aScreenLocation.x,
     180                            pVBox->pScreens[i].aScreenLocation.y);
    181181    }
    182182#endif
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c

    r51242 r52199  
    215215    for (i = 0; i < pVBox->cScreens; ++i)
    216216    {
    217         pVBox->aPreferredSize[i].cx = 1024;
    218         pVBox->aPreferredSize[i].cy = 768;
     217        pVBox->pScreens[i].aPreferredSize.cx = 1024;
     218        pVBox->pScreens[i].aPreferredSize.cy = 768;
    219219    }
    220220    /* Set up the first mode correctly to match the requested initial mode. */
    221     pScrn->modes->HDisplay = pVBox->aPreferredSize[0].cx;
    222     pScrn->modes->VDisplay = pVBox->aPreferredSize[0].cy;
     221    pScrn->modes->HDisplay = pVBox->pScreens[0].aPreferredSize.cx;
     222    pScrn->modes->VDisplay = pVBox->pScreens[0].aPreferredSize.cy;
    223223    /* RandR 1.1 quirk: make sure that the initial resolution is always present
    224224     * in the mode list as RandR will always advertise a mode of the initial
    225225     * virtual resolution via GetScreenInfo. */
    226226    pMode = vboxAddEmptyScreenMode(pScrn);
    227     vboxFillDisplayMode(pScrn, pMode, NULL, pVBox->aPreferredSize[0].cx,
    228                         pVBox->aPreferredSize[0].cy);
     227    vboxFillDisplayMode(pScrn, pMode, NULL, pVBox->pScreens[0].aPreferredSize.cx,
     228                        pVBox->pScreens[0].aPreferredSize.cy);
    229229}
    230230
     
    255255            if (!((int32_t *)prop->data)[i])
    256256                continue;
    257             pVBox->aPreferredSize[i].cx = ((int32_t *)prop->data)[i] >> 16;
    258             pVBox->aPreferredSize[i].cy = ((int32_t *)prop->data)[i] & 0xffff;
     257            pVBox->pScreens[i].aPreferredSize.cx = ((int32_t *)prop->data)[i] >> 16;
     258            pVBox->pScreens[i].aPreferredSize.cy = ((int32_t *)prop->data)[i] & 0xffff;
    259259        }
    260260}
     
    288288    if (pScrn->currentMode == pMode)
    289289        pMode = pMode->next;
    290     pMode->HDisplay = pVBox->aPreferredSize[0].cx;
    291     pMode->VDisplay = pVBox->aPreferredSize[0].cy;
     290    pMode->HDisplay = pVBox->pScreens[0].aPreferredSize.cx;
     291    pMode->VDisplay = pVBox->pScreens[0].aPreferredSize.cy;
    292292}
    293293
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c

    r52191 r52199  
    288288    unsigned cDisplay = (uintptr_t)crtc->driver_private;
    289289    TRACE_LOG("cDisplay=%u, mode=%i\n", cDisplay, mode);
    290     pVBox->afDisabled[cDisplay] = (mode != DPMSModeOn);
     290    pVBox->pScreens[cDisplay].afDisabled = (mode != DPMSModeOn);
    291291    /* Don't fiddle with the hardware if we are switched
    292292     * to a virtual terminal. */
     
    296296        return;
    297297    }
    298     if (   pVBox->aScreenLocation[cDisplay].cx
    299         && pVBox->aScreenLocation[cDisplay].cy)
     298    if (   pVBox->pScreens[cDisplay].aScreenLocation.cx
     299        && pVBox->pScreens[cDisplay].aScreenLocation.cy)
    300300        VBOXSetMode(crtc->scrn, cDisplay,
    301                     pVBox->aScreenLocation[cDisplay].cx,
    302                     pVBox->aScreenLocation[cDisplay].cy,
    303                     pVBox->aScreenLocation[cDisplay].x,
    304                     pVBox->aScreenLocation[cDisplay].y);
     301                    pVBox->pScreens[cDisplay].aScreenLocation.cx,
     302                    pVBox->pScreens[cDisplay].aScreenLocation.cy,
     303                    pVBox->pScreens[cDisplay].aScreenLocation.x,
     304                    pVBox->pScreens[cDisplay].aScreenLocation.y);
    305305}
    306306
     
    335335    TRACE_LOG("name=%s, HDisplay=%d, VDisplay=%d, x=%d, y=%d\n", adjusted_mode->name,
    336336           adjusted_mode->HDisplay, adjusted_mode->VDisplay, x, y);
    337     pVBox->afDisabled[cDisplay] = false;
    338     pVBox->aScreenLocation[cDisplay].cx = adjusted_mode->HDisplay;
    339     pVBox->aScreenLocation[cDisplay].cy = adjusted_mode->VDisplay;
    340     pVBox->aScreenLocation[cDisplay].x = x;
    341     pVBox->aScreenLocation[cDisplay].y = y;
     337    pVBox->pScreens[cDisplay].afDisabled = false;
     338    pVBox->pScreens[cDisplay].aScreenLocation.cx = adjusted_mode->HDisplay;
     339    pVBox->pScreens[cDisplay].aScreenLocation.cy = adjusted_mode->VDisplay;
     340    pVBox->pScreens[cDisplay].aScreenLocation.x = x;
     341    pVBox->pScreens[cDisplay].aScreenLocation.y = y;
    342342    /* Don't fiddle with the hardware if we are switched
    343343     * to a virtual terminal. */
     
    466466    VBoxUpdateSizeHints(pScrn);
    467467    pMode = vbox_output_add_mode(pVBox, &pModes, NULL,
    468                                  pVBox->aPreferredSize[iScreen].cx,
    469                                  pVBox->aPreferredSize[iScreen].cy, TRUE,
     468                                 pVBox->pScreens[iScreen].aPreferredSize.cx,
     469                                 pVBox->pScreens[iScreen].aPreferredSize.cy, TRUE,
    470470                                 FALSE);
    471471    VBOXEDIDSet(output, pMode);
     
    527527        h = (*(uint32_t *)value->data) & 0xffff;
    528528        TRACE_LOG("screen=%u, property value=%dx%d\n", cDisplay, w, h);
    529         pVBox->aPreferredSize[cDisplay].cx = w;
    530         pVBox->aPreferredSize[cDisplay].cy = h;
     529        pVBox->pScreens[cDisplay].aPreferredSize.cx = w;
     530        pVBox->pScreens[cDisplay].aPreferredSize.cy = h;
    531531        return TRUE;
    532532    }
     
    10961096
    10971097            /* Setup our virtual CRTCs. */
    1098             pVBox->paCrtcs[i] = xf86CrtcCreate(pScrn, &VBOXCrtcFuncs);
    1099             pVBox->paCrtcs[i]->driver_private = (void *)(uintptr_t)i;
     1098            pVBox->pScreens[i].paCrtcs = xf86CrtcCreate(pScrn, &VBOXCrtcFuncs);
     1099            pVBox->pScreens[i].paCrtcs->driver_private = (void *)(uintptr_t)i;
    11001100
    11011101            /* Set up our virtual outputs. */
    11021102            snprintf(szOutput, sizeof(szOutput), "VGA-%u", i);
    1103             pVBox->paOutputs[i] = xf86OutputCreate(pScrn, &VBOXOutputFuncs,
    1104                                                   szOutput);
     1103            pVBox->pScreens[i].paOutputs
     1104                = xf86OutputCreate(pScrn, &VBOXOutputFuncs, szOutput);
    11051105
    11061106            /* We are not interested in the monitor section in the
    11071107             * configuration file. */
    1108             xf86OutputUseScreenMonitor(pVBox->paOutputs[i], FALSE);
    1109             pVBox->paOutputs[i]->possible_crtcs = 1 << i;
    1110             pVBox->paOutputs[i]->possible_clones = 0;
    1111             pVBox->paOutputs[i]->driver_private = (void *)(uintptr_t)i;
     1108            xf86OutputUseScreenMonitor(pVBox->pScreens[i].paOutputs, FALSE);
     1109            pVBox->pScreens[i].paOutputs->possible_crtcs = 1 << i;
     1110            pVBox->pScreens[i].paOutputs->possible_clones = 0;
     1111            pVBox->pScreens[i].paOutputs->driver_private = (void *)(uintptr_t)i;
    11121112            TRACE_LOG("Created crtc (%p) and output %s (%p)\n",
    1113                       (void *)pVBox->paCrtcs[i], szOutput,
    1114                       (void *)pVBox->paOutputs[i]);
     1113                      (void *)pVBox->pScreens[i].paCrtcs, szOutput,
     1114                      (void *)pVBox->pScreens[i].paOutputs);
    11151115        }
    11161116    }
     
    11401140        {
    11411141            INT32 value = 0;
    1142             RRChangeOutputProperty(pVBox->paOutputs[i]->randr_output,
     1142            RRChangeOutputProperty(pVBox->pScreens[i].paOutputs->randr_output,
    11431143                                   vboxAtomVBoxMode(), XA_INTEGER, 32,
    11441144                                   PropModeReplace, 1, &value, TRUE,
     
    11611161    pVBox->FBSize.cx = pScrn->currentMode->HDisplay;
    11621162    pVBox->FBSize.cy = pScrn->currentMode->VDisplay;
    1163     pVBox->aScreenLocation[0].cx = pScrn->currentMode->HDisplay;
    1164     pVBox->aScreenLocation[0].cy = pScrn->currentMode->VDisplay;
    1165     pVBox->aScreenLocation[0].x = pScrn->frameX0;
    1166     pVBox->aScreenLocation[0].y = pScrn->frameY0;
     1163    pVBox->pScreens[0].aScreenLocation.cx = pScrn->currentMode->HDisplay;
     1164    pVBox->pScreens[0].aScreenLocation.cy = pScrn->currentMode->VDisplay;
     1165    pVBox->pScreens[0].aScreenLocation.x = pScrn->frameX0;
     1166    pVBox->pScreens[0].aScreenLocation.y = pScrn->frameY0;
    11671167#endif /* !VBOXVIDEO_13 */
    11681168
     
    13271327    pVBox->FBSize.cx = pMode->HDisplay;
    13281328    pVBox->FBSize.cy = pMode->VDisplay;
    1329     pVBox->aScreenLocation[0].cx = pMode->HDisplay;
    1330     pVBox->aScreenLocation[0].cy = pMode->VDisplay;
    1331     pVBox->aScreenLocation[0].x = pScrn->frameX0;
    1332     pVBox->aScreenLocation[0].y = pScrn->frameY0;
     1329    pVBox->pScreens[0].aScreenLocation.cx = pMode->HDisplay;
     1330    pVBox->pScreens[0].aScreenLocation.cy = pMode->VDisplay;
     1331    pVBox->pScreens[0].aScreenLocation.x = pScrn->frameX0;
     1332    pVBox->pScreens[0].aScreenLocation.y = pScrn->frameY0;
    13331333#endif
    13341334    if (!pScrn->vtSema)
     
    13541354
    13551355    TRACE_ENTRY();
    1356     pVBox->aScreenLocation[0].x = x;
    1357     pVBox->aScreenLocation[0].y = y;
     1356    pVBox->pScreens[0].aScreenLocation.x = x;
     1357    pVBox->pScreens[0].aScreenLocation.y = y;
    13581358    /* Don't fiddle with the hardware if we are switched
    13591359     * to a virtual terminal. */
     
    13641364        return;
    13651365    }
    1366     VBOXSetMode(pScrn, 0, pVBox->aScreenLocation[0].cx,
    1367                 pVBox->aScreenLocation[0].cy, x, y);
     1366    VBOXSetMode(pScrn, 0, pVBox->pScreens[0].aScreenLocation.cx,
     1367                pVBox->pScreens[0].aScreenLocation.cy, x, y);
    13681368    TRACE_EXIT();
    13691369}
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h

    r51393 r52199  
    142142#endif
    143143
    144 /*XXX*/
     144/** Structure containing all virtual monitor-specific information. */
     145struct VBoxScreen
     146{
     147    /** Position information for each virtual screen for the purposes of
     148     * sending dirty rectangle information to the right one. */
     149    RTRECT2 aScreenLocation;
     150    /** Has this screen been disabled by the guest? */
     151    Bool afDisabled;
     152#ifdef VBOXVIDEO_13
     153    /** The virtual crtcs. */
     154    struct _xf86Crtc *paCrtcs;
     155    /** The virtual outputs, logically not distinct from crtcs. */
     156    struct _xf86Output *paOutputs;
     157#endif
     158    /** Offsets of VBVA buffers in video RAM */
     159    uint32_t aoffVBVABuffer;
     160    /** Context information about the VBVA buffers for each screen */
     161    struct VBVABUFFERCONTEXT aVbvaCtx;
     162    /** The current preferred resolution for the screen */
     163    RTRECTSIZE aPreferredSize;
     164};
    145165
    146166typedef struct VBOXRec
     
    177197    /** Number of screens attached */
    178198    uint32_t cScreens;
    179     /** Position information for each virtual screen for the purposes of
    180      * sending dirty rectangle information to the right one. */
    181     RTRECT2 aScreenLocation[VBOX_VIDEO_MAX_SCREENS];
     199    /** Information about each virtual screen. */
     200    struct VBoxScreen *pScreens;
    182201    /** The last requested framebuffer size. */
    183202    RTRECTSIZE FBSize;
    184     /** Has this screen been disabled by the guest? */
    185     Bool afDisabled[VBOX_VIDEO_MAX_SCREENS];
    186 #ifdef VBOXVIDEO_13
    187     /** The virtual crtcs */
    188     struct _xf86Crtc *paCrtcs[VBOX_VIDEO_MAX_SCREENS];
    189     struct _xf86Output *paOutputs[VBOX_VIDEO_MAX_SCREENS];
    190 #else
     203#ifndef VBOXVIDEO_13
    191204    /** The original CreateScreenResources procedure which we wrap with our own.
    192205     */
    193206    CreateScreenResourcesProcPtr pfnCreateScreenResources;
    194207#endif
    195     /** Offsets of VBVA buffers in video RAM */
    196     uint32_t aoffVBVABuffer[VBOX_VIDEO_MAX_SCREENS];
    197     /** Context information about the VBVA buffers for each screen */
    198     struct VBVABUFFERCONTEXT aVbvaCtx[VBOX_VIDEO_MAX_SCREENS];
    199     /** The current preferred resolution for the screen */
    200     RTRECTSIZE aPreferredSize[VBOX_VIDEO_MAX_SCREENS];
    201208    /** HGSMI guest heap context */
    202209    HGSMIGUESTCOMMANDCONTEXT guestCtx;
  • trunk/src/VBox/Additions/x11/vboxvideo/vbva.c

    r51393 r52199  
    6666    {
    6767        /* Just continue quietly if VBVA is not currently active. */
    68         struct VBVABUFFER *pVBVA = pVBox->aVbvaCtx[j].pVBVA;
     68        struct VBVABUFFER *pVBVA = pVBox->pScreens[j].aVbvaCtx.pVBVA;
    6969        if (   !pVBVA
    7070            || !(pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))
     
    7272        for (i = 0; i < iRects; ++i)
    7373        {
    74             if (   aRects[i].x1 >   pVBox->aScreenLocation[j].x
    75                                   + pVBox->aScreenLocation[j].cx
    76                 || aRects[i].y1 >   pVBox->aScreenLocation[j].y
    77                                   + pVBox->aScreenLocation[j].cy
    78                 || aRects[i].x2 <   pVBox->aScreenLocation[j].x
    79                 || aRects[i].y2 <   pVBox->aScreenLocation[j].y)
     74            if (   aRects[i].x1 >   pVBox->pScreens[j].aScreenLocation.x
     75                                  + pVBox->pScreens[j].aScreenLocation.cx
     76                || aRects[i].y1 >   pVBox->pScreens[j].aScreenLocation.y
     77                                  + pVBox->pScreens[j].aScreenLocation.cy
     78                || aRects[i].x2 <   pVBox->pScreens[j].aScreenLocation.x
     79                || aRects[i].y2 <   pVBox->pScreens[j].aScreenLocation.y)
    8080                continue;
    8181            cmdHdr.x = (int16_t)aRects[i].x1;
     
    8989#endif
    9090
    91             if (VBoxVBVABufferBeginUpdate(&pVBox->aVbvaCtx[j],
     91            if (VBoxVBVABufferBeginUpdate(&pVBox->pScreens[j].aVbvaCtx,
    9292                                          &pVBox->guestCtx))
    9393            {
    94                 VBoxVBVAWrite(&pVBox->aVbvaCtx[j], &pVBox->guestCtx, &cmdHdr,
     94                VBoxVBVAWrite(&pVBox->pScreens[j].aVbvaCtx, &pVBox->guestCtx, &cmdHdr,
    9595                              sizeof(cmdHdr));
    96                 VBoxVBVABufferEndUpdate(&pVBox->aVbvaCtx[j]);
     96                VBoxVBVABufferEndUpdate(&pVBox->pScreens[j].aVbvaCtx);
    9797            }
    9898        }
     
    198198    pVBox->cbView = pVBox->cbFBMax = offVRAMBaseMapping;
    199199    pVBox->cScreens = VBoxHGSMIGetMonitorCount(&pVBox->guestCtx);
     200    pVBox->pScreens = calloc(pVBox->cScreens, sizeof(*pVBox->pScreens));
     201    if (pVBox->pScreens == NULL)
     202        FatalError("Failed to allocate memory for screens array.\n");
    200203    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Requested monitor count: %u\n",
    201204               pVBox->cScreens);
     
    203206    {
    204207        pVBox->cbFBMax -= VBVA_MIN_BUFFER_SIZE;
    205         pVBox->aoffVBVABuffer[i] = pVBox->cbFBMax;
     208        pVBox->pScreens[i].aoffVBVABuffer = pVBox->cbFBMax;
    206209        TRACE_LOG("VBVA buffer offset for screen %u: 0x%lx\n", i,
    207210                  (unsigned long) pVBox->cbFBMax);
    208         VBoxVBVASetupBufferContext(&pVBox->aVbvaCtx[i],
    209                                    pVBox->aoffVBVABuffer[i],
     211        VBoxVBVASetupBufferContext(&pVBox->pScreens[i].aVbvaCtx,
     212                                   pVBox->pScreens[i].aoffVBVABuffer,
    210213                                   VBVA_MIN_BUFFER_SIZE);
    211214    }
     
    261264
    262265        pVBVA = (struct VBVABUFFER *) (  ((uint8_t *)pVBox->base)
    263                                        + pVBox->aoffVBVABuffer[i]);
    264         if (!VBoxVBVAEnable(&pVBox->aVbvaCtx[i], &pVBox->guestCtx, pVBVA, i))
     266                                       + pVBox->pScreens[i].aoffVBVABuffer);
     267        if (!VBoxVBVAEnable(&pVBox->pScreens[i].aVbvaCtx, &pVBox->guestCtx,
     268                            pVBVA, i))
    265269            rc = FALSE;
    266270    }
     
    293297    TRACE_ENTRY();
    294298    for (i = 0; i < pVBox->cScreens; ++i)
    295         VBoxVBVADisable(&pVBox->aVbvaCtx[i], &pVBox->guestCtx, i);
    296 }
     299        VBoxVBVADisable(&pVBox->pScreens[i].aVbvaCtx, &pVBox->guestCtx, i);
     300}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette