VirtualBox

Ignore:
Timestamp:
Mar 19, 2014 10:29:48 AM (11 years ago)
Author:
vboxsync
Message:

crOpenGL: new command submission continued

File:
1 edited

Legend:

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

    r50815 r50817  
    6262static DECLCALLBACK(int) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd);
    6363
     64DECLINLINE(CRClient*) crVBoxServerClientById(uint32_t u32ClientID)
     65{
     66    int32_t i;
     67
     68    if (cr_server.fCrCmdEnabled)
     69        return CrHTableGet(&cr_server.clientTable, u32ClientID);
     70
     71    for (i = 0; i < cr_server.numClients; i++)
     72    {
     73        if (cr_server.clients[i] && cr_server.clients[i]->conn
     74            && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
     75        {
     76            return cr_server.clients[i];
     77        }
     78    }
     79
     80    return NULL;
     81}
     82
    6483DECLINLINE(int32_t) crVBoxServerClientGet(uint32_t u32ClientID, CRClient **ppClient)
    6584{
     
    6786    int32_t i;
    6887
    69     *ppClient = NULL;
    70 
    71     for (i = 0; i < cr_server.numClients; i++)
    72     {
    73         if (cr_server.clients[i] && cr_server.clients[i]->conn
    74             && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
    75         {
    76             pClient = cr_server.clients[i];
    77             break;
    78         }
    79     }
     88    pClient = crVBoxServerClientById(u32ClientID);
     89
    8090    if (!pClient)
    8191    {
    82         crWarning("client not found!");
     92        WARN(("client not found!"));
     93        *ppClient = NULL;
    8394        return VERR_INVALID_PARAMETER;
    8495    }
     
    8697    if (!pClient->conn->vMajor)
    8798    {
    88         crWarning("no major version specified for client!");
     99        WARN(("no major version specified for client!"));
     100        *ppClient = NULL;
    89101        return VERR_NOT_SUPPORTED;
    90102    }
     
    337349#endif
    338350
     351    cr_server.fCrCmdEnabled = GL_FALSE;
     352    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
     353
    339354    cr_server.bUseMultipleContexts = (crGetenv( "CR_SERVER_ENABLE_MULTIPLE_CONTEXTS" ) != NULL);
    340355
     
    441456#endif
    442457
     458    cr_server.fCrCmdEnabled = GL_FALSE;
     459    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
     460
    443461    cr_server.bUseMultipleContexts = (crGetenv( "CR_SERVER_ENABLE_MULTIPLE_CONTEXTS" ) != NULL);
    444462
     
    591609}
    592610
    593 void crVBoxServerRemoveClient(uint32_t u32ClientID)
    594 {
    595     CRClient *pClient=NULL;
    596     int32_t i;
    597 
    598     crDebug("crServer: RemoveClient u32ClientID=%d", u32ClientID);
    599 
    600     for (i = 0; i < cr_server.numClients; i++)
    601     {
    602         if (cr_server.clients[i] && cr_server.clients[i]->conn
    603             && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
    604         {
    605             pClient = cr_server.clients[i];
    606             break;
    607         }
    608     }
    609     //if (!pClient) return VERR_INVALID_PARAMETER;
    610     if (!pClient)
    611     {
    612         crWarning("Invalid client id %u passed to crVBoxServerRemoveClient", u32ClientID);
    613         return;
    614     }
    615 
     611static void crVBoxServerRemoveClientObj(CRClient *pClient)
     612{
    616613#ifdef VBOX_WITH_CRHGSMI
    617614    CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
     
    623620    /* Let server clear client from the queue */
    624621    crServerDeleteClient(pClient);
     622}
     623
     624static void crVBoxServerRemoveAllClients()
     625{
     626    int32_t i;
     627    for (i = cr_server.numClients - 1; i >= 0; --i)
     628    {
     629        Assert(cr_server.clients[i]);
     630        crVBoxServerRemoveClientObj(cr_server.clients[i]);
     631    }
     632}
     633
     634void crVBoxServerRemoveClient(uint32_t u32ClientID)
     635{
     636    CRClient *pClient=NULL;
     637    int32_t i;
     638
     639    crDebug("crServer: RemoveClient u32ClientID=%d", u32ClientID);
     640
     641    for (i = 0; i < cr_server.numClients; i++)
     642    {
     643        if (cr_server.clients[i] && cr_server.clients[i]->conn
     644            && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
     645        {
     646            pClient = cr_server.clients[i];
     647            break;
     648        }
     649    }
     650    //if (!pClient) return VERR_INVALID_PARAMETER;
     651    if (!pClient)
     652    {
     653        WARN(("Invalid client id %u passed to crVBoxServerRemoveClient", u32ClientID));
     654        return;
     655    }
     656
     657    crVBoxServerRemoveClientObj(pClient);
    625658}
    626659
     
    32633296static DECLCALLBACK(int) crVBoxCrCmdEnable(HVBOXCRCMDSVR hSvr, VBOXCRCMD_SVRENABLE_INFO *pInfo)
    32643297{
     3298    Assert(!cr_server.fCrCmdEnabled);
     3299    Assert(!cr_server.numClients);
     3300
    32653301    cr_server.CrCmdClientInfo = *pInfo;
    32663302
    32673303    crVBoxServerDefaultContextSet();
    32683304
     3305    cr_server.fCrCmdEnabled = GL_TRUE;
     3306
    32693307    return VINF_SUCCESS;
    32703308}
     
    32723310static DECLCALLBACK(int) crVBoxCrCmdDisable(HVBOXCRCMDSVR hSvr)
    32733311{
     3312    Assert(cr_server.fCrCmdEnabled);
     3313
     3314    crVBoxServerRemoveAllClients();
     3315
     3316    CrHTableEmpty(&cr_server.clientTable);
     3317
    32743318    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
    32753319
    32763320    memset(&cr_server.CrCmdClientInfo, 0, sizeof (cr_server.CrCmdClientInfo));
    32773321
     3322    cr_server.fCrCmdEnabled = GL_FALSE;
     3323
    32783324    return VINF_SUCCESS;
    32793325}
     
    32823328{
    32833329    return crVBoxServerHostCtl((VBOXCRCMDCTL*)pCmd, cbCmd);
     3330}
     3331
     3332static int crVBoxCrDisconnect(uint32_t u32Client)
     3333{
     3334    CRClient *pClient = (CRClient*)CrHTableRemove(&cr_server.clientTable, u32Client);
     3335    if (!pClient)
     3336    {
     3337        WARN(("invalid client id"));
     3338        return VERR_INVALID_PARAMETER;
     3339    }
     3340
     3341    crVBoxServerRemoveClientObj(pClient);
     3342
     3343    return VINF_SUCCESS;
     3344}
     3345
     3346static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect)
     3347{
     3348    CRClient *pClient;
     3349    int rc;
     3350    /* allocate client id */
     3351    uint32_t u32ClientId =  CrHTablePut(&cr_server.clientTable, (void*)1);
     3352    if (u32ClientId != CRHTABLE_HANDLE_INVALID)
     3353    {
     3354        rc = crVBoxServerAddClientObj(u32ClientId, &pClient);
     3355        if (RT_SUCCESS(rc))
     3356        {
     3357            rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient);
     3358            if (RT_SUCCESS(rc))
     3359                return VINF_SUCCESS;
     3360            else
     3361                WARN(("CrHTablePutToSlot failed %d", rc));
     3362
     3363            crVBoxServerRemoveClientObj(pClient);
     3364        }
     3365        else
     3366            WARN(("crVBoxServerAddClientObj failed %d", rc));
     3367
     3368        CrHTableRemove(&cr_server.clientTable, u32ClientId);
     3369    }
     3370    else
     3371    {
     3372        WARN(("CrHTablePut failed"));
     3373        rc = VERR_NO_MEMORY;
     3374    }
     3375
     3376    return rc;
    32843377}
    32853378
     
    32973390        case VBOXCMDVBVA3DCTL_TYPE_CONNECT:
    32983391        {
    3299             VBOXCMDVBVA_3DCTL_CONNECT *pConnect = (VBOXCMDVBVA_3DCTL_CONNECT*)pCtl;
    3300 
    3301             return VERR_NOT_SUPPORTED;
     3392            if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL_CONNECT))
     3393            {
     3394                WARN(("invalid command size"));
     3395                return VERR_INVALID_PARAMETER;
     3396            }
     3397
     3398            return crVBoxCrConnect((VBOXCMDVBVA_3DCTL_CONNECT*)pCtl);
    33023399        }
    33033400        case VBOXCMDVBVA3DCTL_TYPE_DISCONNECT:
    33043401        {
    3305             return VERR_NOT_SUPPORTED;
     3402            if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL))
     3403            {
     3404                WARN(("invalid command size"));
     3405                return VERR_INVALID_PARAMETER;
     3406            }
     3407
     3408            return crVBoxCrDisconnect(pCtl->u32CmdClientId);
    33063409        }
    33073410        case VBOXCMDVBVA3DCTL_TYPE_CMD:
     
    37783881    uint32_t cbCtl;
    37793882
     3883    Assert(!cr_server.fCrCmdEnabled);
     3884
    37803885    if (cr_server.numClients)
    37813886    {
     
    37963901int32_t crVBoxServerHgcmDisable()
    37973902{
     3903    Assert(!cr_server.fCrCmdEnabled);
     3904
    37983905    if (cr_server.numClients)
    37993906    {
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