VirtualBox

Ignore:
Timestamp:
Apr 9, 2014 8:58:50 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93199
Message:

DevVGA/crOpenGL: create worker thread when needed only; saved state; bugfixes (to be continued)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r50957 r51005  
    16501650static uint32_t g_hackVBoxServerSaveLoadCallsLeft = 0;
    16511651
    1652 DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
     1652static int32_t crVBoxServerSaveStatePerform(PSSMHANDLE pSSM)
    16531653{
    16541654    int32_t  rc, i;
     
    16711671
    16721672    /* We shouldn't be called if there's no clients at all*/
    1673     CRASSERT(cr_server.numClients>0);
     1673    CRASSERT(cr_server.numClients > 0);
    16741674
    16751675    /* @todo it's hack atm */
     
    16851685        AssertRCReturn(rc, rc);
    16861686
    1687         g_hackVBoxServerSaveLoadCallsLeft = cr_server.numClients;
     1687        /* we get called only once for CrCmd case, so disable the hack */
     1688        g_hackVBoxServerSaveLoadCallsLeft = cr_server.fCrCmdEnabled ? 1 : cr_server.numClients;
    16881689    }
    16891690
     
    18291830
    18301831    return VINF_SUCCESS;
     1832}
     1833
     1834DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
     1835{
     1836    if (cr_server.fCrCmdEnabled)
     1837    {
     1838        WARN(("we should not be called with cmd enabled!"));
     1839        return VERR_INTERNAL_ERROR;
     1840    }
     1841
     1842    return crVBoxServerSaveStatePerform(pSSM);
    18311843}
    18321844
     
    23532365}
    23542366
    2355 DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
     2367static int32_t crVBoxServerLoadStatePerform(PSSMHANDLE pSSM, uint32_t version)
    23562368{
    23572369    int32_t  rc, i;
     
    23692381        rc = SSMR3GetU32(pSSM, &g_hackVBoxServerSaveLoadCallsLeft);
    23702382        AssertRCReturn(rc, rc);
     2383
     2384        Assert(g_hackVBoxServerSaveLoadCallsLeft);
     2385        /* we get called only once for CrCmd */
     2386        if (cr_server.fCrCmdEnabled)
     2387            g_hackVBoxServerSaveLoadCallsLeft = 1;
    23712388    }
    23722389
     
    27182735}
    27192736
     2737DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
     2738{
     2739    if (cr_server.fCrCmdEnabled)
     2740    {
     2741        WARN(("CrCmd enabled"));
     2742        return VERR_INTERNAL_ERROR;
     2743    }
     2744
     2745    return crVBoxServerLoadStatePerform(pSSM, version);
     2746}
     2747
    27202748#define SCREEN(i) (cr_server.screen[i])
    27212749#define MAPPED(screen) ((screen).winID != 0)
     
    29813009{
    29823010    GLint spuWindow, spuCtx;
     3011    CRContext *ctx = NULL;
    29833012
    29843013    if (cr_server.MainContextInfo.SpuContext)
     
    29953024            spuCtx = cr_server.MainContextInfo.SpuContext;
    29963025            spuWindow = pMural->spuWindow;
     3026            ctx = cr_server.MainContextInfo.pContext;
     3027            Assert(ctx);
    29973028        }
    29983029    }
     
    30043035
    30053036    cr_server.head_spu->dispatch_table.MakeCurrent(spuWindow, 0, spuCtx);
     3037    crStateSetCurrent(ctx);
     3038
    30063039}
    30073040
     
    33373370
    33383371    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
     3372    crStateCleanupCurrent();
    33393373
    33403374    memset(&cr_server.CrCmdClientInfo, 0, sizeof (cr_server.CrCmdClientInfo));
     
    33643398}
    33653399
    3366 static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect)
     3400static int crVBoxCrConnectEx(VBOXCMDVBVA_3DCTL_CONNECT *pConnect, uint32_t u32ClientId)
    33673401{
    33683402    CRClient *pClient;
    33693403    int rc;
    3370     /* allocate client id */
    3371     uint32_t u32ClientId =  CrHTablePut(&cr_server.clientTable, (void*)1);
    3372     if (u32ClientId != CRHTABLE_HANDLE_INVALID)
    3373     {
    3374         rc = crVBoxServerAddClientObj(u32ClientId, &pClient);
     3404
     3405    if (u32ClientId == CRHTABLE_HANDLE_INVALID)
     3406    {
     3407        /* allocate client id */
     3408        u32ClientId =  CrHTablePut(&cr_server.clientTable, (void*)1);
     3409        if (u32ClientId == CRHTABLE_HANDLE_INVALID)
     3410        {
     3411            WARN(("CrHTablePut failed"));
     3412            return VERR_NO_MEMORY;
     3413        }
     3414    }
     3415
     3416    rc = crVBoxServerAddClientObj(u32ClientId, &pClient);
     3417    if (RT_SUCCESS(rc))
     3418    {
     3419        rc = crVBoxServerClientObjSetVersion(pClient, pConnect->u32MajorVersion, pConnect->u32MinorVersion);
    33753420        if (RT_SUCCESS(rc))
    33763421        {
    3377             rc = crVBoxServerClientObjSetVersion(pClient, pConnect->u32MajorVersion, pConnect->u32MinorVersion);
     3422            rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid);
    33783423            if (RT_SUCCESS(rc))
    33793424            {
    3380                 rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid);
     3425                rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient);
    33813426                if (RT_SUCCESS(rc))
    33823427                {
    3383                     rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient);
    3384                     if (RT_SUCCESS(rc))
    3385                     {
    3386                         pConnect->Hdr.u32CmdClientId = u32ClientId;
    3387                         return VINF_SUCCESS;
    3388                     }
    3389                     else
    3390                         WARN(("CrHTablePutToSlot failed %d", rc));
     3428                    pConnect->Hdr.u32CmdClientId = u32ClientId;
     3429                    return VINF_SUCCESS;
    33913430                }
    33923431                else
    3393                     WARN(("crVBoxServerClientObjSetPID failed %d", rc));
     3432                    WARN(("CrHTablePutToSlot failed %d", rc));
    33943433            }
    33953434            else
    3396                 WARN(("crVBoxServerClientObjSetVersion failed %d", rc));
    3397 
    3398             crVBoxServerRemoveClientObj(pClient);
     3435                WARN(("crVBoxServerClientObjSetPID failed %d", rc));
    33993436        }
    34003437        else
    3401             WARN(("crVBoxServerAddClientObj failed %d", rc));
    3402 
    3403         CrHTableRemove(&cr_server.clientTable, u32ClientId);
     3438            WARN(("crVBoxServerClientObjSetVersion failed %d", rc));
     3439
     3440        crVBoxServerRemoveClientObj(pClient);
    34043441    }
    34053442    else
    3406     {
    3407         WARN(("CrHTablePut failed"));
    3408         rc = VERR_NO_MEMORY;
    3409     }
     3443        WARN(("crVBoxServerAddClientObj failed %d", rc));
     3444
     3445    CrHTableRemove(&cr_server.clientTable, u32ClientId);
    34103446
    34113447    return rc;
     3448}
     3449
     3450static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect)
     3451{
     3452    return crVBoxCrConnectEx(pConnect, CRHTABLE_HANDLE_INVALID);
    34123453}
    34133454
     
    34623503}
    34633504
     3505static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***";
     3506
     3507static int crVBoxCrCmdSaveClients(PSSMHANDLE pSSM)
     3508{
     3509    int i;
     3510    int rc = SSMR3PutU32(pSSM, cr_server.numClients);
     3511    AssertRCReturn(rc, rc);
     3512
     3513    for (i = 0; i < cr_server.numClients; i++)
     3514    {
     3515        CRClient * pClient = cr_server.clients[i];
     3516        Assert(pClient);
     3517
     3518        rc = SSMR3PutU32(pSSM, pClient->conn->u32ClientID);
     3519        AssertRCReturn(rc, rc);
     3520        rc = SSMR3PutU32(pSSM, pClient->conn->vMajor);
     3521        AssertRCReturn(rc, rc);
     3522        rc = SSMR3PutU32(pSSM, pClient->conn->vMinor);
     3523        AssertRCReturn(rc, rc);
     3524        rc = SSMR3PutU64(pSSM, pClient->pid);
     3525        AssertRCReturn(rc, rc);
     3526    }
     3527
     3528    return VINF_SUCCESS;
     3529}
     3530
     3531static int crVBoxCrCmdLoadClients(PSSMHANDLE pSSM, uint32_t u32Version)
     3532{
     3533    uint32_t i;
     3534    uint32_t u32;
     3535    VBOXCMDVBVA_3DCTL_CONNECT Connect;
     3536    int rc = SSMR3GetU32(pSSM, &u32);
     3537    AssertRCReturn(rc, rc);
     3538
     3539    for (i = 0; i < u32; i++)
     3540    {
     3541        uint32_t u32ClientID;
     3542        Connect.Hdr.u32Type = VBOXCMDVBVA3DCTL_TYPE_CONNECT;
     3543        Connect.Hdr.u32CmdClientId = 0;
     3544
     3545        rc = SSMR3GetU32(pSSM, &u32ClientID);
     3546        AssertRCReturn(rc, rc);
     3547        rc = SSMR3GetU32(pSSM, &Connect.u32MajorVersion);
     3548        AssertRCReturn(rc, rc);
     3549        rc = SSMR3GetU32(pSSM, &Connect.u32MinorVersion);
     3550        AssertRCReturn(rc, rc);
     3551        rc = SSMR3GetU64(pSSM, &Connect.u64Pid);
     3552        AssertRCReturn(rc, rc);
     3553
     3554        rc = crVBoxCrConnectEx(&Connect, u32ClientID);
     3555        AssertRCReturn(rc, rc);
     3556    }
     3557
     3558    return VINF_SUCCESS;
     3559}
     3560
     3561
    34643562static DECLCALLBACK(int) crVBoxCrCmdSaveState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM)
    34653563{
    3466     AssertFailed();
    3467     return VERR_NOT_IMPLEMENTED;
     3564    int rc = VINF_SUCCESS;
     3565
     3566    Assert(cr_server.fCrCmdEnabled);
     3567
     3568    /* Start*/
     3569    rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
     3570    AssertRCReturn(rc, rc);
     3571
     3572    if (!cr_server.numClients)
     3573    {
     3574        rc = SSMR3PutU32(pSSM, 0);
     3575        AssertRCReturn(rc, rc);
     3576
     3577        rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
     3578        AssertRCReturn(rc, rc);
     3579
     3580        return VINF_SUCCESS;
     3581    }
     3582
     3583    rc = SSMR3PutU32(pSSM, 1);
     3584    AssertRCReturn(rc, rc);
     3585
     3586    /* Version */
     3587    rc = SSMR3PutU32(pSSM, (uint32_t) SHCROGL_SSM_VERSION);
     3588    AssertRCReturn(rc, rc);
     3589
     3590    rc = crVBoxCrCmdSaveClients(pSSM);
     3591    AssertRCReturn(rc, rc);
     3592
     3593    /* The state itself */
     3594    rc = crVBoxServerSaveStatePerform(pSSM);
     3595    AssertRCReturn(rc, rc);
     3596
     3597    /* Save svc buffers info */
     3598    {
     3599        rc = SSMR3PutU32(pSSM, 0);
     3600        AssertRCReturn(rc, rc);
     3601
     3602        rc = SSMR3PutU32(pSSM, 0);
     3603        AssertRCReturn(rc, rc);
     3604    }
     3605
     3606    /* End */
     3607    rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
     3608    AssertRCReturn(rc, rc);
     3609
     3610    return VINF_SUCCESS;
    34683611}
    34693612
    34703613static DECLCALLBACK(int) crVBoxCrCmdLoadState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM, uint32_t u32Version)
    34713614{
    3472     AssertFailed();
    3473     return VERR_NOT_IMPLEMENTED;
     3615    int rc = VINF_SUCCESS;
     3616
     3617    char psz[2000];
     3618    uint32_t ui32;
     3619
     3620    Assert(cr_server.fCrCmdEnabled);
     3621
     3622    /* Start of data */
     3623    rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
     3624    AssertRCReturn(rc, rc);
     3625    if (strcmp(gszVBoxOGLSSMMagic, psz))
     3626    {
     3627        WARN(("unexpected data"));
     3628        return VERR_SSM_UNEXPECTED_DATA;
     3629    }
     3630
     3631    /* num clients */
     3632    rc = SSMR3GetU32(pSSM, &ui32);
     3633    AssertRCReturn(rc, rc);
     3634
     3635    if (!ui32)
     3636    {
     3637        /* no clients, dummy stub */
     3638        rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
     3639        AssertRCReturn(rc, rc);
     3640        if (strcmp(gszVBoxOGLSSMMagic, psz))
     3641        {
     3642            WARN(("unexpected data"));
     3643            return VERR_SSM_UNEXPECTED_DATA;
     3644        }
     3645
     3646        return VINF_SUCCESS;
     3647    }
     3648    if (ui32 != 1)
     3649    {
     3650        WARN(("invalid id"));
     3651        return VERR_SSM_UNEXPECTED_DATA;
     3652    }
     3653
     3654    /* Version */
     3655    rc = SSMR3GetU32(pSSM, &ui32);
     3656    AssertRCReturn(rc, rc);
     3657
     3658    if (ui32 < SHCROGL_SSM_VERSION_CRCMD)
     3659    {
     3660        WARN(("unexpected version"));
     3661        return VERR_SSM_UNEXPECTED_DATA;
     3662    }
     3663
     3664    rc = crVBoxCrCmdLoadClients(pSSM, u32Version);
     3665    AssertRCReturn(rc, rc);
     3666
     3667    /* The state itself */
     3668    rc = crVBoxServerLoadStatePerform(pSSM, ui32);
     3669    AssertRCReturn(rc, rc);
     3670
     3671    /* Save svc buffers info */
     3672    {
     3673        rc = SSMR3GetU32(pSSM, &ui32);
     3674        AssertRCReturn(rc, rc);
     3675
     3676        if (ui32)
     3677        {
     3678            WARN(("unexpected data1"));
     3679            return VERR_SSM_UNEXPECTED_DATA;
     3680        }
     3681
     3682        rc = SSMR3GetU32(pSSM, &ui32);
     3683        AssertRCReturn(rc, rc);
     3684
     3685        if (ui32)
     3686        {
     3687            WARN(("unexpected data1"));
     3688            return VERR_SSM_UNEXPECTED_DATA;
     3689        }
     3690    }
     3691
     3692    /* End */
     3693    rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
     3694    AssertRCReturn(rc, rc);
     3695    if (strcmp(gszVBoxOGLSSMMagic, psz))
     3696    {
     3697        WARN(("unexpected data"));
     3698        return VERR_SSM_UNEXPECTED_DATA;
     3699    }
     3700
     3701    return VINF_SUCCESS;
    34743702}
    34753703
     
    39624190
    39634191    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
     4192    crStateCleanupCurrent();
    39644193
    39654194    cr_server.DisableData = *pData;
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