Changeset 19817 in vbox
- Timestamp:
- May 19, 2009 12:16:28 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 47467
- Location:
- trunk/src/VBox
- Files:
-
- 2 deleted
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxBFE/DisplayImpl.cpp
r19300 r19817 93 93 mcbVbvaPartial = 0; 94 94 95 RTSemEventMultiCreate(&mUpdateSem);96 97 // reset the event sems98 RTSemEventMultiReset(mUpdateSem);99 100 95 // by default, we have an internal Framebuffer which is 101 96 // NULL, i.e. a black hole for no display output 97 mFramebuffer = NULL; 98 mFramebufferOpened = false; 99 100 mu32ResizeStatus = ResizeStatus_Void; 101 } 102 103 VMDisplay::~VMDisplay() 104 { 102 105 mFramebuffer = 0; 103 mInternalFramebuffer = true;104 mFramebufferOpened = false;105 106 mu32ResizeStatus = ResizeStatus_Void;107 }108 109 VMDisplay::~VMDisplay()110 {111 mFramebuffer = 0;112 RTSemEventMultiDestroy(mUpdateSem);113 106 } 114 107 … … 201 194 202 195 // this is only valid for external framebuffers 203 if ( mInternalFramebuffer)196 if (!mFramebuffer) 204 197 return E_FAIL; 205 198 … … 259 252 } 260 253 261 // special processing for the internal Framebuffer 262 if (mInternalFramebuffer) 263 { 264 mFramebuffer->Unlock(); 265 } 266 else 267 { 268 // callback into the Framebuffer to notify it 269 BOOL finished; 270 271 RTSemEventMultiReset(mUpdateSem); 272 273 mFramebuffer->NotifyUpdate(x, y, w, h, &finished); 274 mFramebuffer->Unlock(); 275 276 if (!finished) 277 { 278 // the Framebuffer needs more time to process 279 // the event so we have to halt the VM until it's done 280 RTSemEventMultiWait(mUpdateSem, RT_INDEFINITE_WAIT); 281 } 282 } 254 mFramebuffer->NotifyUpdate(x, y, w, h); 255 mFramebuffer->Unlock(); 283 256 } 284 257 … … 336 309 * @param Framebuffer external Framebuffer object 337 310 */ 338 STDMETHODIMP VMDisplay:: RegisterExternalFramebuffer(Framebuffer *Framebuffer)311 STDMETHODIMP VMDisplay::SetFramebuffer(unsigned iScreenID, Framebuffer *Framebuffer) 339 312 { 340 313 if (!Framebuffer) … … 343 316 // free current Framebuffer (if there is any) 344 317 mFramebuffer = 0; 345 mInternalFramebuffer = false;346 318 mFramebuffer = Framebuffer; 347 319 updateDisplayData(); -
trunk/src/VBox/Frontends/VBoxBFE/DisplayImpl.h
r8155 r19817 55 55 uint32_t getBitsPerPixel(); 56 56 57 STDMETHODIMP RegisterExternalFramebuffer(Framebuffer *Framebuffer);57 STDMETHODIMP SetFramebuffer(unsigned iScreenID, Framebuffer *Framebuffer); 58 58 STDMETHODIMP InvalidateAndUpdate(); 59 59 STDMETHODIMP ResizeCompleted(); … … 84 84 85 85 Framebuffer *mFramebuffer; 86 bool m InternalFramebuffer, mFramebufferOpened;86 bool mFramebufferOpened; 87 87 88 88 ULONG mSupportedAccelOps; 89 RTSEMEVENTMULTI mUpdateSem;90 89 91 90 struct _VBVAMEMORY *mpVbvaMemory; -
trunk/src/VBox/Frontends/VBoxBFE/Framebuffer.h
r19798 r19817 44 44 virtual HRESULT getBitsPerPixel(ULONG *bitsPerPixel) = 0; 45 45 virtual HRESULT getLineSize(ULONG *lineSize) = 0; 46 virtual HRESULT NotifyUpdate(ULONG x, ULONG y, 47 ULONG w, ULONG h, BOOL *finished) = 0; 46 virtual HRESULT NotifyUpdate(ULONG x, ULONG y, ULONG w, ULONG h) = 0; 48 47 virtual HRESULT RequestResize(ULONG w, ULONG h, BOOL *finished) = 0; 49 48 -
trunk/src/VBox/Frontends/VBoxBFE/SDLFramebuffer.cpp
r19798 r19817 228 228 */ 229 229 HRESULT SDLFramebuffer::NotifyUpdate(ULONG x, ULONG y, 230 ULONG w, ULONG h , BOOL *finished)230 ULONG w, ULONG h) 231 231 { 232 232 LogFlow(("SDLFramebuffer::NotifyUpdate: x = %d, y = %d, w = %d, h = %d\n", … … 258 258 #endif /* !VBOXBFE_WITH_X11 */ 259 259 260 /*261 * The Display thread can continue as we will lock the framebuffer262 * from the SDL thread when we get to actually doing the update.263 */264 if (finished)265 *finished = TRUE;266 260 return S_OK; 267 261 } -
trunk/src/VBox/Frontends/VBoxBFE/SDLFramebuffer.h
r19798 r19817 50 50 virtual HRESULT getBitsPerPixel(ULONG *bitsPerPixel); 51 51 virtual HRESULT getLineSize(ULONG *lineSize); 52 virtual HRESULT NotifyUpdate(ULONG x, ULONG y, 53 ULONG w, ULONG h, BOOL *finished); 52 virtual HRESULT NotifyUpdate(ULONG x, ULONG y, ULONG w, ULONG h); 54 53 virtual HRESULT RequestResize(ULONG w, ULONG h, BOOL *finished); 55 54 virtual HRESULT GetVisibleRegion(BYTE *aRectangles, ULONG aCount, ULONG *aCountCopied); -
trunk/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp
r19300 r19817 803 803 if (!gConsole->initialized()) 804 804 goto leave; 805 gDisplay-> RegisterExternalFramebuffer(gFramebuffer);805 gDisplay->SetFramebuffer(0, gFramebuffer); 806 806 807 807 /* start with something in the titlebar */ -
trunk/src/VBox/Frontends/VBoxFB/Framebuffer.cpp
r8155 r19817 187 187 188 188 NS_IMETHODIMP VBoxDirectFB::NotifyUpdate(uint32_t x, uint32_t y, 189 uint32_t w, uint32_t h , PRBool *finished)189 uint32_t w, uint32_t h) 190 190 { 191 191 // we only need to take action if we have a memory framebuffer … … 209 209 DFBCHECK(surface->StretchBlit(surface, fbInternalSurface, 210 210 &blitRectangle, &hostRectangle)); 211 } else 211 } 212 else 212 213 { 213 214 DFBCHECK(surface->Blit(surface, fbInternalSurface, &blitRectangle, … … 216 217 } 217 218 } 218 if (finished)219 *finished = true;220 219 return NS_OK; 221 220 } -
trunk/src/VBox/Frontends/VBoxFB/Framebuffer.h
r8155 r19817 44 44 NS_IMETHOD GetUsesGuestVRAM(BOOL *usesGuestVRAM); 45 45 NS_IMETHOD NotifyUpdate(uint32_t x, uint32_t y, 46 uint32_t w, uint32_t h, PRBool *finished);46 uint32_t w, uint32_t h); 47 47 NS_IMETHOD RequestResize(ULONG aScreenId, ULONG pixelFormat, uint32_t vram, 48 48 uint32_t bitsPerPixel, uint32_t bytesPerLine, -
trunk/src/VBox/Frontends/VBoxFB/VBoxFB.cpp
r13835 r19817 342 342 // register our framebuffer 343 343 frameBuffer = new VBoxDirectFB(dfb, surface); 344 display-> RegisterExternalFramebuffer(frameBuffer);344 display->SetFramebuffer(VBOX_VIDEO_PRIMARY_SCREEN, frameBuffer); 345 345 346 346 /** -
trunk/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
r19239 r19817 46 46 #include <iprt/env.h> 47 47 #include <VBox/err.h> 48 #include <VBox/VBoxVideo.h> 48 49 49 50 #ifdef VBOX_FFMPEG … … 744 745 Log2(("VBoxHeadless: Registering framebuffer\n")); 745 746 pFramebuffer->AddRef(); 746 display-> RegisterExternalFramebuffer(pFramebuffer);747 display->SetFramebuffer(VBOX_VIDEO_PRIMARY_SCREEN, pFramebuffer); 747 748 } 748 749 if (!RT_SUCCESS(rrc) || (rcc != S_OK)) -
trunk/src/VBox/Frontends/VBoxHeadless/VideoCapture/FFmpegFB.cpp
r19798 r19817 142 142 { 143 143 /* Dummy update to make sure we get all the frame (timing). */ 144 BOOL dummy; 145 NotifyUpdate(0, 0, 0, 0, &dummy); 144 NotifyUpdate(0, 0, 0, 0); 146 145 /* Write the last pending frame before exiting */ 147 146 int rc = do_rgb_to_yuv_conversion(); … … 431 430 * @param w width of the area which has been updated 432 431 * @param h height of the area which has been updated 433 * @param finished 434 */ 435 STDMETHODIMP FFmpegFB::NotifyUpdate(ULONG x, ULONG y, ULONG w, ULONG h, 436 BOOL *finished) 432 */ 433 STDMETHODIMP FFmpegFB::NotifyUpdate(ULONG x, ULONG y, ULONG w, ULONG h) 437 434 { 438 435 int rc; … … 442 439 (unsigned long) x, (unsigned long) y, (unsigned long) w, 443 440 (unsigned long) h)); 444 if (!finished) 445 return E_POINTER; 446 /* For now we will do things synchronously */ 447 *finished = true; 441 448 442 /* We always leave at least one frame update pending, which we 449 443 process when the time until the next frame has elapsed. */ -
trunk/src/VBox/Frontends/VBoxHeadless/VideoCapture/FFmpegFB.h
r19798 r19817 100 100 STDMETHOD(COMGETTER(WinId)) (ULONG64 *winId); 101 101 102 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, 103 ULONG w, ULONG h, BOOL *finished); 102 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, ULONG w, ULONG h); 104 103 STDMETHOD(RequestResize)(ULONG aScreenId, ULONG pixelFormat, BYTE *vram, 105 104 ULONG bitsPerPixel, ULONG bytesPerLine, -
trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp
r19798 r19817 408 408 */ 409 409 STDMETHODIMP VBoxSDLFB::NotifyUpdate(ULONG x, ULONG y, 410 ULONG w, ULONG h , BOOL *finished)410 ULONG w, ULONG h) 411 411 { 412 412 /* … … 434 434 #endif /* !VBOXSDL_WITH_X11 */ 435 435 436 /*437 * The Display thread can continue as we will lock the framebuffer438 * from the SDL thread when we get to actually doing the update.439 */440 if (finished)441 *finished = TRUE;442 436 return S_OK; 443 437 } … … 1454 1448 */ 1455 1449 STDMETHODIMP VBoxSDLFBOverlay::NotifyUpdate(ULONG x, ULONG y, 1456 ULONG w, ULONG h , BOOL *finished)1457 { 1458 return mParent->NotifyUpdate(x + mOverlayX, y + mOverlayY, w, h , finished);1450 ULONG w, ULONG h) 1451 { 1452 return mParent->NotifyUpdate(x + mOverlayX, y + mOverlayY, w, h); 1459 1453 } 1460 1454 -
trunk/src/VBox/Frontends/VBoxSDL/Framebuffer.h
r19798 r19817 101 101 STDMETHOD(COMGETTER(WinId)) (uint64_t *winId); 102 102 103 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, 104 ULONG w, ULONG h, BOOL *finished); 103 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, ULONG w, ULONG h); 105 104 STDMETHOD(RequestResize)(ULONG aScreenId, ULONG pixelFormat, BYTE *vram, 106 105 ULONG bitsPerPixel, ULONG bytesPerLine, … … 268 267 STDMETHOD(Unlock)(); 269 268 STDMETHOD(Move)(ULONG x, ULONG y); 270 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, 271 ULONG w, ULONG h, BOOL *finished); 269 STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, ULONG w, ULONG h); 272 270 STDMETHOD(RequestResize)(ULONG aScreenId, ULONG pixelFormat, ULONG vram, 273 271 ULONG bitsPerPixel, ULONG bytesPerLine, -
trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
r19579 r19817 59 59 #include <VBox/log.h> 60 60 #include <VBox/version.h> 61 #include <VBox/VBoxVideo.h> 61 62 62 63 #include <iprt/alloca.h> … … 2037 2038 2038 2039 // register our framebuffer 2039 rc = gDisplay-> RegisterExternalFramebuffer(gpFrameBuffer);2040 rc = gDisplay->SetFramebuffer(VBOX_VIDEO_PRIMARY_SCREEN, gpFrameBuffer); 2040 2041 if (rc != S_OK) 2041 2042 { … … 2885 2886 LogFlow(("Releasing mouse, keyboard, vrdpserver, display, console...\n")); 2886 2887 if (gDisplay) 2887 gDisplay->Set upInternalFramebuffer(0);2888 gDisplay->SetFramebuffer(VBOX_VIDEO_PRIMARY_SCREEN, NULL); 2888 2889 gMouse = NULL; 2889 2890 gKeyboard = NULL; -
trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h
r19798 r19817 273 273 274 274 STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY, 275 ULONG aW, ULONG aH, 276 BOOL *aFinished); 275 ULONG aW, ULONG aH); 277 276 278 277 ulong pixelFormat() { return mPixelFormat; } … … 308 307 309 308 STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY, 310 ULONG aW, ULONG aH, 311 BOOL *aFinished); 309 ULONG aW, ULONG aH); 312 310 313 311 uchar *address() … … 364 362 365 363 STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY, 366 ULONG aW, ULONG aH, 367 BOOL *aFinished); 364 ULONG aW, ULONG aH); 368 365 369 366 uchar *address() { return (uchar *) mSurfaceDesc.lpSurface; } … … 422 419 423 420 STDMETHOD (NotifyUpdate) (ULONG aX, ULONG aY, 424 ULONG aW, ULONG aH, 425 BOOL *aFinished); 421 ULONG aW, ULONG aH); 426 422 STDMETHOD (SetVisibleRegion) (BYTE *aRectangles, ULONG aCount); 427 423 -
trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp
r19684 r19817 20 20 * additional information or have any questions. 21 21 */ 22 23 #include <VBox/VBoxVideo.h> 22 24 23 25 #include "VBoxConsoleView.h" … … 876 878 { 877 879 mFrameBuf->AddRef(); 878 display. RegisterExternalFramebuffer (CFramebuffer (mFrameBuf));880 display.SetFramebuffer (VBOX_VIDEO_PRIMARY_SCREEN, CFramebuffer (mFrameBuf)); 879 881 } 880 882 … … 950 952 CDisplay display = mConsole.GetDisplay(); 951 953 Assert (!display.isNull()); 952 display.Set upInternalFramebuffer (0);954 display.SetFramebuffer (VBOX_VIDEO_PRIMARY_SCREEN, CFramebuffer(NULL)); 953 955 /* release the reference */ 954 956 mFrameBuf->Release(); -
trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBDDRAW.cpp
r10149 r19817 229 229 /** @note This method is called on EMT from under this object's lock */ 230 230 STDMETHODIMP VBoxDDRAWFrameBuffer::NotifyUpdate (ULONG aX, ULONG aY, 231 ULONG aW, ULONG aH, 232 BOOL *aFinished) 231 ULONG aW, ULONG aH) 233 232 { 234 233 LOGDDRAW(("DDRAW: NotifyUpdate %d,%d %dx%d\n", aX, aY, aW, aH)); … … 243 242 drawRect (aX, aY, aW, aH); 244 243 } 245 246 *aFinished = TRUE;247 244 248 245 return S_OK; -
trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQuartz2D.cpp
r17201 r19817 64 64 /** @note This method is called on EMT from under this object's lock */ 65 65 STDMETHODIMP VBoxQuartz2DFrameBuffer::NotifyUpdate (ULONG aX, ULONG aY, 66 ULONG aW, ULONG aH, 67 BOOL *aFinished) 66 ULONG aW, ULONG aH) 68 67 { 69 68 /* Log (("Quartz2D: NotifyUpdate %d,%d %dx%d\n", aX, aY, aW, aH));*/ … … 71 70 QApplication::postEvent (mView, 72 71 new VBoxRepaintEvent (aX, aY, aW, aH)); 73 /* the update has been finished, return TRUE */74 *aFinished = TRUE;75 76 72 return S_OK; 77 73 } -
trunk/src/VBox/Frontends/VirtualBox/src/VBoxFrameBuffer.cpp
r19798 r19817 282 282 /** @note This method is called on EMT from under this object's lock */ 283 283 STDMETHODIMP VBoxQImageFrameBuffer::NotifyUpdate (ULONG aX, ULONG aY, 284 ULONG aW, ULONG aH, 285 BOOL *aFinished) 284 ULONG aW, ULONG aH) 286 285 { 287 286 /* We're not on the GUI thread and update() isn't thread safe in … … 292 291 new VBoxRepaintEvent (aX, aY, aW, aH)); 293 292 294 /* The update has been finished, return TRUE */295 *aFinished = TRUE;296 293 return S_OK; 297 294 } … … 465 462 /** @note This method is called on EMT from under this object's lock */ 466 463 STDMETHODIMP VBoxSDLFrameBuffer::NotifyUpdate (ULONG aX, ULONG aY, 467 ULONG aW, ULONG aH, 468 BOOL *aFinished) 464 ULONG aW, ULONG aH) 469 465 { 470 466 #if !defined (Q_WS_WIN) && !defined (Q_WS_PM) … … 480 476 aW, aH); 481 477 #endif 482 /* the update has been finished, return TRUE */483 *aFinished = TRUE;484 478 return S_OK; 485 479 } -
trunk/src/VBox/Main/DisplayImpl.cpp
r19798 r19817 23 23 24 24 #include "DisplayImpl.h" 25 #include "FramebufferImpl.h"26 25 #include "ConsoleImpl.h" 27 26 #include "ConsoleVRDPServer.h" … … 86 85 mpVMMDev = NULL; 87 86 mfVMMDevInited = false; 88 RTSemEventMultiCreate(&mUpdateSem);89 87 90 88 mLastAddress = NULL; … … 124 122 unconst (mParent) = aParent; 125 123 126 /* reset the event sems */127 RTSemEventMultiReset (mUpdateSem);128 129 124 // by default, we have an internal framebuffer which is 130 125 // NULL, i.e. a black hole for no display output 131 mInternalFramebuffer = true;132 126 mFramebufferOpened = false; 133 mSupportedAccelOps = 0;134 127 135 128 ULONG ul; … … 185 178 for (ul = 0; ul < mcMonitors; ul++) 186 179 maFramebuffers[ul].pFramebuffer = NULL; 187 188 RTSemEventMultiDestroy (mUpdateSem);189 180 190 181 if (mParent) … … 507 498 pFramebuffer->Lock(); 508 499 509 /* special processing for the internal framebuffer */ 510 if (mInternalFramebuffer) 511 { 512 pFramebuffer->Unlock(); 513 } else 514 { 515 /* callback into the framebuffer to notify it */ 516 BOOL finished = FALSE; 517 518 RTSemEventMultiReset(mUpdateSem); 519 520 checkCoordBounds (&x, &y, &w, &h, mpDrv->Connector.cx, mpDrv->Connector.cy); 521 522 if (w == 0 || h == 0) 523 { 524 /* Nothing to be updated. */ 525 finished = TRUE; 526 } 527 else 528 { 529 pFramebuffer->NotifyUpdate(x, y, w, h, &finished); 530 } 531 532 if (!finished) 533 { 534 /* 535 * the framebuffer needs more time to process 536 * the event so we have to halt the VM until it's done 537 */ 538 pFramebuffer->Unlock(); 539 RTSemEventMultiWait(mUpdateSem, RT_INDEFINITE_WAIT); 540 } else 541 { 542 pFramebuffer->Unlock(); 543 } 544 545 if (!mfVideoAccelEnabled) 546 { 547 /* When VBVA is enabled, the VRDP server is informed in the VideoAccelFlush. 548 * Inform the server here only if VBVA is disabled. 549 */ 550 if (maFramebuffers[uScreenId].u32ResizeStatus == ResizeStatus_Void) 551 { 552 mParent->consoleVRDPServer()->SendUpdateBitmap(uScreenId, x, y, w, h); 553 } 554 } 555 } 556 return; 500 checkCoordBounds (&x, &y, &w, &h, mpDrv->Connector.cx, mpDrv->Connector.cy); 501 502 if (w != 0 && h != 0) 503 pFramebuffer->NotifyUpdate(x, y, w, h); 504 505 pFramebuffer->Unlock(); 506 507 if (!mfVideoAccelEnabled) 508 { 509 /* When VBVA is enabled, the VRDP server is informed in the VideoAccelFlush. 510 * Inform the server here only if VBVA is disabled. 511 */ 512 if (maFramebuffers[uScreenId].u32ResizeStatus == ResizeStatus_Void) 513 mParent->consoleVRDPServer()->SendUpdateBitmap(uScreenId, x, y, w, h); 514 } 557 515 } 558 516 … … 1344 1302 ///////////////////////////////////////////////////////////////////////////// 1345 1303 1346 STDMETHODIMP Display::SetupInternalFramebuffer (ULONG depth) 1304 STDMETHODIMP Display::SetFramebuffer (ULONG aScreenId, 1305 IFramebuffer *aFramebuffer) 1347 1306 { 1348 1307 LogFlowFunc (("\n")); 1308 1309 if (aFramebuffer != NULL) 1310 CheckComArgOutPointerValid(aFramebuffer); 1349 1311 1350 1312 AutoCaller autoCaller (this); … … 1353 1315 AutoWriteLock alock (this); 1354 1316 1355 /*1356 * Create an internal framebuffer only if depth is not zero. Otherwise, we1357 * reset back to the "black hole" state as it was at Display construction.1358 */1359 ComPtr <IFramebuffer> frameBuf;1360 if (depth)1361 {1362 ComObjPtr <InternalFramebuffer> internal;1363 internal.createObject();1364 internal->init (640, 480, depth);1365 frameBuf = internal; // query interface1366 }1367 1368 1317 Console::SafeVMPtrQuiet pVM (mParent); 1369 1318 if (pVM.isOk()) 1370 1319 { 1371 /* Must leave the lock here because the changeFramebuffer will also obtain it. */ 1320 /* Must leave the lock here because the changeFramebuffer will 1321 * also obtain it. */ 1372 1322 alock.leave (); 1373 1323 … … 1375 1325 PVMREQ pReq = NULL; 1376 1326 int vrc = VMR3ReqCall (pVM, VMCPUID_ANY, &pReq, RT_INDEFINITE_WAIT, 1377 (PFNRT) changeFramebuffer, 4, 1378 this, static_cast <IFramebuffer *> (frameBuf), 1379 true /* aInternal */, VBOX_VIDEO_PRIMARY_SCREEN); 1327 (PFNRT) changeFramebuffer, 3, this, aFramebuffer, aScreenId); 1380 1328 if (RT_SUCCESS (vrc)) 1381 1329 vrc = pReq->iStatus; … … 1389 1337 { 1390 1338 /* No VM is created (VM is powered off), do a direct call */ 1391 int vrc = changeFramebuffer (this, frameBuf, true /* aInternal */, VBOX_VIDEO_PRIMARY_SCREEN); 1392 ComAssertRCRet (vrc, E_FAIL); 1393 } 1394 1395 return S_OK; 1396 } 1397 1398 STDMETHODIMP Display::LockFramebuffer (BYTE **address) 1399 { 1400 CheckComArgOutPointerValid(address); 1401 1402 AutoCaller autoCaller (this); 1403 CheckComRCReturnRC (autoCaller.rc()); 1404 1405 AutoWriteLock alock (this); 1406 1407 /* only allowed for internal framebuffers */ 1408 if (mInternalFramebuffer && !mFramebufferOpened 1409 && !maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer.isNull()) 1410 { 1411 CHECK_CONSOLE_DRV (mpDrv); 1412 1413 maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer->Lock(); 1414 mFramebufferOpened = true; 1415 *address = mpDrv->Connector.pu8Data; 1416 return S_OK; 1417 } 1418 1419 return setError (VBOX_E_NOT_SUPPORTED, 1420 tr ("Framebuffer locking is allowed only for the internal framebuffer")); 1421 } 1422 1423 STDMETHODIMP Display::UnlockFramebuffer() 1424 { 1425 AutoCaller autoCaller (this); 1426 CheckComRCReturnRC (autoCaller.rc()); 1427 1428 AutoWriteLock alock (this); 1429 1430 if (mFramebufferOpened) 1431 { 1432 CHECK_CONSOLE_DRV (mpDrv); 1433 1434 maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer->Unlock(); 1435 mFramebufferOpened = false; 1436 return S_OK; 1437 } 1438 1439 return setError (VBOX_E_NOT_SUPPORTED, 1440 tr ("Framebuffer locking is allowed only for the internal framebuffer")); 1441 } 1442 1443 STDMETHODIMP Display::RegisterExternalFramebuffer (IFramebuffer *frameBuf) 1444 { 1445 LogFlowFunc (("\n")); 1446 1447 CheckComArgNotNull(frameBuf); 1448 1449 AutoCaller autoCaller (this); 1450 CheckComRCReturnRC (autoCaller.rc()); 1451 1452 AutoWriteLock alock (this); 1453 1454 Console::SafeVMPtrQuiet pVM (mParent); 1455 if (pVM.isOk()) 1456 { 1457 /* Must leave the lock here because the changeFramebuffer will 1458 * also obtain it. */ 1459 alock.leave (); 1460 1461 /* send request to the EMT thread */ 1462 PVMREQ pReq = NULL; 1463 int vrc = VMR3ReqCall (pVM, VMCPUID_ANY, &pReq, RT_INDEFINITE_WAIT, 1464 (PFNRT) changeFramebuffer, 4, this, frameBuf, false /* aInternal */, 1465 VBOX_VIDEO_PRIMARY_SCREEN); 1466 if (RT_SUCCESS (vrc)) 1467 vrc = pReq->iStatus; 1468 VMR3ReqFree (pReq); 1469 1470 alock.enter (); 1471 1472 ComAssertRCRet (vrc, E_FAIL); 1473 } 1474 else 1475 { 1476 /* No VM is created (VM is powered off), do a direct call */ 1477 int vrc = changeFramebuffer (this, frameBuf, false /* aInternal */, 1478 VBOX_VIDEO_PRIMARY_SCREEN); 1479 ComAssertRCRet (vrc, E_FAIL); 1480 } 1481 1482 return S_OK; 1483 } 1484 1485 STDMETHODIMP Display::SetFramebuffer (ULONG aScreenId, 1486 IFramebuffer *aFramebuffer) 1487 { 1488 LogFlowFunc (("\n")); 1489 1490 CheckComArgOutPointerValid(aFramebuffer); 1491 1492 AutoCaller autoCaller (this); 1493 CheckComRCReturnRC (autoCaller.rc()); 1494 1495 AutoWriteLock alock (this); 1496 1497 Console::SafeVMPtrQuiet pVM (mParent); 1498 if (pVM.isOk()) 1499 { 1500 /* Must leave the lock here because the changeFramebuffer will 1501 * also obtain it. */ 1502 alock.leave (); 1503 1504 /* send request to the EMT thread */ 1505 PVMREQ pReq = NULL; 1506 int vrc = VMR3ReqCall (pVM, VMCPUID_ANY, &pReq, RT_INDEFINITE_WAIT, 1507 (PFNRT) changeFramebuffer, 4, this, aFramebuffer, false /* aInternal */, 1508 aScreenId); 1509 if (RT_SUCCESS (vrc)) 1510 vrc = pReq->iStatus; 1511 VMR3ReqFree (pReq); 1512 1513 alock.enter (); 1514 1515 ComAssertRCRet (vrc, E_FAIL); 1516 } 1517 else 1518 { 1519 /* No VM is created (VM is powered off), do a direct call */ 1520 int vrc = changeFramebuffer (this, aFramebuffer, false /* aInternal */, 1521 aScreenId); 1339 int vrc = changeFramebuffer (this, aFramebuffer, aScreenId); 1522 1340 ComAssertRCRet (vrc, E_FAIL); 1523 1341 } … … 1823 1641 1824 1642 /* this is only valid for external framebuffers */ 1825 if (m InternalFramebuffer)1643 if (maFramebuffers[aScreenId].pFramebuffer == NULL) 1826 1644 return setError (VBOX_E_NOT_SUPPORTED, 1827 1645 tr ("Resize completed notification is valid only " … … 1859 1677 1860 1678 /* this is only valid for external framebuffers */ 1861 if (m InternalFramebuffer)1679 if (maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer == NULL) 1862 1680 return setError (VBOX_E_NOT_SUPPORTED, 1863 1681 tr ("Resize completed notification is valid only " 1864 1682 "for external framebuffers")); 1865 1866 maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer->Lock();1867 /* signal our semaphore */1868 RTSemEventMultiSignal(mUpdateSem);1869 maFramebuffers[VBOX_VIDEO_PRIMARY_SCREEN].pFramebuffer->Unlock();1870 1683 1871 1684 return S_OK; … … 1972 1785 /* static */ 1973 1786 DECLCALLBACK(int) Display::changeFramebuffer (Display *that, IFramebuffer *aFB, 1974 bool aInternal,unsigned uScreenId)1787 unsigned uScreenId) 1975 1788 { 1976 1789 LogFlowFunc (("uScreenId = %d\n", uScreenId)); 1977 1790 1978 1791 AssertReturn (that, VERR_INVALID_PARAMETER); 1979 AssertReturn (aFB || aInternal, VERR_INVALID_PARAMETER);1980 1792 AssertReturn (uScreenId < that->mcMonitors, VERR_INVALID_PARAMETER); 1981 1793 … … 1987 1799 DISPLAYFBINFO *pDisplayFBInfo = &that->maFramebuffers[uScreenId]; 1988 1800 pDisplayFBInfo->pFramebuffer = aFB; 1989 1990 that->mInternalFramebuffer = aInternal;1991 that->mSupportedAccelOps = 0;1992 1801 1993 1802 that->mParent->consoleVRDPServer()->SendResize (); -
trunk/src/VBox/Main/Makefile.kmk
r19134 r19817 570 570 MouseImpl.cpp \ 571 571 DisplayImpl.cpp \ 572 FramebufferImpl.cpp \573 572 MachineDebuggerImpl.cpp \ 574 573 VBoxDriversRegister.cpp \ -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r19798 r19817 10276 10276 <interface 10277 10277 name="IFramebuffer" extends="$unknown" 10278 uuid=" 3ce29e6d-835a-4283-8ee0-eb9971b81d81"10278 uuid="faaf4c24-d534-4171-8781-c15d2b9fe8c3" 10279 10279 wsmap="suppress" 10280 10280 > … … 10385 10385 <param name="width" type="unsigned long" dir="in"/> 10386 10386 <param name="height" type="unsigned long" dir="in"/> 10387 <param name="finished" type="boolean" dir="return"/>10388 10387 </method> 10389 10388 … … 10663 10662 </desc> 10664 10663 </attribute> 10665 10666 <method name="setupInternalFramebuffer">10667 <desc>10668 Prepares an internally managed frame buffer.10669 </desc>10670 <param name="depth" type="unsigned long" dir="in"/>10671 </method>10672 10673 <method name="lockFramebuffer">10674 <desc>10675 Requests access to the internal frame buffer.10676 10677 <result name="VBOX_E_NOT_SUPPORTED">10678 Attempt to lock a non-internal frame buffer.10679 </result>10680 10681 </desc>10682 <param name="address" type="octet" mod="ptr" dir="return"/>10683 </method>10684 10685 <method name="unlockFramebuffer">10686 <desc>10687 Releases access to the internal frame buffer.10688 10689 <result name="VBOX_E_NOT_SUPPORTED">10690 Attempt to unlock a non-internal frame buffer.10691 </result>10692 10693 </desc>10694 </method>10695 10696 <method name="registerExternalFramebuffer">10697 <desc>10698 Registers an external frame buffer.10699 </desc>10700 <param name="framebuffer" type="IFramebuffer" dir="in"/>10701 </method>10702 10664 10703 10665 <method name="setFramebuffer"> -
trunk/src/VBox/Main/include/DisplayImpl.h
r19239 r19817 232 232 233 233 // IDisplay methods 234 STDMETHOD(SetupInternalFramebuffer)(ULONG depth);235 STDMETHOD(LockFramebuffer)(BYTE **address);236 STDMETHOD(UnlockFramebuffer)();237 STDMETHOD(RegisterExternalFramebuffer)(IFramebuffer *frameBuf);238 234 STDMETHOD(SetFramebuffer)(ULONG aScreenId, IFramebuffer *aFramebuffer); 239 235 STDMETHOD(GetFramebuffer)(ULONG aScreenId, IFramebuffer **aFramebuffer, LONG *aXOrigin, LONG *aYOrigin); … … 256 252 257 253 static DECLCALLBACK(int) changeFramebuffer (Display *that, IFramebuffer *aFB, 258 bool aInternal,unsigned uScreenId);254 unsigned uScreenId); 259 255 260 256 static DECLCALLBACK(void*) drvQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface); … … 277 273 /** Set after the first attempt to find the VMM Device. */ 278 274 bool mfVMMDevInited; 279 bool mInternalFramebuffer;280 275 281 276 unsigned mcMonitors; … … 283 278 284 279 bool mFramebufferOpened; 285 /** bitmask of acceleration operations supported by current framebuffer */286 ULONG mSupportedAccelOps;287 RTSEMEVENTMULTI mUpdateSem;288 280 289 281 /* arguments of the last handleDisplayResize() call */ -
trunk/src/VBox/Main/xpcom/module.cpp
r17684 r19817 41 41 #include "RemoteUSBDeviceImpl.h" 42 42 #include "SharedFolderImpl.h" 43 #include "FramebufferImpl.h"44 43 #include "ProgressImpl.h" 45 44 #include "NetworkAdapterImpl.h" … … 63 62 NS_DECL_CLASSINFO(MachineDebugger) 64 63 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(MachineDebugger, IMachineDebugger) 65 NS_DECL_CLASSINFO(InternalFramebuffer)66 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(InternalFramebuffer, IFramebuffer)67 64 NS_DECL_CLASSINFO(Progress) 68 65 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(Progress, IProgress)
Note:
See TracChangeset
for help on using the changeset viewer.