Changeset 27708 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserver
- Timestamp:
- Mar 25, 2010 2:36:56 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 59311
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r27091 r27708 54 54 #define LOG_GROUP LOG_GROUP_SHARED_CROPENGL 55 55 #include <VBox/log.h> 56 #endif 57 58 #include "render/renderspu.h" 56 #include <VBox/com/ErrorInfo.h> 57 #endif /* RT_OS_WINDOWS */ 58 59 #include <VBox/com/errorprint.h> 59 60 60 61 PVBOXHGCMSVCHELPERS g_pHelpers; 61 static I Framebuffer* g_pFrameBuffer;62 static IConsole* g_pConsole = NULL; 62 63 static PVM g_pVM = NULL; 63 static ULONG64 g_winId = 0;64 64 65 65 #ifndef RT_OS_WINDOWS … … 68 68 #endif 69 69 70 #define CR_USE_HGCM71 72 70 static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***"; 73 #define SHCROGL_SSM_VERSION 15 74 75 typedef struct 76 { 77 DWORD dwThreadID; 78 79 } VBOXOGLCTX, *PVBOXOGLCTX; 80 81 /*@todo remove this workaround for crstate "unshareable" data*/ 82 static int crIsThreadWorking=0; 83 84 static DWORD WINAPI crServerProc(void* pv) 85 { 86 uint64_t winId = *((uint64_t*)pv); 87 renderspuSetWindowId(winId); 88 CRServerMain(0, NULL); 89 crIsThreadWorking = 0; 90 return 0; 91 } 92 71 #define SHCROGL_SSM_VERSION 16 93 72 94 73 static DECLCALLBACK(int) svcUnload (void *) … … 98 77 Log(("SHARED_CROPENGL svcUnload\n")); 99 78 100 //vboxglGlobalUnload();101 79 crVBoxServerTearDown(); 102 80 … … 108 86 int rc = VINF_SUCCESS; 109 87 110 NOREF(u32ClientID); 111 VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient; 112 Assert(pClient); 88 NOREF(pvClient); 113 89 114 90 Log(("SHARED_CROPENGL svcConnect: u32ClientID = %d\n", u32ClientID)); 115 91 116 #ifndef CR_USE_HGCM117 if (!crIsThreadWorking)118 {119 HANDLE h;120 Assert(g_pFrameBuffer);121 122 g_pFrameBuffer->COMGETTER(WinId)(&g_winId);123 //CHECK_ERROR_RET(g_piConsole, COMGETTER(Display)(display.asOutParam()), rc);124 125 //vboxglConnect((PVBOXOGLCTX)pvClient);126 crIsThreadWorking=1;127 h = CreateThread(NULL, 0, crServerProc, (void*)&g_winId, 0, &pClient->dwThreadID);128 if (!h) rc = VERR_MAX_THRDS_REACHED;129 }130 else131 rc = VERR_MAX_THRDS_REACHED;132 #else133 g_pFrameBuffer->COMGETTER(WinId)(&g_winId);134 renderspuSetWindowId(g_winId);135 92 rc = crVBoxServerAddClient(u32ClientID); 136 #endif137 93 138 94 return rc; … … 142 98 { 143 99 int rc = VINF_SUCCESS; 144 VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient; 145 Assert(pClient);100 101 NOREF(pvClient); 146 102 147 103 Log(("SHARED_CROPENGL svcDisconnect: u32ClientID = %d\n", u32ClientID)); 148 104 149 #ifndef CR_USE_HGCM150 if (crIsThreadWorking && pClient->dwThreadID)151 PostThreadMessage(pClient->dwThreadID, WM_QUIT, 0, 0);152 #else153 105 crVBoxServerRemoveClient(u32ClientID); 154 #endif 155 //vboxglDisconnect((PVBOXOGLCTX)pvClient); 106 156 107 return rc; 157 108 } … … 159 110 static DECLCALLBACK(int) svcSaveState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM) 160 111 { 161 VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;162 163 NOREF(p Client);112 int rc = VINF_SUCCESS; 113 114 NOREF(pvClient); 164 115 165 116 Log(("SHARED_CROPENGL svcSaveState: u32ClientID = %d\n", u32ClientID)); 166 167 int rc;168 117 169 118 /* Start*/ … … 188 137 static DECLCALLBACK(int) svcLoadState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM) 189 138 { 190 VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient; 191 192 NOREF(pClient); 193 NOREF(pSSM); 139 int rc = VINF_SUCCESS; 140 141 NOREF(pvClient); 194 142 195 143 Log(("SHARED_CROPENGL svcLoadState: u32ClientID = %d\n", u32ClientID)); 196 144 197 145 char psz[2000]; 198 int rc;199 146 uint32_t ui32; 200 147 … … 253 200 int rc = VINF_SUCCESS; 254 201 202 NOREF(pvClient); 203 255 204 Log(("SHARED_CROPENGL svcCall: u32ClientID = %d, fn = %d, cParms = %d, pparms = %d\n", u32ClientID, u32Function, cParms, paParms)); 256 257 VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;258 205 259 206 #ifdef DEBUG … … 455 402 switch (u32Function) 456 403 { 457 case SHCRGL_HOST_FN_SET_ FRAMEBUFFER:458 { 459 Log(("svcCall: SHCRGL_HOST_FN_SET_ FRAMEBUFFER\n"));404 case SHCRGL_HOST_FN_SET_CONSOLE: 405 { 406 Log(("svcCall: SHCRGL_HOST_FN_SET_DISPLAY\n")); 460 407 461 408 /* Verify parameter count and types. */ 462 if (cParms != SHCRGL_CPARMS_SET_ FRAMEBUFFER)409 if (cParms != SHCRGL_CPARMS_SET_CONSOLE) 463 410 { 464 411 rc = VERR_INVALID_PARAMETER; … … 471 418 { 472 419 /* Fetch parameters. */ 473 I Framebuffer* pFrameBuffer = (IFramebuffer*)paParms[0].u.pointer.addr;420 IConsole* pConsole = (IConsole*)paParms[0].u.pointer.addr; 474 421 uint32_t cbData = paParms[0].u.pointer.size; 475 422 476 423 /* Verify parameters values. */ 477 if (cbData != sizeof (I Framebuffer*))424 if (cbData != sizeof (IConsole*)) 478 425 { 479 426 rc = VERR_INVALID_PARAMETER; 480 427 } 481 else 482 { 483 /* Execute the function. */ 484 g_pFrameBuffer = pFrameBuffer; 428 else if (!pConsole) 429 { 430 rc = VERR_INVALID_PARAMETER; 431 } 432 else /* Execute the function. */ 433 { 434 ComPtr<IMachine> pMachine; 435 ComPtr<IDisplay> pDisplay; 436 ComPtr<IFramebuffer> pFramebuffer; 437 LONG xo, yo; 438 ULONG64 winId = 0; 439 ULONG monitorCount, i, w, h; 440 441 CHECK_ERROR_BREAK(pConsole, COMGETTER(Machine)(pMachine.asOutParam())); 442 CHECK_ERROR_BREAK(pMachine, COMGETTER(MonitorCount)(&monitorCount)); 443 CHECK_ERROR_BREAK(pConsole, COMGETTER(Display)(pDisplay.asOutParam())); 444 445 rc = crVBoxServerSetScreenCount(monitorCount); 446 AssertRCReturn(rc, rc); 447 448 for (i=0; i<monitorCount; ++i) 449 { 450 CHECK_ERROR_RET(pDisplay, GetFramebuffer(i, pFramebuffer.asOutParam(), &xo, &yo), rc); 451 452 if (!pDisplay) 453 { 454 rc = crVBoxServerUnmapScreen(i); 455 AssertRCReturn(rc, rc); 456 } 457 else 458 { 459 CHECK_ERROR_RET(pFramebuffer, COMGETTER(WinId)(&winId), rc); 460 CHECK_ERROR_RET(pFramebuffer, COMGETTER(Width)(&w), rc); 461 CHECK_ERROR_RET(pFramebuffer, COMGETTER(Height)(&h), rc); 462 463 rc = crVBoxServerMapScreen(i, xo, yo, w, h, winId); 464 AssertRCReturn(rc, rc); 465 } 466 } 467 468 g_pConsole = pConsole; 485 469 rc = VINF_SUCCESS; 486 470 } … … 541 525 Assert(sizeof(RTRECT)==4*sizeof(GLint)); 542 526 543 renderspuSetRootVisibleRegion(paParms[1].u.uint32, (GLint*)paParms[0].u.pointer.addr); 527 rc = crVBoxServerSetRootVisibleRegion(paParms[1].u.uint32, (GLint*)paParms[0].u.pointer.addr); 528 break; 529 } 530 case SHCRGL_HOST_FN_SCREEN_CHANGED: 531 { 532 Log(("svcCall: SHCRGL_HOST_FN_SCREEN_CHANGED\n")); 533 534 /* Verify parameter count and types. */ 535 if (cParms != SHCRGL_CPARMS_SCREEN_CHANGED) 536 { 537 rc = VERR_INVALID_PARAMETER; 538 } 539 else if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT) 540 { 541 rc = VERR_INVALID_PARAMETER; 542 } 543 else 544 { 545 /* Fetch parameters. */ 546 uint32_t screenId = paParms[0].u.uint32; 547 548 /* Execute the function. */ 549 ComPtr<IDisplay> pDisplay; 550 ComPtr<IFramebuffer> pFramebuffer; 551 LONG xo, yo; 552 ULONG64 winId = 0; 553 ULONG w, h; 554 555 Assert(g_pConsole); 556 CHECK_ERROR_RET(g_pConsole, COMGETTER(Display)(pDisplay.asOutParam()), rc); 557 CHECK_ERROR_RET(pDisplay, GetFramebuffer(screenId, pFramebuffer.asOutParam(), &xo, &yo), rc); 558 559 if (!pFramebuffer) 560 { 561 rc = crVBoxServerUnmapScreen(screenId); 562 AssertRCReturn(rc, rc); 563 } 564 else 565 { 566 CHECK_ERROR_RET(pFramebuffer, COMGETTER(WinId)(&winId), rc); 567 CHECK_ERROR_RET(pFramebuffer, COMGETTER(Width)(&w), rc); 568 CHECK_ERROR_RET(pFramebuffer, COMGETTER(Height)(&h), rc); 569 570 rc = crVBoxServerMapScreen(screenId, xo, yo, w, h, winId); 571 AssertRCReturn(rc, rc); 572 } 573 574 rc = VINF_SUCCESS; 575 } 544 576 break; 545 577 } … … 576 608 g_pHelpers = ptable->pHelpers; 577 609 578 ptable->cbClient = sizeof ( VBOXOGLCTX);610 ptable->cbClient = sizeof (void*); 579 611 580 612 ptable->pfnUnload = svcUnload; … … 586 618 ptable->pfnLoadState = svcLoadState; 587 619 ptable->pvService = NULL; 588 #ifdef CR_USE_HGCM 620 589 621 if (!crVBoxServerInit()) 590 622 return VERR_NOT_SUPPORTED; 591 #endif592 623 } 593 624 } … … 595 626 return rc; 596 627 } 628
Note:
See TracChangeset
for help on using the changeset viewer.