Changeset 108641 in vbox
- Timestamp:
- Mar 20, 2025 12:48:42 PM (2 months ago)
- svn:sync-xref-src-repo-rev:
- 168054
- Location:
- trunk
- Files:
-
- 5 deleted
- 48 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Config.kmk
r108495 r108641 667 667 # Enable Host Guest Shared Memory Interface. 668 668 VBOX_WITH_HGSMI = 1 669 # Enable Video 2D Acceleration.670 if1of ($(KBUILD_TARGET), darwin linux win freebsd)671 VBOX_WITH_VIDEOHWACCEL = 1672 endif673 669 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 win.amd64) 674 670 # Enable XPDM Video driver for XP and older guests. … … 1758 1754 # 1759 1755 1760 # Use the OpenGL module in qt when the video hardware acceleration feature 1761 # is enabled. 1762 if defined(VBOX_WITH_VIDEOHWACCEL) && defined(VBOX_WITH_QTGUI) 1763 VBOX_GUI_USE_QGL = 1 1764 else 1765 VBOX_GUI_USE_QGL = 1766 endif 1756 # The OpenGL module in qt is not being used currently. 1757 VBOX_GUI_USE_QGL = 1767 1758 1768 1759 # Collection macro mainly for deciding whether VBoxDTrace needs shipping. -
trunk/configure
r108322 r108641 2929 2929 cnf_append "VBOX_WITH_VMSVGA3D" "" 2930 2930 cnf_append "VBOX_WITH_3D_ACCELERATION" "" 2931 cnf_append "VBOX_WITH_VIDEOHWACCEL" ""2932 2931 cnf_append "VBOX_GUI_USE_QGL" "" 2933 2932 fi -
trunk/include/VBox/Graphics/VBoxVideo.h
r106061 r108641 312 312 #pragma pack() 313 313 314 #ifdef VBOX_WITH_VIDEOHWACCEL315 #pragma pack(1)316 317 #define VBOXVHWA_VERSION_MAJ 0318 #define VBOXVHWA_VERSION_MIN 0319 #define VBOXVHWA_VERSION_BLD 6320 #define VBOXVHWA_VERSION_RSV 0321 322 typedef enum323 {324 VBOXVHWACMD_TYPE_SURF_CANCREATE = 1,325 VBOXVHWACMD_TYPE_SURF_CREATE,326 VBOXVHWACMD_TYPE_SURF_DESTROY,327 VBOXVHWACMD_TYPE_SURF_LOCK,328 VBOXVHWACMD_TYPE_SURF_UNLOCK,329 VBOXVHWACMD_TYPE_SURF_BLT,330 VBOXVHWACMD_TYPE_SURF_FLIP,331 VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE,332 VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION,333 VBOXVHWACMD_TYPE_SURF_COLORKEY_SET,334 VBOXVHWACMD_TYPE_QUERY_INFO1,335 VBOXVHWACMD_TYPE_QUERY_INFO2,336 VBOXVHWACMD_TYPE_ENABLE,337 VBOXVHWACMD_TYPE_DISABLE,338 VBOXVHWACMD_TYPE_HH_CONSTRUCT,339 VBOXVHWACMD_TYPE_HH_RESET340 #ifdef VBOX_WITH_WDDM341 , VBOXVHWACMD_TYPE_SURF_GETINFO342 , VBOXVHWACMD_TYPE_SURF_COLORFILL343 #endif344 , VBOXVHWACMD_TYPE_HH_DISABLE345 , VBOXVHWACMD_TYPE_HH_ENABLE346 , VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN347 , VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND348 , VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM349 , VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM350 } VBOXVHWACMD_TYPE;351 352 /** The command processing was asynch, set by the host to indicate asynch353 * command completion. Must not be cleared once set, the command completion is354 * performed by issuing a host->guest completion command while keeping this355 * flag unchanged */356 #define VBOXVHWACMD_FLAG_HG_ASYNCH UINT32_C(0x00010000)357 /** asynch completion is performed by issuing the event */358 #define VBOXVHWACMD_FLAG_GH_ASYNCH_EVENT UINT32_C(0x00000001)359 /** issue interrupt on asynch completion */360 #define VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ UINT32_C(0x00000002)361 /** Guest does not do any op on completion of this command, the host may copy362 * the command and indicate that it does not need the command anymore363 * by setting the VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED flag */364 #define VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION UINT32_C(0x00000004)365 /** the host has copied the VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION command and returned it to the guest */366 #define VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED UINT32_C(0x00020000)367 /** this is the host->host cmd, i.e. a configuration command posted by the host to the framebuffer */368 #define VBOXVHWACMD_FLAG_HH_CMD UINT32_C(0x10000000)369 370 typedef struct VBOXVHWACMD371 {372 VBOXVHWACMD_TYPE enmCmd; /**< command type */373 volatile int32_t rc; /**< command result */374 int32_t iDisplay; /**< display index */375 volatile int32_t Flags; /**< ORed VBOXVHWACMD_FLAG_xxx values */376 uint64_t GuestVBVAReserved1; /**< field internally used by the guest VBVA cmd handling, must NOT be modified by clients */377 uint64_t GuestVBVAReserved2; /**< field internally used by the guest VBVA cmd handling, must NOT be modified by clients */378 volatile uint32_t cRefs;379 int32_t Reserved;380 union381 {382 struct VBOXVHWACMD *pNext;383 uint32_t offNext;384 uint64_t Data; /**< the body is 64-bit aligned */385 } u;386 char body[1];387 } VBOXVHWACMD;388 389 #define VBOXVHWACMD_HEADSIZE() (RT_OFFSETOF(VBOXVHWACMD, body))390 #define VBOXVHWACMD_SIZE_FROMBODYSIZE(a_cbBody) (VBOXVHWACMD_HEADSIZE() + (a_cbBody))391 #define VBOXVHWACMD_SIZE(a_tTypeCmd) (VBOXVHWACMD_SIZE_FROMBODYSIZE(sizeof(a_tTypeCmd)))392 typedef unsigned int VBOXVHWACMD_LENGTH;393 typedef uint64_t VBOXVHWA_SURFHANDLE;394 #define VBOXVHWA_SURFHANDLE_INVALID UINT64_C(0)395 #define VBOXVHWACMD_BODY(a_pHdr, a_TypeBody) ( (a_TypeBody RT_UNTRUSTED_VOLATILE_HSTGST *)&(a_pHdr)->body[0] )396 #if !defined(IN_GUEST) && defined(IN_RING3)397 # define VBOXVHWACMD_BODY_HOST_HEAP(a_pHdr, a_TypeBody) ( (a_TypeBody *)&(a_pHdr)->body[0] )398 #endif399 #define VBOXVHWACMD_HEAD(a_pBody)\400 ( (VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HSTGST *)((uint8_t *)(a_pBody) - RT_OFFSETOF(VBOXVHWACMD, body)))401 402 typedef struct VBOXVHWA_RECTL403 {404 int32_t left;405 int32_t top;406 int32_t right;407 int32_t bottom;408 } VBOXVHWA_RECTL;409 410 typedef struct VBOXVHWA_COLORKEY411 {412 uint32_t low;413 uint32_t high;414 } VBOXVHWA_COLORKEY;415 416 typedef struct VBOXVHWA_PIXELFORMAT417 {418 uint32_t flags;419 uint32_t fourCC;420 union421 {422 uint32_t rgbBitCount;423 uint32_t yuvBitCount;424 } c;425 426 union427 {428 uint32_t rgbRBitMask;429 uint32_t yuvYBitMask;430 } m1;431 432 union433 {434 uint32_t rgbGBitMask;435 uint32_t yuvUBitMask;436 } m2;437 438 union439 {440 uint32_t rgbBBitMask;441 uint32_t yuvVBitMask;442 } m3;443 444 union445 {446 uint32_t rgbABitMask;447 } m4;448 449 uint32_t Reserved;450 } VBOXVHWA_PIXELFORMAT;451 452 typedef struct VBOXVHWA_SURFACEDESC453 {454 uint32_t flags;455 uint32_t height;456 uint32_t width;457 uint32_t pitch;458 uint32_t sizeX;459 uint32_t sizeY;460 uint32_t cBackBuffers;461 uint32_t Reserved;462 VBOXVHWA_COLORKEY DstOverlayCK;463 VBOXVHWA_COLORKEY DstBltCK;464 VBOXVHWA_COLORKEY SrcOverlayCK;465 VBOXVHWA_COLORKEY SrcBltCK;466 VBOXVHWA_PIXELFORMAT PixelFormat;467 uint32_t surfCaps;468 uint32_t Reserved2;469 VBOXVHWA_SURFHANDLE hSurf;470 uint64_t offSurface;471 } VBOXVHWA_SURFACEDESC;472 473 typedef struct VBOXVHWA_BLTFX474 {475 uint32_t flags;476 uint32_t rop;477 uint32_t rotationOp;478 uint32_t rotation;479 uint32_t fillColor;480 uint32_t Reserved;481 VBOXVHWA_COLORKEY DstCK;482 VBOXVHWA_COLORKEY SrcCK;483 } VBOXVHWA_BLTFX;484 485 typedef struct VBOXVHWA_OVERLAYFX486 {487 uint32_t flags;488 uint32_t Reserved1;489 uint32_t fxFlags;490 uint32_t Reserved2;491 VBOXVHWA_COLORKEY DstCK;492 VBOXVHWA_COLORKEY SrcCK;493 } VBOXVHWA_OVERLAYFX;494 495 #define VBOXVHWA_CAPS_BLT 0x00000040496 #define VBOXVHWA_CAPS_BLTCOLORFILL 0x04000000497 #define VBOXVHWA_CAPS_BLTFOURCC 0x00000100498 #define VBOXVHWA_CAPS_BLTSTRETCH 0x00000200499 #define VBOXVHWA_CAPS_BLTQUEUE 0x00000080500 501 #define VBOXVHWA_CAPS_OVERLAY 0x00000800502 #define VBOXVHWA_CAPS_OVERLAYFOURCC 0x00002000503 #define VBOXVHWA_CAPS_OVERLAYSTRETCH 0x00004000504 #define VBOXVHWA_CAPS_OVERLAYCANTCLIP 0x00001000505 506 #define VBOXVHWA_CAPS_COLORKEY 0x00400000507 #define VBOXVHWA_CAPS_COLORKEYHWASSIST 0x01000000508 509 #define VBOXVHWA_SCAPS_BACKBUFFER 0x00000004510 #define VBOXVHWA_SCAPS_COMPLEX 0x00000008511 #define VBOXVHWA_SCAPS_FLIP 0x00000010512 #define VBOXVHWA_SCAPS_FRONTBUFFER 0x00000020513 #define VBOXVHWA_SCAPS_OFFSCREENPLAIN 0x00000040514 #define VBOXVHWA_SCAPS_OVERLAY 0x00000080515 #define VBOXVHWA_SCAPS_PRIMARYSURFACE 0x00000200516 #define VBOXVHWA_SCAPS_SYSTEMMEMORY 0x00000800517 #define VBOXVHWA_SCAPS_VIDEOMEMORY 0x00004000518 #define VBOXVHWA_SCAPS_VISIBLE 0x00008000519 #define VBOXVHWA_SCAPS_LOCALVIDMEM 0x10000000520 521 #define VBOXVHWA_PF_PALETTEINDEXED8 0x00000020522 #define VBOXVHWA_PF_RGB 0x00000040523 #define VBOXVHWA_PF_RGBTOYUV 0x00000100524 #define VBOXVHWA_PF_YUV 0x00000200525 #define VBOXVHWA_PF_FOURCC 0x00000004526 527 #define VBOXVHWA_LOCK_DISCARDCONTENTS 0x00002000528 529 #define VBOXVHWA_CFG_ENABLED 0x00000001530 531 #define VBOXVHWA_SD_BACKBUFFERCOUNT 0x00000020532 #define VBOXVHWA_SD_CAPS 0x00000001533 #define VBOXVHWA_SD_CKDESTBLT 0x00004000534 #define VBOXVHWA_SD_CKDESTOVERLAY 0x00002000535 #define VBOXVHWA_SD_CKSRCBLT 0x00010000536 #define VBOXVHWA_SD_CKSRCOVERLAY 0x00008000537 #define VBOXVHWA_SD_HEIGHT 0x00000002538 #define VBOXVHWA_SD_PITCH 0x00000008539 #define VBOXVHWA_SD_PIXELFORMAT 0x00001000540 /*#define VBOXVHWA_SD_REFRESHRATE 0x00040000*/541 #define VBOXVHWA_SD_WIDTH 0x00000004542 543 #define VBOXVHWA_CKEYCAPS_DESTBLT 0x00000001544 #define VBOXVHWA_CKEYCAPS_DESTBLTCLRSPACE 0x00000002545 #define VBOXVHWA_CKEYCAPS_DESTBLTCLRSPACEYUV 0x00000004546 #define VBOXVHWA_CKEYCAPS_DESTBLTYUV 0x00000008547 #define VBOXVHWA_CKEYCAPS_DESTOVERLAY 0x00000010548 #define VBOXVHWA_CKEYCAPS_DESTOVERLAYCLRSPACE 0x00000020549 #define VBOXVHWA_CKEYCAPS_DESTOVERLAYCLRSPACEYUV 0x00000040550 #define VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE 0x00000080551 #define VBOXVHWA_CKEYCAPS_DESTOVERLAYYUV 0x00000100552 #define VBOXVHWA_CKEYCAPS_SRCBLT 0x00000200553 #define VBOXVHWA_CKEYCAPS_SRCBLTCLRSPACE 0x00000400554 #define VBOXVHWA_CKEYCAPS_SRCBLTCLRSPACEYUV 0x00000800555 #define VBOXVHWA_CKEYCAPS_SRCBLTYUV 0x00001000556 #define VBOXVHWA_CKEYCAPS_SRCOVERLAY 0x00002000557 #define VBOXVHWA_CKEYCAPS_SRCOVERLAYCLRSPACE 0x00004000558 #define VBOXVHWA_CKEYCAPS_SRCOVERLAYCLRSPACEYUV 0x00008000559 #define VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE 0x00010000560 #define VBOXVHWA_CKEYCAPS_SRCOVERLAYYUV 0x00020000561 #define VBOXVHWA_CKEYCAPS_NOCOSTOVERLAY 0x00040000562 563 #define VBOXVHWA_BLT_COLORFILL 0x00000400564 #define VBOXVHWA_BLT_DDFX 0x00000800565 #define VBOXVHWA_BLT_EXTENDED_FLAGS 0x40000000566 #define VBOXVHWA_BLT_EXTENDED_LINEAR_CONTENT 0x00000004567 #define VBOXVHWA_BLT_EXTENDED_PRESENTATION_STRETCHFACTOR 0x00000010568 #define VBOXVHWA_BLT_KEYDESTOVERRIDE 0x00004000569 #define VBOXVHWA_BLT_KEYSRCOVERRIDE 0x00010000570 #define VBOXVHWA_BLT_LAST_PRESENTATION 0x20000000571 #define VBOXVHWA_BLT_PRESENTATION 0x10000000572 #define VBOXVHWA_BLT_ROP 0x00020000573 574 575 #define VBOXVHWA_OVER_DDFX 0x00080000576 #define VBOXVHWA_OVER_HIDE 0x00000200577 #define VBOXVHWA_OVER_KEYDEST 0x00000400578 #define VBOXVHWA_OVER_KEYDESTOVERRIDE 0x00000800579 #define VBOXVHWA_OVER_KEYSRC 0x00001000580 #define VBOXVHWA_OVER_KEYSRCOVERRIDE 0x00002000581 #define VBOXVHWA_OVER_SHOW 0x00004000582 583 #define VBOXVHWA_CKEY_COLORSPACE 0x00000001584 #define VBOXVHWA_CKEY_DESTBLT 0x00000002585 #define VBOXVHWA_CKEY_DESTOVERLAY 0x00000004586 #define VBOXVHWA_CKEY_SRCBLT 0x00000008587 #define VBOXVHWA_CKEY_SRCOVERLAY 0x00000010588 589 #define VBOXVHWA_BLT_ARITHSTRETCHY 0x00000001590 #define VBOXVHWA_BLT_MIRRORLEFTRIGHT 0x00000002591 #define VBOXVHWA_BLT_MIRRORUPDOWN 0x00000004592 593 #define VBOXVHWA_OVERFX_ARITHSTRETCHY 0x00000001594 #define VBOXVHWA_OVERFX_MIRRORLEFTRIGHT 0x00000002595 #define VBOXVHWA_OVERFX_MIRRORUPDOWN 0x00000004596 597 #define VBOXVHWA_CAPS2_CANRENDERWINDOWED 0x00080000598 #define VBOXVHWA_CAPS2_WIDESURFACES 0x00001000599 #define VBOXVHWA_CAPS2_COPYFOURCC 0x00008000600 /*#define VBOXVHWA_CAPS2_FLIPINTERVAL 0x00200000*/601 /*#define VBOXVHWA_CAPS2_FLIPNOVSYNC 0x00400000*/602 603 604 #define VBOXVHWA_OFFSET64_VOID (UINT64_MAX)605 606 typedef struct VBOXVHWA_VERSION607 {608 uint32_t maj;609 uint32_t min;610 uint32_t bld;611 uint32_t reserved;612 } VBOXVHWA_VERSION;613 614 #define VBOXVHWA_VERSION_INIT(_pv) do { \615 (_pv)->maj = VBOXVHWA_VERSION_MAJ; \616 (_pv)->min = VBOXVHWA_VERSION_MIN; \617 (_pv)->bld = VBOXVHWA_VERSION_BLD; \618 (_pv)->reserved = VBOXVHWA_VERSION_RSV; \619 } while(0)620 621 typedef struct VBOXVHWACMD_QUERYINFO1622 {623 union624 {625 struct626 {627 VBOXVHWA_VERSION guestVersion;628 } in;629 630 struct631 {632 uint32_t cfgFlags;633 uint32_t caps;634 635 uint32_t caps2;636 uint32_t colorKeyCaps;637 638 uint32_t stretchCaps;639 uint32_t surfaceCaps;640 641 uint32_t numOverlays;642 uint32_t curOverlays;643 644 uint32_t numFourCC;645 uint32_t reserved;646 } out;647 } u;648 } VBOXVHWACMD_QUERYINFO1;649 650 typedef struct VBOXVHWACMD_QUERYINFO2651 {652 uint32_t numFourCC;653 uint32_t FourCC[1];654 } VBOXVHWACMD_QUERYINFO2;655 656 #define VBOXVHWAINFO2_SIZE(_cFourCC) RT_UOFFSETOF_DYN(VBOXVHWACMD_QUERYINFO2, FourCC[_cFourCC])657 658 typedef struct VBOXVHWACMD_SURF_CANCREATE659 {660 VBOXVHWA_SURFACEDESC SurfInfo;661 union662 {663 struct664 {665 uint32_t bIsDifferentPixelFormat;666 uint32_t Reserved;667 } in;668 669 struct670 {671 int32_t ErrInfo;672 } out;673 } u;674 } VBOXVHWACMD_SURF_CANCREATE;675 676 typedef struct VBOXVHWACMD_SURF_CREATE677 {678 VBOXVHWA_SURFACEDESC SurfInfo;679 } VBOXVHWACMD_SURF_CREATE;680 681 #ifdef VBOX_WITH_WDDM682 typedef struct VBOXVHWACMD_SURF_GETINFO683 {684 VBOXVHWA_SURFACEDESC SurfInfo;685 } VBOXVHWACMD_SURF_GETINFO;686 #endif687 688 typedef struct VBOXVHWACMD_SURF_DESTROY689 {690 union691 {692 struct693 {694 VBOXVHWA_SURFHANDLE hSurf;695 } in;696 } u;697 } VBOXVHWACMD_SURF_DESTROY;698 699 typedef struct VBOXVHWACMD_SURF_LOCK700 {701 union702 {703 struct704 {705 VBOXVHWA_SURFHANDLE hSurf;706 uint64_t offSurface;707 uint32_t flags;708 uint32_t rectValid;709 VBOXVHWA_RECTL rect;710 } in;711 } u;712 } VBOXVHWACMD_SURF_LOCK;713 714 typedef struct VBOXVHWACMD_SURF_UNLOCK715 {716 union717 {718 struct719 {720 VBOXVHWA_SURFHANDLE hSurf;721 uint32_t xUpdatedMemValid;722 uint32_t reserved;723 VBOXVHWA_RECTL xUpdatedMemRect;724 } in;725 } u;726 } VBOXVHWACMD_SURF_UNLOCK;727 728 typedef struct VBOXVHWACMD_SURF_BLT729 {730 uint64_t DstGuestSurfInfo;731 uint64_t SrcGuestSurfInfo;732 union733 {734 struct735 {736 VBOXVHWA_SURFHANDLE hDstSurf;737 uint64_t offDstSurface;738 VBOXVHWA_RECTL dstRect;739 VBOXVHWA_SURFHANDLE hSrcSurf;740 uint64_t offSrcSurface;741 VBOXVHWA_RECTL srcRect;742 uint32_t flags;743 uint32_t xUpdatedSrcMemValid;744 VBOXVHWA_BLTFX desc;745 VBOXVHWA_RECTL xUpdatedSrcMemRect;746 } in;747 } u;748 } VBOXVHWACMD_SURF_BLT;749 750 #ifdef VBOX_WITH_WDDM751 typedef struct VBOXVHWACMD_SURF_COLORFILL752 {753 union754 {755 struct756 {757 VBOXVHWA_SURFHANDLE hSurf;758 uint64_t offSurface;759 uint32_t u32Reserved;760 uint32_t cRects;761 VBOXVHWA_RECTL aRects[1];762 } in;763 } u;764 } VBOXVHWACMD_SURF_COLORFILL;765 #endif766 767 typedef struct VBOXVHWACMD_SURF_FLIP768 {769 uint64_t TargGuestSurfInfo;770 uint64_t CurrGuestSurfInfo;771 union772 {773 struct774 {775 VBOXVHWA_SURFHANDLE hTargSurf;776 uint64_t offTargSurface;777 VBOXVHWA_SURFHANDLE hCurrSurf;778 uint64_t offCurrSurface;779 uint32_t flags;780 uint32_t xUpdatedTargMemValid;781 VBOXVHWA_RECTL xUpdatedTargMemRect;782 } in;783 } u;784 } VBOXVHWACMD_SURF_FLIP;785 786 typedef struct VBOXVHWACMD_SURF_COLORKEY_SET787 {788 union789 {790 struct791 {792 VBOXVHWA_SURFHANDLE hSurf;793 uint64_t offSurface;794 VBOXVHWA_COLORKEY CKey;795 uint32_t flags;796 uint32_t reserved;797 } in;798 } u;799 } VBOXVHWACMD_SURF_COLORKEY_SET;800 801 #define VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_SRCMEMRECT 0x00000001802 #define VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_DSTMEMRECT 0x00000002803 804 typedef struct VBOXVHWACMD_SURF_OVERLAY_UPDATE805 {806 union807 {808 struct809 {810 VBOXVHWA_SURFHANDLE hDstSurf;811 uint64_t offDstSurface;812 VBOXVHWA_RECTL dstRect;813 VBOXVHWA_SURFHANDLE hSrcSurf;814 uint64_t offSrcSurface;815 VBOXVHWA_RECTL srcRect;816 uint32_t flags;817 uint32_t xFlags;818 VBOXVHWA_OVERLAYFX desc;819 VBOXVHWA_RECTL xUpdatedSrcMemRect;820 VBOXVHWA_RECTL xUpdatedDstMemRect;821 } in;822 } u;823 }VBOXVHWACMD_SURF_OVERLAY_UPDATE;824 825 typedef struct VBOXVHWACMD_SURF_OVERLAY_SETPOSITION826 {827 union828 {829 struct830 {831 VBOXVHWA_SURFHANDLE hDstSurf;832 uint64_t offDstSurface;833 VBOXVHWA_SURFHANDLE hSrcSurf;834 uint64_t offSrcSurface;835 uint32_t xPos;836 uint32_t yPos;837 uint32_t flags;838 uint32_t reserved;839 } in;840 } u;841 } VBOXVHWACMD_SURF_OVERLAY_SETPOSITION;842 843 typedef struct VBOXVHWACMD_HH_CONSTRUCT844 {845 void *pVM;846 /* VRAM info for the backend to be able to properly translate VRAM offsets */847 void *pvVRAM;848 uint32_t cbVRAM;849 } VBOXVHWACMD_HH_CONSTRUCT;850 851 typedef struct VBOXVHWACMD_HH_SAVESTATE_SAVEPERFORM852 {853 struct SSMHANDLE * pSSM;854 } VBOXVHWACMD_HH_SAVESTATE_SAVEPERFORM;855 856 typedef struct VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM857 {858 struct SSMHANDLE * pSSM;859 } VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM;860 861 typedef DECLCALLBACKTYPE(void, FNVBOXVHWA_HH_CALLBACK,(void *));862 typedef FNVBOXVHWA_HH_CALLBACK *PFNVBOXVHWA_HH_CALLBACK;863 864 #define VBOXVHWA_HH_CALLBACK_SET(_pCmd, _pfn, _parg) \865 do { \866 (_pCmd)->GuestVBVAReserved1 = (uint64_t)(uintptr_t)(_pfn); \867 (_pCmd)->GuestVBVAReserved2 = (uint64_t)(uintptr_t)(_parg); \868 }while(0)869 870 #define VBOXVHWA_HH_CALLBACK_GET(_pCmd) ((PFNVBOXVHWA_HH_CALLBACK)(_pCmd)->GuestVBVAReserved1)871 #define VBOXVHWA_HH_CALLBACK_GET_ARG(_pCmd) ((void*)(_pCmd)->GuestVBVAReserved2)872 873 #pragma pack()874 #endif /* #ifdef VBOX_WITH_VIDEOHWACCEL */875 876 314 /* All structures are without alignment. */ 877 315 #pragma pack(1) … … 917 355 #define VBVA_ENABLE 7 918 356 #define VBVA_MOUSE_POINTER_SHAPE 8 919 #ifdef VBOX_WITH_VIDEOHWACCEL920 # define VBVA_VHWA_CMD 9921 #endif /* # ifdef VBOX_WITH_VIDEOHWACCEL */922 357 #ifdef VBOX_WITH_VDMA 923 358 # define VBVA_VDMA_CTL 10 /* setup G<->H DMA channel info */ … … 943 378 #define VBVAHG_SHGSMI_COMPLETION 3 944 379 #endif 945 946 #ifdef VBOX_WITH_VIDEOHWACCEL947 #define VBVAHG_DCUSTOM_VHWA_CMDCOMPLETE 1948 #pragma pack(1)949 typedef struct VBVAHOSTCMDVHWACMDCOMPLETE950 {951 uint32_t offCmd;952 }VBVAHOSTCMDVHWACMDCOMPLETE;953 #pragma pack()954 #endif /* # ifdef VBOX_WITH_VIDEOHWACCEL */955 380 956 381 #pragma pack(1) -
trunk/include/VBox/vmm/pdmifs.h
r106061 r108641 803 803 /** Pointer to a 3D graphics notification. */ 804 804 typedef struct VBOX3DNOTIFY VBOX3DNOTIFY; 805 /** Pointer to a 2D graphics acceleration command. */806 typedef struct VBOXVHWACMD VBOXVHWACMD;807 805 /** Pointer to a VBVA command header. */ 808 806 typedef struct VBVACMDHDR *PVBVACMDHDR; … … 920 918 */ 921 919 DECLR3CALLBACKMEMBER(void, pfnProcessDisplayData,(PPDMIDISPLAYCONNECTOR pInterface, void *pvVRAM, unsigned uScreenId)); 922 923 /**924 * Process the guest Video HW Acceleration command.925 *926 * @param pInterface Pointer to this interface.927 * @param enmCmd The command type (don't re-read from pCmd).928 * @param fGuestCmd Set if the command origins with the guest and929 * pCmd must be considered volatile.930 * @param pCmd Video HW Acceleration Command to be processed.931 * @retval VINF_SUCCESS - command is completed,932 * @retval VINF_CALLBACK_RETURN if command will by asynchronously completed via933 * complete callback.934 * @retval VERR_INVALID_STATE if the command could not be processed (most935 * likely because the framebuffer was disconnected) - the post should936 * be retried later.937 * @thread EMT938 */939 DECLR3CALLBACKMEMBER(int, pfnVHWACommandProcess,(PPDMIDISPLAYCONNECTOR pInterface, int enmCmd, bool fGuestCmd,940 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd));941 920 942 921 /** … … 2289 2268 #endif /* VBOX_WITH_HGCM */ 2290 2269 2291 2292 /** Pointer to a display VBVA callbacks interface. */2293 typedef struct PDMIDISPLAYVBVACALLBACKS *PPDMIDISPLAYVBVACALLBACKS;2294 /**2295 * Display VBVA callbacks interface (up).2296 */2297 typedef struct PDMIDISPLAYVBVACALLBACKS2298 {2299 2300 /**2301 * Informs guest about completion of processing the given Video HW Acceleration2302 * command, does not wait for the guest to process the command.2303 *2304 * @returns ???2305 * @param pInterface Pointer to this interface.2306 * @param pCmd The Video HW Acceleration Command that was2307 * completed.2308 */2309 DECLR3CALLBACKMEMBER(int, pfnVHWACommandCompleteAsync,(PPDMIDISPLAYVBVACALLBACKS pInterface,2310 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd));2311 } PDMIDISPLAYVBVACALLBACKS;2312 /** PDMIDISPLAYVBVACALLBACKS */2313 #define PDMIDISPLAYVBVACALLBACKS_IID "37f34c9c-0491-47dc-a0b3-81697c44a416"2314 2315 2270 /** Pointer to a PCI raw connector interface. */ 2316 2271 typedef struct PDMIPCIRAWCONNECTOR *PPDMIPCIRAWCONNECTOR; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
r106061 r108641 673 673 uint32_t u32AdapterCaps; /* VBOXWDDM_QAI_CAP_* */ 674 674 uint32_t cInfos; /* Number of initialized elements in aInfos (equal to number of guest 675 * displays). 0 if VBOX_WITH_VIDEOHWACCEL is not defined. */675 * displays). Always 0 currently. */ 676 676 VBOXVHWA_INFO aInfos[VBOX_VIDEO_MAX_SCREENS]; /* cInfos elements are initialized. */ 677 677 union -
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/xpdm/VBoxVideoIOCTL.h
r106061 r108641 156 156 } HGSMIHANDLERENABLE; 157 157 158 #ifdef VBOX_WITH_VIDEOHWACCEL159 /* Data returned by IOCTL_VIDEO_VHWA_QUERY_INFO. */160 typedef struct _VHWAQUERYINFO161 {162 ULONG_PTR offVramBase;163 } VHWAQUERYINFO;164 #endif165 158 #pragma pack() 166 159 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk
r107086 r108641 48 48 VBoxDisp_DEFS = VBOX_WITH_DDRAW 49 49 VBoxDisp_DEFS += LOG_TO_BACKDOOR #LOG_ENABLED 50 ifdef VBOX_WITH_VIDEOHWACCEL51 VBoxDisp_DEFS += VBOX_WITH_VIDEOHWACCEL52 endif53 50 #VBoxDisp_DEFS += VBOX_VBVA_ADJUST_RECT 54 51 VBoxDisp_INCS = \ … … 77 74 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/VBVABase.cpp \ 78 75 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp 79 ifdef VBOX_WITH_VIDEOHWACCEL80 VBoxDisp_SOURCES += \81 xpdm/VBoxDispVHWA.cpp \82 xpdm/VBoxDispDDrawVHWA.cpp83 endif84 76 85 77 VBoxDisp_LIBS = \ … … 123 115 ifdef VBOXWDDM_WITH_VBVA 124 116 VBoxDispD3D_DEFS += VBOXWDDM_WITH_VBVA 125 endif126 ifdef VBOX_WITH_VIDEOHWACCEL127 VBoxDispD3D_DEFS += VBOX_WITH_VIDEOHWACCEL128 117 endif 129 118 # Avoid "src\VBox\Additions\3D\mesa\mesa-21.3.8\include\c99_compat.h(99): warning C4668: '__STDC_VERSION__' -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r106582 r108641 106 106 PVBOXWDDMDISP_ADAPTER *ppAdapter) 107 107 { 108 #ifdef VBOX_WITH_VIDEOHWACCEL109 Assert(pAdapterInfo->cInfos >= 1);110 PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(RT_UOFFSETOF_DYN(VBOXWDDMDISP_ADAPTER,111 aHeads[pAdapterInfo->cInfos]));112 #else113 108 Assert(pAdapterInfo->cInfos == 0); 114 109 PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(sizeof(VBOXWDDMDISP_ADAPTER)); 115 #endif 116 AssertReturn(pAdapter, E_OUTOFMEMORY); 110 AssertPtrReturn(pAdapter, E_OUTOFMEMORY); 117 111 118 112 pAdapter->hAdapter = pOpenData->hAdapter; … … 126 120 pAdapter->f3D = RT_BOOL(pAdapterInfo->u32AdapterCaps & VBOXWDDM_QAI_CAP_3D) 127 121 && !vboxDispIsDDraw(pOpenData); 128 #ifdef VBOX_WITH_VIDEOHWACCEL129 pAdapter->cHeads = pAdapterInfo->cInfos;130 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)131 pAdapter->aHeads[i].Vhwa.Settings = pAdapterInfo->aInfos[i];132 #endif133 122 134 123 *ppAdapter = pAdapter; … … 163 152 WARN(("VBoxDispD3DOpen failed, hr (%d)", hr)); 164 153 } 165 #ifdef VBOX_WITH_VIDEOHWACCEL166 else167 {168 /* 2D adapter. */169 hr = VBoxDispD3DGlobal2DFormatsInit(pAdapter);170 if (FAILED(hr))171 WARN(("VBoxDispD3DGlobal2DFormatsInit failed hr 0x%x", hr));172 }173 #endif174 154 } 175 155 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
r106061 r108641 56 56 #define VBOXWDDMDISP_IS_TEXTURE(_f) ((_f).Texture || (_f).Value == 0) 57 57 58 #ifdef VBOX_WITH_VIDEOHWACCEL59 typedef struct VBOXDISPVHWA_INFO60 {61 VBOXVHWA_INFO Settings;62 }VBOXDISPVHWA_INFO;63 64 /* represents settings secific to65 * display device (head) on the multiple-head graphics card66 * currently used for 2D (overlay) only since in theory its settings67 * can differ per each frontend's framebuffer. */68 typedef struct VBOXWDDMDISP_HEAD69 {70 VBOXDISPVHWA_INFO Vhwa;71 } VBOXWDDMDISP_HEAD;72 #endif73 74 58 typedef struct VBOXWDDMDISP_ADAPTER 75 59 { … … 89 73 VBOXWDDM_QAI AdapterInfo; 90 74 91 #ifdef VBOX_WITH_VIDEOHWACCEL92 uint32_t cHeads;93 VBOXWDDMDISP_HEAD aHeads[1];94 #endif95 75 } VBOXWDDMDISP_ADAPTER, *PVBOXWDDMDISP_ADAPTER; 96 76 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
r106061 r108641 320 320 }, 321 321 }; 322 323 #ifdef VBOX_WITH_VIDEOHWACCEL324 325 static void vboxVhwaPopulateOverlayFourccSurfDesc(DDSURFACEDESC *pDesc, uint32_t fourcc)326 {327 memset(pDesc, 0, sizeof (DDSURFACEDESC));328 329 pDesc->dwSize = sizeof (DDSURFACEDESC);330 pDesc->dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT;331 pDesc->ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);332 pDesc->ddpfPixelFormat.dwFlags = DDPF_FOURCC;333 pDesc->ddpfPixelFormat.dwFourCC = fourcc;334 pDesc->ddsCaps.dwCaps = DDSCAPS_BACKBUFFER335 | DDSCAPS_COMPLEX336 | DDSCAPS_FLIP337 | DDSCAPS_FRONTBUFFER338 | DDSCAPS_LOCALVIDMEM339 | DDSCAPS_OVERLAY340 | DDSCAPS_VIDEOMEMORY341 | DDSCAPS_VISIBLE;342 }343 344 static bool vboxPixFormatMatch(DDPIXELFORMAT *pFormat1, DDPIXELFORMAT *pFormat2)345 {346 return !memcmp(pFormat1, pFormat2, sizeof (DDPIXELFORMAT));347 }348 349 HRESULT vboxSurfDescMerge(DDSURFACEDESC *paDescs, uint32_t *pcDescs, uint32_t cMaxDescs, DDSURFACEDESC *pDesc)350 {351 uint32_t cDescs = *pcDescs;352 353 Assert(cMaxDescs >= cDescs);354 Assert(pDesc->dwFlags == (DDSD_CAPS | DDSD_PIXELFORMAT));355 if (pDesc->dwFlags != (DDSD_CAPS | DDSD_PIXELFORMAT))356 return E_INVALIDARG;357 358 for (uint32_t i = 0; i < cDescs; ++i)359 {360 DDSURFACEDESC *pCur = &paDescs[i];361 if (vboxPixFormatMatch(&pCur->ddpfPixelFormat, &pDesc->ddpfPixelFormat))362 {363 if (pDesc->dwFlags & DDSD_CAPS)364 {365 pCur->dwFlags |= DDSD_CAPS;366 pCur->ddsCaps.dwCaps |= pDesc->ddsCaps.dwCaps;367 }368 return S_OK;369 }370 }371 372 if (cMaxDescs > cDescs)373 {374 paDescs[cDescs] = *pDesc;375 ++cDescs;376 *pcDescs = cDescs;377 return VINF_SUCCESS;378 }379 return E_FAIL;380 }381 382 HRESULT vboxFormatOpsMerge(FORMATOP *paOps, uint32_t *pcOps, uint32_t cMaxOps, FORMATOP *pOp)383 {384 uint32_t cOps = *pcOps;385 386 Assert(cMaxOps >= cOps);387 388 for (uint32_t i = 0; i < cOps; ++i)389 {390 FORMATOP *pCur = &paOps[i];391 if (pCur->Format == pOp->Format)392 {393 pCur->Operations |= pOp->Operations;394 Assert(pCur->FlipMsTypes == pOp->FlipMsTypes);395 Assert(pCur->BltMsTypes == pOp->BltMsTypes);396 Assert(pCur->PrivateFormatBitCount == pOp->PrivateFormatBitCount);397 return S_OK;398 }399 }400 401 if (cMaxOps > cOps)402 {403 paOps[cOps] = *pOp;404 ++cOps;405 *pcOps = cOps;406 return VINF_SUCCESS;407 }408 return E_FAIL;409 }410 411 HRESULT VBoxDispD3DGlobal2DFormatsInit(PVBOXWDDMDISP_ADAPTER pAdapter)412 {413 HRESULT hr = S_OK;414 memset(&pAdapter->D3D, 0, sizeof (pAdapter->D3D));415 memset(&pAdapter->Formats, 0, sizeof (pAdapter->Formats));416 417 /* just calc the max number of formats */418 uint32_t cFormats = RT_ELEMENTS(gVBoxFormatOpsBase);419 uint32_t cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);420 uint32_t cOverlayFormats = 0;421 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)422 {423 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;424 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)425 {426 cOverlayFormats += pVhwa->Settings.cFormats;427 }428 }429 430 cFormats += cOverlayFormats;431 cSurfDescs += cOverlayFormats;432 433 uint32_t cbFormatOps = cFormats * sizeof (FORMATOP);434 cbFormatOps = (cbFormatOps + 7) & ~3;435 /* ensure the surf descs are 8 byte aligned */436 uint32_t offSurfDescs = (cbFormatOps + 7) & ~3;437 uint32_t cbSurfDescs = cSurfDescs * sizeof (DDSURFACEDESC);438 uint32_t cbBuf = offSurfDescs + cbSurfDescs;439 uint8_t* pvBuf = (uint8_t*)RTMemAllocZ(cbBuf);440 if (pvBuf)441 {442 pAdapter->Formats.paFormatOps = (FORMATOP*)pvBuf;443 memcpy ((void*)pAdapter->Formats.paFormatOps , gVBoxFormatOpsBase, sizeof (gVBoxFormatOpsBase));444 pAdapter->Formats.cFormatOps = RT_ELEMENTS(gVBoxFormatOpsBase);445 446 FORMATOP fo = {D3DDDIFMT_UNKNOWN, 0, 0, 0, 0};447 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)448 {449 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;450 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)451 {452 for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)453 {454 fo.Format = pVhwa->Settings.aFormats[j];455 fo.Operations = FORMATOP_OVERLAY;456 hr = vboxFormatOpsMerge((FORMATOP *)pAdapter->Formats.paFormatOps, &pAdapter->Formats.cFormatOps, cFormats, &fo);457 if (FAILED(hr))458 {459 WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));460 }461 }462 }463 }464 465 pAdapter->Formats.paSurfDescs = (DDSURFACEDESC*)(pvBuf + offSurfDescs);466 memcpy ((void*)pAdapter->Formats.paSurfDescs , gVBoxSurfDescsBase, sizeof (gVBoxSurfDescsBase));467 pAdapter->Formats.cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);468 469 DDSURFACEDESC sd;470 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)471 {472 VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;473 if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)474 {475 for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)476 {477 uint32_t fourcc = vboxWddmFormatToFourcc(pVhwa->Settings.aFormats[j]);478 if (fourcc)479 {480 vboxVhwaPopulateOverlayFourccSurfDesc(&sd, fourcc);481 hr = vboxSurfDescMerge((DDSURFACEDESC *)pAdapter->Formats.paSurfDescs, &pAdapter->Formats.cSurfDescs, cSurfDescs, &sd);482 if (FAILED(hr))483 {484 WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));485 }486 }487 }488 }489 }490 }491 else492 {493 WARN(("RTMemAllocZ failed"));494 return E_FAIL;495 }496 return S_OK;497 }498 499 void VBoxDispD3DGlobal2DFormatsTerm(PVBOXWDDMDISP_ADAPTER pAdapter)500 {501 if (pAdapter->Formats.paFormatOps)502 {503 RTMemFree((void *)pAdapter->Formats.paFormatOps);504 pAdapter->Formats.paFormatOps = NULL;505 }506 }507 508 #endif509 322 510 323 static CRITICAL_SECTION g_VBoxDispD3DGlobalCritSect; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
r106061 r108641 73 73 void VBoxDispD3DGlobalClose(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats); 74 74 75 #ifdef VBOX_WITH_VIDEOHWACCEL76 HRESULT VBoxDispD3DGlobal2DFormatsInit(struct VBOXWDDMDISP_ADAPTER *pAdapter);77 void VBoxDispD3DGlobal2DFormatsTerm(struct VBOXWDDMDISP_ADAPTER *pAdapter);78 #endif79 80 75 #ifdef DEBUG 81 76 void vboxDispCheckCapsLevel(const D3DCAPS9 *pCaps); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/GaDdi.cpp
r106507 r108641 4946 4946 VBoxDispD3DGlobalClose(&pAdapter->D3D, &pAdapter->Formats); 4947 4947 } 4948 #ifdef VBOX_WITH_VIDEOHWACCEL4949 else4950 {4951 VBoxDispD3DGlobal2DFormatsTerm(pAdapter);4952 }4953 #endif4954 4948 4955 4949 RTMemFree(pAdapter); … … 4965 4959 }; 4966 4960 4967 #ifdef VBOX_WITH_VIDEOHWACCEL4968 static bool vboxVhwaHasCKeying(PVBOXWDDMDISP_ADAPTER pAdapter)4969 {4970 for (uint32_t i = 0; i < pAdapter->cHeads; ++i)4971 {4972 VBOXVHWA_INFO* pSettings = &pAdapter->aHeads[i].Vhwa.Settings;4973 if ( (pSettings->fFlags & VBOXVHWA_F_ENABLED)4974 && ( (pSettings->fFlags & VBOXVHWA_F_CKEY_DST)4975 || (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC)))4976 return true;4977 }4978 return false;4979 }4980 #endif4981 4982 4961 HRESULT APIENTRY GaDdiAdapterGetCaps(HANDLE hAdapter, const D3DDDIARG_GETCAPS *pData) 4983 4962 { … … 4996 4975 Assert(pData->DataSize == sizeof(DDRAW_CAPS)); 4997 4976 if (pData->DataSize >= sizeof(DDRAW_CAPS)) 4998 {4999 4977 memset(pData->pData, 0, sizeof(DDRAW_CAPS)); 5000 #ifdef VBOX_WITH_VIDEOHWACCEL5001 if (!VBOXDISPMODE_IS_3D(pAdapter))5002 {5003 if (vboxVhwaHasCKeying(pAdapter))5004 {5005 DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData;5006 pCaps->Caps |= DDRAW_CAPS_COLORKEY;5007 // pCaps->Caps2 |= DDRAW_CAPS2_FLIPNOVSYNC;5008 }5009 }5010 else5011 {5012 WARN(("D3DDDICAPS_DDRAW query for D3D mode!"));5013 }5014 #endif5015 }5016 4978 else 5017 4979 hr = E_INVALIDARG; … … 5028 4990 /* Do not overwrite the first "Head" field, zero starting with the one following "Head", i.e. Caps. */ 5029 4991 memset(&pCaps->Caps, 0, sizeof(DDRAW_MODE_SPECIFIC_CAPS) - RT_UOFFSETOF(DDRAW_MODE_SPECIFIC_CAPS, Caps)); 5030 #ifdef VBOX_WITH_VIDEOHWACCEL5031 if (!VBOXDISPMODE_IS_3D(pAdapter))5032 {5033 VBOXVHWA_INFO *pSettings = &pAdapter->aHeads[pCaps->Head].Vhwa.Settings;5034 if (pSettings->fFlags & VBOXVHWA_F_ENABLED)5035 {5036 pCaps->Caps |= MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH;5037 5038 if (pSettings->fFlags & VBOXVHWA_F_CKEY_DST)5039 {5040 pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY5041 | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */5042 ;5043 }5044 5045 if (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC)5046 {5047 pCaps->CKeyCaps |= MODE_CKEYCAPS_SRCOVERLAY5048 | MODE_CKEYCAPS_SRCOVERLAYCLRSPACE /* ?? */5049 | MODE_CKEYCAPS_SRCOVERLAYCLRSPACEYUV /* ?? */5050 | MODE_CKEYCAPS_SRCOVERLAYYUV /* ?? */5051 ;5052 }5053 5054 pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX5055 | MODE_FXCAPS_OVERLAYSHRINKY5056 | MODE_FXCAPS_OVERLAYSTRETCHX5057 | MODE_FXCAPS_OVERLAYSTRETCHY;5058 5059 5060 pCaps->MaxVisibleOverlays = pSettings->cOverlaysSupported;5061 pCaps->MinOverlayStretch = 1;5062 pCaps->MaxOverlayStretch = 32000;5063 }5064 }5065 else5066 {5067 WARN(("D3DDDICAPS_DDRAW_MODE_SPECIFIC query for D3D mode!"));5068 }5069 #endif5070 4992 } 5071 4993 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDisp.h
r106061 r108641 142 142 #ifdef VBOX_WITH_DDRAW 143 143 VBOXDDLOCKINFO ddpsLock; /* Primary surface DirectDraw lock information */ 144 #endif145 146 #ifdef VBOX_WITH_VIDEOHWACCEL147 VBOXDISPVHWAINFO vhwa; /* VHWA Info */148 144 #endif 149 145 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispDDraw.cpp
r106061 r108641 38 38 PDD_SURFACEDESC lpDDS = lpCanCreateSurface->lpDDSurfaceDesc; 39 39 40 #ifdef VBOX_WITH_VIDEOHWACCEL41 PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpCanCreateSurface->lpDD->dhpdev;42 if(pDev->vhwa.bEnabled)43 {44 uint32_t unsupportedSCaps = VBoxDispVHWAUnsupportedDDSCAPS(lpDDS->ddsCaps.dwCaps);45 if(unsupportedSCaps)46 {47 WARN(("unsupported ddscaps: %#x", unsupportedSCaps));48 lpCanCreateSurface->ddRVal = DDERR_INVALIDCAPS;49 return DDHAL_DRIVER_HANDLED;50 }51 52 unsupportedSCaps = VBoxDispVHWAUnsupportedDDPFS(lpDDS->ddpfPixelFormat.dwFlags);53 if(unsupportedSCaps)54 {55 WARN(("unsupported pixel format: %#x", unsupportedSCaps));56 lpCanCreateSurface->ddRVal = DDERR_INVALIDPIXELFORMAT;57 return DDHAL_DRIVER_HANDLED;58 }59 60 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HOST * pCmd61 = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_CANCREATE, sizeof(VBOXVHWACMD_SURF_CANCREATE));62 if (pCmd)63 {64 int rc;65 VBOXVHWACMD_SURF_CANCREATE RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CANCREATE);66 67 rc = VBoxDispVHWAFromDDSURFACEDESC(&pBody->SurfInfo, lpDDS);68 pBody->u.in.bIsDifferentPixelFormat = lpCanCreateSurface->bIsDifferentPixelFormat;69 70 VBoxDispVHWACommandSubmit(pDev, pCmd);71 72 if (RT_SUCCESS(pCmd->rc))73 {74 if(pBody->u.out.ErrInfo)75 {76 WARN(("pBody->u.out.ErrInfo = %#x", pBody->u.out.ErrInfo));77 lpCanCreateSurface->ddRVal = DDERR_GENERIC;78 }79 else80 {81 lpCanCreateSurface->ddRVal = DD_OK;82 }83 }84 else85 {86 WARN(("VBoxDispVHWACommandSubmit failed with rc=%#x", rc));87 lpCanCreateSurface->ddRVal = DDERR_GENERIC;88 }89 VBoxDispVHWACommandRelease(pDev, pCmd);90 }91 else92 {93 WARN(("VBoxDispVHWACommandCreate failed!"));94 lpCanCreateSurface->ddRVal = DDERR_GENERIC;95 }96 return DDHAL_DRIVER_HANDLED;97 }98 #endif /*VBOX_WITH_VIDEOHWACCEL*/99 100 40 if (lpDDS->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) 101 41 { … … 144 84 pSurf->lpGbl->dwReserved1 = 0; 145 85 146 #ifdef VBOX_WITH_VIDEOHWACCEL147 PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpCreateSurface->lpDD->dhpdev;148 if(pDev->vhwa.bEnabled)149 {150 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HOST *pCmd151 = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_CREATE, sizeof(VBOXVHWACMD_SURF_CREATE));152 if (pCmd)153 {154 VBOXVHWACMD_SURF_CREATE RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE);155 PVBOXVHWASURFDESC pDesc;156 int rc;157 158 rc = VBoxDispVHWAFromDDSURFACEDESC(&pBody->SurfInfo, lpCreateSurface->lpDDSurfaceDesc);159 VBOX_WARNRC(rc);160 161 pBody->SurfInfo.surfCaps = VBoxDispVHWAFromDDSCAPS(pSurf->ddsCaps.dwCaps);162 pBody->SurfInfo.flags |= DDSD_CAPS;163 164 pBody->SurfInfo.height = pSurf->lpGbl->wHeight;165 pBody->SurfInfo.width = pSurf->lpGbl->wWidth;166 pBody->SurfInfo.flags |= DDSD_HEIGHT | DDSD_WIDTH;167 168 VBoxDispVHWAFromDDPIXELFORMAT(&pBody->SurfInfo.PixelFormat, &pSurf->lpGbl->ddpfSurface);169 pBody->SurfInfo.flags |= VBOXVHWA_SD_PIXELFORMAT;170 171 if (pSurf->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)172 {173 pBody->SurfInfo.offSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, 0);174 }175 else176 {177 pBody->SurfInfo.offSurface = VBOXVHWA_OFFSET64_VOID;178 }179 180 pDesc = VBoxDispVHWASurfDescAlloc();181 if (pDesc)182 {183 VBoxDispVHWACommandSubmit(pDev, pCmd);184 if (RT_SUCCESS(pCmd->rc))185 {186 pDesc->hHostHandle = pBody->SurfInfo.hSurf;187 188 if(!!(pSurf->ddsCaps.dwCaps & DDSCAPS_OVERLAY)189 && !!(pSurf->ddsCaps.dwCaps & DDSCAPS_VISIBLE))190 {191 pDesc->bVisible = true;192 }193 194 pSurf->lpGbl->dwBlockSizeX = pBody->SurfInfo.sizeX;195 pSurf->lpGbl->dwBlockSizeY = pBody->SurfInfo.sizeY;196 pSurf->lpGbl->lPitch = pBody->SurfInfo.pitch;197 198 lpCreateSurface->lpDDSurfaceDesc->lPitch = pSurf->lpGbl->lPitch;199 lpCreateSurface->lpDDSurfaceDesc->dwFlags |= DDSD_PITCH;200 201 202 /** @todo it's probably a memory leak, because DDDestroySurface wouldn't be called for203 * primary surfaces.204 */205 pSurf->lpGbl->dwReserved1 = (ULONG_PTR)pDesc;206 }207 else208 {209 WARN(("VBoxDispVHWACommandSubmit failed with rc=%#x", rc));210 VBoxDispVHWASurfDescFree(pDesc);211 }212 }213 else214 {215 WARN(("VBoxDispVHWASurfDescAlloc failed"));216 }217 VBoxDispVHWACommandRelease(pDev, pCmd);218 }219 else220 {221 WARN(("VBoxDispVHWACommandCreate failed"));222 }223 return DDHAL_DRIVER_NOTHANDLED;224 }225 #endif /*VBOX_WITH_VIDEOHWACCEL*/226 227 86 LPDDSURFACEDESC pDesc = lpCreateSurface->lpDDSurfaceDesc; 228 87 … … 261 120 lpDestroySurface->ddRVal = DD_OK; 262 121 263 #ifdef VBOX_WITH_VIDEOHWACCEL264 PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpDestroySurface->lpDD->dhpdev;265 if (pDev->vhwa.bEnabled)266 {267 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HOST *pCmd268 = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY));269 if (pCmd)270 {271 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpDestroySurface->lpDDSurface->lpGbl->dwReserved1;272 if (pDesc)273 {274 VBOXVHWACMD_SURF_DESTROY RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY);275 pBody->u.in.hSurf = pDesc->hHostHandle;276 277 VBoxDispVHWACommandSubmit(pDev, pCmd);278 279 VBoxDispVHWACommandRelease(pDev, pCmd);280 281 VBoxDispVHWASurfDescFree(pDesc);282 283 lpDestroySurface->lpDDSurface->lpGbl->dwReserved1 = (ULONG_PTR)NULL;284 }285 else286 {287 WARN(("!pDesc, memory overwrite somewhere?"));288 lpDestroySurface->ddRVal = DDERR_GENERIC;289 }290 }291 else292 {293 WARN(("VBoxDispVHWACommandCreate failed!"));294 lpDestroySurface->ddRVal = DDERR_GENERIC;295 }296 }297 else298 #endif /*VBOX_WITH_VIDEOHWACCEL*/299 300 122 LOGF_LEAVE(); 301 123 return DDHAL_DRIVER_NOTHANDLED; … … 351 173 352 174 lpLock->ddRVal = DD_OK; 353 354 #ifdef VBOX_WITH_VIDEOHWACCEL355 if(pDev->vhwa.bEnabled)356 {357 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC) pSurf->lpGbl->dwReserved1;358 RECTL tmpRect, *pRect;359 360 if (!pDesc)361 {362 WARN(("!pDesc, memory overwrite somewhere?"));363 lpLock->ddRVal = DDERR_GENERIC;364 return DDHAL_DRIVER_HANDLED;365 }366 367 /* Check if host is still processing drawing commands */368 if (ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)369 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr)370 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)371 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg))372 {373 VBoxDispVHWACommandCheckHostCmds(pDev);374 if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)375 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr)376 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)377 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg))378 {379 lpLock->ddRVal = DDERR_WASSTILLDRAWING;380 return DDHAL_DRIVER_HANDLED;381 }382 }383 384 if (lpLock->bHasRect)385 {386 pRect = &lpLock->rArea;387 }388 else389 {390 tmpRect.left = 0;391 tmpRect.top = 0;392 tmpRect.right = pSurf->lpGbl->wWidth-1;393 tmpRect.bottom = pSurf->lpGbl->wHeight-1;394 pRect = &tmpRect;395 }396 397 if (lpLock->dwFlags & DDLOCK_DISCARDCONTENTS)398 {399 VBoxDispVHWARegionTrySubstitute(&pDesc->NonupdatedMemRegion, pRect);400 VBoxDispVHWARegionAdd(&pDesc->UpdatedMemRegion, pRect);401 }402 else if (!VBoxDispVHWARegionIntersects(&pDesc->NonupdatedMemRegion, pRect))403 {404 VBoxDispVHWARegionAdd(&pDesc->UpdatedMemRegion, pRect);405 }406 else407 {408 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HOST *pCmd409 = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_LOCK, sizeof(VBOXVHWACMD_SURF_LOCK));410 if (pCmd)411 {412 VBOXVHWACMD_SURF_LOCK RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_LOCK);413 414 pBody->u.in.offSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pSurf->lpGbl->fpVidMem);415 416 VBoxDispVHWAFromRECTL(&pBody->u.in.rect, &pDesc->NonupdatedMemRegion.Rect);417 pBody->u.in.rectValid = 1;418 419 pBody->u.in.hSurf = pDesc->hHostHandle;420 421 /* wait for the surface to be locked and memory buffer updated */422 VBoxDispVHWACommandSubmit(pDev, pCmd);423 VBOX_WARNRC(pCmd->rc);424 VBoxDispVHWACommandRelease(pDev, pCmd);425 VBoxDispVHWARegionClear(&pDesc->NonupdatedMemRegion);426 }427 else428 {429 WARN(("VBoxDispVHWACommandCreate failed!"));430 lpLock->ddRVal = DDERR_GENERIC;431 }432 }433 434 return DDHAL_DRIVER_NOTHANDLED;435 }436 #endif /*VBOX_WITH_VIDEOHWACCEL*/437 175 438 176 /* We only care about primary surface as we'd have to report dirty rectangles to the host in the DDUnlock*/ … … 466 204 lpUnlock->ddRVal = DD_OK; 467 205 468 #ifdef VBOX_WITH_VIDEOHWACCEL 469 if(pDev->vhwa.bEnabled) 470 { 471 DD_SURFACE_LOCAL *pSurf = lpUnlock->lpDDSurface; 472 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC) pSurf->lpGbl->dwReserved1; 473 474 if (!pDesc) 206 if (pDev->ddpsLock.bLocked) 207 { 208 pDev->ddpsLock.bLocked = FALSE; 209 210 if (pDev->hgsmi.bSupported && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->hgsmi.ctx)) 475 211 { 476 WARN(("!pDesc, memory overwrite somewhere?")); 477 lpUnlock->ddRVal = DDERR_GENERIC; 478 return DDHAL_DRIVER_HANDLED; 479 } 480 481 if((pSurf->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && pDesc->UpdatedMemRegion.bValid 482 && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->hgsmi.ctx)) 483 { 484 vbvaReportDirtyRect(pDev, &pDesc->UpdatedMemRegion.Rect); 212 vbvaReportDirtyRect(pDev, &pDev->ddpsLock.rect); 485 213 486 214 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) … … 492 220 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP) 493 221 { 494 vrdpReportDirtyRect(pDev, &pDe sc->UpdatedMemRegion.Rect);222 vrdpReportDirtyRect(pDev, &pDev->ddpsLock.rect); 495 223 } 496 224 497 225 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); 498 226 } 499 else if ((pSurf->ddsCaps.dwCaps & DDSCAPS_VISIBLE) 500 || ((pSurf->ddsCaps.dwCaps & DDSCAPS_OVERLAY) && pDesc->bVisible)) 501 { 502 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_HOST *pCmd 503 = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 504 if (pCmd) 505 { 506 VBOXVHWACMD_SURF_UNLOCK RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK); 507 508 pBody->u.in.hSurf = pDesc->hHostHandle; 509 if(pDesc->UpdatedMemRegion.bValid) 510 { 511 pBody->u.in.xUpdatedMemValid = 1; 512 VBoxDispVHWAFromRECTL(&pBody->u.in.xUpdatedMemRect, &pDesc->UpdatedMemRegion.Rect); 513 VBoxDispVHWARegionClear(&pDesc->UpdatedMemRegion); 514 } 515 516 VBoxDispVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 517 } 518 else 519 { 520 WARN(("VBoxDispVHWACommandCreate failed!")); 521 lpUnlock->ddRVal = DDERR_GENERIC; 522 } 523 524 } 525 526 return DDHAL_DRIVER_NOTHANDLED; 527 } 528 #endif /*VBOX_WITH_VIDEOHWACCEL*/ 529 530 if (pDev->ddpsLock.bLocked) 531 { 532 pDev->ddpsLock.bLocked = FALSE; 533 534 if (pDev->hgsmi.bSupported && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->hgsmi.ctx)) 535 { 536 vbvaReportDirtyRect(pDev, &pDev->ddpsLock.rect); 537 538 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) 539 { 540 vrdpReset(pDev); 541 pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; 542 } 543 544 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP) 545 { 546 vrdpReportDirtyRect(pDev, &pDev->ddpsLock.rect); 547 } 548 549 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); 550 } 551 } 552 553 LOGF_LEAVE(); 554 return DDHAL_DRIVER_NOTHANDLED; 555 } 227 } 228 229 LOGF_LEAVE(); 230 return DDHAL_DRIVER_NOTHANDLED; 231 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispDDraw.h
r106061 r108641 41 41 DWORD APIENTRY VBoxDispDDMapMemory(PDD_MAPMEMORYDATA lpMapMemory); 42 42 43 #ifdef VBOX_WITH_VIDEOHWACCEL44 int VBoxDispVHWAUpdateDDHalInfo(PVBOXDISPDEV pDev, DD_HALINFO *pHalInfo);45 46 DWORD APIENTRY VBoxDispDDGetDriverInfo(DD_GETDRIVERINFODATA *lpData);47 DWORD APIENTRY VBoxDispDDSetColorKey(PDD_SETCOLORKEYDATA lpSetColorKey);48 DWORD APIENTRY VBoxDispDDAddAttachedSurface(PDD_ADDATTACHEDSURFACEDATA lpAddAttachedSurface);49 DWORD APIENTRY VBoxDispDDBlt(PDD_BLTDATA lpBlt);50 DWORD APIENTRY VBoxDispDDFlip(PDD_FLIPDATA lpFlip);51 DWORD APIENTRY VBoxDispDDGetBltStatus(PDD_GETBLTSTATUSDATA lpGetBltStatus);52 DWORD APIENTRY VBoxDispDDGetFlipStatus(PDD_GETFLIPSTATUSDATA lpGetFlipStatus);53 DWORD APIENTRY VBoxDispDDSetOverlayPosition(PDD_SETOVERLAYPOSITIONDATA lpSetOverlayPosition);54 DWORD APIENTRY VBoxDispDDUpdateOverlay(PDD_UPDATEOVERLAYDATA lpUpdateOverlay);55 #endif56 57 43 #endif /* !GA_INCLUDED_SRC_WINNT_Graphics_Video_disp_xpdm_VBoxDispDDraw_h */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispDriver.cpp
r106061 r108641 637 637 } 638 638 639 #ifdef VBOX_WITH_VIDEOHWACCEL640 VBoxDispVHWAEnable(pDev);641 #endif642 643 639 /* Set device palette if needed */ 644 640 if (pDev->mode.ulBitsPerPel == 8) … … 809 805 { 810 806 LOGF(("!bEnable")); 811 #ifdef VBOX_WITH_VIDEOHWACCEL812 /* tells we can not process host commands any more and ensures that813 * we've completed processing of the host VHWA commands814 */815 VBoxDispVHWADisable(pDev);816 #endif817 807 818 808 /* disable VBVA */ … … 852 842 (uint16_t)pDev->mode.ulBitsPerPel, VBVA_SCREEN_F_ACTIVE); 853 843 } 854 855 #ifdef VBOX_WITH_VIDEOHWACCEL856 /* tells we can process host commands */857 VBoxDispVHWAEnable(pDev);858 #endif859 844 860 845 /* Associate back GDI bitmap residing in our framebuffer memory with GDI's handle to our device */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispDriverDDraw.cpp
r106061 r108641 75 75 VIDEOMEMORY *pvmList, DWORD *pdwNumFourCCCodes, DWORD *pdwFourCC) 76 76 { 77 RT_NOREF(pdwFourCC); 78 77 79 PVBOXDISPDEV pDev = (PVBOXDISPDEV)dhpdev; 78 80 LOGF_ENTER(); 79 81 80 82 VBoxDispGetDDHalInfo(pDev, pHalInfo); 81 82 #ifdef VBOX_WITH_VIDEOHWACCEL83 int rc;84 85 if (!pvmList && !pdwFourCC) /* first call */86 {87 rc = VBoxDispVHWAInitHostInfo1(pDev);88 VBOX_WARNRC_NOBP(rc);89 }90 91 if (pDev->vhwa.bEnabled)92 {93 rc = VBoxDispVHWAUpdateDDHalInfo(pDev, pHalInfo);94 VBOX_WARNRC(rc);95 96 pDev->vhwa.bEnabled = RT_SUCCESS(rc);97 }98 #else99 RT_NOREF(pdwFourCC);100 #endif101 83 102 84 /* we could only have 1 heap, so it's not really a list */ … … 106 88 pvmList->fpStart = pDev->layout.offDDrawHeap; 107 89 pvmList->fpEnd = pDev->layout.offDDrawHeap + pDev->layout.cbDDrawHeap - 1; 108 #ifdef VBOX_WITH_VIDEOHWACCEL 109 if (pDev->vhwa.bEnabled) 110 { 111 pvmList->ddsCaps.dwCaps = 0; 112 } 113 else 114 #endif 115 { 116 pvmList->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 117 } 90 pvmList->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 118 91 pvmList->ddsCapsAlt.dwCaps = 0; 119 120 92 } 121 93 … … 123 95 *pdwNumHeaps = (pDev->layout.cbDDrawHeap>0) ? 1:0; 124 96 125 #ifndef VBOX_WITH_VIDEOHWACCEL126 97 *pdwNumFourCCCodes = 0; 127 #else128 if (pDev->vhwa.bEnabled)129 {130 *pdwNumFourCCCodes = pDev->vhwa.numFourCC;131 if (pdwFourCC && pDev->vhwa.numFourCC)132 {133 rc = VBoxDispVHWAInitHostInfo2(pDev, pdwFourCC);134 VBOX_WARNRC(rc);135 136 if (RT_FAILURE(rc))137 {138 *pdwNumFourCCCodes = 0;139 pDev->vhwa.numFourCC = 0;140 }141 }142 143 pHalInfo->GetDriverInfo = VBoxDispDDGetDriverInfo;144 pHalInfo->dwFlags |= DDHALINFO_GETDRIVERINFOSET;145 }146 #endif147 98 148 99 LOGF_LEAVE(); … … 154 105 DD_PALETTECALLBACKS *pPaletteCallBacks) 155 106 { 107 RT_NOREF(dhpdev); 108 156 109 LOGF_ENTER(); 157 110 … … 169 122 pPaletteCallBacks->dwSize = sizeof(DD_PALETTECALLBACKS); 170 123 pPaletteCallBacks->dwFlags = 0; 171 172 #ifdef VBOX_WITH_VIDEOHWACCEL173 PVBOXDISPDEV pDev = (PVBOXDISPDEV)dhpdev;174 175 if (pDev->vhwa.bEnabled)176 {177 pSurfaceCallBacks->DestroySurface = VBoxDispDDDestroySurface;178 pSurfaceCallBacks->Flip = VBoxDispDDFlip;179 pSurfaceCallBacks->GetFlipStatus = VBoxDispDDGetFlipStatus;180 pSurfaceCallBacks->Blt = VBoxDispDDBlt;181 pSurfaceCallBacks->GetBltStatus = VBoxDispDDGetBltStatus;182 pSurfaceCallBacks->SetColorKey = VBoxDispDDSetColorKey;183 pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE|184 DDHAL_SURFCB32_FLIP|DDHAL_SURFCB32_GETFLIPSTATUS|185 DDHAL_SURFCB32_BLT|DDHAL_SURFCB32_GETBLTSTATUS|186 DDHAL_SURFCB32_SETCOLORKEY;187 188 if(pDev->vhwa.caps & VBOXVHWA_CAPS_OVERLAY)189 {190 pSurfaceCallBacks->UpdateOverlay = VBoxDispDDUpdateOverlay;191 pSurfaceCallBacks->SetOverlayPosition = VBoxDispDDSetOverlayPosition;192 pSurfaceCallBacks->dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY|DDHAL_SURFCB32_SETOVERLAYPOSITION;193 }194 }195 #else196 RT_NOREF(dhpdev);197 #endif198 124 199 125 LOGF_LEAVE(); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispInternal.h
r106061 r108641 54 54 55 55 typedef struct _VBOXDISPDEV *PVBOXDISPDEV; 56 57 #ifdef VBOX_WITH_VIDEOHWACCEL58 # include "VBoxDispVHWA.h"59 #endif60 56 61 57 /* 4bytes tag passed to EngAllocMem. -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispMini.cpp
r106061 r108641 288 288 } 289 289 290 #ifdef VBOX_WITH_VIDEOHWACCEL291 int VBoxDispMPVHWAQueryInfo(HANDLE hDriver, VHWAQUERYINFO *pInfo)292 {293 DWORD dwrc;294 ULONG cbReturned;295 LOGF_ENTER();296 297 memset(pInfo, 0, sizeof(VHWAQUERYINFO));298 dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_VHWA_QUERY_INFO, NULL, 0,299 pInfo, sizeof(VHWAQUERYINFO), &cbReturned);300 VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR);301 VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_VHWA_QUERY_INFO", cbReturned, sizeof(VHWAQUERYINFO), VERR_DEV_IO_ERROR);302 303 LOGF_LEAVE();304 return VINF_SUCCESS;305 }306 #endif307 308 290 int VBoxDispMPSetColorRegisters(HANDLE hDriver, PVIDEO_CLUT pClut, DWORD cbClut) 309 291 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispMini.h
r106061 r108641 42 42 int VBoxDispMPQueryHGSMICallbacks(HANDLE hDriver, HGSMIQUERYCALLBACKS *pCallbacks); 43 43 int VBoxDispMPHGSMIQueryPortProcs(HANDLE hDriver, HGSMIQUERYCPORTPROCS *pPortProcs); 44 #ifdef VBOX_WITH_VIDEOHWACCEL45 int VBoxDispMPVHWAQueryInfo(HANDLE hDriver, VHWAQUERYINFO *pInfo);46 #endif47 44 int VBoxDispMPSetColorRegisters(HANDLE hDriver, PVIDEO_CLUT pClut, DWORD cbClut); 48 45 int VBoxDispMPDisablePointer(HANDLE hDriver); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/xpdm/VBoxDispVBVA.cpp
r106061 r108641 364 364 0, NULL, &cbReturned); 365 365 VBOX_WARN_WINERR(dwrc); 366 367 #ifdef VBOX_WITH_VIDEOHWACCEL368 if (NO_ERROR == dwrc)369 {370 VBoxDispVHWAInit(pDev);371 }372 #endif373 366 } 374 367 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk
r106454 r108641 41 41 VBoxVideo_DEFS += LOG_TO_BACKDOOR #LOG_ENABLED 42 42 VBoxVideo_DEFS += VBOX_SVN_REV=$(VBOX_SVN_REV) 43 ifdef VBOX_WITH_VIDEOHWACCEL44 VBoxVideo_DEFS += VBOX_WITH_VIDEOHWACCEL45 endif46 43 VBoxVideo_INCS = \ 47 44 ../../../include \ … … 95 92 VBoxWddm_DEFS += WIN9X_COMPAT_SPINLOCK 96 93 VBoxWddm_DEFS += VBOX_WITH_8BPP_MODES 97 ifdef VBOX_WITH_VIDEOHWACCEL98 VBoxWddm_DEFS += VBOX_WITH_VIDEOHWACCEL99 endif100 94 ifdef VBOXWDDM_WITH_VBVA 101 95 VBoxWddm_DEFS += VBOXWDDM_WITH_VBVA … … 141 135 VBoxWddm_SOURCES += \ 142 136 wddm/VBoxMPVbva.cpp 143 endif144 ifdef VBOX_WITH_VIDEOHWACCEL145 VBoxWddm_SOURCES += \146 wddm/VBoxMPVhwa.cpp147 137 endif 148 138 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r106061 r108641 157 157 158 158 BOOLEAN f3DEnabled; 159 BOOLEAN fCmdVbvaEnabled; 159 BOOLEAN fCmdVbvaEnabled; /** @todo r=andy Remove this too for @bugref{10756}? */ 160 160 BOOLEAN fComplexTopologiesEnabled; 161 161 … … 164 164 VBOXVTLIST CtlList; 165 165 VBOXVTLIST DmaCmdList; 166 #ifdef VBOX_WITH_VIDEOHWACCEL 167 VBOXVTLIST VhwaCmdList; 168 #endif 166 169 167 BOOLEAN bNotifyDxDpc; 170 168 171 169 BOOLEAN fDisableTargetUpdate; 172 173 174 170 175 171 BOOL bVSyncTimerEnabled; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPLegacy.cpp
r106061 r108641 30 30 #include "common/VBoxMPCommon.h" 31 31 #include "common/VBoxMPHGSMI.h" 32 #ifdef VBOX_WITH_VIDEOHWACCEL33 # include "VBoxMPVhwa.h"34 #endif35 32 #include "VBoxMPVidPn.h" 36 33 #include "VBoxMPLegacy.h" … … 1537 1534 vboxVtListInit(&CtlList); 1538 1535 1539 #ifdef VBOX_WITH_VIDEOHWACCEL1540 VBOXVTLIST VhwaCmdList;1541 vboxVtListInit(&VhwaCmdList);1542 #endif1543 1544 1536 uint32_t flags = VBoxCommonFromDeviceExt(pDevExt)->hostCtx.pfHostFlags->u32HostFlags; 1545 1537 bOur = (flags & HGSMIHOSTFLAGS_IRQ); … … 1583 1575 switch (chInfo) 1584 1576 { 1585 #ifdef VBOX_WITH_VIDEOHWACCEL1586 case VBVA_VHWA_CMD:1587 {1588 vboxVhwaPutList(&VhwaCmdList, (VBOXVHWACMD*)pvCmd);1589 break;1590 }1591 #endif /* # ifdef VBOX_WITH_VIDEOHWACCEL */1592 1577 default: 1593 1578 AssertBreakpoint(); … … 1613 1598 bNeedDpc = TRUE; 1614 1599 } 1615 #ifdef VBOX_WITH_VIDEOHWACCEL1616 if (!vboxVtListIsEmpty(&VhwaCmdList))1617 {1618 vboxVtListCat(&pDevExt->VhwaCmdList, &VhwaCmdList);1619 bNeedDpc = TRUE;1620 }1621 #endif1622 1600 1623 1601 if (pDevExt->bNotifyDxDpc) … … 1675 1653 { 1676 1654 VBOXVTLIST CtlList; 1677 #ifdef VBOX_WITH_VIDEOHWACCEL1678 VBOXVTLIST VhwaCmdList;1679 #endif1680 1655 LIST_ENTRY CompletedDdiCmdQueue; 1681 1656 BOOL bNotifyDpc; … … 1693 1668 PVBOXMP_DEVEXT pDevExt = pdc->pDevExt; 1694 1669 vboxVtListDetach2List(&pDevExt->CtlList, &pdc->data.CtlList); 1695 #ifdef VBOX_WITH_VIDEOHWACCEL1696 vboxVtListDetach2List(&pDevExt->VhwaCmdList, &pdc->data.VhwaCmdList);1697 #endif1698 1670 1699 1671 pdc->data.bNotifyDpc = pDevExt->bNotifyDxDpc; … … 1734 1706 AssertRC(rc); 1735 1707 } 1736 #ifdef VBOX_WITH_VIDEOHWACCEL1737 if (!vboxVtListIsEmpty(&context.data.VhwaCmdList))1738 {1739 vboxVhwaCompletionListProcess(pDevExt, &context.data.VhwaCmdList);1740 }1741 #endif1742 1708 1743 1709 // LOGF(("LEAVE, context(0x%p)", MiniportDeviceContext)); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r106061 r108641 110 110 } VBOXWDDM_GLOBAL_POINTER_INFO, *PVBOXWDDM_GLOBAL_POINTER_INFO; 111 111 112 #ifdef VBOX_WITH_VIDEOHWACCEL113 typedef struct VBOXWDDM_VHWA114 {115 VBOXVHWA_INFO Settings;116 volatile uint32_t cOverlaysCreated;117 } VBOXWDDM_VHWA;118 #endif119 120 112 typedef struct VBOXWDDM_ADDR 121 113 { … … 153 145 BOOLEAN bBlankedByPowerOff; 154 146 VBOXVBVAINFO Vbva; 155 #ifdef VBOX_WITH_VIDEOHWACCEL156 /* @todo: in our case this seems more like a target property,157 * but keep it here for now */158 VBOXWDDM_VHWA Vhwa;159 volatile uint32_t cOverlays;160 LIST_ENTRY OverlayList;161 KSPIN_LOCK OverlayListLock;162 #endif163 147 KSPIN_LOCK AllocationLock; 164 148 POINT VScreenPos; … … 191 175 VBOXWDDM_ALLOC_TYPE enmType; 192 176 D3DDDI_RESOURCEFLAGS fRcFlags; 193 #ifdef VBOX_WITH_VIDEOHWACCEL194 VBOXVHWA_SURFHANDLE hHostHandle;195 #endif196 177 BOOLEAN fDeleted; 197 178 BOOLEAN bVisible; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r106061 r108641 29 29 #include "common/VBoxMPCommon.h" 30 30 #include "VBoxMPVdma.h" 31 #ifdef VBOX_WITH_VIDEOHWACCEL32 #include "VBoxMPVhwa.h"33 #endif34 31 #include <iprt/asm.h> 35 32 #include <iprt/mem.h> -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r106061 r108641 29 29 #include "common/VBoxMPCommon.h" 30 30 #include "common/VBoxMPHGSMI.h" 31 #ifdef VBOX_WITH_VIDEOHWACCEL32 # include "VBoxMPVhwa.h"33 #endif34 31 #include "VBoxMPVidPn.h" 35 32 #include "VBoxMPLegacy.h" … … 1090 1087 vboxShRcTreeInit(pDevExt); 1091 1088 #endif 1092 1093 #ifdef VBOX_WITH_VIDEOHWACCEL1094 vboxVhwaInit(pDevExt);1095 #endif1096 1089 VBoxWddmSlInit(pDevExt); 1097 1090 … … 1276 1269 1277 1270 /* do everything we did on DxgkDdiStartDevice in the reverse order */ 1278 #ifdef VBOX_WITH_VIDEOHWACCEL1279 vboxVhwaFree(pDevExt);1280 #endif1281 1271 #if 0 1282 1272 vboxShRcTreeTerm(pDevExt); … … 1687 1677 pCaps->NumberOfSwizzlingRanges = 0; 1688 1678 pCaps->MaxOverlays = 0; 1689 #ifdef VBOX_WITH_VIDEOHWACCEL1690 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)1691 {1692 if ( pDevExt->aSources[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)1693 pCaps->MaxOverlays += pDevExt->aSources[i].Vhwa.Settings.cOverlaysSupported;1694 }1695 #endif1696 1679 pCaps->GammaRampCaps.Value = 0; 1697 1680 pCaps->PresentationCaps.Value = 0; … … 1861 1844 GaQueryInfo(pDevExt->pGa, pDevExt->enmHwType, &pQAI->u.vmsvga.HWInfo); 1862 1845 #endif 1863 1864 #ifdef VBOX_WITH_VIDEOHWACCEL1865 pQAI->cInfos = VBoxCommonFromDeviceExt(pDevExt)->cDisplays;1866 for (uint32_t i = 0; i < pQAI->cInfos; ++i)1867 {1868 pQAI->aInfos[i] = pDevExt->aSources[i].Vhwa.Settings;1869 }1870 #endif1871 1846 } 1872 1847 else … … 2177 2152 break; 2178 2153 case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC: 2179 #ifdef VBOX_WITH_VIDEOHWACCEL 2180 if (pAllocInfo->fFlags.Overlay) 2154 { 2155 RT_NOREF(pDevExt); 2156 2157 Assert(pAllocation->AllocData.SurfDesc.bpp); 2158 Assert(pAllocation->AllocData.SurfDesc.pitch); 2159 Assert(pAllocation->AllocData.SurfDesc.cbSize); 2160 2161 /* 2162 * Mark the allocation as visible to the CPU so we can 2163 * lock it in the user mode driver for SYSTEM pool allocations. 2164 * See @bugref{8040} for further information. 2165 */ 2166 if (!pAllocInfo->fFlags.SharedResource && !pAllocInfo->hostID) 2167 pAllocationInfo->Flags.CpuVisible = 1; 2168 2169 if (pAllocInfo->fFlags.SharedResource) 2181 2170 { 2182 /* actually we can not "properly" issue create overlay commands to the host here 2183 * because we do not know source VidPn id here, i.e. 2184 * the primary which is supposed to be overlayed, 2185 * however we need to get some info like pitch & size from the host here */ 2186 int rc = vboxVhwaHlpGetSurfInfo(pDevExt, pAllocation); 2187 AssertRC(rc); 2188 if (RT_SUCCESS(rc)) 2171 pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle; 2172 #if 0 2173 if (pAllocation->hSharedHandle) 2189 2174 { 2190 pAllocationInfo->Flags.Overlay = 1; 2191 pAllocationInfo->Flags.CpuVisible = 1; 2192 pAllocationInfo->Size = pAllocation->AllocData.SurfDesc.cbSize; 2193 2194 pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_HIGH; 2195 } 2196 else 2197 Status = STATUS_UNSUCCESSFUL; 2198 } 2199 else 2200 #endif 2201 { 2202 RT_NOREF(pDevExt); 2203 2204 Assert(pAllocation->AllocData.SurfDesc.bpp); 2205 Assert(pAllocation->AllocData.SurfDesc.pitch); 2206 Assert(pAllocation->AllocData.SurfDesc.cbSize); 2207 2208 /* 2209 * Mark the allocation as visible to the CPU so we can 2210 * lock it in the user mode driver for SYSTEM pool allocations. 2211 * See @bugref{8040} for further information. 2212 */ 2213 if (!pAllocInfo->fFlags.SharedResource && !pAllocInfo->hostID) 2214 pAllocationInfo->Flags.CpuVisible = 1; 2215 2216 if (pAllocInfo->fFlags.SharedResource) 2217 { 2218 pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle; 2219 #if 0 2220 if (pAllocation->hSharedHandle) 2221 { 2222 vboxShRcTreePut(pDevExt, pAllocation); 2223 } 2224 #endif 2225 } 2226 2227 #if 0 2228 /* Allocation from the CPU invisible second segment does not 2229 * work apparently and actually fails on Vista. 2230 * 2231 * @todo Find out what exactly is wrong. 2232 */ 2233 // if (pAllocInfo->hostID) 2234 { 2235 pAllocationInfo->SupportedReadSegmentSet = 2; 2236 pAllocationInfo->SupportedWriteSegmentSet = 2; 2175 vboxShRcTreePut(pDevExt, pAllocation); 2237 2176 } 2238 2177 #endif 2239 2178 } 2179 2180 #if 0 2181 /* Allocation from the CPU invisible second segment does not 2182 * work apparently and actually fails on Vista. 2183 * 2184 * @todo Find out what exactly is wrong. 2185 */ 2186 // if (pAllocInfo->hostID) 2187 { 2188 pAllocationInfo->SupportedReadSegmentSet = 2; 2189 pAllocationInfo->SupportedWriteSegmentSet = 2; 2190 } 2191 #endif 2240 2192 break; 2193 } 2241 2194 case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE: 2242 2195 case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE: … … 2678 2631 { 2679 2632 #ifdef DEBUG_sunlover 2680 /** @todo Remove VBOX_WITH_VIDEOHWACCEL code, because the host does not support it anymore. */2681 2633 AssertFailed(); /* Should not be here, because this is not used with 3D gallium driver. */ 2682 2634 #endif … … 4332 4284 DXGKARG_CREATEOVERLAY *pCreateOverlay) 4333 4285 { 4334 LOGF(("ENTER, hAdapter(0x%p)", hAdapter));4335 4336 NTSTATUS Status = STATUS_SUCCESS;4337 4338 #ifdef VBOX_WITH_VIDEOHWACCEL4339 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;4340 PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OVERLAY));4341 Assert(pOverlay);4342 if (pOverlay)4343 {4344 int rc = vboxVhwaHlpOverlayCreate(pDevExt, pCreateOverlay->VidPnSourceId, &pCreateOverlay->OverlayInfo, pOverlay);4345 AssertRC(rc);4346 if (RT_SUCCESS(rc))4347 {4348 pCreateOverlay->hOverlay = pOverlay;4349 }4350 else4351 {4352 vboxWddmMemFree(pOverlay);4353 Status = STATUS_UNSUCCESSFUL;4354 }4355 }4356 else4357 Status = STATUS_NO_MEMORY;4358 #else4359 4286 RT_NOREF(hAdapter, pCreateOverlay); 4360 #endif 4361 4362 LOGF(("LEAVE, hAdapter(0x%p)", hAdapter)); 4363 4364 return Status; 4287 return STATUS_SUCCESS; 4365 4288 } 4366 4289 … … 4465 4388 break; 4466 4389 } 4467 4468 #ifdef VBOX_WITH_VIDEOHWACCEL4469 PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;4470 4471 if (pRcInfo->RcDesc.fFlags.Overlay)4472 {4473 /* we have queried host for some surface info, like pitch & size,4474 * need to return it back to the UMD (User Mode Drive) */4475 pAllocInfo->SurfDesc = pAllocation->AllocData.SurfDesc;4476 /* success, just continue */4477 }4478 #endif4479 4390 } 4480 4391 … … 4584 4495 CONST DXGKARG_UPDATEOVERLAY *pUpdateOverlay) 4585 4496 { 4586 LOGF(("ENTER, hOverlay(0x%p)", hOverlay));4587 4588 NTSTATUS Status = STATUS_SUCCESS;4589 4590 #ifdef VBOX_WITH_VIDEOHWACCEL4591 PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;4592 AssertPtr(pOverlay);4593 int rc = vboxVhwaHlpOverlayUpdate(pOverlay, &pUpdateOverlay->OverlayInfo);4594 AssertRC(rc);4595 if (RT_FAILURE(rc))4596 Status = STATUS_UNSUCCESSFUL;4597 #else4598 4497 RT_NOREF(hOverlay, pUpdateOverlay); 4599 #endif 4600 4601 LOGF(("LEAVE, hOverlay(0x%p)", hOverlay)); 4602 return Status; 4498 return STATUS_SUCCESS; 4603 4499 } 4604 4500 … … 4609 4505 CONST DXGKARG_FLIPOVERLAY *pFlipOverlay) 4610 4506 { 4611 LOGF(("ENTER, hOverlay(0x%p)", hOverlay));4612 4613 NTSTATUS Status = STATUS_SUCCESS;4614 4615 #ifdef VBOX_WITH_VIDEOHWACCEL4616 PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;4617 AssertPtr(pOverlay);4618 int rc = vboxVhwaHlpOverlayFlip(pOverlay, pFlipOverlay);4619 AssertRC(rc);4620 if (RT_FAILURE(rc))4621 Status = STATUS_UNSUCCESSFUL;4622 #else4623 4507 RT_NOREF(hOverlay, pFlipOverlay); 4624 #endif 4625 4626 LOGF(("LEAVE, hOverlay(0x%p)", hOverlay)); 4627 4628 return Status; 4508 return STATUS_SUCCESS; 4629 4509 } 4630 4510 … … 4634 4514 CONST HANDLE hOverlay) 4635 4515 { 4636 LOGF(("ENTER, hOverlay(0x%p)", hOverlay));4637 4638 NTSTATUS Status = STATUS_SUCCESS;4639 4640 #ifdef VBOX_WITH_VIDEOHWACCEL4641 PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;4642 AssertPtr(pOverlay);4643 int rc = vboxVhwaHlpOverlayDestroy(pOverlay);4644 AssertRC(rc);4645 if (RT_SUCCESS(rc))4646 vboxWddmMemFree(pOverlay);4647 else4648 Status = STATUS_UNSUCCESSFUL;4649 #else4650 4516 RT_NOREF(hOverlay); 4651 #endif 4652 4653 LOGF(("LEAVE, hOverlay(0x%p)", hOverlay)); 4654 4655 return Status; 4517 return STATUS_SUCCESS; 4656 4518 } 4657 4519 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/xpdm/VBoxMPDriver.cpp
r106504 r108641 557 557 } 558 558 559 #ifdef VBOX_WITH_VIDEOHWACCEL560 /* Returns framebuffer offset. */561 case IOCTL_VIDEO_VHWA_QUERY_INFO:562 {563 STARTIO_OUT(VHWAQUERYINFO, pInfo);564 565 bResult = VBoxMPVhwaQueryInfo(pExt, pInfo, pStatus);566 break;567 }568 #endif569 570 559 case IOCTL_VIDEO_VBOX_ISANYX: 571 560 { … … 704 693 return FALSE; 705 694 } 706 707 #ifdef VBOX_WITH_VIDEOHWACCEL708 static VOID VBoxMPHGSMIDpc(IN PVOID HwDeviceExtension, IN PVOID Context)709 {710 NOREF(Context);711 PVBOXMP_DEVEXT pExt = (PVBOXMP_DEVEXT) HwDeviceExtension;712 713 VBoxHGSMIProcessHostQueue(&VBoxCommonFromDeviceExt(pExt)->hostCtx);714 }715 716 static BOOLEAN717 VBoxDrvInterrupt(PVOID HwDeviceExtension)718 {719 PVBOXMP_DEVEXT pExt = (PVBOXMP_DEVEXT) HwDeviceExtension;720 721 //LOGF_ENTER();722 723 /* Check if it could be our IRQ*/724 if (VBoxCommonFromDeviceExt(pExt)->hostCtx.pfHostFlags)725 {726 uint32_t flags = VBoxCommonFromDeviceExt(pExt)->hostCtx.pfHostFlags->u32HostFlags;727 if ((flags & HGSMIHOSTFLAGS_IRQ) != 0)728 {729 /* queue a DPC*/730 BOOLEAN bResult = pExt->pPrimary->u.primary.VideoPortProcs.pfnQueueDpc(pExt->pPrimary, VBoxMPHGSMIDpc, NULL);731 732 if (!bResult)733 {734 LOG(("VideoPortQueueDpc failed!"));735 }736 737 /* clear the IRQ */738 VBoxHGSMIClearIrq(&VBoxCommonFromDeviceExt(pExt)->hostCtx);739 //LOGF_LEAVE();740 return TRUE;741 }742 }743 744 //LOGF_LEAVE();745 return FALSE;746 }747 #endif748 695 749 696 /* Video Miniport Driver entry point */ … … 780 727 /*Optional callbacks*/ 781 728 vhwData.HwResetHw = VBoxDrvResetHW; 782 #ifdef VBOX_WITH_VIDEOHWACCEL783 vhwData.HwInterrupt = VBoxDrvInterrupt;784 #endif785 729 786 730 /*Our private storage space*/ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/xpdm/VBoxMPIOCTL.cpp
r106061 r108641 647 647 } 648 648 649 #ifdef VBOX_WITH_VIDEOHWACCEL650 /* Called for IOCTL_VIDEO_VHWA_QUERY_INFO.651 * Returns framebuffer offset.652 */653 BOOLEAN VBoxMPVhwaQueryInfo(PVBOXMP_DEVEXT pExt, VHWAQUERYINFO *pInfo, PSTATUS_BLOCK pStatus)654 {655 BOOLEAN fRc = TRUE;656 LOGF_ENTER();657 658 if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)659 {660 pInfo->offVramBase = (ULONG_PTR)pExt->ulFrameBufferOffset;661 662 pStatus->Information = sizeof (VHWAQUERYINFO);663 }664 else665 {666 pStatus->Status = ERROR_INVALID_FUNCTION;667 fRc=FALSE;668 }669 670 LOGF_LEAVE();671 return fRc;672 }673 #endif674 675 649 BOOLEAN VBoxMPQueryRegistryFlags(PVBOXMP_DEVEXT pExt, ULONG *pulFlags, PSTATUS_BLOCK pStatus) 676 650 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/xpdm/VBoxMPInternal.h
r106061 r108641 75 75 BOOLEAN VBoxMPQueryHgsmiInfo(PVBOXMP_DEVEXT pExt, QUERYHGSMIRESULT *pResult, PSTATUS_BLOCK pStatus); 76 76 BOOLEAN VBoxMPHgsmiHandlerEnable(PVBOXMP_DEVEXT pExt, HGSMIHANDLERENABLE *pChannel, PSTATUS_BLOCK pStatus); 77 #ifdef VBOX_WITH_VIDEOHWACCEL78 BOOLEAN VBoxMPVhwaQueryInfo(PVBOXMP_DEVEXT pExt, VHWAQUERYINFO *pInfo, PSTATUS_BLOCK pStatus);79 #endif80 77 BOOLEAN VBoxMPQueryRegistryFlags(PVBOXMP_DEVEXT pExt, ULONG *pulFlags, PSTATUS_BLOCK pStatus); 81 78 -
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r108047 r108641 3319 3319 case VGA_PORT_HGSMI_HOST: /* Host */ 3320 3320 { 3321 # if defined(VBOX_WITH_V IDEOHWACCEL) || defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM)3321 # if defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM) 3322 3322 if (u32 == HGSMIOFFSET_VOID) 3323 3323 { … … 4774 4774 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThisCC->IBase); 4775 4775 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIDISPLAYPORT, &pThisCC->IPort); 4776 # if defined(VBOX_WITH_HGSMI) && defined(VBOX_WITH_VIDEOHWACCEL) 4777 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIDISPLAYVBVACALLBACKS, &pThisCC->IVBVACallbacks); 4778 # endif 4776 /* pThisCC->IVBVACallbacks not used currently. */ 4779 4777 PDMIBASE_RETURN_INTERFACE(pszIID, PDMILEDPORTS, &pThisCC->ILeds); 4780 4778 return NULL; … … 5570 5568 PDMDevHlpTimerSetMillies(pDevIns, hTimer, pThis->cMilliesRefreshInterval); 5571 5569 5572 # ifdef VBOX_WITH_VIDEOHWACCEL5573 vbvaTimerCb(pDevIns, pThis, pThisCC);5574 # endif5575 5576 5570 # ifdef VBOX_WITH_VMSVGA 5577 5571 /* … … 5827 5821 static DECLCALLBACK(int) vgaR3SavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 5828 5822 { 5829 # ifdef VBOX_WITH_VIDEOHWACCEL5830 RT_NOREF(pSSM);5831 return vboxVBVASaveStatePrep(pDevIns);5832 # else5833 5823 RT_NOREF(pDevIns, pSSM); 5834 5824 return VINF_SUCCESS; 5835 # endif5836 5825 } 5837 5826 … … 5842 5831 static DECLCALLBACK(int) vgaR3SaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 5843 5832 { 5844 # ifdef VBOX_WITH_VIDEOHWACCEL5845 RT_NOREF(pSSM);5846 return vboxVBVASaveStateDone(pDevIns);5847 # else5848 5833 RT_NOREF(pDevIns, pSSM); 5849 5834 return VINF_SUCCESS; 5850 # endif5851 5835 } 5852 5836 … … 6258 6242 rc = VERR_INTERNAL_ERROR; 6259 6243 } 6260 # ifdef VBOX_WITH_VIDEOHWACCEL6261 if(rc == VINF_SUCCESS)6262 {6263 rc = vbvaVHWAConstruct(pDevIns, pThis, pThisCC);6264 if (rc != VERR_NOT_IMPLEMENTED)6265 AssertRC(rc);6266 }6267 # endif6268 6244 } 6269 6245 else … … 6376 6352 } 6377 6353 6378 # if defined(VBOX_WITH_V IDEOHWACCEL) || defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM)6354 # if defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM) 6379 6355 PDMDevHlpCritSectDelete(pDevIns, &pThis->CritSectIRQ); 6380 6356 # endif … … 6629 6605 PDMPciDevSetClassBase(pPciDev, 0x03); 6630 6606 PDMPciDevSetHeaderType(pPciDev, 0x00); 6631 # if defined(VBOX_WITH_HGSMI) && (defined(VBOX_WITH_V IDEOHWACCEL) || defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM))6607 # if defined(VBOX_WITH_HGSMI) && (defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM)) 6632 6608 PDMPciDevSetInterruptPin(pPciDev, 1); 6633 6609 # endif … … 6658 6634 pThisCC->IPort.pfnReportHostCursorCapabilities = vgaR3PortReportHostCursorCapabilities; 6659 6635 pThisCC->IPort.pfnReportHostCursorPosition = vgaR3PortReportHostCursorPosition; 6660 6661 # if defined(VBOX_WITH_HGSMI) && defined(VBOX_WITH_VIDEOHWACCEL)6662 pThisCC->IVBVACallbacks.pfnVHWACommandCompleteAsync = vbvaR3VHWACommandCompleteAsync;6663 # endif6664 6636 6665 6637 pThisCC->ILeds.pfnQueryStatusLed = vgaR3PortQueryStatusLed; -
trunk/src/VBox/Devices/Graphics/DevVGA.h
r106061 r108641 281 281 #endif 282 282 283 #ifdef VBOX_WITH_VIDEOHWACCEL284 #define VBOX_VHWA_MAX_PENDING_COMMANDS 1000285 286 typedef struct _VBOX_VHWA_PENDINGCMD287 {288 RTLISTNODE Node;289 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand;290 } VBOX_VHWA_PENDINGCMD;291 #endif292 293 294 283 /** 295 284 * The shared VGA state data. … … 577 566 /** LUN\#0: The display port interface. */ 578 567 PDMIDISPLAYPORT IPort; 579 #ifdef VBOX_WITH_HGSMI580 /** LUN\#0: VBVA callbacks interface */581 PDMIDISPLAYVBVACALLBACKS IVBVACallbacks;582 #endif583 568 /** Status LUN: Leds interface. */ 584 569 PDMILEDPORTS ILeds; … … 728 713 #endif 729 714 730 # ifdef VBOX_WITH_VIDEOHWACCEL731 DECLCALLBACK(int) vbvaR3VHWACommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface,732 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd);733 int vbvaVHWAConstruct(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC);734 735 void vbvaTimerCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC);736 737 int vboxVBVASaveStatePrep(PPDMDEVINS pDevIns);738 int vboxVBVASaveStateDone(PPDMDEVINS pDevIns);739 # endif740 741 715 int vboxVBVASaveStateExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM); 742 716 int vboxVBVALoadStateExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Version); -
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r107630 r108641 43 43 #include <iprt/string.h> 44 44 #include <iprt/param.h> 45 #ifdef VBOX_WITH_VIDEOHWACCEL46 #include <iprt/semaphore.h>47 #endif48 45 49 46 #include "DevVGA.h" … … 857 854 #define VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC 0x9abcdef0 858 855 859 #ifdef VBOX_WITH_VIDEOHWACCEL860 861 static void vbvaVHWAHHCommandReinit(VBOXVHWACMD* pHdr, VBOXVHWACMD_TYPE enmCmd, int32_t iDisplay)862 {863 memset(pHdr, 0, VBOXVHWACMD_HEADSIZE());864 pHdr->cRefs = 1;865 pHdr->iDisplay = iDisplay;866 pHdr->rc = VERR_NOT_IMPLEMENTED;867 pHdr->enmCmd = enmCmd;868 pHdr->Flags = VBOXVHWACMD_FLAG_HH_CMD;869 }870 871 static VBOXVHWACMD *vbvaVHWAHHCommandCreate(VBOXVHWACMD_TYPE enmCmd, int32_t iDisplay, VBOXVHWACMD_LENGTH cbCmd)872 {873 VBOXVHWACMD *pHdr = (VBOXVHWACMD *)RTMemAllocZ(cbCmd + VBOXVHWACMD_HEADSIZE());874 Assert(pHdr);875 if (pHdr)876 vbvaVHWAHHCommandReinit(pHdr, enmCmd, iDisplay);877 878 return pHdr;879 }880 881 DECLINLINE(void) vbvaVHWAHHCommandRelease(VBOXVHWACMD *pCmd)882 {883 uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs);884 if (!cRefs)885 RTMemFree(pCmd);886 }887 888 DECLINLINE(void) vbvaVHWAHHCommandRetain(VBOXVHWACMD *pCmd)889 {890 ASMAtomicIncU32(&pCmd->cRefs);891 }892 893 static void vbvaVHWACommandComplete(PVGASTATECC pThisCC, VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand, bool fAsyncCommand)894 {895 if (fAsyncCommand)896 {897 Assert(pCommand->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH);898 vbvaR3VHWACommandCompleteAsync(&pThisCC->IVBVACallbacks, pCommand);899 }900 else901 {902 Log(("VGA Command <<< Sync rc %d %#p, %d\n", pCommand->rc, pCommand, pCommand->enmCmd));903 pCommand->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;904 }905 906 }907 908 static void vbvaVHWACommandCompleteAllPending(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, int rc)909 {910 if (!ASMAtomicUoReadU32(&pThis->pendingVhwaCommands.cPending))911 return;912 913 int const rcLock = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VERR_SEM_BUSY);914 PDM_CRITSECT_RELEASE_ASSERT_RC_DEV(pDevIns, &pThis->CritSect, rcLock);915 916 VBOX_VHWA_PENDINGCMD *pIter, *pNext;917 RTListForEachSafe(&pThis->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)918 {919 pIter->pCommand->rc = rc;920 vbvaVHWACommandComplete(pThisCC, pIter->pCommand, true);921 922 /* the command is submitted/processed, remove from the pend list */923 RTListNodeRemove(&pIter->Node);924 ASMAtomicDecU32(&pThis->pendingVhwaCommands.cPending);925 RTMemFree(pIter);926 }927 928 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);929 }930 931 static void vbvaVHWACommandClearAllPending(PPDMDEVINS pDevIns, PVGASTATE pThis)932 {933 if (!ASMAtomicUoReadU32(&pThis->pendingVhwaCommands.cPending))934 return;935 936 int const rcLock = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VERR_SEM_BUSY);937 PDM_CRITSECT_RELEASE_ASSERT_RC_DEV(pDevIns, &pThis->CritSect, rcLock);938 939 VBOX_VHWA_PENDINGCMD *pIter, *pNext;940 RTListForEachSafe(&pThis->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)941 {942 RTListNodeRemove(&pIter->Node);943 ASMAtomicDecU32(&pThis->pendingVhwaCommands.cPending);944 RTMemFree(pIter);945 }946 947 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);948 }949 950 static void vbvaVHWACommandPend(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,951 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand)952 {953 int rc = VERR_BUFFER_OVERFLOW;954 955 if (ASMAtomicUoReadU32(&pThis->pendingVhwaCommands.cPending) < VBOX_VHWA_MAX_PENDING_COMMANDS)956 {957 VBOX_VHWA_PENDINGCMD *pPend = (VBOX_VHWA_PENDINGCMD *)RTMemAlloc(sizeof(*pPend));958 if (pPend)959 {960 pCommand->Flags |= VBOXVHWACMD_FLAG_HG_ASYNCH;961 pPend->pCommand = pCommand;962 963 int const rcLock = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VERR_SEM_BUSY);964 PDM_CRITSECT_RELEASE_ASSERT_RC_DEV(pDevIns, &pThis->CritSect, rcLock);965 966 if (ASMAtomicUoReadU32(&pThis->pendingVhwaCommands.cPending) < VBOX_VHWA_MAX_PENDING_COMMANDS)967 {968 RTListAppend(&pThis->pendingVhwaCommands.PendingList, &pPend->Node);969 ASMAtomicIncU32(&pThis->pendingVhwaCommands.cPending);970 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);971 return;972 }973 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);974 LogRel(("VBVA: Pending command count has reached its threshold.. completing them all.."));975 RTMemFree(pPend);976 }977 else978 rc = VERR_NO_MEMORY;979 }980 else981 LogRel(("VBVA: Pending command count has reached its threshold, completing them all.."));982 983 vbvaVHWACommandCompleteAllPending(pDevIns, pThis, pThisCC, rc);984 985 pCommand->rc = rc;986 987 vbvaVHWACommandComplete(pThisCC, pCommand, false);988 }989 990 static bool vbvaVHWACommandCanPend(VBOXVHWACMD_TYPE enmCmd)991 {992 switch (enmCmd)993 {994 case VBOXVHWACMD_TYPE_HH_CONSTRUCT:995 case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN:996 case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND:997 case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM:998 case VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM:999 return false;1000 default:1001 return true;1002 }1003 }1004 1005 static int vbvaVHWACommandSavePending(PCPDMDEVHLPR3 pHlp, PVGASTATE pThis, PVGASTATECC pThisCC, PSSMHANDLE pSSM)1006 {1007 int rc = pHlp->pfnSSMPutU32(pSSM, pThis->pendingVhwaCommands.cPending);1008 AssertRCReturn(rc, rc);1009 1010 VBOX_VHWA_PENDINGCMD *pIter;1011 RTListForEach(&pThis->pendingVhwaCommands.PendingList, pIter, VBOX_VHWA_PENDINGCMD, Node)1012 {1013 AssertContinue((uintptr_t)pIter->pCommand - (uintptr_t)pThisCC->pbVRam < pThis->vram_size);1014 rc = pHlp->pfnSSMPutU32(pSSM, (uint32_t)(((uint8_t *)pIter->pCommand) - ((uint8_t *)pThisCC->pbVRam)));1015 AssertRCReturn(rc, rc);1016 }1017 return rc;1018 }1019 1020 static int vbvaVHWACommandLoadPending(PPDMDEVINS pDevIns, PCPDMDEVHLPR3 pHlp, PVGASTATE pThis, PVGASTATECC pThisCC,1021 PSSMHANDLE pSSM, uint32_t u32Version)1022 {1023 if (u32Version < VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA)1024 return VINF_SUCCESS;1025 1026 uint32_t u32;1027 int rc = pHlp->pfnSSMGetU32(pSSM, &u32);1028 AssertRCReturn(rc, rc);1029 for (uint32_t i = 0; i < u32; ++i)1030 {1031 uint32_t off32;1032 rc = pHlp->pfnSSMGetU32(pSSM, &off32);1033 AssertRCReturn(rc, rc);1034 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand1035 = (VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *)((uint8_t volatile *)pThisCC->pbVRam + off32);1036 vbvaVHWACommandPend(pDevIns, pThis, pThisCC, pCommand);1037 }1038 return rc;1039 }1040 1041 1042 /** Worker for vbvaVHWACommandSubmit. */1043 static bool vbvaVHWACommandSubmitInner(PVGASTATE pThis, PVGASTATECC pThisCC,1044 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand, bool *pfPending)1045 {1046 *pfPending = false;1047 1048 /*1049 * Read the command type and validate it and our driver state.1050 */1051 VBOXVHWACMD_TYPE enmCmd = pCommand->enmCmd;1052 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();1053 1054 bool fGuestCmd = (uintptr_t)pCommand - (uintptr_t)pThisCC->pbVRam < pThis->vram_size;1055 ASSERT_GUEST_LOGREL_MSG_STMT_RETURN( !fGuestCmd1056 || ( enmCmd != VBOXVHWACMD_TYPE_HH_CONSTRUCT1057 && enmCmd != VBOXVHWACMD_TYPE_HH_RESET1058 && enmCmd != VBOXVHWACMD_TYPE_HH_DISABLE1059 && enmCmd != VBOXVHWACMD_TYPE_HH_ENABLE1060 && enmCmd != VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN1061 && enmCmd != VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND1062 && enmCmd != VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM1063 && enmCmd != VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM),1064 ("enmCmd=%d\n", enmCmd),1065 pCommand->rc = VERR_INVALID_PARAMETER,1066 true);1067 ASSERT_GUEST_STMT_RETURN(pThisCC->pDrv->pfnVHWACommandProcess, pCommand->rc = VERR_INVALID_STATE, true);1068 RT_UNTRUSTED_VALIDATED_FENCE();1069 1070 /*1071 * Call the driver to process the command.1072 */1073 Log(("VGA Command >>> %#p, %d\n", pCommand, enmCmd));1074 int rc = pThisCC->pDrv->pfnVHWACommandProcess(pThisCC->pDrv, enmCmd, fGuestCmd, pCommand);1075 if (rc == VINF_CALLBACK_RETURN)1076 {1077 Log(("VGA Command --- Going Async %#p, %d\n", pCommand, enmCmd));1078 *pfPending = true;1079 return true; /* Command will be completed asynchronously by the driver and need not be put in the pending list. */1080 }1081 1082 if (rc == VERR_INVALID_STATE)1083 {1084 Log(("VGA Command --- Trying Pend %#p, %d\n", pCommand, enmCmd));1085 if (vbvaVHWACommandCanPend(enmCmd))1086 {1087 Log(("VGA Command --- Can Pend %#p, %d\n", pCommand, enmCmd));1088 *pfPending = true;1089 return false; /* put on pending list so it can be retried?? */1090 }1091 1092 Log(("VGA Command --- Can NOT Pend %#p, %d\n", pCommand, enmCmd));1093 }1094 else1095 Log(("VGA Command --- Going Complete Sync rc %d %#p, %d\n", rc, pCommand, enmCmd));1096 1097 /* the command was completed, take a special care about it (see caller) */1098 pCommand->rc = rc;1099 return true;1100 }1101 1102 1103 static bool vbvaVHWACommandSubmit(PVGASTATE pThis, PVGASTATECC pThisCC,1104 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand, bool fAsyncCommand)1105 {1106 bool fPending = false;1107 bool fRet = vbvaVHWACommandSubmitInner(pThis, pThisCC, pCommand, &fPending);1108 if (!fPending)1109 vbvaVHWACommandComplete(pThisCC, pCommand, fAsyncCommand);1110 return fRet;1111 }1112 1113 1114 /**1115 * @returns false if commands are pending, otherwise true.1116 */1117 static bool vbvaVHWACheckPendingCommands(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC)1118 {1119 if (!ASMAtomicUoReadU32(&pThis->pendingVhwaCommands.cPending))1120 return true;1121 1122 int const rcLock = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VERR_SEM_BUSY);1123 PDM_CRITSECT_RELEASE_ASSERT_RC_DEV(pDevIns, &pThis->CritSect, rcLock);1124 1125 VBOX_VHWA_PENDINGCMD *pIter, *pNext;1126 RTListForEachSafe(&pThis->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)1127 {1128 if (!vbvaVHWACommandSubmit(pThis, pThisCC, pIter->pCommand, true))1129 {1130 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);1131 return false; /* the command should be still pending */1132 }1133 1134 /* the command is submitted/processed, remove from the pend list */1135 RTListNodeRemove(&pIter->Node);1136 ASMAtomicDecU32(&pThis->pendingVhwaCommands.cPending);1137 RTMemFree(pIter);1138 }1139 1140 PDMDevHlpCritSectLeave(pDevIns, &pThis->CritSect);1141 1142 return true;1143 }1144 1145 void vbvaTimerCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC)1146 {1147 vbvaVHWACheckPendingCommands(pDevIns, pThis, pThisCC);1148 }1149 1150 static void vbvaVHWAHandleCommand(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1151 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd)1152 {1153 if (vbvaVHWACheckPendingCommands(pDevIns, pThis, pThisCC))1154 {1155 if (vbvaVHWACommandSubmit(pThis, pThisCC, pCmd, false))1156 return;1157 }1158 1159 vbvaVHWACommandPend(pDevIns, pThis, pThisCC, pCmd);1160 }1161 1162 static DECLCALLBACK(void) vbvaVHWAHHCommandSetEventCallback(void * pContext)1163 {1164 RTSemEventSignal((RTSEMEVENT)pContext);1165 }1166 1167 static int vbvaVHWAHHCommandPost(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, VBOXVHWACMD *pCmd)1168 {1169 RTSEMEVENT hComplEvent;1170 int rc = RTSemEventCreate(&hComplEvent);1171 AssertRC(rc);1172 if (RT_SUCCESS(rc))1173 {1174 /* ensure the cmd is not deleted until we process it */1175 vbvaVHWAHHCommandRetain(pCmd);1176 1177 VBOXVHWA_HH_CALLBACK_SET(pCmd, vbvaVHWAHHCommandSetEventCallback, (void *)hComplEvent);1178 vbvaVHWAHandleCommand(pDevIns, pThis, pThisCC, pCmd);1179 1180 if ((ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_HG_ASYNCH) != 0)1181 rc = RTSemEventWaitNoResume(hComplEvent, RT_INDEFINITE_WAIT); /** @todo Why the NoResume and event leaking here? */1182 /* else: the command is completed */1183 1184 AssertRC(rc);1185 if (RT_SUCCESS(rc))1186 RTSemEventDestroy(hComplEvent);1187 1188 vbvaVHWAHHCommandRelease(pCmd);1189 }1190 return rc;1191 }1192 1193 int vbvaVHWAConstruct(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC)1194 {1195 pThis->pendingVhwaCommands.cPending = 0;1196 RTListInit(&pThis->pendingVhwaCommands.PendingList);1197 1198 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(VBOXVHWACMD_TYPE_HH_CONSTRUCT, 0, sizeof(VBOXVHWACMD_HH_CONSTRUCT));1199 Assert(pCmd);1200 if(pCmd)1201 {1202 uint32_t iDisplay = 0;1203 int rc = VINF_SUCCESS;1204 VBOXVHWACMD_HH_CONSTRUCT *pBody = VBOXVHWACMD_BODY_HOST_HEAP(pCmd, VBOXVHWACMD_HH_CONSTRUCT);1205 1206 for (;;)1207 {1208 memset(pBody, 0, sizeof(VBOXVHWACMD_HH_CONSTRUCT));1209 1210 PVM pVM = PDMDevHlpGetVM(pDevIns);1211 1212 pBody->pVM = pVM;1213 pBody->pvVRAM = pThisCC->pbVRam;1214 pBody->cbVRAM = pThis->vram_size;1215 1216 rc = vbvaVHWAHHCommandPost(pDevIns, pThis, pThisCC, pCmd);1217 ASMCompilerBarrier();1218 1219 AssertRC(rc);1220 if (RT_SUCCESS(rc))1221 {1222 rc = pCmd->rc;1223 AssertMsg(RT_SUCCESS(rc) || rc == VERR_NOT_IMPLEMENTED, ("%Rrc\n", rc));1224 if(rc == VERR_NOT_IMPLEMENTED)1225 {1226 /** @todo set some flag in pThis indicating VHWA is not supported */1227 /* VERR_NOT_IMPLEMENTED is not a failure, we just do not support it */1228 rc = VINF_SUCCESS;1229 }1230 1231 if (!RT_SUCCESS(rc))1232 break;1233 }1234 else1235 break;1236 1237 ++iDisplay;1238 if (iDisplay >= pThis->cMonitors)1239 break;1240 vbvaVHWAHHCommandReinit(pCmd, VBOXVHWACMD_TYPE_HH_CONSTRUCT, (int32_t)iDisplay);1241 }1242 1243 vbvaVHWAHHCommandRelease(pCmd);1244 1245 return rc;1246 }1247 return VERR_OUT_OF_RESOURCES;1248 }1249 1250 static int vbvaVHWAReset(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC)1251 {1252 vbvaVHWACommandClearAllPending(pDevIns, pThis);1253 1254 /* ensure we have all pending cmds processed and h->g cmds disabled */1255 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(VBOXVHWACMD_TYPE_HH_RESET, 0, 0);1256 Assert(pCmd);1257 if (pCmd)1258 {1259 int rc = VINF_SUCCESS;1260 uint32_t iDisplay = 0;1261 1262 do1263 {1264 rc = vbvaVHWAHHCommandPost(pDevIns, pThis, pThisCC, pCmd);1265 AssertRC(rc);1266 if(RT_SUCCESS(rc))1267 {1268 rc = pCmd->rc;1269 AssertMsg(RT_SUCCESS(rc) || rc == VERR_NOT_IMPLEMENTED, ("%Rrc\n", rc));1270 if (rc == VERR_NOT_IMPLEMENTED)1271 rc = VINF_SUCCESS;1272 }1273 1274 if (!RT_SUCCESS(rc))1275 break;1276 1277 ++iDisplay;1278 if (iDisplay >= pThis->cMonitors)1279 break;1280 vbvaVHWAHHCommandReinit(pCmd, VBOXVHWACMD_TYPE_HH_RESET, (int32_t)iDisplay);1281 1282 } while (true);1283 1284 vbvaVHWAHHCommandRelease(pCmd);1285 1286 return rc;1287 }1288 return VERR_OUT_OF_RESOURCES;1289 }1290 1291 typedef DECLCALLBACKTYPE(bool, FNVBOXVHWAHHCMDPRECB,(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, VBOXVHWACMD *pCmd,1292 uint32_t iDisplay, void *pvContext));1293 typedef FNVBOXVHWAHHCMDPRECB *PFNVBOXVHWAHHCMDPRECB;1294 1295 typedef DECLCALLBACKTYPE(bool, FNVBOXVHWAHHCMDPOSTCB,(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, VBOXVHWACMD *pCmd,1296 uint32_t iDisplay, int rc, void *pvContext));1297 typedef FNVBOXVHWAHHCMDPOSTCB *PFNVBOXVHWAHHCMDPOSTCB;1298 1299 static int vbvaVHWAHHPost(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, VBOXVHWACMD *pCmd,1300 PFNVBOXVHWAHHCMDPRECB pfnPre, PFNVBOXVHWAHHCMDPOSTCB pfnPost, void *pvContext)1301 {1302 const VBOXVHWACMD_TYPE enmType = pCmd->enmCmd;1303 int rc = VINF_SUCCESS;1304 uint32_t iDisplay = 0;1305 1306 do1307 {1308 if (!pfnPre || pfnPre(pDevIns, pThis, pThisCC, pCmd, iDisplay, pvContext))1309 {1310 rc = vbvaVHWAHHCommandPost(pDevIns, pThis, pThisCC, pCmd);1311 AssertRC(rc);1312 if (pfnPost)1313 {1314 if (!pfnPost(pDevIns, pThis, pThisCC, pCmd, iDisplay, rc, pvContext))1315 {1316 rc = VINF_SUCCESS;1317 break;1318 }1319 rc = VINF_SUCCESS;1320 }1321 else if(RT_SUCCESS(rc))1322 {1323 rc = pCmd->rc;1324 AssertMsg(RT_SUCCESS(rc) || rc == VERR_NOT_IMPLEMENTED, ("%Rrc\n", rc));1325 if(rc == VERR_NOT_IMPLEMENTED)1326 {1327 rc = VINF_SUCCESS;1328 }1329 }1330 1331 if (!RT_SUCCESS(rc))1332 break;1333 }1334 1335 ++iDisplay;1336 if (iDisplay >= pThis->cMonitors)1337 break;1338 vbvaVHWAHHCommandReinit(pCmd, enmType, (int32_t)iDisplay);1339 } while (true);1340 1341 return rc;1342 }1343 1344 /** @todo call this also on reset? */1345 static int vbvaVHWAEnable(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, bool bEnable)1346 {1347 const VBOXVHWACMD_TYPE enmType = bEnable ? VBOXVHWACMD_TYPE_HH_ENABLE : VBOXVHWACMD_TYPE_HH_DISABLE;1348 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(enmType, 0, 0);1349 Assert(pCmd);1350 if(pCmd)1351 {1352 int rc = vbvaVHWAHHPost(pDevIns, pThis, pThisCC, pCmd, NULL, NULL, NULL);1353 vbvaVHWAHHCommandRelease(pCmd);1354 return rc;1355 }1356 return VERR_OUT_OF_RESOURCES;1357 }1358 1359 int vboxVBVASaveStatePrep(PPDMDEVINS pDevIns)1360 {1361 /* ensure we have no pending commands */1362 return vbvaVHWAEnable(pDevIns, PDMDEVINS_2_DATA(pDevIns, PVGASTATE), PDMDEVINS_2_DATA_CC(pDevIns, PVGASTATECC), false);1363 }1364 1365 int vboxVBVASaveStateDone(PPDMDEVINS pDevIns)1366 {1367 /* ensure we have no pending commands */1368 return vbvaVHWAEnable(pDevIns, PDMDEVINS_2_DATA(pDevIns, PVGASTATE), PDMDEVINS_2_DATA_CC(pDevIns, PVGASTATECC), true);1369 }1370 1371 1372 /**1373 * @interface_method_impl{PDMIDISPLAYVBVACALLBACKS,pfnVHWACommandCompleteAsync}1374 */1375 DECLCALLBACK(int) vbvaR3VHWACommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface,1376 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd)1377 {1378 PVGASTATECC pThisCC = RT_FROM_MEMBER(pInterface, VGASTATECC, IVBVACallbacks);1379 PPDMDEVINS pDevIns = pThisCC->pDevIns;1380 PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE);1381 int rc;1382 1383 Log(("VGA Command <<< Async rc %d %#p, %d\n", pCmd->rc, pCmd, pCmd->enmCmd));1384 1385 if ((uintptr_t)pCmd - (uintptr_t)pThisCC->pbVRam < pThis->vram_size)1386 {1387 PHGSMIINSTANCE pIns = pThisCC->pHGSMI;1388 Assert(!(pCmd->Flags & VBOXVHWACMD_FLAG_HH_CMD));1389 Assert(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH);1390 #ifdef VBOX_WITH_WDDM1391 if (pThis->fGuestCaps & VBVACAPS_COMPLETEGCMD_BY_IOREAD)1392 {1393 rc = HGSMICompleteGuestCommand(pIns, pCmd, !!(pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ));1394 AssertRC(rc);1395 }1396 else1397 #endif1398 {1399 VBVAHOSTCMD RT_UNTRUSTED_VOLATILE_GUEST *pHostCmd = NULL; /* Shut up MSC. */1400 if (pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_EVENT)1401 {1402 rc = HGSMIHostCommandAlloc(pIns,1403 (void RT_UNTRUSTED_VOLATILE_GUEST **)&pHostCmd,1404 VBVAHOSTCMD_SIZE(sizeof(VBVAHOSTCMDEVENT)),1405 HGSMI_CH_VBVA,1406 VBVAHG_EVENT);1407 AssertRC(rc);1408 if (RT_SUCCESS(rc))1409 {1410 memset((void *)pHostCmd, 0 , VBVAHOSTCMD_SIZE(sizeof(VBVAHOSTCMDEVENT)));1411 pHostCmd->iDstID = pCmd->iDisplay;1412 pHostCmd->customOpCode = 0;1413 VBVAHOSTCMDEVENT RT_UNTRUSTED_VOLATILE_GUEST *pBody = VBVAHOSTCMD_BODY(pHostCmd, VBVAHOSTCMDEVENT);1414 pBody->pEvent = pCmd->GuestVBVAReserved1;1415 }1416 }1417 else1418 {1419 HGSMIOFFSET offCmd = HGSMIPointerToOffsetHost(pIns, pCmd);1420 Assert(offCmd != HGSMIOFFSET_VOID);1421 if (offCmd != HGSMIOFFSET_VOID)1422 {1423 rc = HGSMIHostCommandAlloc(pIns,1424 (void RT_UNTRUSTED_VOLATILE_GUEST **)&pHostCmd,1425 VBVAHOSTCMD_SIZE(sizeof(VBVAHOSTCMDVHWACMDCOMPLETE)),1426 HGSMI_CH_VBVA,1427 VBVAHG_DISPLAY_CUSTOM);1428 AssertRC(rc);1429 if (RT_SUCCESS(rc))1430 {1431 memset((void *)pHostCmd, 0 , VBVAHOSTCMD_SIZE(sizeof(VBVAHOSTCMDVHWACMDCOMPLETE)));1432 pHostCmd->iDstID = pCmd->iDisplay;1433 pHostCmd->customOpCode = VBVAHG_DCUSTOM_VHWA_CMDCOMPLETE;1434 VBVAHOSTCMDVHWACMDCOMPLETE RT_UNTRUSTED_VOLATILE_GUEST *pBody1435 = VBVAHOSTCMD_BODY(pHostCmd, VBVAHOSTCMDVHWACMDCOMPLETE);1436 pBody->offCmd = offCmd;1437 }1438 }1439 else1440 rc = VERR_INVALID_PARAMETER;1441 }1442 1443 if (RT_SUCCESS(rc))1444 {1445 rc = HGSMIHostCommandSubmitAndFreeAsynch(pIns, pHostCmd, RT_BOOL(pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ));1446 AssertRC(rc);1447 if (RT_SUCCESS(rc))1448 return rc;1449 1450 HGSMIHostCommandFree (pIns, pHostCmd);1451 }1452 }1453 }1454 else1455 {1456 Assert(pCmd->Flags & VBOXVHWACMD_FLAG_HH_CMD);1457 PFNVBOXVHWA_HH_CALLBACK pfn = VBOXVHWA_HH_CALLBACK_GET(pCmd);1458 if (pfn)1459 pfn(VBOXVHWA_HH_CALLBACK_GET_ARG(pCmd));1460 rc = VINF_SUCCESS;1461 }1462 return rc;1463 }1464 1465 typedef struct VBOXVBVASAVEDSTATECBDATA1466 {1467 PSSMHANDLE pSSM;1468 int rc;1469 bool ab2DOn[VBOX_VIDEO_MAX_SCREENS];1470 } VBOXVBVASAVEDSTATECBDATA, *PVBOXVBVASAVEDSTATECBDATA;1471 1472 /**1473 * @callback_method_impl{FNVBOXVHWAHHCMDPOSTCB}1474 */1475 static DECLCALLBACK(bool) vboxVBVASaveStateBeginPostCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1476 VBOXVHWACMD *pCmd, uint32_t iDisplay, int rc, void *pvContext)1477 {1478 RT_NOREF(pDevIns, pThis, pThisCC, pCmd);1479 PVBOXVBVASAVEDSTATECBDATA pData = (PVBOXVBVASAVEDSTATECBDATA)pvContext;1480 if (RT_FAILURE(pData->rc))1481 return false;1482 if (RT_FAILURE(rc))1483 {1484 pData->rc = rc;1485 return false;1486 }1487 1488 Assert(iDisplay < RT_ELEMENTS(pData->ab2DOn));1489 if (iDisplay >= RT_ELEMENTS(pData->ab2DOn))1490 {1491 pData->rc = VERR_INVALID_PARAMETER;1492 return false;1493 }1494 1495 Assert(RT_SUCCESS(pCmd->rc) || pCmd->rc == VERR_NOT_IMPLEMENTED);1496 if (RT_SUCCESS(pCmd->rc))1497 {1498 pData->ab2DOn[iDisplay] = true;1499 }1500 else if (pCmd->rc != VERR_NOT_IMPLEMENTED)1501 {1502 pData->rc = pCmd->rc;1503 return false;1504 }1505 1506 return true;1507 }1508 1509 /**1510 * @callback_method_impl{FNVBOXVHWAHHCMDPRECB}1511 */1512 static DECLCALLBACK(bool) vboxVBVASaveStatePerformPreCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1513 VBOXVHWACMD *pCmd, uint32_t iDisplay, void *pvContext)1514 {1515 RT_NOREF(pThis, pThisCC, pCmd);1516 PVBOXVBVASAVEDSTATECBDATA pData = (PVBOXVBVASAVEDSTATECBDATA)pvContext;1517 if (RT_FAILURE(pData->rc))1518 return false;1519 1520 Assert(iDisplay < RT_ELEMENTS(pData->ab2DOn));1521 if (iDisplay >= RT_ELEMENTS(pData->ab2DOn))1522 {1523 pData->rc = VERR_INVALID_PARAMETER;1524 return false;1525 }1526 1527 int rc;1528 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3;1529 1530 if (pData->ab2DOn[iDisplay])1531 {1532 rc = pHlp->pfnSSMPutU32(pData->pSSM, VBOXVBVASAVEDSTATE_VHWAAVAILABLE_MAGIC); AssertRC(rc);1533 if (RT_FAILURE(rc))1534 {1535 pData->rc = rc;1536 return false;1537 }1538 return true;1539 }1540 1541 rc = pHlp->pfnSSMPutU32(pData->pSSM, VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC); AssertRC(rc);1542 if (RT_FAILURE(rc))1543 {1544 pData->rc = rc;1545 return false;1546 }1547 1548 return false;1549 }1550 1551 /**1552 * @callback_method_impl{FNVBOXVHWAHHCMDPOSTCB}1553 */1554 static DECLCALLBACK(bool) vboxVBVASaveStateEndPreCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1555 VBOXVHWACMD *pCmd, uint32_t iDisplay, void *pvContext)1556 {1557 RT_NOREF(pDevIns, pThis, pThisCC, pCmd);1558 PVBOXVBVASAVEDSTATECBDATA pData = (PVBOXVBVASAVEDSTATECBDATA)pvContext;1559 Assert(iDisplay < RT_ELEMENTS(pData->ab2DOn));1560 if (pData->ab2DOn[iDisplay])1561 return true;1562 return false;1563 }1564 1565 /**1566 * @callback_method_impl{FNVBOXVHWAHHCMDPOSTCB}1567 */1568 static DECLCALLBACK(bool) vboxVBVALoadStatePerformPostCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1569 VBOXVHWACMD *pCmd, uint32_t iDisplay, int rc, void *pvContext)1570 {1571 RT_NOREF(pThis, pThisCC, pCmd);1572 PVBOXVBVASAVEDSTATECBDATA pData = (PVBOXVBVASAVEDSTATECBDATA)pvContext;1573 if (RT_FAILURE(pData->rc))1574 return false;1575 if (RT_FAILURE(rc))1576 {1577 pData->rc = rc;1578 return false;1579 }1580 1581 Assert(iDisplay < RT_ELEMENTS(pData->ab2DOn));1582 if (iDisplay >= RT_ELEMENTS(pData->ab2DOn))1583 {1584 pData->rc = VERR_INVALID_PARAMETER;1585 return false;1586 }1587 1588 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3;1589 Assert(RT_SUCCESS(pCmd->rc) || pCmd->rc == VERR_NOT_IMPLEMENTED);1590 if (pCmd->rc == VERR_NOT_IMPLEMENTED)1591 {1592 pData->rc = pHlp->pfnSSMSkipToEndOfUnit(pData->pSSM);1593 AssertRC(pData->rc);1594 return false;1595 }1596 if (RT_FAILURE(pCmd->rc))1597 {1598 pData->rc = pCmd->rc;1599 return false;1600 }1601 1602 return true;1603 }1604 1605 /**1606 * @callback_method_impl{FNVBOXVHWAHHCMDPOSTCB}1607 */1608 static DECLCALLBACK(bool) vboxVBVALoadStatePerformPreCb(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC,1609 VBOXVHWACMD *pCmd, uint32_t iDisplay, void *pvContext)1610 {1611 RT_NOREF(pThis, pThisCC, pCmd);1612 PVBOXVBVASAVEDSTATECBDATA pData = (PVBOXVBVASAVEDSTATECBDATA)pvContext;1613 if (RT_FAILURE(pData->rc))1614 return false;1615 1616 Assert(iDisplay < RT_ELEMENTS(pData->ab2DOn));1617 if (iDisplay >= RT_ELEMENTS(pData->ab2DOn))1618 {1619 pData->rc = VERR_INVALID_PARAMETER;1620 return false;1621 }1622 1623 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3;1624 int rc;1625 uint32_t u32;1626 rc = pHlp->pfnSSMGetU32(pData->pSSM, &u32); AssertRC(rc);1627 if (RT_FAILURE(rc))1628 {1629 pData->rc = rc;1630 return false;1631 }1632 1633 switch (u32)1634 {1635 case VBOXVBVASAVEDSTATE_VHWAAVAILABLE_MAGIC:1636 pData->ab2DOn[iDisplay] = true;1637 return true;1638 case VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC:1639 pData->ab2DOn[iDisplay] = false;1640 return false;1641 default:1642 pData->rc = VERR_INVALID_STATE;1643 return false;1644 }1645 }1646 1647 #endif /* VBOX_WITH_VIDEOHWACCEL */1648 1649 856 static int vboxVBVASaveDevStateExec(PCPDMDEVHLPR3 pHlp, PVGASTATE pThis, PVGASTATECC pThisCC, PSSMHANDLE pSSM) 1650 857 { … … 1775 982 PVGASTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVGASTATECC); 1776 983 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1777 int rc; 1778 #ifdef VBOX_WITH_VIDEOHWACCEL 1779 VBOXVBVASAVEDSTATECBDATA VhwaData = {0}; 1780 VhwaData.pSSM = pSSM; 1781 uint32_t cbCmd = sizeof (VBOXVHWACMD_HH_SAVESTATE_SAVEPERFORM); /* maximum cmd size */ 1782 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN, 0, cbCmd); 1783 Assert(pCmd); 1784 if (pCmd) 1785 { 1786 vbvaVHWAHHPost(pDevIns, pThis, pThisCC, pCmd, NULL, vboxVBVASaveStateBeginPostCb, &VhwaData); 1787 rc = VhwaData.rc; 1788 AssertRC(rc); 1789 if (RT_SUCCESS(rc)) 1790 { 1791 #endif 1792 rc = vboxVBVASaveDevStateExec(pHlp, pThis, pThisCC, pSSM); 1793 AssertRC(rc); 1794 #ifdef VBOX_WITH_VIDEOHWACCEL 1795 if (RT_SUCCESS(rc)) 1796 { 1797 vbvaVHWAHHCommandReinit(pCmd, VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM, 0); 1798 VBOXVHWACMD_HH_SAVESTATE_SAVEPERFORM *pSave = VBOXVHWACMD_BODY_HOST_HEAP(pCmd, VBOXVHWACMD_HH_SAVESTATE_SAVEPERFORM); 1799 pSave->pSSM = pSSM; 1800 vbvaVHWAHHPost(pDevIns, pThis, pThisCC, pCmd, vboxVBVASaveStatePerformPreCb, NULL, &VhwaData); 1801 rc = VhwaData.rc; 1802 AssertRC(rc); 1803 if (RT_SUCCESS(rc)) 1804 { 1805 rc = vbvaVHWACommandSavePending(pHlp, pThis, pThisCC, pSSM); 1806 AssertRCReturn(rc, rc); 1807 1808 vbvaVHWAHHCommandReinit(pCmd, VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND, 0); 1809 vbvaVHWAHHPost(pDevIns, pThis, pThisCC, pCmd, vboxVBVASaveStateEndPreCb, NULL, &VhwaData); 1810 rc = VhwaData.rc; 1811 AssertRC(rc); 1812 } 1813 } 1814 } 1815 1816 vbvaVHWAHHCommandRelease(pCmd); 1817 } 1818 else 1819 rc = VERR_OUT_OF_RESOURCES; 1820 #else 984 985 int rc = vboxVBVASaveDevStateExec(pHlp, pThis, pThisCC, pSSM); 1821 986 if (RT_SUCCESS(rc)) 1822 987 { … … 1830 995 /* no pending commands */ 1831 996 pHlp->pfnSSMPutU32(pSSM, 0); 1832 #endif 997 1833 998 return rc; 1834 999 } … … 2017 1182 if (uVersion > VGA_SAVEDSTATE_VERSION_WDDM) 2018 1183 { 2019 bool fLoadCommands; 2020 2021 if (uVersion < VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA) 1184 /* Skip loading VHWA (2D Video Hardware Acceleration) state from older saved states. */ 1185 if (uVersion < VGA_SAVEDSTATE_VERSION_VHWA_REMOVED) 2022 1186 { 2023 const char *pcszOsArch = pHlp->pfnSSMHandleHostOSAndArch(pSSM); 2024 Assert(pcszOsArch); 2025 fLoadCommands = !pcszOsArch || RTStrNCmp(pcszOsArch, RT_STR_TUPLE("solaris")); 2026 } 2027 else 2028 fLoadCommands = true; 2029 2030 #ifdef VBOX_WITH_VIDEOHWACCEL 2031 uint32_t cbCmd = sizeof (VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM); /* maximum cmd size */ 2032 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM, 0, cbCmd); 2033 Assert(pCmd); 2034 if(pCmd) 2035 { 2036 VBOXVBVASAVEDSTATECBDATA VhwaData = {0}; 2037 VhwaData.pSSM = pSSM; 2038 VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM *pLoad = VBOXVHWACMD_BODY_HOST_HEAP(pCmd, VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM); 2039 pLoad->pSSM = pSSM; 2040 vbvaVHWAHHPost(pDevIns, pThis, pThisCC, pCmd, vboxVBVALoadStatePerformPreCb, 2041 vboxVBVALoadStatePerformPostCb, &VhwaData); 2042 rc = VhwaData.rc; 2043 vbvaVHWAHHCommandRelease(pCmd); 2044 AssertRCReturn(rc, rc); 2045 1187 bool fLoadCommands; 1188 if (uVersion < VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA) 1189 { 1190 const char *pcszOsArch = pHlp->pfnSSMHandleHostOSAndArch(pSSM); 1191 AssertPtr(pcszOsArch); 1192 fLoadCommands = !pcszOsArch || RTStrNCmp(pcszOsArch, RT_STR_TUPLE("solaris")); 1193 } 1194 else 1195 fLoadCommands = true; 1196 1197 uint32_t u32; 1198 for (uint32_t i = 0; i < pThis->cMonitors; ++i) 1199 { 1200 rc = pHlp->pfnSSMGetU32(pSSM, &u32); /* VHWA [un]available magic. */ 1201 AssertRCReturn(rc, rc); 1202 } 1203 1204 /* Pending VHWA commands. */ 2046 1205 if (fLoadCommands) 2047 1206 { 2048 rc = vbvaVHWACommandLoadPending(pDevIns, pHlp, pThis, pThisCC, pSSM, uVersion);1207 rc = pHlp->pfnSSMGetU32(pSSM, &u32); 2049 1208 AssertRCReturn(rc, rc); 1209 for (uint32_t i = 0; i < u32; ++i) 1210 { 1211 rc = pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); 1212 AssertRCReturn(rc, rc); 1213 } 2050 1214 } 2051 1215 } 2052 else2053 {2054 rc = VERR_OUT_OF_RESOURCES;2055 }2056 #else2057 uint32_t u32;2058 2059 for (uint32_t i = 0; i < pThis->cMonitors; ++i)2060 {2061 rc = pHlp->pfnSSMGetU32(pSSM, &u32);2062 AssertRCReturn(rc, rc);2063 2064 if (u32 != VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC)2065 {2066 LogRel(("VBVA: 2D data while 2D is not supported\n"));2067 return VERR_NOT_SUPPORTED;2068 }2069 }2070 2071 if (fLoadCommands)2072 {2073 rc = pHlp->pfnSSMGetU32(pSSM, &u32);2074 AssertRCReturn(rc, rc);2075 2076 if (u32)2077 {2078 LogRel(("VBVA: 2D pending command while 2D is not supported\n"));2079 return VERR_NOT_SUPPORTED;2080 }2081 }2082 #endif2083 1216 } 2084 1217 … … 2433 1566 static DECLCALLBACK(void) vbvaNotifyGuest(void *pvCallback) 2434 1567 { 2435 #if defined(VBOX_WITH_HGSMI) && (defined(VBOX_WITH_V IDEOHWACCEL) || defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM))1568 #if defined(VBOX_WITH_HGSMI) && (defined(VBOX_WITH_VDMA) || defined(VBOX_WITH_WDDM)) 2436 1569 PPDMDEVINS pDevIns = (PPDMDEVINS)pvCallback; 2437 1570 PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); … … 2585 1718 break; 2586 1719 2587 2588 #ifdef VBOX_WITH_VIDEOHWACCEL2589 case VBVA_VHWA_CMD:2590 if (cbBuffer >= VBOXVHWACMD_HEADSIZE())2591 {2592 vbvaVHWAHandleCommand(pDevIns, pThis, pThisCC, (VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *)pvBuffer);2593 rc = VINF_SUCCESS;2594 }2595 else2596 rc = VERR_INVALID_PARAMETER;2597 break;2598 #endif2599 2600 1720 #ifdef VBOX_WITH_WDDM 2601 1721 case VBVA_INFO_CAPS: … … 2741 1861 2742 1862 VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext(pThisCC->pHGSMI); 2743 2744 #ifdef VBOX_WITH_VIDEOHWACCEL2745 vbvaVHWAReset(pDevIns, pThis, pThisCC);2746 #endif2747 1863 2748 1864 HGSMIReset(pThisCC->pHGSMI); -
trunk/src/VBox/Devices/Makefile.kmk
r108237 r108641 312 312 VBoxDD_DEFS += VBOXWDDM_WITH_VBVA 313 313 endif 314 ifdef VBOX_WITH_VIDEOHWACCEL315 VBoxDD_DEFS += VBOX_WITH_VIDEOHWACCEL316 endif317 314 318 315 ifdef VBOX_WITH_HGSMI … … 1118 1115 USB/DevXHCI.cpp 1119 1116 endif 1120 endif1121 1122 ifdef VBOX_WITH_VIDEOHWACCEL1123 VBoxDDRC_DEFS += VBOX_WITH_VIDEOHWACCEL1124 1117 endif 1125 1118 … … 1386 1379 VBoxDDR0_DEFS += VBOX_WITH_HGSMI 1387 1380 endif 1388 ifdef VBOX_WITH_VIDEOHWACCEL1389 VBoxDDR0_DEFS += VBOX_WITH_VIDEOHWACCEL1390 endif1391 1381 1392 1382 if1of ($(VBOX_LDR_FMT), pe lx) -
trunk/src/VBox/Devices/testcase/Makefile.kmk
r108258 r108641 53 53 $(if $(VBOX_WITH_USB),VBOX_WITH_USB,) \ 54 54 $(if $(VBOX_WITH_VDMA),VBOX_WITH_VDMA,) \ 55 $(if $(VBOX_WITH_VIDEOHWACCEL),VBOX_WITH_VIDEOHWACCEL,) \56 55 $(if $(VBOX_WITH_VIRTIO),VBOX_WITH_VIRTIO,) \ 57 56 $(if $(VBOX_WITH_VMSVGA),VBOX_WITH_VMSVGA,) \ -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
r106061 r108641 355 355 GEN_CHECK_OFF(VGASTATE, IBase); 356 356 GEN_CHECK_OFF(VGASTATE, IPort); 357 #if defined(VBOX_WITH_HGSMI) && defined(VBOX_WITH_VIDEOHWACCEL)358 GEN_CHECK_OFF(VGASTATE, IVBVACallbacks);359 #endif360 357 GEN_CHECK_OFF(VGASTATE, pDrvBase); 361 358 GEN_CHECK_OFF(VGASTATE, pDrv); -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
r108046 r108641 1547 1547 SHOW_ULONG_PROP(pGraphicsAdapter, MonitorCount, "monitorcount", Info::tr("Monitor count:"), ""); 1548 1548 SHOW_BOOLEAN_METHOD(pGraphicsAdapter, IsFeatureEnabled(GraphicsFeature_Acceleration3D, &f), "accelerate3d", "3D Acceleration:"); 1549 #ifdef VBOX_WITH_VIDEOHWACCEL1550 SHOW_BOOLEAN_METHOD(pGraphicsAdapter, IsFeatureEnabled(GraphicsFeature_Acceleration2DVideo, &f), "accelerate2dvideo", "2D Video Acceleration:");1551 #endif1552 1549 SHOW_BOOLEAN_PROP( machine, TeleporterEnabled, "teleporterenabled", Info::tr("Teleporter Enabled:")); 1553 1550 SHOW_ULONG_PROP( machine, TeleporterPort, "teleporterport", Info::tr("Teleporter Port:"), ""); -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
r108003 r108641 83 83 MODIFYVM_MONITORCOUNT, 84 84 MODIFYVM_ACCELERATE3D, 85 #ifdef VBOX_WITH_VIDEOHWACCEL 86 MODIFYVM_ACCELERATE2DVIDEO, 87 #endif 85 MODIFYVM_ACCELERATE2DVIDEO, // deprecated 88 86 /* 89 87 * Firmware-specific stuff. … … 311 309 OPT2("--monitor-count", "--monitorcount", MODIFYVM_MONITORCOUNT, RTGETOPT_REQ_UINT32), 312 310 OPT2("--accelerate-3d", "--accelerate3d", MODIFYVM_ACCELERATE3D, RTGETOPT_REQ_BOOL_ONOFF), 313 #ifdef VBOX_WITH_VIDEOHWACCEL 311 /* { Kept for backwards-compatibility*/ 314 312 OPT2("--accelerate-2d-video", "--accelerate2dvideo", MODIFYVM_ACCELERATE2DVIDEO, RTGETOPT_REQ_BOOL_ONOFF), 315 #endif 313 /* } */ 316 314 OPT1("--firmware-logo-fade-in", MODIFYVM_FWLOGOFADEIN, RTGETOPT_REQ_BOOL_ONOFF), 317 315 OPT1("--firmware-logo-fade-out", MODIFYVM_FWLOGOFADEOUT, RTGETOPT_REQ_BOOL_ONOFF), … … 1148 1146 } 1149 1147 1150 #ifdef VBOX_WITH_VIDEOHWACCEL 1148 /* Kept for backwards-compatibility. */ 1151 1149 case MODIFYVM_ACCELERATE2DVIDEO: 1152 1150 { 1153 CHECK_ERROR(pGraphicsAdapter, SetFeature(GraphicsFeature_Acceleration2DVideo, ValueUnion.f));1154 break; 1155 } 1156 #endif 1151 RTStrmPrintf(g_pStdErr, ModifyVM::tr("Warning: '--accelerate-2d-video' is deprecated and will be removed in a future version\n")); 1152 break; 1153 } 1154 1157 1155 case MODIFYVM_FWLOGOFADEIN: 1158 1156 { -
trunk/src/VBox/Frontends/VBoxShell/vboxshell.py
r108046 r108641 1016 1016 1017 1017 print(" Hardware 3d acceleration [accelerate3DEnabled]: " + asState(mach.graphicsAdapter.isFeatureEnabled(ctx['const'].GraphicsFeature_Acceleration3D))) 1018 print(" Hardware 2d video acceleration [accelerate2DVideoEnabled]: " + asState(mach.graphicsAdapter.isFeatureEnabled(ctx['const'].GraphicsFeature_Acceleration2DVideo)))1019 1018 print(" Use universal time [RTCUseUTC]: %s" % (asState(mach.platform.RTCUseUTC))) 1020 1019 audioAdp = mach.audioSettings.adapter -
trunk/src/VBox/Installer/win/Makefile.kmk
r108581 r108641 551 551 -E 'VBOX_WITH_VBOX_IMG=$(if $(VBOX_WITH_VBOX_IMG),yes,no)' \ 552 552 -E 'VBOX_WITH_VBOXSDL=$(if $(VBOX_WITH_VBOXSDL),yes,no)' \ 553 -E 'VBOX_WITH_VIDEOHWACCEL=$(if $(VBOX_WITH_VIDEOHWACCEL),yes,no)' \554 -E 'VBOX_WITH_VIDEOHWACCEL=$(if $(VBOX_WITH_VIDEOHWACCEL),yes,no)' \555 553 -E 'VBOX_WITH_VMSVGA3D=$(if $(VBOX_WITH_VMSVGA3D),yes,no)' \ 556 554 -E 'VBOX_WITH_VRDP=$(if-expr defined(VBOX_WITH_VRDP) && !defined(VBOX_WITH_EXTPACK_PUEL),yes,no)' \ -
trunk/src/VBox/Main/Makefile.kmk
r107588 r108641 1034 1034 $(if $(VBOX_WITH_EFI),VBOX_WITH_EFI,) \ 1035 1035 $(if $(VBOX_WITH_HGSMI),VBOX_WITH_HGSMI,) \ 1036 $(if $(VBOX_WITH_VIDEOHWACCEL),VBOX_WITH_VIDEOHWACCEL,) \1037 1036 $(if $(VBOX_WITH_3D_ACCELERATION),VBOX_WITH_3D_ACCELERATION,) \ 1038 1037 $(if $(VBOX_WITH_DRAG_AND_DROP),VBOX_WITH_DRAG_AND_DROP,) \ -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r108355 r108641 6919 6919 <enum 6920 6920 name="GraphicsFeature" 6921 uuid=" 5cd900a5-ec77-4a08-8f8d-c0a36f462a7c"6921 uuid="1BC430F8-D061-45FB-8830-155058FF3F66" 6922 6922 > 6923 6923 <desc>Graphics features.</desc> … … 6925 6925 <desc>No feature specified, invalid.</desc> 6926 6926 </const> 6927 <const name="Acceleration2DVideo" value="1"> 6928 <desc>2D video acceleration.</desc> 6929 </const> 6927 <!-- Value 1 was Acceleration2DVideo which was removed in VBox 7.2. --> 6930 6928 <const name="Acceleration3D" value="2"> 6931 6929 <desc>3D acceleration.</desc> … … 13943 13941 <interface 13944 13942 name="IGuestOSType" extends="$unknown" 13945 uuid="c eb482fc-41b9-42a8-8538-9835ea33b6f2"13943 uuid="c6e30023-751e-487d-9bd1-595c22b104ba" 13946 13944 wsmap="struct" 13947 13945 rest="managed" … … 13998 13996 <attribute name="recommendedVRAM" type="unsigned long" readonly="yes"> 13999 13997 <desc>Recommended video RAM size in Megabytes.</desc> 14000 </attribute>14001 14002 <attribute name="recommended2DVideoAcceleration" type="boolean" readonly="yes">14003 <desc>Returns @c true if 2D video acceleration is recommended for this OS type.</desc>14004 13998 </attribute> 14005 13999 … … 21890 21884 <interface 21891 21885 name="IDisplay" extends="$unknown" 21892 uuid=" 4680b2de-8690-11e9-b83d-5719e53cf1de"21886 uuid="14fd6676-ee6b-441a-988b-c83025ab693a" 21893 21887 wsmap="managed" 21894 21888 wrap-hint-server-addinterfaces="IEventListener" … … 22230 22224 The guest screen to redraw. 22231 22225 </desc> 22232 </param>22233 </method>22234 22235 <method name="completeVHWACommand">22236 <desc>22237 Signals that the Video HW Acceleration command has completed.22238 </desc>22239 22240 <param name="command" type="octet" mod="ptr" dir="in">22241 <desc>Pointer to VBOXVHWACMD containing the completed command.</desc>22242 22226 </param> 22243 22227 </method> -
trunk/src/VBox/Main/include/DisplayImpl.h
r106061 r108641 164 164 void i_handleUpdateGuestVBVACapabilities(uint32_t fNewCapabilities); 165 165 void i_handleUpdateVBVAInputMapping(int32_t xOrigin, int32_t yOrigin, uint32_t cx, uint32_t cy); 166 #ifdef VBOX_WITH_VIDEOHWACCEL167 int i_handleVHWACommandProcess(int enmCmd, bool fGuestCmd, VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand);168 #endif169 166 int i_handle3DNotifyProcess(VBOX3DNOTIFY *p3DNotify); 170 167 … … 270 267 virtual HRESULT invalidateAndUpdate(); 271 268 virtual HRESULT invalidateAndUpdateScreen(ULONG aScreenId); 272 virtual HRESULT completeVHWACommand(BYTE *aCommand);273 269 virtual HRESULT viewportChanged(ULONG aScreenId, 274 270 ULONG aX, … … 326 322 void *pvVRAM, unsigned uScreenId); 327 323 328 #ifdef VBOX_WITH_VIDEOHWACCEL329 static DECLCALLBACK(int) i_displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, int enmCmd, bool fGuestCmd,330 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand);331 #endif332 324 static DECLCALLBACK(int) i_display3DNotifyProcess(PPDMIDISPLAYCONNECTOR pInterface, 333 325 VBOX3DNOTIFY *p3DNotify); -
trunk/src/VBox/Main/src-client/DisplayImpl.cpp
r106061 r108641 52 52 #include <VBox/vmm/pdmdrv.h> 53 53 54 #ifdef VBOX_WITH_VIDEOHWACCEL55 # include <VBoxVideo.h>56 #endif57 54 #include <VBoxVideo3D.h> 58 55 … … 83 80 /** Our display connector interface. */ 84 81 PDMIDISPLAYCONNECTOR IConnector; 85 #if defined(VBOX_WITH_VIDEOHWACCEL)86 /** VBVA callbacks */87 PPDMIDISPLAYVBVACALLBACKS pVBVACallbacks;88 #endif89 82 } DRVMAINDISPLAY, *PDRVMAINDISPLAY; 90 83 … … 2709 2702 } 2710 2703 2711 HRESULT Display::completeVHWACommand(BYTE *aCommand)2712 {2713 #ifdef VBOX_WITH_VIDEOHWACCEL2714 AssertPtr(mpDrv->pVBVACallbacks);2715 mpDrv->pVBVACallbacks->pfnVHWACommandCompleteAsync(mpDrv->pVBVACallbacks, (VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *)aCommand);2716 return S_OK;2717 #else2718 RT_NOREF(aCommand);2719 return E_NOTIMPL;2720 #endif2721 }2722 2723 2704 HRESULT Display::viewportChanged(ULONG aScreenId, ULONG aX, ULONG aY, ULONG aWidth, ULONG aHeight) 2724 2705 { … … 3278 3259 pDrv->pDisplay->processDisplayData(pvVRAM, uScreenId); 3279 3260 } 3280 3281 #ifdef VBOX_WITH_VIDEOHWACCEL3282 3283 int Display::i_handleVHWACommandProcess(int enmCmd, bool fGuestCmd, VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand)3284 {3285 /* bugref:9691 Disable the legacy VHWA interface.3286 * Keep the host commands enabled because they are needed when an old saved state is loaded.3287 */3288 if (fGuestCmd)3289 return VERR_NOT_IMPLEMENTED;3290 3291 unsigned id = (unsigned)pCommand->iDisplay;3292 if (id >= mcMonitors)3293 return VERR_INVALID_PARAMETER;3294 3295 ComPtr<IFramebuffer> pFramebuffer;3296 AutoReadLock arlock(this COMMA_LOCKVAL_SRC_POS);3297 pFramebuffer = maFramebuffers[id].pFramebuffer;3298 bool fVHWASupported = RT_BOOL(maFramebuffers[id].u32Caps & FramebufferCapabilities_VHWA);3299 arlock.release();3300 3301 if (pFramebuffer == NULL || !fVHWASupported)3302 return VERR_NOT_IMPLEMENTED; /* Implementation is not available. */3303 3304 HRESULT hr = pFramebuffer->ProcessVHWACommand((BYTE *)pCommand, enmCmd, fGuestCmd);3305 if (hr == S_FALSE)3306 return VINF_SUCCESS;3307 if (SUCCEEDED(hr))3308 return VINF_CALLBACK_RETURN;3309 if (hr == E_ACCESSDENIED)3310 return VERR_INVALID_STATE; /* notify we can not handle request atm */3311 if (hr == E_NOTIMPL)3312 return VERR_NOT_IMPLEMENTED;3313 return VERR_GENERAL_FAILURE;3314 }3315 3316 DECLCALLBACK(int) Display::i_displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, int enmCmd, bool fGuestCmd,3317 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCommand)3318 {3319 PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);3320 3321 return pDrv->pDisplay->i_handleVHWACommandProcess(enmCmd, fGuestCmd, pCommand);3322 }3323 3324 #endif /* VBOX_WITH_VIDEOHWACCEL */3325 3261 3326 3262 int Display::i_handle3DNotifyProcess(VBOX3DNOTIFY *p3DNotify) … … 3855 3791 pThis->pDisplay->mParent->i_recordingStop(); 3856 3792 #endif 3857 #if defined(VBOX_WITH_VIDEOHWACCEL)3858 pThis->pVBVACallbacks = NULL;3859 #endif3860 3793 } 3861 3794 } … … 3892 3825 pThis->pDisplay->mParent->i_recordingStop(); 3893 3826 #endif 3894 #if defined(VBOX_WITH_VIDEOHWACCEL)3895 pThis->pVBVACallbacks = NULL;3896 #endif3897 3898 3827 pThis->pDisplay->mpDrv = NULL; 3899 3828 pThis->pDisplay = NULL; 3900 3829 } 3901 #if defined(VBOX_WITH_VIDEOHWACCEL)3902 pThis->pVBVACallbacks = NULL;3903 #endif3904 3830 } 3905 3831 … … 3937 3863 pThis->IConnector.pfnProcessAdapterData = Display::i_displayProcessAdapterDataCallback; 3938 3864 pThis->IConnector.pfnProcessDisplayData = Display::i_displayProcessDisplayDataCallback; 3939 #ifdef VBOX_WITH_VIDEOHWACCEL3940 pThis->IConnector.pfnVHWACommandProcess = Display::i_displayVHWACommandProcess;3941 #endif3942 3865 #ifdef VBOX_WITH_HGSMI 3943 3866 pThis->IConnector.pfnVBVAEnable = Display::i_displayVBVAEnable; … … 3963 3886 return VERR_PDM_MISSING_INTERFACE_ABOVE; 3964 3887 } 3965 #if defined(VBOX_WITH_VIDEOHWACCEL) 3966 pThis->pVBVACallbacks = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIDISPLAYVBVACALLBACKS); 3967 #endif 3888 3968 3889 /* 3969 3890 * Get the Display object pointer and update the mpDrv member. -
trunk/src/VBox/Main/src-server/GraphicsAdapterImpl.cpp
r106081 r108641 309 309 switch (aFeature) 310 310 { 311 case GraphicsFeature_Acceleration2DVideo:312 pfSetting = &mData->fAccelerate2DVideo;313 break;314 315 311 case GraphicsFeature_Acceleration3D: 316 312 pfSetting = &mData->fAccelerate3D; … … 482 478 switch (aFeature) 483 479 { 484 case GraphicsFeature_Acceleration2DVideo: return &mData->fAccelerate2DVideo; 485 case GraphicsFeature_Acceleration3D: return &mData->fAccelerate3D; 480 case GraphicsFeature_Acceleration3D: return &mData->fAccelerate3D; 486 481 default: 487 482 break; … … 506 501 FEATUREMEMBER2ENUM aFeatures[] = 507 502 { 508 { &mData->fAccelerate2DVideo, GraphicsFeature_Acceleration2DVideo }, 509 { &mData->fAccelerate3D, GraphicsFeature_Acceleration3D }, 503 { &mData->fAccelerate3D, GraphicsFeature_Acceleration3D } 510 504 }; 511 505 -
trunk/src/VBox/Main/src-server/MachineImpl.cpp
r108566 r108641 15291 15291 if (FAILED(hrc)) return hrc; 15292 15292 15293 BOOL fAccelerate2DVideoEnabled;15294 hrc = osType->COMGETTER(Recommended2DVideoAcceleration)(&fAccelerate2DVideoEnabled);15295 if (FAILED(hrc)) return hrc;15296 15297 hrc = mGraphicsAdapter->SetFeature(GraphicsFeature_Acceleration2DVideo, fAccelerate2DVideoEnabled);15298 if (FAILED(hrc))15299 {15300 if (hrc != VBOX_E_NOT_SUPPORTED)15301 return hrc;15302 }15303 15304 15293 BOOL fAccelerate3DEnabled; 15305 15294 hrc = osType->COMGETTER(Recommended3DAcceleration)(&fAccelerate3DEnabled); 15306 15295 if (FAILED(hrc)) return hrc; 15307 15308 hrc = mGraphicsAdapter->SetFeature(GraphicsFeature_Acceleration2DVideo, fAccelerate3DEnabled);15309 if (FAILED(hrc))15310 {15311 if (hrc != VBOX_E_NOT_SUPPORTED)15312 return hrc;15313 }15314 15296 15315 15297 /* Apply network adapters defaults */ -
trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp
r107930 r108641 1156 1156 static const GraphicsFeature_T s_aGraphicsFeatures[] = 1157 1157 { 1158 # ifdef VBOX_WITH_VIDEOHWACCEL1159 GraphicsFeature_Acceleration2DVideo,1160 # endif1161 1158 # ifdef VBOX_WITH_3D_ACCELERATION 1162 1159 GraphicsFeature_Acceleration3D -
trunk/src/VBox/ValidationKit/testdriver/vbox.py
r107205 r108641 2374 2374 fAccelerate3DEnabled = \ 2375 2375 oVM.graphicsAdapter.isFeatureEnabled(vboxcon.GraphicsFeature_Acceleration3D); 2376 fAccelerate2DVideoEnabled = \ 2377 oVM.graphicsAdapter.isFeatureEnabled(vboxcon.GraphicsFeature_Acceleration2DVideo); 2376 if self.fpApiVer < 7.2: # 2D video acceleration was removed with 7.2. 2377 fAccelerate2DVideoEnabled = \ 2378 oVM.graphicsAdapter.isFeatureEnabled(vboxcon.GraphicsFeature_Acceleration2DVideo); 2378 2379 else: 2379 2380 fAccelerate3DEnabled = oVM.graphicsAdapter.accelerate3DEnabled; … … 2383 2384 fAccelerate2DVideoEnabled = oVM.accelerate2DVideoEnabled; 2384 2385 reporter.log(" 3D acceleration: %s" % (fAccelerate3DEnabled,)); 2385 reporter.log(" 2D acceleration: %s" % (fAccelerate2DVideoEnabled,)); 2386 if self.fpApiVer < 7.2: 2387 reporter.log(" 2D acceleration: %s" % (fAccelerate2DVideoEnabled,)); 2386 2388 reporter.log(" TeleporterEnabled: %s" % (oVM.teleporterEnabled,)); 2387 2389 reporter.log(" TeleporterPort: %s" % (oVM.teleporterPort,));
Note:
See TracChangeset
for help on using the changeset viewer.