VirtualBox

Changeset 53862 in vbox


Ignore:
Timestamp:
Jan 19, 2015 6:45:06 PM (10 years ago)
Author:
vboxsync
Message:

FE/Qt: Runtime UI: Machine-view: Frame-buffer preparation cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp

    r53861 r53862  
    477477void UIMachineView::prepareFrameBuffer()
    478478{
    479     /* Take scale-factor and unscaled video output mode into account: */
    480     const double dScaleFactor = gEDataManager->scaleFactor(vboxGlobal().managedVMUuid());
    481     const bool fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(vboxGlobal().managedVMUuid());
    482 
    483     /* Prepare frame-buffer: */
     479    /* Check whether we already have corresponding frame-buffer: */
    484480    UIFrameBuffer *pFrameBuffer = uisession()->frameBuffer(screenId());
     481
     482    /* If we do: */
    485483    if (pFrameBuffer)
    486484    {
     485        /* Assign it's view: */
    487486        pFrameBuffer->setView(this);
    488         /* Mark framebuffer as used again: */
     487        /* Mark frame-buffer as used again: */
    489488        LogRelFlow(("UIMachineView::prepareFrameBuffer: Start EMT callbacks accepting for screen: %d.\n", screenId()));
    490489        pFrameBuffer->setMarkAsUnused(false);
     490        /* And remember our choice: */
    491491        m_pFrameBuffer = pFrameBuffer;
    492492    }
     493    /* If we do not: */
    493494    else
    494495    {
    495 # ifdef VBOX_WITH_VIDEOHWACCEL
     496#ifdef VBOX_WITH_VIDEOHWACCEL
     497        /* If 2D video acceleration is activated: */
    496498        if (m_fAccelerate2DVideo)
    497499        {
     500            /* Create new frame-buffer on the basis
     501             * of VBoxOverlayFrameBuffer template: */
    498502            ComObjPtr<VBoxOverlayFrameBuffer> pOFB;
    499503            pOFB.createObject();
     
    501505            m_pFrameBuffer = pOFB;
    502506        }
     507        /* If 2D video acceleration is not activated: */
    503508        else
    504509        {
     510            /* Create new default frame-buffer: */
    505511            m_pFrameBuffer.createObject();
    506512            m_pFrameBuffer->init(this);
    507513        }
    508 # else /* VBOX_WITH_VIDEOHWACCEL */
     514#else /* VBOX_WITH_VIDEOHWACCEL */
     515        /* Create new default frame-buffer: */
    509516        m_pFrameBuffer.createObject();
    510517        m_pFrameBuffer->init(this);
    511 # endif /* !VBOX_WITH_VIDEOHWACCEL */
     518#endif /* !VBOX_WITH_VIDEOHWACCEL */
     519
     520        /* Take HiDPI optimization type into account: */
    512521        m_pFrameBuffer->setHiDPIOptimizationType(uisession()->hiDPIOptimizationType());
     522
     523        /* Take scale-factor into account: */
     524        const double dScaleFactor = gEDataManager->scaleFactor(vboxGlobal().managedVMUuid());
    513525        m_pFrameBuffer->setScaleFactor(dScaleFactor);
    514526        display().NotifyScaleFactorChange(m_uScreenId,
    515527                                          (uint32_t)(dScaleFactor * VBOX_OGL_SCALE_FACTOR_MULTIPLIER),
    516528                                          (uint32_t)(dScaleFactor * VBOX_OGL_SCALE_FACTOR_MULTIPLIER));
     529
     530        /* Take unscaled HiDPI output mode into account: */
     531        const bool fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(vboxGlobal().managedVMUuid());
    517532        m_pFrameBuffer->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
     533
     534        /* Associate uisession with frame-buffer finally: */
    518535        uisession()->setFrameBuffer(screenId(), m_pFrameBuffer);
    519536    }
    520537
    521     /* If frame-buffer was prepared: */
    522     if (m_pFrameBuffer)
    523     {
    524         /* Prepare display: */
    525         CFramebuffer fb = display().QueryFramebuffer(m_uScreenId);
    526         /* Always perform AttachFramebuffer to ensure 3D gets notified: */
    527         if (!fb.isNull())
    528             display().DetachFramebuffer(m_uScreenId);
    529         display().AttachFramebuffer(m_uScreenId, CFramebuffer(m_pFrameBuffer));
    530     }
    531 
     538    /* Make sure frame-buffer was prepared: */
     539    AssertReturnVoid(m_pFrameBuffer);
     540
     541    /* Prepare display: */
     542    CFramebuffer fb = display().QueryFramebuffer(m_uScreenId);
     543    /* Always perform AttachFramebuffer to ensure 3D gets notified: */
     544    if (!fb.isNull())
     545        display().DetachFramebuffer(m_uScreenId);
     546    display().AttachFramebuffer(m_uScreenId, CFramebuffer(m_pFrameBuffer));
     547
     548    /* Calculate frame-buffer size: */
    532549    QSize size;
     550    {
    533551#ifdef Q_WS_X11
    534     /* Processing pseudo resize-event to synchronize frame-buffer with stored
    535      * framebuffer size. On X11 this will be additional done when the machine
    536      * state was 'saved'. */
    537     if (machine().GetState() == KMachineState_Saved)
    538         size = guestSizeHint();
     552        /* Processing pseudo resize-event to synchronize frame-buffer with stored framebuffer size.
     553         * On X11 this will be additional done when the machine state was 'saved'. */
     554        if (machine().GetState() == KMachineState_Saved)
     555            size = guestSizeHint();
    539556#endif /* Q_WS_X11 */
    540     /* If there is a preview image saved, we will resize the framebuffer to the
    541      * size of that image. */
    542     ULONG buffer = 0, width = 0, height = 0;
    543     machine().QuerySavedScreenshotPNGSize(0, buffer, width, height);
    544     if (buffer > 0)
    545     {
    546         /* Init with the screenshot size */
    547         size = QSize(width, height);
    548         /* Try to get the real guest dimensions from the save state */
    549         ULONG guestOriginX = 0, guestOriginY = 0, guestWidth = 0, guestHeight = 0;
    550         BOOL fEnabled = true;
    551         machine().QuerySavedGuestScreenInfo(m_uScreenId, guestOriginX, guestOriginY, guestWidth, guestHeight, fEnabled);
    552         if (   guestWidth  > 0
    553             && guestHeight > 0)
    554             size = QSize(guestWidth, guestHeight);
    555     }
    556     /* If we have a valid size, resize the framebuffer. */
    557     if (size.width() > 0 && size.height() > 0)
    558     {
    559         frameBuffer()->resizeEvent(size.width(), size.height());
    560         frameBuffer()->setScaleFactor(dScaleFactor);
    561         display().NotifyScaleFactorChange(m_uScreenId,
    562                                           (uint32_t)(dScaleFactor * VBOX_OGL_SCALE_FACTOR_MULTIPLIER),
    563                                           (uint32_t)(dScaleFactor * VBOX_OGL_SCALE_FACTOR_MULTIPLIER));
    564         frameBuffer()->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
     557
     558        /* If there is a preview image saved,
     559         * we will resize the framebuffer to the size of that image: */
     560        ULONG uBuffer = 0, uWidth = 0, uHeight = 0;
     561        machine().QuerySavedScreenshotPNGSize(0, uBuffer, uWidth, uHeight);
     562        if (uBuffer > 0)
     563        {
     564            /* Init with the screenshot size: */
     565            size = QSize(uWidth, uHeight);
     566            /* Try to get the real guest dimensions from the save-state: */
     567            ULONG uGuestOriginX = 0, uGuestOriginY = 0, uGuestWidth = 0, uGuestHeight = 0;
     568            BOOL fEnabled = true;
     569            machine().QuerySavedGuestScreenInfo(m_uScreenId, uGuestOriginX, uGuestOriginY, uGuestWidth, uGuestHeight, fEnabled);
     570            if (uGuestWidth  > 0 && uGuestHeight > 0)
     571                size = QSize(uGuestWidth, uGuestHeight);
     572        }
     573
     574        /* If we have a valid size, resize the framebuffer. */
     575        if (size.width() > 0 && size.height() > 0)
     576            frameBuffer()->resizeEvent(size.width(), size.height());
    565577    }
    566578}
Note: See TracChangeset for help on using the changeset viewer.

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