VirtualBox

vbox的更動 34763 路徑 trunk/src/VBox/Additions/x11


忽略:
時間撮記:
2010-12-6 下午04:55:41 (14 年 以前)
作者:
vboxsync
訊息:

Additions/x11/vboxvideo: fix updates on additional monitors, try to sort-of-fix dynamic resizing

位置:
trunk/src/VBox/Additions/x11/vboxvideo
檔案:
修改 3 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c

    r34747 r34763  
    216216                continue;
    217217            cmdHdr.x =   (int16_t)aRects[i].x1
    218                        - pVBox->aScreenLocation[j].x * 2
    219                        + pVBox->aScreenLocation[0].x;
     218                       - pVBox->aScreenLocation[0].x;
    220219            cmdHdr.y =   (int16_t)aRects[i].y1
    221                        - pVBox->aScreenLocation[j].y * 2
    222                        + pVBox->aScreenLocation[0].y;
     220                       - pVBox->aScreenLocation[0].y - 1;
    223221            cmdHdr.w = (uint16_t)(aRects[i].x2 - aRects[i].x1);
    224222            cmdHdr.h = (uint16_t)(aRects[i].y2 - aRects[i].y1);
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c

    r34747 r34763  
    297297    (void) mode;
    298298    VBOXPtr pVBox = VBOXGetRec(crtc->scrn);
    299     int bpp = crtc->scrn->depth == 24 ? 32 : 16;
    300299
    301300    TRACE_LOG("name=%s, HDisplay=%d, VDisplay=%d, x=%d, y=%d\n", adjusted_mode->name,
     
    683682}
    684683
     684/** Calculate the BPP from the screen depth */
     685static uint16_t
     686vboxBPP(ScrnInfoPtr pScrn)
     687{
     688    return pScrn->depth == 24 ? 32 : 16;
     689}
     690
     691/** Calculate the scan line length for a display width */
     692static int32_t
     693vboxLineLength(ScrnInfoPtr pScrn, int32_t cDisplayWidth)
     694{
     695    uint64_t cbLine = ((uint64_t)cDisplayWidth * vboxBPP(pScrn) / 8 + 7) & ~7;
     696    return cbLine < INT32_MAX ? cbLine : INT32_MAX;
     697}
     698
     699/** Calculate the display pitch from the scan line length */
     700static int32_t
     701vboxDisplayPitch(ScrnInfoPtr pScrn, int32_t cbLine)
     702{
     703    return (uint64_t)cbLine * 8 / vboxBPP(pScrn);
     704}
     705
    685706/*
    686707 * QUOTE from the XFree86 DESIGN document:
     
    848869
    849870    /* Needed before we initialise DRI. */
    850     pScrn->displayWidth = pScrn->virtualX;
     871    pVBox->cbLine = vboxLineLength(pScrn, pScrn->virtualX);
     872    pScrn->displayWidth = vboxDisplayPitch(pScrn, pVBox->cbLine);
    851873
    852874    xf86PrintModes(pScrn);
     
    11631185    pScreen->CloseScreen = pVBox->CloseScreen;
    11641186    return pScreen->CloseScreen(scrnIndex, pScreen);
     1187}
     1188
     1189static void
     1190vboxCalcDisplayDimensions(VBOXPtr pVBox, int32_t *pcWidth, int32_t *pcHeight)
     1191{
     1192    int32_t cWidth = 0, cHeight = 0;
     1193    unsigned i;
     1194    for (i = 0; i < pVBox->cScreens; ++i)
     1195    {
     1196        int32_t cWidthScreen =    pVBox->aScreenLocation[i].x
     1197                                + pVBox->aScreenLocation[i].cx;
     1198        int32_t cHeightScreen =   pVBox->aScreenLocation[i].y
     1199                                + pVBox->aScreenLocation[i].cy;
     1200        if (cWidthScreen > cWidth)
     1201            cWidth = cWidthScreen;
     1202        if (cHeightScreen > cWidth)
     1203            cWidth = cWidthScreen;
     1204    }
     1205    *pcWidth = cWidth;
     1206    *pcHeight = cHeight;
    11651207}
    11661208
     
    11841226    rc = VBOXSetMode(pScrn, 0, pMode->HDisplay, pMode->VDisplay,
    11851227                     pScrn->frameX0, pScrn->frameY0);
     1228    {
     1229        int32_t cWidth, cHeight;
     1230        vboxCalcDisplayDimensions(pVBox, &cWidth, &cHeight);
     1231        VBOXAdjustScreenPixmap(pScrn, cWidth, cHeight);
     1232    }
    11861233    if (rc)
    11871234    {
     
    12111258    uint32_t yRel = cDisplay ? y - pVBox->aScreenLocation[0].y : 0;
    12121259
    1213     int bpp = pScrn->depth == 24 ? 32 : 16;
    12141260    TRACE_LOG("cDisplay=%u, cWidth=%u, cHeight=%u, x=%d, y=%d, displayWidth=%d\n",
    12151261              cDisplay, cWidth, cHeight, x, y, pScrn->displayWidth);
     
    12201266        if (cDisplay == 0)
    12211267            VBoxVideoSetModeRegisters(cWidth, cHeight, pScrn->displayWidth,
    1222                                       bpp, x, y);
     1268                                      vboxBPP(pScrn), x, y);
    12231269        /* Tell the host we support graphics */
    12241270        if (vbox_device_available(pVBox))
     
    12291275        && !pVBox->vtSwitch)
    12301276        VBoxHGSMIProcessDisplayInfo(&pVBox->guestCtx, cDisplay, xRel, yRel,
    1231                                     (y * pScrn->displayWidth + x) * bpp / 8,
    1232                                     pScrn->displayWidth * bpp / 8,
    1233                                     cWidth, cHeight, bpp);
     1277                                    pVBox->cbLine + x * vboxBPP(pScrn) / 8,
     1278                                    pVBox->cbLine,
     1279                                    cWidth, cHeight, vboxBPP(pScrn));
    12341280    pVBox->aScreenLocation[cDisplay].cx = cWidth;
    12351281    pVBox->aScreenLocation[cDisplay].cy = cHeight;
     
    12451291    PixmapPtr pPixmap = pScreen->GetScreenPixmap(pScreen);
    12461292    VBOXPtr pVBox = VBOXGetRec(pScrn);
    1247     int bpp = pScrn->depth == 24 ? 32 : 16;
     1293    uint64_t cbLine = vboxLineLength(pScrn, width);
    12481294
    12491295    TRACE_LOG("width=%d, height=%d\n", width, height);
    1250     if ((uint64_t)width * height * bpp / 8 >= pVBox->cbFramebuffer)
     1296    if (!pPixmap) {
     1297        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
     1298                   "Failed to get the screen pixmap.\n");
     1299        return FALSE;
     1300    }
     1301    if (cbLine > UINT32_MAX || cbLine * height >= pVBox->cbFramebuffer)
    12511302    {
    12521303        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
     
    12551306        return FALSE;
    12561307    }
    1257     if (!pPixmap) {
    1258         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
    1259                    "Failed to get the screen pixmap.\n");
    1260         return FALSE;
    1261     }
    12621308    pScreen->ModifyPixmapHeader(pPixmap, width, height,
    1263                                 pScrn->depth, bpp, width * bpp / 8,
     1309                                pScrn->depth, vboxBPP(pScrn), cbLine,
    12641310                                pVBox->base);
    12651311    pScrn->virtualX = width;
    12661312    pScrn->virtualY = height;
    1267     pScrn->displayWidth = width;
     1313    pScrn->displayWidth = vboxDisplayPitch(pScrn, cbLine);
     1314    pVBox->cbLine = cbLine;
    12681315#ifdef VBOX_DRI
    12691316    if (pVBox->useDRI)
     
    12731320    /* Write the new values to the hardware */
    12741321    xf86SetDesiredModes(pScrn);
    1275 #else
    1276     pScrn->EnableDisableFBAccess(pScrn->scrnIndex, FALSE);
    1277     pScrn->EnableDisableFBAccess(pScrn->scrnIndex, TRUE);
    12781322#endif
    12791323    return TRUE;
  • trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h

    r34747 r34763  
    185185    /** The amount of VRAM available for use as a framebuffer */
    186186    unsigned long cbFramebuffer;
     187    /** The current line size in bytes */
     188    uint32_t cbLine;
    187189    CARD8 *state, *pstate;      /* SVGA state */
    188190    int statePage, stateSize, stateMode;
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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