VirtualBox

Changeset 50178 in vbox


Ignore:
Timestamp:
Jan 23, 2014 12:04:44 PM (11 years ago)
Author:
vboxsync
Message:

crOpenGL: seamless and resize bugfixes

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/VBoxCrOpenGLSvc.h

    r50149 r50178  
    3232#include <VBox/VBoxGuest2.h>
    3333#include <VBox/hgcmsvc.h>
     34#include <VBox/VBoxVideo.h>
    3435
    3536/* crOpenGL host functions */
     
    361362} CRVBOXHGCMWRITEREADBUFFERED;
    362363
     364
     365typedef struct
     366{
     367    VBVAINFOSCREEN Screen;
     368    void *pvVRAM;
     369} CRVBOXHGCMDEVRESIZE;
     370
    363371#endif
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r50149 r50178  
    531531extern DECLEXPORT(void) crServerVBoxCompositionSetEnableStateGlobal(GLboolean fEnable);
    532532struct VBVAINFOSCREEN;
    533 extern DECLEXPORT(int) crVBoxServerNotifyResize(uint32_t idScreen);
     533extern DECLEXPORT(int) crVBoxServerNotifyResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM);
    534534extern DECLEXPORT(int32_t) crVBoxServerSetRootVisibleRegion(GLint cRects, const RTRECT *pRects);
    535535
  • trunk/src/VBox/GuestHost/OpenGL/util/compositor.cpp

    r50095 r50178  
    409409        if (fAdjusted)
    410410        {
    411             fChangeFlags &= ~VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
    412             fChangeFlags |= VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED;
     411            if (CrVrScrCompositorEntryIsUsed(pEntry))
     412            {
     413                fChangeFlags &= ~VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;
     414                fChangeFlags |= VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED;
     415            }
     416            else
     417            {
     418                fChangeFlags = 0;
     419            }
    413420        }
    414421    }
  • trunk/src/VBox/GuestHost/OpenGL/util/htable.cpp

    r50095 r50178  
    9595    pTbl->cData = 0;
    9696    pTbl->iNext2Search = 0;
     97    if (pTbl->cSize)
     98        memset(pTbl->paData, 0, sizeof (pTbl->paData[0]) * pTbl->cSize);
    9799}
    98100
     
    159161    {
    160162        void* pvData = pTbl->paData[iIndex];
    161         pTbl->paData[iIndex] = NULL;
    162         --pTbl->cData;
    163         Assert(pTbl->cData <= pTbl->cSize);
    164         pTbl->iNext2Search = iIndex;
     163        if (pvData)
     164        {
     165            pTbl->paData[iIndex] = NULL;
     166            --pTbl->cData;
     167            Assert(pTbl->cData <= pTbl->cSize);
     168            pTbl->iNext2Search = iIndex;
     169        }
    165170        return pvData;
    166171    }
     
    172177{
    173178    uint32_t iIndex = crHTableHandle2Index(hHandle);
    174     Assert(iIndex < pTbl->cSize);
    175179    if (iIndex < pTbl->cSize)
    176180        return pTbl->paData[iIndex];
    177     WARN(("invalid handle supplied %d", hHandle));
     181    LOG(("invalid handle supplied %d", hHandle));
    178182    return NULL;
    179183}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r50149 r50178  
    11861186            }
    11871187
    1188             for (int i = 0; i < SHCRGL_CPARMS_DEV_RESIZE; ++i)
    1189             {
    1190                 if (paParms[i].type != VBOX_HGCM_SVC_PARM_32BIT)
    1191                 {
    1192                     AssertMsgFailed(("invalid param\n"));
    1193                     return VERR_INVALID_PARAMETER;
    1194                 }
    1195             }
    1196 
    1197             rc = crVBoxServerNotifyResize(paParms[0].u.uint32);
     1188            if (paParms->type != VBOX_HGCM_SVC_PARM_PTR)
     1189            {
     1190                AssertMsgFailed(("invalid param\n"));
     1191                return VERR_INVALID_PARAMETER;
     1192            }
     1193
     1194            if (!paParms->u.pointer.addr)
     1195            {
     1196                AssertMsgFailed(("invalid param\n"));
     1197                return VERR_INVALID_PARAMETER;
     1198            }
     1199
     1200            if (paParms->u.pointer.size != sizeof (CRVBOXHGCMDEVRESIZE))
     1201            {
     1202                AssertMsgFailed(("invalid param\n"));
     1203                return VERR_INVALID_PARAMETER;
     1204            }
     1205
     1206            CRVBOXHGCMDEVRESIZE *pResize = (CRVBOXHGCMDEVRESIZE*)paParms->u.pointer.addr;
     1207
     1208            rc = crVBoxServerNotifyResize(&pResize->Screen, pResize->pvVRAM);
    11981209            break;
    11991210        }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp

    r50149 r50178  
    430430}
    431431
    432 DECLEXPORT(int) crVBoxServerNotifyResize(uint32_t idScreen)
    433 {
    434     struct VBVAINFOSCREEN Screen;
    435     void *pvVRAM;
    436 
    437     int rc = cr_server.CltInfo.pfnDmGet(cr_server.CltInfo.hClient, idScreen, &Screen, &pvVRAM);
    438     if (!RT_SUCCESS(rc))
    439     {
    440         WARN(("err"));
    441         return rc;
    442     }
    443 
    444     rc = crVBoxServerResizeScreen(&Screen, pvVRAM);
     432DECLEXPORT(int) crVBoxServerNotifyResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM)
     433{
     434    int rc = crVBoxServerResizeScreen(pScreen, pvVRAM);
    445435    if (!RT_SUCCESS(rc))
    446436    {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r50161 r50178  
    248248        return VINF_SUCCESS;
    249249
    250     CrHTableEmpty(&pFb->SlotTable);
    251 
    252250    pFb->pDisplay = pDisplay;
    253251
     
    288286#define CR_PMGR_MODE_ALL    0x7
    289287
    290 static int crPMgrModeModifyGlobal(uint32_t u32Mode, bool fEnable);
     288static int crPMgrModeModifyGlobal(uint32_t u32ModeAdd, uint32_t u32ModeRemove);
    291289
    292290static CR_FBTEX* crFbTexAlloc()
     
    412410    if (!pTobj)
    413411    {
    414         WARN(("pTobj is null!"));
     412        LOG(("pTobj is null!"));
    415413        crStateGlobalSharedRelease();
    416414        return NULL;
     
    573571    if (!pFbTex)
    574572    {
    575         WARN(("crFbTexAcquire failed"));
     573        LOG(("crFbTexAcquire failed"));
    576574        return VERR_INVALID_PARAMETER;
    577575    }
     
    10081006        {
    10091007            mFlags.fRegionsShanged = 0;
    1010             ueRegions();
     1008            if (getFramebuffer()) /*<-dont't do anything on cleanup*/
     1009                ueRegions();
    10111010        }
    10121011    }
     
    22432242    {
    22442243        CrVrScrCompositorClear(&mCompositor);
     2244
    22452245        int rc = CrVrScrCompositorRectSet(&mCompositor, CrVrScrCompositorRectGet(CrFbGetCompositor(getFramebuffer())), NULL);
    22462246        if (!RT_SUCCESS(rc))
     
    28332833                {
    28342834#endif
    2835                     rc = crPMgrModeModifyGlobal(CR_PMGR_MODE_WINDOW, true);
     2835                    rc = crPMgrModeModifyGlobal(CR_PMGR_MODE_WINDOW, 0);
    28362836                    if (RT_SUCCESS(rc))
    28372837                        return VINF_SUCCESS;
     
    28652865void CrPMgrTerm()
    28662866{
    2867     crPMgrModeModifyGlobal(CR_PMGR_MODE_ALL, false);
     2867    crPMgrModeModifyGlobal(0, CR_PMGR_MODE_ALL);
    28682868
    28692869    HCR_FRAMEBUFFER hFb;
     
    31853185}
    31863186
    3187 static int crPMgrModeModifyGlobal(uint32_t u32Mode, bool fEnable)
    3188 {
    3189     uint32_t u32ModeAdd, u32ModeRemove;
    3190     if (fEnable)
    3191     {
    3192         u32ModeAdd = u32Mode;
    3193         u32ModeRemove = 0;
    3194     }
    3195     else
    3196     {
    3197         u32ModeAdd = 0;
    3198         u32ModeRemove = u32Mode;
    3199     }
    3200 
     3187static int crPMgrModeModifyGlobal(uint32_t u32ModeAdd, uint32_t u32ModeRemove)
     3188{
    32013189    g_CrPresenter.u32DisplayMode = (g_CrPresenter.u32DisplayMode | u32ModeAdd) & ~u32ModeRemove;
    32023190
     
    32133201int CrPMgrModeVrdp(bool fEnable)
    32143202{
    3215     return crPMgrModeModifyGlobal(CR_PMGR_MODE_VRDP, fEnable);
     3203    uint32_t u32ModeAdd, u32ModeRemove;
     3204    if (fEnable)
     3205    {
     3206        u32ModeAdd = CR_PMGR_MODE_VRDP;
     3207        u32ModeRemove = 0;
     3208    }
     3209    else
     3210    {
     3211        u32ModeAdd = 0;
     3212        u32ModeRemove = CR_PMGR_MODE_VRDP;
     3213    }
     3214    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
    32163215}
    32173216
    32183217int CrPMgrModeRootVr(bool fEnable)
    32193218{
    3220     return crPMgrModeModifyGlobal(CR_PMGR_MODE_ROOTVR, fEnable);
     3219    uint32_t u32ModeAdd, u32ModeRemove;
     3220    if (fEnable)
     3221    {
     3222        u32ModeAdd = CR_PMGR_MODE_ROOTVR;
     3223        u32ModeRemove = CR_PMGR_MODE_WINDOW;
     3224    }
     3225    else
     3226    {
     3227        u32ModeAdd = CR_PMGR_MODE_WINDOW;
     3228        u32ModeRemove = CR_PMGR_MODE_ROOTVR;
     3229    }
     3230
     3231    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
    32213232}
    32223233
     
    36773688        if (!RT_SUCCESS(rc))
    36783689        {
    3679             WARN(("CrFbEntryCreateForTexId Failed"));
     3690            LOG(("CrFbEntryCreateForTexId Failed"));
    36803691            return;
    36813692        }
  • trunk/src/VBox/Main/include/DisplayImpl.h

    r50095 r50178  
    170170    void handleCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
    171171#endif
     172
     173#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     174    void  handleCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
     175#endif
     176
    172177    int notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM);
    173178
     
    267272#endif
    268273
     274#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     275    static DECLCALLBACK(void)  displayCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
     276#endif
     277
    269278    static DECLCALLBACK(void)  displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser);
    270279    static DECLCALLBACK(int)   displaySSMLoadScreenshot(PSSMHANDLE pSSM, void *pvUser, uint32_t uVersion, uint32_t uPass);
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r50149 r50178  
    670670            if (pVMMDev)
    671671            {
    672                 VBOXHGCMSVCPARM parm[SHCRGL_CPARMS_DEV_RESIZE];
    673 
    674                 parm[0].type = VBOX_HGCM_SVC_PARM_32BIT;
    675                 parm[0].u.uint32 = pScreen->u32ViewIndex;
    676 
    677                 /* no completion callback is specified with this call,
    678                  * the CrOgl code will complete the CrHgsmi command once it processes it */
    679                 rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_DEV_RESIZE, parm, NULL, NULL);
    680                 AssertRC(rc);
     672                CRVBOXHGCMDEVRESIZE *pData = (CRVBOXHGCMDEVRESIZE*)RTMemAlloc(sizeof (*pData));
     673                if (pData)
     674                {
     675                    pData->Screen = *pScreen;
     676                    pData->pvVRAM = pvVRAM;
     677
     678                    VBOXHGCMSVCPARM parm;
     679
     680                    parm.type = VBOX_HGCM_SVC_PARM_PTR;
     681                    parm.u.pointer.addr = pData;
     682                    parm.u.pointer.size = sizeof (*pData);
     683
     684                    rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_DEV_RESIZE, &parm, displayCrAsyncCmdCompletion, this);
     685                    AssertRC(rc);
     686                }
     687                else
     688                    rc = VERR_NO_MEMORY;
    681689            }
    682690        }
     
    40624070    pDisplay->handleCrHgsmiControlCompletion(result, u32Function, pParam);
    40634071}
     4072#endif
     4073
     4074#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     4075DECLCALLBACK(void)  Display::displayCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext)
     4076{
     4077    Display *pDisplay = (Display *)pvContext;
     4078    pDisplay->handleCrAsyncCmdCompletion(result, u32Function, pParam);
     4079}
     4080
     4081
     4082void  Display::handleCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam)
     4083{
     4084    if (pParam->type == VBOX_HGCM_SVC_PARM_PTR && pParam->u.pointer.addr)
     4085        RTMemFree(pParam->u.pointer.addr);
     4086}
     4087
    40644088#endif
    40654089
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