Changeset 50973 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Apr 4, 2014 6:31:40 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93141
- 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 226 226 { 227 227 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); 229 229 } 230 230 else 231 231 { 232 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT /* | CR_VBOX_CAP_CMDVBVA*/;232 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT 233 233 #ifdef DEBUG_misha 234 cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;234 | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS 235 235 #endif 236 ; 236 237 237 238 } … … 376 377 { 377 378 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); 379 380 } 380 381 else 381 382 { 382 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT /* | CR_VBOX_CAP_CMDVBVA*/;383 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT 383 384 #ifdef DEBUG_misha 384 cr_server.u32Caps |= CR_VBOX_CAP_CMDVBVA;385 | CR_VBOX_CAP_CMDVBVA | CR_VBOX_CAP_CMDBLOCKS 385 386 #endif 387 ; 386 388 } 387 389 -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c
r50627 r50973 416 416 } 417 417 418 typedef struct CR_SERVER_PENDING_MSG 419 { 420 RTLISTNODE Node; 421 CRMessage Msg; 422 } CR_SERVER_PENDING_MSG; 423 424 static 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 440 static 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 } 418 467 419 468 /** … … 422 471 */ 423 472 static void 424 crServerDispatchMessage(CRConnection *conn, CRMessage *msg )473 crServerDispatchMessage(CRConnection *conn, CRMessage *msg, int cbMsg) 425 474 { 426 475 const CRMessageOpcodes *msg_opcodes; … … 430 479 PCRVBOXHGSMI_CMDDATA pCmdData = NULL; 431 480 #endif 481 CR_UNPACK_BUFFER_TYPE enmType; 482 bool fUnpack = true; 432 483 433 484 if (msg->header.type == CR_MESSAGE_REDIR_PTR) … … 450 501 451 502 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 } 456 561 457 562 #ifdef VBOX_WITH_CRHGSMI … … 584 689 585 690 /* Commands get dispatched here */ 586 crServerDispatchMessage( conn, msg );691 crServerDispatchMessage( conn, msg, len ); 587 692 588 693 crNetFree( conn, msg );
Note:
See TracChangeset
for help on using the changeset viewer.