VirtualBox

Ignore:
Timestamp:
Apr 4, 2014 6:31:40 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93141
Message:

crOpenGL: command blocks (disabled for now)

Location:
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
Files:
2 edited

Legend:

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

    r50217 r50973  
    226226    {
    227227        cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
    228         cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA);
     228        cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS);
    229229    }
    230230    else
    231231    {
    232         cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT/* | CR_VBOX_CAP_CMDVBVA*/;
     232        cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT
    233233#ifdef DEBUG_misha
    234         cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;
     234                | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS
    235235#endif
     236                ;
    236237
    237238    }
     
    376377    {
    377378        cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
    378         cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA);
     379        cr_server.u32Caps &= ~(CR_VBOX_CAP_TEX_PRESENT | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS);
    379380    }
    380381    else
    381382    {
    382         cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT/* | CR_VBOX_CAP_CMDVBVA*/;
     383        cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT
    383384#ifdef DEBUG_misha
    384         cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;
     385                | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS
    385386#endif
     387                ;
    386388    }
    387389
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c

    r50627 r50973  
    416416}
    417417
     418typedef struct CR_SERVER_PENDING_MSG
     419{
     420    RTLISTNODE Node;
     421    CRMessage Msg;
     422} CR_SERVER_PENDING_MSG;
     423
     424static int crServerPendMsg(CRConnection *conn, const CRMessage *msg, int cbMsg)
     425{
     426    CR_SERVER_PENDING_MSG *pMsg = (CR_SERVER_PENDING_MSG*)RTMemAlloc(cbMsg + RT_OFFSETOF(CR_SERVER_PENDING_MSG, Msg));
     427    if (!pMsg)
     428    {
     429        WARN(("RTMemAlloc failed"));
     430        return VERR_NO_MEMORY;
     431    }
     432
     433    memcpy(&pMsg->Msg, msg, cbMsg);
     434
     435    RTListAppend(&conn->PendingMsgList, &pMsg->Node);
     436
     437    return VINF_SUCCESS;
     438}
     439
     440static void crServerPendProcess(CRConnection *conn)
     441{
     442    CR_SERVER_PENDING_MSG *pIter, *pNext;
     443    RTListForEachSafe(&conn->PendingMsgList, pIter, pNext, CR_SERVER_PENDING_MSG, Node)
     444    {
     445        CRMessage *msg = &pIter->Msg;
     446        const CRMessageOpcodes *msg_opcodes;
     447        int opcodeBytes;
     448        const char *data_ptr;
     449
     450        RTListNodeRemove(&pIter->Node);
     451
     452        CRASSERT(msg->header.type == CR_MESSAGE_OPCODES);
     453
     454        msg_opcodes = (const CRMessageOpcodes *) msg;
     455        opcodeBytes = (msg_opcodes->numOpcodes + 3) & ~0x03;
     456
     457        data_ptr = (const char *) msg_opcodes + sizeof (CRMessageOpcodes) + opcodeBytes;
     458
     459        crUnpack(data_ptr,                 /* first command's operands */
     460                 data_ptr - 1,             /* first command's opcode */
     461                 msg_opcodes->numOpcodes,  /* how many opcodes */
     462                 &(cr_server.dispatch));   /* the CR dispatch table */
     463
     464        RTMemFree(pIter);
     465    }
     466}
    418467
    419468/**
     
    422471 */
    423472static void
    424 crServerDispatchMessage(CRConnection *conn, CRMessage *msg)
     473crServerDispatchMessage(CRConnection *conn, CRMessage *msg, int cbMsg)
    425474{
    426475    const CRMessageOpcodes *msg_opcodes;
     
    430479    PCRVBOXHGSMI_CMDDATA pCmdData = NULL;
    431480#endif
     481    CR_UNPACK_BUFFER_TYPE enmType;
     482    bool fUnpack = true;
    432483
    433484    if (msg->header.type == CR_MESSAGE_REDIR_PTR)
     
    450501
    451502    data_ptr = (const char *) msg_opcodes + sizeof(CRMessageOpcodes) + opcodeBytes;
    452     crUnpack(data_ptr,                 /* first command's operands */
    453              data_ptr - 1,             /* first command's opcode */
    454              msg_opcodes->numOpcodes,  /* how many opcodes */
    455              &(cr_server.dispatch));   /* the CR dispatch table */
     503
     504    enmType = crUnpackGetBufferType(data_ptr - 1,             /* first command's opcode */
     505                msg_opcodes->numOpcodes  /* how many opcodes */);
     506    switch (enmType)
     507    {
     508        case CR_UNPACK_BUFFER_TYPE_GENERIC:
     509        {
     510            if (RTListIsEmpty(&conn->PendingMsgList))
     511                break;
     512
     513            if (RT_SUCCESS(crServerPendMsg(conn, msg, cbMsg)))
     514            {
     515                fUnpack = false;
     516                break;
     517            }
     518
     519            WARN(("crServerPendMsg failed"));
     520            crServerPendProcess(conn);
     521            break;
     522        }
     523        case CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN:
     524        {
     525            if (RTListIsEmpty(&conn->PendingMsgList))
     526            {
     527                if (RT_SUCCESS(crServerPendMsg(conn, msg, cbMsg)))
     528                {
     529                    Assert(!RTListIsEmpty(&conn->PendingMsgList));
     530                    fUnpack = false;
     531                    break;
     532                }
     533                else
     534                    WARN(("crServerPendMsg failed"));
     535            }
     536            else
     537                WARN(("Pend List is NOT empty, drain the current list, and ignore this command"));
     538
     539            crServerPendProcess(conn);
     540            break;
     541        }
     542        case CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END:
     543        {
     544            CRASSERT(!RTListIsEmpty(&conn->PendingMsgList));
     545            crServerPendProcess(conn);
     546            Assert(RTListIsEmpty(&conn->PendingMsgList));
     547            break;
     548        }
     549        default:
     550            WARN(("unsupported buffer type"));
     551            break;
     552    }
     553
     554    if (fUnpack)
     555    {
     556        crUnpack(data_ptr,                 /* first command's operands */
     557                 data_ptr - 1,             /* first command's opcode */
     558                 msg_opcodes->numOpcodes,  /* how many opcodes */
     559                 &(cr_server.dispatch));   /* the CR dispatch table */
     560    }
    456561
    457562#ifdef VBOX_WITH_CRHGSMI
     
    584689
    585690        /* Commands get dispatched here */
    586         crServerDispatchMessage( conn, msg );
     691        crServerDispatchMessage( conn, msg, len );
    587692
    588693        crNetFree( conn, msg );
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