Changeset 51005 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Apr 9, 2014 8:58:50 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93199
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r50957 r51005 1650 1650 static uint32_t g_hackVBoxServerSaveLoadCallsLeft = 0; 1651 1651 1652 DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)1652 static int32_t crVBoxServerSaveStatePerform(PSSMHANDLE pSSM) 1653 1653 { 1654 1654 int32_t rc, i; … … 1671 1671 1672 1672 /* We shouldn't be called if there's no clients at all*/ 1673 CRASSERT(cr_server.numClients >0);1673 CRASSERT(cr_server.numClients > 0); 1674 1674 1675 1675 /* @todo it's hack atm */ … … 1685 1685 AssertRCReturn(rc, rc); 1686 1686 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; 1688 1689 } 1689 1690 … … 1829 1830 1830 1831 return VINF_SUCCESS; 1832 } 1833 1834 DECLEXPORT(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); 1831 1843 } 1832 1844 … … 2353 2365 } 2354 2366 2355 DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)2367 static int32_t crVBoxServerLoadStatePerform(PSSMHANDLE pSSM, uint32_t version) 2356 2368 { 2357 2369 int32_t rc, i; … … 2369 2381 rc = SSMR3GetU32(pSSM, &g_hackVBoxServerSaveLoadCallsLeft); 2370 2382 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; 2371 2388 } 2372 2389 … … 2718 2735 } 2719 2736 2737 DECLEXPORT(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 2720 2748 #define SCREEN(i) (cr_server.screen[i]) 2721 2749 #define MAPPED(screen) ((screen).winID != 0) … … 2981 3009 { 2982 3010 GLint spuWindow, spuCtx; 3011 CRContext *ctx = NULL; 2983 3012 2984 3013 if (cr_server.MainContextInfo.SpuContext) … … 2995 3024 spuCtx = cr_server.MainContextInfo.SpuContext; 2996 3025 spuWindow = pMural->spuWindow; 3026 ctx = cr_server.MainContextInfo.pContext; 3027 Assert(ctx); 2997 3028 } 2998 3029 } … … 3004 3035 3005 3036 cr_server.head_spu->dispatch_table.MakeCurrent(spuWindow, 0, spuCtx); 3037 crStateSetCurrent(ctx); 3038 3006 3039 } 3007 3040 … … 3337 3370 3338 3371 cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0); 3372 crStateCleanupCurrent(); 3339 3373 3340 3374 memset(&cr_server.CrCmdClientInfo, 0, sizeof (cr_server.CrCmdClientInfo)); … … 3364 3398 } 3365 3399 3366 static int crVBoxCrConnect (VBOXCMDVBVA_3DCTL_CONNECT *pConnect)3400 static int crVBoxCrConnectEx(VBOXCMDVBVA_3DCTL_CONNECT *pConnect, uint32_t u32ClientId) 3367 3401 { 3368 3402 CRClient *pClient; 3369 3403 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); 3375 3420 if (RT_SUCCESS(rc)) 3376 3421 { 3377 rc = crVBoxServerClientObjSet Version(pClient, pConnect->u32MajorVersion, pConnect->u32MinorVersion);3422 rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid); 3378 3423 if (RT_SUCCESS(rc)) 3379 3424 { 3380 rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid);3425 rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient); 3381 3426 if (RT_SUCCESS(rc)) 3382 3427 { 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; 3391 3430 } 3392 3431 else 3393 WARN((" crVBoxServerClientObjSetPIDfailed %d", rc));3432 WARN(("CrHTablePutToSlot failed %d", rc)); 3394 3433 } 3395 3434 else 3396 WARN(("crVBoxServerClientObjSetVersion failed %d", rc)); 3397 3398 crVBoxServerRemoveClientObj(pClient); 3435 WARN(("crVBoxServerClientObjSetPID failed %d", rc)); 3399 3436 } 3400 3437 else 3401 WARN(("crVBoxServer AddClientObjfailed %d", rc));3402 3403 CrHTableRemove(&cr_server.clientTable, u32ClientId);3438 WARN(("crVBoxServerClientObjSetVersion failed %d", rc)); 3439 3440 crVBoxServerRemoveClientObj(pClient); 3404 3441 } 3405 3442 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); 3410 3446 3411 3447 return rc; 3448 } 3449 3450 static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect) 3451 { 3452 return crVBoxCrConnectEx(pConnect, CRHTABLE_HANDLE_INVALID); 3412 3453 } 3413 3454 … … 3462 3503 } 3463 3504 3505 static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***"; 3506 3507 static 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 3531 static 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 3464 3562 static DECLCALLBACK(int) crVBoxCrCmdSaveState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM) 3465 3563 { 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; 3468 3611 } 3469 3612 3470 3613 static DECLCALLBACK(int) crVBoxCrCmdLoadState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM, uint32_t u32Version) 3471 3614 { 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; 3474 3702 } 3475 3703 … … 3962 4190 3963 4191 cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0); 4192 crStateCleanupCurrent(); 3964 4193 3965 4194 cr_server.DisableData = *pData;
Note:
See TracChangeset
for help on using the changeset viewer.