Changeset 33146 in vbox for trunk/src/VBox/HostServices/SharedOpenGL
- Timestamp:
- Oct 15, 2010 10:34:58 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66679
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/Makefile.kmk
r32175 r33146 90 90 VBoxSharedCrOpenGL_LIBS += \ 91 91 $(LIB_XPCOM) 92 endif 93 ifdef VBOX_WITH_CRHGSMI 94 VBoxSharedCrOpenGL_DEFS += VBOX_WITH_CRHGSMI 92 95 endif 93 96 -
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r32420 r33146 53 53 #endif /* RT_OS_WINDOWS */ 54 54 55 #ifdef VBOX_WITH_CRHGSMI 56 #include <VBox/VBoxVideo.h> 57 #endif 58 55 59 #include <VBox/com/errorprint.h> 56 60 … … 58 62 static IConsole* g_pConsole = NULL; 59 63 static PVM g_pVM = NULL; 64 #ifdef VBOX_WITH_CRHGSMI 65 static uint8_t* g_pvVRamBase; 66 #endif 60 67 61 68 #ifndef RT_OS_WINDOWS … … 450 457 } 451 458 459 #ifdef VBOX_WITH_CRHGSMI 460 static int vboxCrHgsmiCtl(PVBOXVDMACMD_CHROMIUM_CTL pCtl) 461 { 462 int rc; 463 switch (pCtl->enmType) 464 { 465 case VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP: 466 { 467 PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pSetup = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)pCtl; 468 g_pvVRamBase = (uint8_t*)pSetup->pvRamBase; 469 rc = VINF_SUCCESS; 470 } break; 471 default: 472 Assert(0); 473 rc = VERR_INVALID_PARAMETER; 474 } 475 476 return rc; 477 } 478 479 #define VBOXCRHGSMI_PTR(_off, _t) ((_t*)(g_pvVRamBase + (_off))) 480 static int vboxCrHgsmiCmd(PVBOXVDMACMD_CHROMIUM_CMD pCmd) 481 { 482 int rc; 483 uint32_t cBuffers = pCmd->cBuffers; 484 uint32_t cParams; 485 486 if (!g_pvVRamBase) 487 { 488 Assert(0); 489 return VERR_INVALID_STATE; 490 } 491 492 if (!cBuffers) 493 { 494 Assert(0); 495 return VERR_INVALID_PARAMETER; 496 } 497 498 cParams = cBuffers-1; 499 500 CRVBOXHGSMIHDR *pHdr = VBOXCRHGSMI_PTR(pCmd->aBuffers[0].offBuffer, CRVBOXHGSMIHDR); 501 uint32_t u32Function = pHdr->u32Function; 502 uint32_t u32ClientID = pHdr->u32ClientID; 503 /* now we compile HGCM params out of HGSMI 504 * @todo: can we avoid this ? */ 505 switch (u32Function) 506 { 507 508 case SHCRGL_GUEST_FN_WRITE: 509 { 510 Log(("svcCall: SHCRGL_GUEST_FN_WRITE\n")); 511 512 CRVBOXHGSMIWRITE* pFnCmd = (CRVBOXHGSMIWRITE*)pHdr; 513 514 /* @todo: Verify */ 515 if (cParams == 1) 516 { 517 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 518 /* Fetch parameters. */ 519 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t); 520 uint32_t cbBuffer = pBuf->cbBuffer; 521 522 /* Execute the function. */ 523 rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer); 524 if (!RT_SUCCESS(rc)) 525 { 526 Assert(VERR_NOT_SUPPORTED==rc); 527 svcClientVersionUnsupported(0, 0); 528 } 529 } 530 else 531 { 532 Assert(0); 533 rc = VERR_INVALID_PARAMETER; 534 } 535 break; 536 } 537 538 case SHCRGL_GUEST_FN_INJECT: 539 { 540 Log(("svcCall: SHCRGL_GUEST_FN_INJECT\n")); 541 542 CRVBOXHGSMIINJECT *pFnCmd = (CRVBOXHGSMIINJECT*)pHdr; 543 544 /* @todo: Verify */ 545 if (cParams == 1) 546 { 547 /* Fetch parameters. */ 548 uint32_t u32InjectClientID = pFnCmd->u32ClientID; 549 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 550 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t); 551 uint32_t cbBuffer = pBuf->cbBuffer; 552 553 /* Execute the function. */ 554 rc = crVBoxServerClientWrite(u32InjectClientID, pBuffer, cbBuffer); 555 if (!RT_SUCCESS(rc)) 556 { 557 if (VERR_NOT_SUPPORTED==rc) 558 { 559 svcClientVersionUnsupported(0, 0); 560 } 561 else 562 { 563 crWarning("SHCRGL_GUEST_FN_INJECT failed to inject for %i from %i", u32InjectClientID, u32ClientID); 564 } 565 } 566 } 567 else 568 { 569 Assert(0); 570 rc = VERR_INVALID_PARAMETER; 571 } 572 break; 573 } 574 575 case SHCRGL_GUEST_FN_READ: 576 { 577 Log(("svcCall: SHCRGL_GUEST_FN_READ\n")); 578 579 /* @todo: Verify */ 580 if (cParams == 1) 581 { 582 CRVBOXHGSMIREAD *pFnCmd = (CRVBOXHGSMIREAD*)pHdr; 583 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 584 /* Fetch parameters. */ 585 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t); 586 uint32_t cbBuffer = pBuf->cbBuffer; 587 588 /* Execute the function. */ 589 rc = crVBoxServerClientRead(u32ClientID, pBuffer, &cbBuffer); 590 591 if (RT_SUCCESS(rc)) 592 { 593 /* Update parameters.*/ 594 // paParms[0].u.pointer.size = cbBuffer; //@todo guest doesn't see this change somehow? 595 } else if (VERR_NOT_SUPPORTED==rc) 596 { 597 svcClientVersionUnsupported(0, 0); 598 } 599 600 /* Return the required buffer size always */ 601 pFnCmd->cbBuffer = cbBuffer; 602 } 603 else 604 { 605 Assert(0); 606 rc = VERR_INVALID_PARAMETER; 607 } 608 609 break; 610 } 611 612 case SHCRGL_GUEST_FN_WRITE_READ: 613 { 614 Log(("svcCall: SHCRGL_GUEST_FN_WRITE_READ\n")); 615 616 /* @todo: Verify */ 617 if (cParams == 2) 618 { 619 CRVBOXHGSMIWRITEREAD *pFnCmd = (CRVBOXHGSMIWRITEREAD*)pHdr; 620 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 621 VBOXVDMACMD_CHROMIUM_BUFFER *pWbBuf = &pCmd->aBuffers[2]; 622 623 /* Fetch parameters. */ 624 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t); 625 uint32_t cbBuffer = pBuf->cbBuffer; 626 627 uint8_t *pWriteback = VBOXCRHGSMI_PTR(pWbBuf->offBuffer, uint8_t); 628 uint32_t cbWriteback = pWbBuf->cbBuffer; 629 630 /* Execute the function. */ 631 rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer); 632 if (!RT_SUCCESS(rc)) 633 { 634 Assert(VERR_NOT_SUPPORTED==rc); 635 svcClientVersionUnsupported(0, 0); 636 } 637 638 rc = crVBoxServerClientRead(u32ClientID, pWriteback, &cbWriteback); 639 640 // if (RT_SUCCESS(rc)) 641 // { 642 // /* Update parameters.*/ 643 // paParms[1].u.pointer.size = cbWriteback; 644 // } 645 /* Return the required buffer size always */ 646 pFnCmd->cbWriteback = cbWriteback; 647 } 648 else 649 { 650 Assert(0); 651 rc = VERR_INVALID_PARAMETER; 652 } 653 654 break; 655 } 656 657 case SHCRGL_GUEST_FN_SET_VERSION: 658 { 659 Assert(0); 660 rc = VERR_NOT_IMPLEMENTED; 661 break; 662 } 663 664 default: 665 { 666 Assert(0); 667 rc = VERR_NOT_IMPLEMENTED; 668 } 669 670 } 671 672 pHdr->result = rc; 673 674 return VINF_SUCCESS; 675 } 676 #endif 677 452 678 /* 453 679 * We differentiate between a function handler for the guest and one for the host. … … 471 697 switch (u32Function) 472 698 { 699 #ifdef VBOX_WITH_CRHGSMI 700 case SHCRGL_HOST_FN_CRHGSMI_CMD: 701 { 702 Assert(cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR); 703 if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR) 704 rc = vboxCrHgsmiCmd((PVBOXVDMACMD_CHROMIUM_CMD)paParms[0].u.pointer.addr); 705 else 706 rc = VERR_INVALID_PARAMETER; 707 } break; 708 case SHCRGL_HOST_FN_CRHGSMI_CTL: 709 { 710 Assert(cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR); 711 if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR) 712 rc = vboxCrHgsmiCtl((PVBOXVDMACMD_CHROMIUM_CTL)paParms[0].u.pointer.addr); 713 else 714 rc = VERR_INVALID_PARAMETER; 715 } break; 716 #endif 473 717 case SHCRGL_HOST_FN_SET_CONSOLE: 474 718 {
Note:
See TracChangeset
for help on using the changeset viewer.