VirtualBox

Changeset 51627 in vbox for trunk/src


Ignore:
Timestamp:
Jun 17, 2014 10:33:46 AM (11 years ago)
Author:
vboxsync
Message:

IDisplay::SetFramebufferUpdateMode and IFramebuffer::NotifyUpdateImage.

Location:
trunk/src/VBox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp

    r51610 r51627  
    419419}
    420420
     421STDMETHODIMP VBoxSDLFB::NotifyUpdateImage(ULONG aX,
     422                                          ULONG aY,
     423                                          ULONG aWidth,
     424                                          ULONG aHeight,
     425                                          ComSafeArrayIn(BYTE, aImage))
     426{
     427    return E_NOTIMPL;
     428}
     429
    421430extern ComPtr<IDisplay> gpDisplay;
    422431
  • trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.h

    r51610 r51627  
    8282
    8383    STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, ULONG w, ULONG h);
     84    STDMETHOD(NotifyUpdateImage)(ULONG x, ULONG y, ULONG w, ULONG h, ComSafeArrayIn(BYTE, aImage));
    8485    STDMETHOD(NotifyChange)(ULONG aScreenId,
    8586                            ULONG aXOrigin,
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp

    r51610 r51627  
    263263}
    264264
     265STDMETHODIMP UIFrameBuffer::NotifyUpdateImage(ULONG aX,
     266                                              ULONG aY,
     267                                              ULONG aWidth,
     268                                              ULONG aHeight,
     269                                              ComSafeArrayIn(BYTE, aImage))
     270{
     271    return E_NOTIMPL;
     272}
     273
    265274STDMETHODIMP UIFrameBuffer::VideoModeSupported(ULONG uWidth, ULONG uHeight, ULONG uBPP, BOOL *pfSupported)
    266275{
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h

    r51610 r51627  
    127127      * @note         Calls to this and #setMarkAsUnused method are synchronized (from GUI side). */
    128128    STDMETHOD(NotifyUpdate)(ULONG uX, ULONG uY, ULONG uWidth, ULONG uHeight);
     129    STDMETHOD(NotifyUpdateImage)(ULONG x, ULONG y, ULONG w, ULONG h, ComSafeArrayIn(BYTE, aImage));
    129130
    130131    /** EMT callback: Returns whether the frame-buffer implementation is willing to support a given video-mode.
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r51610 r51627  
    1523415234  </enum>
    1523515235
     15236  <enum
     15237    name="FramebufferUpdateMode"
     15238    uuid="1268d8ab-dd2f-443c-bc56-d93d3ced5cde"
     15239    >
     15240    <desc>
     15241      How a framebuffer is notified about screen updates.
     15242    </desc>
     15243
     15244    <const name="NotifyUpdate"       value="0">
     15245      <desc>
     15246        IFramebuffer::NotifyUpdate is called.
     15247      </desc>
     15248    </const>
     15249    <const name="NotifyUpdateImage"  value="1">
     15250      <desc>
     15251        IFramebuffer::NotifyUpdateImage is called.
     15252      </desc>
     15253    </const>
     15254  </enum>
     15255
    1523615256  <interface
    1523715257    name="IDisplaySourceBitmap" extends="$unknown" wsmap="suppress"
     
    1525315273  <interface
    1525415274    name="IFramebuffer" extends="$unknown"
    15255     uuid="929e4228-f7cf-436d-99a0-dcf6596473b2"
     15275    uuid="c42d2714-6263-473f-a6c4-3d3b38983e74"
    1525615276    wsmap="managed"
    1525715277    >
     
    1533415354      <param name="width" type="unsigned long" dir="in"/>
    1533515355      <param name="height" type="unsigned long" dir="in"/>
     15356    </method>
     15357
     15358    <method name="notifyUpdateImage">
     15359      <desc>
     15360        Informs about an update and provides 32bpp bitmap.
     15361      </desc>
     15362      <param name="x" type="unsigned long" dir="in"/>
     15363      <param name="y" type="unsigned long" dir="in"/>
     15364      <param name="width" type="unsigned long" dir="in"/>
     15365      <param name="height" type="unsigned long" dir="in"/>
     15366      <param name="image" type="octet" dir="in" safearray="yes">
     15367        <desc>
     15368          Array with 32BPP image data.
     15369        </desc>
     15370      </param>
    1533615371    </method>
    1533715372
     
    1551715552  <interface
    1551815553    name="IDisplay" extends="$unknown"
    15519     uuid="efd0567f-8697-4b4c-965a-7f3672d1909e"
     15554    uuid="0d85a960-bfa7-4f26-9637-fdd521b7f3c1"
    1552015555    wsmap="managed"
    1552115556    >
     
    1585115886      <param name="screenId" type="unsigned long" dir="in"/>
    1585215887      <param name="displaySourceBitmap" type="IDisplaySourceBitmap" dir="out"/>
     15888    </method>
     15889
     15890    <method name="setFramebufferUpdateMode">
     15891      <desc>Select how the framebuffer is informed about screen updates.</desc>
     15892      <param name="screenId" type="unsigned long" dir="in"/>
     15893      <param name="framebufferUpdateMode" type="FramebufferUpdateMode" dir="in"/>
    1585315894    </method>
    1585415895
  • trunk/src/VBox/Main/include/DisplayImpl.h

    r51610 r51627  
    4646    ComPtr<IDisplaySourceBitmap> pSourceBitmap;
    4747    bool fDisabled;
     48
     49    FramebufferUpdateMode_T enmFramebufferUpdateMode;
     50
     51    struct
     52    {
     53        ComPtr<IDisplaySourceBitmap> pSourceBitmap;
     54        uint8_t *pu8Address;
     55        uint32_t cbLine;
     56    } updateImage;
    4857
    4958    LONG xOrigin;
     
    204213    STDMETHOD(QuerySourceBitmap)(ULONG aScreenId,
    205214                                 IDisplaySourceBitmap **aDisplaySourceBitmap);
     215    STDMETHOD(SetFramebufferUpdateMode)(ULONG aScreenId,
     216                                        FramebufferUpdateMode_T aFramebufferUpdateMode);
    206217
    207218    static const PDMDRVREG  DrvReg;
    208219
    209220private:
    210 
    211     HRESULT querySourceBitmap(ULONG aScreenId,
    212                               IDisplaySourceBitmap **ppDisplaySourceBitmap);
    213221
    214222#ifdef VBOX_WITH_CRHGSMI
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r51612 r51627  
    600600        maFramebuffers[ul].fDisabled = ul > 0;
    601601
     602        maFramebuffers[ul].enmFramebufferUpdateMode = FramebufferUpdateMode_NotifyUpdate;
     603
     604        maFramebuffers[ul].updateImage.pu8Address = NULL;
     605        maFramebuffers[ul].updateImage.cbLine = 0;
     606
    602607        maFramebuffers[ul].xOrigin = 0;
    603608        maFramebuffers[ul].yOrigin = 0;
     
    660665    {
    661666        maFramebuffers[uScreenId].pSourceBitmap.setNull();
     667        maFramebuffers[uScreenId].updateImage.pSourceBitmap.setNull();
     668        maFramebuffers[uScreenId].updateImage.pu8Address = NULL;
     669        maFramebuffers[uScreenId].updateImage.cbLine = 0;
    662670        maFramebuffers[uScreenId].pFramebuffer.setNull();
    663671    }
     
    896904        return VINF_SUCCESS;
    897905    }
     906
     907    SetFramebufferUpdateMode(uScreenId, FramebufferUpdateMode_NotifyUpdate);
    898908
    899909    if (uScreenId == VBOX_VIDEO_PRIMARY_SCREEN)
     
    11241134    {
    11251135        if (w != 0 && h != 0)
    1126             pFramebuffer->NotifyUpdate(x, y, w, h);
     1136        {
     1137            if (RT_LIKELY(maFramebuffers[uScreenId].enmFramebufferUpdateMode == FramebufferUpdateMode_NotifyUpdate))
     1138            {
     1139                pFramebuffer->NotifyUpdate(x, y, w, h);
     1140            }
     1141            else if (maFramebuffers[uScreenId].enmFramebufferUpdateMode == FramebufferUpdateMode_NotifyUpdateImage)
     1142            {
     1143                AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1144
     1145                DISPLAYFBINFO *pFBInfo = &maFramebuffers[uScreenId];
     1146
     1147                if (!pFBInfo->updateImage.pSourceBitmap.isNull())
     1148                {
     1149                    Assert(pFBInfo->updateImage.pu8Address);
     1150
     1151                    size_t cbData = w * h * 4;
     1152                    com::SafeArray<BYTE> image(cbData);
     1153
     1154                    uint8_t *pu8Dst = image.raw();
     1155                    const uint8_t *pu8Src = pFBInfo->updateImage.pu8Address + pFBInfo->updateImage.cbLine * y + x * 4;
     1156
     1157                    int i;
     1158                    for (i = y; i < y + h; ++i)
     1159                    {
     1160                        memcpy(pu8Dst, pu8Src, w * 4);
     1161                        pu8Dst += w * 4;
     1162                        pu8Src += pFBInfo->updateImage.cbLine;
     1163                    }
     1164
     1165                    pFramebuffer->NotifyUpdateImage(x, y, w, h, ComSafeArrayAsInParam(image));
     1166                }
     1167            }
     1168        }
    11271169    }
    11281170
     
    33833425        return ptrVM.rc();
    33843426
     3427    bool fSetRenderVRAM = false;
     3428    bool fInvalidate = false;
     3429
    33853430    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    33863431
     
    33893434                        aScreenId, mcMonitors);
    33903435
    3391     HRESULT hr = querySourceBitmap(aScreenId, aDisplaySourceBitmap);
    3392 
    3393     alock.release();
    3394 
    3395     LogRelFlowFunc(("%Rhrc\n", hr));
    3396     return hr;
    3397 }
    3398 
    3399 // private methods
    3400 /////////////////////////////////////////////////////////////////////////////
    3401 
    3402 HRESULT Display::querySourceBitmap(ULONG aScreenId,
    3403                                    IDisplaySourceBitmap **ppDisplaySourceBitmap)
    3404 {
     3436    if (!mfSourceBitmapEnabled)
     3437    {
     3438        *aDisplaySourceBitmap = NULL;
     3439        return E_FAIL;
     3440    }
     3441
    34053442    HRESULT hr = S_OK;
    3406 
    3407     if (!mfSourceBitmapEnabled)
    3408     {
    3409         *ppDisplaySourceBitmap = NULL;
    3410         return E_FAIL;
    3411     }
    34123443
    34133444    DISPLAYFBINFO *pFBInfo = &maFramebuffers[aScreenId];
     
    34243455        if (SUCCEEDED(hr))
    34253456        {
    3426             pFBInfo->pSourceBitmap = obj;
    3427 
    3428             /* Whether VRAM must be copied to the internal buffer. */
    3429             pFBInfo->fDefaultFormat = !obj->usesVRAM();
     3457            bool fDefaultFormat = !obj->usesVRAM();
    34303458
    34313459            if (aScreenId == VBOX_VIDEO_PRIMARY_SCREEN)
     
    34523480                mpDrv->IConnector.cy         = ulHeight;
    34533481
    3454                 if (pFBInfo->fDefaultFormat)
    3455                     mpDrv->pUpPort->pfnSetRenderVRAM(mpDrv->pUpPort, true);
     3482                fSetRenderVRAM = fDefaultFormat;
    34563483            }
    34573484
    3458             if (pFBInfo->fDefaultFormat)
    3459             {
    3460                 /* @todo make sure that the bitmap contains the latest image? */
    3461                 Console::SafeVMPtrQuiet ptrVM(mParent);
    3462                 if (ptrVM.isOk())
    3463                 {
    3464 //                    VMR3ReqCallWaitU(ptrVM.rawUVM(), VMCPUID_ANY, (PFNRT)Display::InvalidateAndUpdateEMT,
    3465 //                                     3, this, aScreenId, false);
    3466                 }
    3467             }
     3485            /* Make sure that the bitmap contains the latest image. */
     3486            fInvalidate = fDefaultFormat;
     3487
     3488            pFBInfo->pSourceBitmap = obj;
     3489            pFBInfo->fDefaultFormat = fDefaultFormat;
    34683490        }
    34693491    }
     
    34723494    {
    34733495        pFBInfo->pSourceBitmap->AddRef();
    3474         *ppDisplaySourceBitmap = pFBInfo->pSourceBitmap;
    3475     }
    3476 
     3496        *aDisplaySourceBitmap = pFBInfo->pSourceBitmap;
     3497    }
     3498
     3499    /* Leave the IDisplay lock because the VGA device must not be called under it. */
     3500    alock.release();
     3501
     3502    if (SUCCEEDED(hr))
     3503    {
     3504        if (fSetRenderVRAM)
     3505            mpDrv->pUpPort->pfnSetRenderVRAM(mpDrv->pUpPort, true);
     3506
     3507        if (fInvalidate)
     3508            VMR3ReqCallWaitU(ptrVM.rawUVM(), VMCPUID_ANY, (PFNRT)Display::InvalidateAndUpdateEMT,
     3509                             3, this, aScreenId, false);
     3510    }
     3511
     3512    LogRelFlowFunc(("%Rhrc\n", hr));
    34773513    return hr;
    34783514}
     3515
     3516STDMETHODIMP Display::SetFramebufferUpdateMode(ULONG aScreenId,
     3517                                               FramebufferUpdateMode_T aFramebufferUpdateMode)
     3518{
     3519    LogRelFlowFunc(("aScreenId %d, aFramebufferUpdateMode %d\n", aScreenId, aFramebufferUpdateMode));
     3520
     3521    AutoCaller autoCaller(this);
     3522    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     3523
     3524    HRESULT hr = S_OK;
     3525
     3526    /* Prepare without taking a lock. API has it's own locking. */
     3527    ComPtr<IDisplaySourceBitmap> pSourceBitmap;
     3528    if (aFramebufferUpdateMode == FramebufferUpdateMode_NotifyUpdateImage)
     3529    {
     3530        /* A source bitmap will be needed. */
     3531        hr = QuerySourceBitmap(aScreenId, pSourceBitmap.asOutParam());
     3532    }
     3533
     3534    if (FAILED(hr))
     3535        return hr;
     3536
     3537    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     3538
     3539    if (aScreenId >= mcMonitors)
     3540        return setError(E_INVALIDARG, tr("SetFramebufferUpdateMode: Invalid screen %d (total %d)"),
     3541                        aScreenId, mcMonitors);
     3542
     3543    DISPLAYFBINFO *pFBInfo = &maFramebuffers[aScreenId];
     3544
     3545    /* Reset the update mode. */
     3546    pFBInfo->updateImage.pSourceBitmap.setNull();
     3547    pFBInfo->updateImage.pu8Address = NULL;
     3548    pFBInfo->updateImage.cbLine = 0;
     3549
     3550    if (aFramebufferUpdateMode == FramebufferUpdateMode_NotifyUpdateImage)
     3551    {
     3552        BYTE *pAddress = NULL;
     3553        ULONG ulWidth = 0;
     3554        ULONG ulHeight = 0;
     3555        ULONG ulBitsPerPixel = 0;
     3556        ULONG ulBytesPerLine = 0;
     3557        ULONG ulPixelFormat = 0;
     3558
     3559        hr = pSourceBitmap->QueryBitmapInfo(&pAddress,
     3560                                            &ulWidth,
     3561                                            &ulHeight,
     3562                                            &ulBitsPerPixel,
     3563                                            &ulBytesPerLine,
     3564                                            &ulPixelFormat);
     3565        if (SUCCEEDED(hr))
     3566        {
     3567            pFBInfo->updateImage.pSourceBitmap = pSourceBitmap;
     3568            pFBInfo->updateImage.pu8Address = pAddress;
     3569            pFBInfo->updateImage.cbLine = ulBytesPerLine;
     3570        }
     3571    }
     3572
     3573    pFBInfo->enmFramebufferUpdateMode = aFramebufferUpdateMode;
     3574
     3575    return S_OK;
     3576}
     3577
     3578
     3579// private methods
     3580/////////////////////////////////////////////////////////////////////////////
    34793581
    34803582#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
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