Changeset 28228 in vbox for trunk/src/VBox/Additions/WINNT/Graphics
- Timestamp:
- Apr 12, 2010 10:54:53 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 59968
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Miniport
- Files:
-
- 2 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk
r27164 r28228 87 87 VBoxVideoWddm_DEFS += VBOX_WITH_VIDEOHWACCEL 88 88 endif 89 ifdef VBOXWDDM_WITH_VBVA 90 VBoxVideoWddm_DEFS += VBOXWDDM_WITH_VBVA 91 ifdef VBOXVDMA_WITH_VBVA 92 VBoxVideoWddm_DEFS += VBOXVDMA_WITH_VBVA 93 endif 94 endif 89 95 VBoxVideoWddm_DEFS += LOG_ENABLED 90 96 #VBoxVideoWddm_DEFS += LOG_TO_BACKDOOR … … 101 107 wddm/VBoxVideoShgsmi.cpp \ 102 108 wddm/VBoxVideoWddm.rc 109 ifdef VBOXWDDM_WITH_VBVA 110 VBoxVideoWddm_SOURCES += \ 111 wddm/VBoxVideoVbva.cpp 112 endif 103 113 VBoxVideoWddm_LIBS.x86 = \ 104 114 $(PATH_SDK_WINDDKWLH_LIB)/bufferoverflowk.lib -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp
r28031 r28228 349 349 #else 350 350 ULONG vramSize = vboxWddmVramCpuVisibleSegmentSize(DeviceExtension); 351 #ifndef VBOXWDDM_ WITH_FAKE_SEGMENT351 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 352 352 /* at least two surfaces will be needed: primary & shadow */ 353 353 vramSize /= 2; … … 925 925 if (DeviceExtension->CurrentMode == 0) 926 926 #else 927 if (!DeviceExtension->cSources || !DeviceExtension->aSources[0].p Allocation)927 if (!DeviceExtension->cSources || !DeviceExtension->aSources[0].pPrimaryAllocation) 928 928 #endif 929 929 { … … 965 965 } 966 966 #else 967 if (DeviceExtension->cSources && DeviceExtension->aSources[0].p Allocation)967 if (DeviceExtension->cSources && DeviceExtension->aSources[0].pPrimaryAllocation) 968 968 { 969 969 if (!xres) 970 xres = DeviceExtension->aSources[0].p Allocation->u.SurfInfo.width;970 xres = DeviceExtension->aSources[0].pPrimaryAllocation->u.SurfInfo.width; 971 971 if (!yres) 972 yres = DeviceExtension->aSources[0].p Allocation->u.SurfInfo.height;972 yres = DeviceExtension->aSources[0].pPrimaryAllocation->u.SurfInfo.height; 973 973 if (!bpp) 974 bpp = DeviceExtension->aSources[0].p Allocation->u.SurfInfo.bpp;974 bpp = DeviceExtension->aSources[0].pPrimaryAllocation->u.SurfInfo.bpp; 975 975 } 976 976 #endif … … 1020 1020 if (DeviceExtension->CurrentMode != 0) 1021 1021 #else 1022 if (DeviceExtension->cSources && DeviceExtension->aSources[0].p Allocation)1022 if (DeviceExtension->cSources && DeviceExtension->aSources[0].pPrimaryAllocation) 1023 1023 #endif 1024 1024 #ifndef VBOX_WITH_MULTIMONITOR_FIX … … 1126 1126 if (DeviceExtension->CurrentMode == 0) 1127 1127 #else 1128 if (!DeviceExtension->cSources || !DeviceExtension->aSources[0].p Allocation)1128 if (!DeviceExtension->cSources || !DeviceExtension->aSources[0].pPrimaryAllocation) 1129 1129 #endif 1130 1130 { … … 1407 1407 &VideoRamBase /*OUT PVOID *VirtualAddress*/ 1408 1408 ); 1409 Assert(ntStatus == STATUS_SUCCESS); 1409 1410 Status = ntStatus == STATUS_SUCCESS ? NO_ERROR : ERROR_INVALID_PARAMETER; /*<- this is what VideoPortMapMemory returns according to the docs */ 1410 1411 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r28031 r28228 117 117 #else 118 118 #include <VBox/VBoxVideo.h> 119 #include "wddm/VBoxVideoWddm.h" 119 120 #include "wddm/VBoxVideoShgsmi.h" 120 121 #include "wddm/VBoxVideoVdma.h" 121 122 #include "wddm/VBoxVideoVidPn.h" 122 #include "wddm/VBoxVideoWddm.h" 123 #ifdef VBOXWDDM_WITH_VBVA 124 # include "wddm/VBoxVideoVbva.h" 125 #endif 126 123 127 124 128 typedef KSPIN_LOCK VBOXVCMNSPIN_LOCK, *PVBOXVCMNSPIN_LOCK; … … 148 152 typedef struct VBOXWDDM_SOURCE 149 153 { 150 struct VBOXWDDM_ALLOCATION * pAllocation; 154 struct VBOXWDDM_ALLOCATION * pPrimaryAllocation; 155 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 156 struct VBOXWDDM_ALLOCATION * pShadowAllocation; 157 VBOXVIDEOOFFSET offVram; 158 VBOXWDDM_SURFACE_DESC SurfInfo; 159 VBOXVBVAINFO Vbva; 160 #endif 151 161 VBOXWDDM_POINTER_INFO PointerInfo; 152 162 } VBOXWDDM_SOURCE, *PVBOXWDDM_SOURCE; … … 199 209 #ifdef VBOXWDDM 200 210 VBOXVDMAINFO Vdma; 211 # ifdef VBOXVDMA_WITH_VBVA 212 VBOXVBVAINFO Vbva; 213 # endif 201 214 #endif 202 215 … … 609 622 DECLINLINE(ULONG) vboxWddmVramCpuVisibleSize(PDEVICE_EXTENSION pDevExt) 610 623 { 624 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 625 /* all memory layout info should be initialized */ 626 Assert(pDevExt->aSources[0].Vbva.offVBVA); 627 /* page aligned */ 628 Assert(!(pDevExt->aSources[0].Vbva.offVBVA & 0xfff)); 629 630 return (ULONG)(pDevExt->aSources[0].Vbva.offVBVA & ~0xfffULL); 631 #else 611 632 /* all memory layout info should be initialized */ 612 633 Assert(pDevExt->u.primary.Vdma.CmdHeap.area.offBase); 613 634 /* page aligned */ 614 635 Assert(!(pDevExt->u.primary.Vdma.CmdHeap.area.offBase & 0xfff)); 636 615 637 return pDevExt->u.primary.Vdma.CmdHeap.area.offBase & ~0xfffUL; 638 #endif 616 639 } 617 640 … … 621 644 } 622 645 623 #ifdef VBOXWDDM_ WITH_FAKE_SEGMENT646 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 624 647 DECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PDEVICE_EXTENSION pDevExt) 625 648 { 626 649 return vboxWddmVramCpuVisibleSegmentSize(pDevExt); 627 650 } 651 652 DECLINLINE(bool) vboxWddmCmpSurfDescs(VBOXWDDM_SURFACE_DESC *pDesc1, VBOXWDDM_SURFACE_DESC *pDesc2) 653 { 654 if (pDesc1->width != pDesc2->width) 655 return false; 656 if (pDesc1->height != pDesc2->height) 657 return false; 658 if (pDesc1->format != pDesc2->format) 659 return false; 660 if (pDesc1->bpp != pDesc2->bpp) 661 return false; 662 if (pDesc1->pitch != pDesc2->pitch) 663 return false; 664 return true; 665 } 666 667 DECLINLINE(void) vboxWddmAssignShadow(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 668 { 669 if (pSource->pShadowAllocation == pAllocation) 670 return; 671 672 if (pSource->pShadowAllocation) 673 { 674 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pShadowAllocation; 675 PVBOXWDDM_ALLOCATION_SHADOWSURFACE pOldShadowInfo = VBOXWDDM_ALLOCATION_BODY(pOldAlloc, VBOXWDDM_ALLOCATION_SHADOWSURFACE); 676 /* clear the visibility info fo the current primary */ 677 pOldShadowInfo->bVisible = FALSE; 678 pOldShadowInfo->bAssigned = FALSE; 679 Assert(pOldShadowInfo->VidPnSourceId == srcId); 680 /* release the shadow surface */ 681 pOldShadowInfo->VidPnSourceId = D3DDDI_ID_UNINITIALIZED; 682 } 683 684 if (pAllocation) 685 { 686 PVBOXWDDM_ALLOCATION_SHADOWSURFACE pShadowInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHADOWSURFACE); 687 pShadowInfo->bVisible = FALSE; 688 /* this check ensures the shadow is not used for other source simultaneously */ 689 Assert(pShadowInfo->VidPnSourceId == D3DDDI_ID_UNINITIALIZED); 690 pShadowInfo->VidPnSourceId = srcId; 691 pShadowInfo->bAssigned = TRUE; 692 if (!vboxWddmCmpSurfDescs(&pSource->SurfInfo, &pAllocation->u.SurfInfo)) 693 pSource->offVram = VBOXVIDEOOFFSET_VOID; /* force guest->host notification */ 694 pSource->SurfInfo = pAllocation->u.SurfInfo; 695 } 696 697 pSource->pShadowAllocation = pAllocation; 698 } 628 699 #endif 629 700 630 701 DECLINLINE(VOID) vboxWddmAssignPrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 631 702 { 632 if (pSource->p Allocation == pAllocation)703 if (pSource->pPrimaryAllocation == pAllocation) 633 704 return; 634 705 635 if (pSource->p Allocation)706 if (pSource->pPrimaryAllocation) 636 707 { 637 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->p Allocation;708 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation; 638 709 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pOldPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pOldAlloc, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 639 710 /* clear the visibility info fo the current primary */ … … 652 723 } 653 724 654 pSource->p Allocation = pAllocation;725 pSource->pPrimaryAllocation = pAllocation; 655 726 } 656 727 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp
r28031 r28228 956 956 vboxVdmaDestroy(PrimaryExtension, &PrimaryExtension->u.primary.Vdma); 957 957 } 958 959 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 960 if (RT_SUCCESS(rc)) 961 { 962 ulAvailable = offset; 963 ulSize = ulAvailable / 2; 964 ulSize /= PrimaryExtension->cSources; 965 Assert(ulSize > VBVA_MIN_BUFFER_SIZE); 966 if (ulSize > VBVA_MIN_BUFFER_SIZE) 967 { 968 ULONG ulRatio = ulSize/VBVA_MIN_BUFFER_SIZE; 969 ulRatio >>= 4; /* /= 16; */ 970 if (ulRatio) 971 ulSize = VBVA_MIN_BUFFER_SIZE * ulRatio; 972 else 973 ulSize = VBVA_MIN_BUFFER_SIZE; 974 } 975 else 976 { 977 /* todo: ?? */ 978 } 979 980 ulSize &= ~0xFFF; 981 Assert(ulSize); 982 983 Assert(ulSize * PrimaryExtension->cSources < ulAvailable); 984 985 for (int i = PrimaryExtension->cSources-1; i >= 0; --i) 986 { 987 offset -= ulSize; 988 rc = vboxVbvaCreate(PrimaryExtension, &PrimaryExtension->aSources[i].Vbva, offset, ulSize, i); 989 AssertRC(rc); 990 if (RT_SUCCESS(rc)) 991 { 992 rc = vboxVbvaEnable(PrimaryExtension, &PrimaryExtension->aSources[i].Vbva); 993 AssertRC(rc); 994 if (RT_FAILURE(rc)) 995 { 996 /* @todo: de-initialize */ 997 } 998 } 999 } 1000 } 1001 #endif 958 1002 959 1003 if (RT_FAILURE(rc)) -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.cpp
r27307 r28228 56 56 } 57 57 58 59 DECLINLINE(void) vboxSHGSMICommandDoSubmit(struct _HGSMIHEAP * pHeap, PVBOXSHGSMIHEADER pHeader)60 {61 /* Initialize the buffer and get the offset for port IO. */62 HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (pHeap, pHeader);63 64 /* Submit the buffer to the host. */65 vboxSHGSMICbCommandWrite(pHeap, offBuffer);66 }67 68 58 /* do not wait for completion */ 69 DECLINLINE( void) vboxSHGSMICommandSubmitAsynch (struct _HGSMIHEAP * pHeap, PVBOXSHGSMIHEADER pHeader)59 DECLINLINE(const VBOXSHGSMIHEADER*) vboxSHGSMICommandPrepAsynch (struct _HGSMIHEAP * pHeap, PVBOXSHGSMIHEADER pHeader) 70 60 { 71 61 /* ensure the command is not removed until we're processing it */ 72 62 vboxSHGSMICommandRetain(pHeader); 73 74 vboxSHGSMICommandDoSubmit(pHeap, pHeader); 75 63 return pHeader; 64 } 65 66 DECLINLINE(void) vboxSHGSMICommandDoneAsynch (struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader) 67 { 76 68 if(!(ASMAtomicReadU32((volatile uint32_t *)&pHeader->fFlags) & VBOXSHGSMI_FLAG_HG_ASYNCH)) 77 69 { … … 80 72 } 81 73 82 vboxSHGSMICommandRelease(pHeap, pHeader); 83 84 } 85 86 void VBoxSHGSMICommandSubmitAsynchEvent (struct _HGSMIHEAP * pHeap, PVOID pvBuff, RTSEMEVENT hEventSem) 74 vboxSHGSMICommandRelease(pHeap, (PVBOXSHGSMIHEADER)pHeader); 75 } 76 77 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchEvent (struct _HGSMIHEAP * pHeap, PVOID pvBuff, RTSEMEVENT hEventSem) 87 78 { 88 79 PVBOXSHGSMIHEADER pHeader = VBoxSHGSMIBufferHeader (pvBuff); … … 91 82 pHeader->fFlags = VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ; 92 83 93 vboxSHGSMICommandSubmitAsynch (pHeap, pHeader);94 } 95 96 int VBoxSHGSMICommandSubmitSynch (struct _HGSMIHEAP * pHeap, PVOID pCmd)84 return vboxSHGSMICommandPrepAsynch (pHeap, pHeader); 85 } 86 87 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepSynch (struct _HGSMIHEAP * pHeap, PVOID pCmd) 97 88 { 98 89 RTSEMEVENT hEventSem; … … 101 92 if (RT_SUCCESS(rc)) 102 93 { 103 VBoxSHGSMICommandSubmitAsynchEvent (pHeap, pCmd, hEventSem); 104 105 rc = RTSemEventWait(hEventSem, RT_INDEFINITE_WAIT); 106 Assert(RT_SUCCESS(rc)); 107 if (RT_SUCCESS(rc)) 108 RTSemEventDestroy(hEventSem); 109 } 94 return VBoxSHGSMICommandPrepAsynchEvent (pHeap, pCmd, hEventSem); 95 } 96 return NULL; 97 } 98 99 void VBoxSHGSMICommandDoneAsynch (struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER * pHeader) 100 { 101 vboxSHGSMICommandDoneAsynch(pHeap, pHeader); 102 } 103 104 int VBoxSHGSMICommandDoneSynch (struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader) 105 { 106 VBoxSHGSMICommandDoneAsynch (pHeap, pHeader); 107 RTSEMEVENT hEventSem = (RTSEMEVENT)pHeader->u64Info2; 108 int rc = RTSemEventWait(hEventSem, RT_INDEFINITE_WAIT); 109 AssertRC(rc); 110 if (RT_SUCCESS(rc)) 111 RTSemEventDestroy(hEventSem); 110 112 return rc; 111 113 } 112 114 113 void VBoxSHGSMICommandSubmitAsynch (struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION pfnCompletion, PVOID pvCompletion, uint32_t fFlags) 115 void VBoxSHGSMICommandCancelAsynch (struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader) 116 { 117 vboxSHGSMICommandRelease(pHeap, (PVBOXSHGSMIHEADER)pHeader); 118 } 119 120 void VBoxSHGSMICommandCancelSynch (struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader) 121 { 122 VBoxSHGSMICommandCancelAsynch (pHeap, pHeader); 123 RTSEMEVENT hEventSem = (RTSEMEVENT)pHeader->u64Info2; 124 RTSemEventDestroy(hEventSem); 125 } 126 127 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynch (struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION pfnCompletion, PVOID pvCompletion, uint32_t fFlags) 114 128 { 115 129 fFlags &= ~VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ; … … 119 133 pHeader->fFlags = fFlags; 120 134 121 vboxSHGSMICommandSubmitAsynch (pHeap, pHeader);122 } 123 124 void VBoxSHGSMICommandSubmitAsynchIrq (struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCompletion, PVOID pvCompletion, uint32_t fFlags)135 return vboxSHGSMICommandPrepAsynch (pHeap, pHeader); 136 } 137 138 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchIrq (struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCompletion, PVOID pvCompletion, uint32_t fFlags) 125 139 { 126 140 fFlags |= VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ | VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ; … … 131 145 pHeader->fFlags = fFlags; 132 146 133 vboxSHGSMICommandSubmitAsynch (pHeap, pHeader);147 return vboxSHGSMICommandPrepAsynch (pHeap, pHeader); 134 148 } 135 149 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.h
r28031 r28228 88 88 } 89 89 90 void VBoxSHGSMICommandSubmitAsynch (struct _HGSMIHEAP *pHeap, PVOID pvBuff, FNVBOXSHGSMICMDCOMPLETION pfnCompletion, PVOID pvCompletion, uint32_t fFlags);91 void VBoxSHGSMICommandSubmitAsynchIrq (struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCompletion, PVOID pvCompletion, uint32_t fFlags);92 void VBoxSHGSMICommandSubmitAsynchEvent (struct _HGSMIHEAP * pHeap, PVOID pvBuff, RTSEMEVENT hEventSem);93 int VBoxSHGSMICommandSubmitSynch (struct _HGSMIHEAP * pHeap, PVOID pCmd);94 int VBoxSHGSMICommandSubmitSynchCompletion (struct _HGSMIHEAP * pHeap, PVOID pCmd);95 void* VBoxSHGSMICommandAlloc (struct _HGSMIHEAP * pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo);96 void VBoxSHGSMICommandFree (struct _HGSMIHEAP * pHeap, void *pvBuffer);97 int VBoxSHGSMICommandProcessCompletion (struct _HGSMIHEAP * pHeap, HGSMIOFFSET offCmd, bool bIrq, PVBOXSHGSMILIST pPostProcessList);98 int VBoxSHGSMICommandPostprocessCompletion (struct _HGSMIHEAP * pHeap, PVBOXSHGSMILIST pPostProcessList);99 90 100 void vboxSHGSMICbCommandWrite(struct _HGSMIHEAP * pHeap, HGSMIOFFSET data); 91 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchEvent(struct _HGSMIHEAP * pHeap, PVOID pvBuff, RTSEMEVENT hEventSem); 92 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepSynch(struct _HGSMIHEAP * pHeap, PVOID pCmd); 93 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynch(struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION pfnCompletion, PVOID pvCompletion, uint32_t fFlags); 94 const VBOXSHGSMIHEADER* VBoxSHGSMICommandPrepAsynchIrq(struct _HGSMIHEAP * pHeap, PVOID pvBuff, PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCompletion, PVOID pvCompletion, uint32_t fFlags); 95 96 void VBoxSHGSMICommandDoneAsynch(struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader); 97 int VBoxSHGSMICommandDoneSynch(struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader); 98 void VBoxSHGSMICommandCancelAsynch(struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader); 99 void VBoxSHGSMICommandCancelSynch(struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader); 100 101 DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset(struct _HGSMIHEAP * pHeap, const VBOXSHGSMIHEADER* pHeader) 102 { 103 return HGSMIHeapBufferOffset(pHeap, (void*)pHeader); 104 } 105 106 void* VBoxSHGSMICommandAlloc(struct _HGSMIHEAP * pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo); 107 void VBoxSHGSMICommandFree(struct _HGSMIHEAP * pHeap, void *pvBuffer); 108 int VBoxSHGSMICommandProcessCompletion(struct _HGSMIHEAP * pHeap, HGSMIOFFSET offCmd, bool bIrq, PVBOXSHGSMILIST pPostProcessList); 109 int VBoxSHGSMICommandPostprocessCompletion(struct _HGSMIHEAP * pHeap, PVBOXSHGSMILIST pPostProcessList); 101 110 102 111 #endif /* #ifndef ___VBoxVideoShgsmi_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp
r27383 r28228 29 29 */ 30 30 31 #ifdef VBOXVDMA_WITH_VBVA 32 static int vboxWddmVdmaSubmitVbva(struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, HGSMIOFFSET offDr) 33 { 34 return vboxVbvaReportCmdOffset(pDevExt, &pDevExt->u.primary.Vbva, offDr); 35 } 36 #define vboxWddmVdmaSubmit vboxWddmVdmaSubmitVbva 37 #else 38 static int vboxWddmVdmaSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, HGSMIOFFSET offDr) 39 { 40 VBoxHGSMIGuestWrite(pDevExt, offDr); 41 return VINF_SUCCESS; 42 } 43 #define vboxWddmVdmaSubmit vboxWddmVdmaSubmitHgsmi 44 #endif 31 45 32 46 static int vboxVdmaInformHost (PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, VBOXVDMA_CTL_TYPE enmCtl) … … 34 48 int rc = VINF_SUCCESS; 35 49 36 PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc 50 PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap, sizeof (VBOXVDMA_CTL), HGSMI_CH_VBVA, VBVA_VDMA_CTL); 37 51 if (pCmd) 38 52 { … … 41 55 pCmd->i32Result = VERR_NOT_SUPPORTED; 42 56 43 VBoxSHGSMICommandSubmitSynch (&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); 44 45 rc = pCmd->i32Result; 46 AssertRC(rc); 57 const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); 58 Assert(pHdr); 59 if (pHdr) 60 { 61 do 62 { 63 HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); 64 Assert(offCmd != HGSMIOFFSET_VOID); 65 if (offCmd != HGSMIOFFSET_VOID) 66 { 67 rc = vboxWddmVdmaSubmit(pDevExt, pInfo, offCmd); 68 AssertRC(rc); 69 if (RT_SUCCESS(rc)) 70 { 71 rc = VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); 72 AssertRC(rc); 73 if (RT_SUCCESS(rc)) 74 { 75 rc = pCmd->i32Result; 76 AssertRC(rc); 77 } 78 break; 79 } 80 } 81 else 82 rc = VERR_INVALID_PARAMETER; 83 /* fail to submit, cancel it */ 84 VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr); 85 } while (0); 86 } 47 87 48 88 VBoxSHGSMICommandFree (&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); … … 248 288 } 249 289 250 void vboxVdmaCBufDrSubmit (PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr) 251 { 252 VBoxSHGSMICommandSubmitAsynchIrq (&pInfo->CmdHeap, pDr, vboxVdmaCBufDrCompletionIrq, pDevExt, VBOXSHGSMI_FLAG_GH_ASYNCH_FORCE); 253 } 290 int vboxVdmaCBufDrSubmit(PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr) 291 { 292 const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynchIrq (&pInfo->CmdHeap, pDr, vboxVdmaCBufDrCompletionIrq, pDevExt, VBOXSHGSMI_FLAG_GH_ASYNCH_FORCE); 293 Assert(pHdr); 294 int rc = VERR_GENERAL_FAILURE; 295 if (pHdr) 296 { 297 do 298 { 299 HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pInfo->CmdHeap, pHdr); 300 Assert(offCmd != HGSMIOFFSET_VOID); 301 if (offCmd != HGSMIOFFSET_VOID) 302 { 303 rc = vboxWddmVdmaSubmit(pDevExt, pInfo, offCmd); 304 AssertRC(rc); 305 if (RT_SUCCESS(rc)) 306 { 307 VBoxSHGSMICommandDoneAsynch(&pInfo->CmdHeap, pHdr); 308 AssertRC(rc); 309 break; 310 } 311 } 312 else 313 rc = VERR_INVALID_PARAMETER; 314 /* fail to submit, cancel it */ 315 VBoxSHGSMICommandCancelAsynch(&pInfo->CmdHeap, pHdr); 316 } while (0); 317 } 318 else 319 rc = VERR_INVALID_PARAMETER; 320 return rc; 321 } -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h
r28031 r28228 21 21 #include "../VBoxVideo.h" 22 22 23 #if 0 24 typedef DECLCALLBACK(int) FNVBOXVDMASUBMIT(struct _DEVICE_EXTENSION* pDevExt, struct VBOXVDMAINFO * pInfo, HGSMIOFFSET offDr, PVOID pvContext); 25 typedef FNVBOXVDMASUBMIT *PFNVBOXVDMASUBMIT; 26 27 typedef struct VBOXVDMASUBMIT 28 { 29 PFNVBOXVDMASUBMIT pfnSubmit; 30 PVOID pvContext; 31 } VBOXVDMASUBMIT, *PVBOXVDMASUBMIT; 32 #endif 33 23 34 /* DMA commands are currently submitted over HGSMI */ 24 35 typedef struct VBOXVDMAINFO … … 27 38 UINT uLastCompletedPagingBufferCmdFenceId; 28 39 BOOL fEnabled; 40 #if 0 41 VBOXVDMASUBMIT Submitter; 42 #endif 29 43 } VBOXVDMAINFO, *PVBOXVDMAINFO; 30 44 31 int vboxVdmaCreate (struct _DEVICE_EXTENSION* pDevExt, VBOXVDMAINFO *pInfo, ULONG offBuffer, ULONG cbBuffer); 45 int vboxVdmaCreate (struct _DEVICE_EXTENSION* pDevExt, VBOXVDMAINFO *pInfo, ULONG offBuffer, ULONG cbBuffer 46 #if 0 47 , PFNVBOXVDMASUBMIT pfnSubmit, PVOID pvContext 48 #endif 49 ); 32 50 int vboxVdmaDisable (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo); 33 51 int vboxVdmaEnable (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo); 34 52 int vboxVdmaFlush (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo); 35 53 int vboxVdmaDestroy (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo); 36 voidvboxVdmaCBufDrSubmit (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr);54 int vboxVdmaCBufDrSubmit (struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr); 37 55 struct VBOXVDMACBUF_DR* vboxVdmaCBufDrCreate (PVBOXVDMAINFO pInfo, uint32_t cbTrailingData); 38 56 void vboxVdmaCBufDrFree (PVBOXVDMAINFO pInfo, struct VBOXVDMACBUF_DR* pDr); -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r28031 r28228 42 42 } 43 43 44 void vboxSHGSMICbCommandWrite(struct _HGSMIHEAP * pHeap, HGSMIOFFSET data)45 {46 /* @todo: this should be taken from PDEVICE_EXTENSION */47 //VBoxHGSMIGuestWrite(pDevExt, data);48 VBoxVideoCmnPortWriteUlong((PULONG)VGA_PORT_HGSMI_GUEST, data);49 }50 51 44 //VBOXVIDEOOFFSET vboxWddmVRAMAddressToOffset(PDEVICE_EXTENSION pDevExt, PHYSICAL_ADDRESS phAddress) 52 45 //{ … … 87 80 } 88 81 89 NTSTATUS vboxWddmGhDisplayPostInfoScreen (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation )82 NTSTATUS vboxWddmGhDisplayPostInfoScreen (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 90 83 { 91 84 VBOXVIDEOOFFSET offVram = pAllocation->offVram; … … 94 87 return STATUS_INVALID_PARAMETER; 95 88 96 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);89 // PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 97 90 /* Issue the screen info command. */ 98 91 void *p = vboxHGSMIBufferAlloc (pDevExt, … … 105 98 VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)p; 106 99 107 pScreen->u32ViewIndex = pPrimaryInfo->VidPnSourceId;100 pScreen->u32ViewIndex = /*pPrimaryInfo->*/VidPnSourceId; 108 101 pScreen->i32OriginX = 0; 109 102 pScreen->i32OriginY = 0; … … 123 116 } 124 117 125 NTSTATUS vboxWddmGhDisplayPostInfoView (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation) 126 { 127 VBOXVIDEOOFFSET offVram = pAllocation->offVram; 128 Assert(offVram != VBOXVIDEOOFFSET_VOID); 129 if (offVram == VBOXVIDEOOFFSET_VOID) 130 return STATUS_INVALID_PARAMETER; 131 132 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 118 /* all views have a zero offset */ 119 NTSTATUS vboxWddmGhDisplayPostInfoView (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 120 { 121 // VBOXVIDEOOFFSET offVram = pAllocation->offVram; 122 // Assert(offVram != VBOXVIDEOOFFSET_VOID); 123 // if (offVram == VBOXVIDEOOFFSET_VOID) 124 // return STATUS_INVALID_PARAMETER; 125 126 // PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 133 127 /* Issue the screen info command. */ 134 128 void *p = vboxHGSMIBufferAlloc (pDevExt, … … 141 135 VBVAINFOVIEW *pView = (VBVAINFOVIEW *)p; 142 136 143 pView->u32ViewIndex = pPrimaryInfo->VidPnSourceId;144 pView->u32ViewOffset = (uint32_t)offVram;137 pView->u32ViewIndex = /*pPrimaryInfo->*/VidPnSourceId; 138 pView->u32ViewOffset = 0;//(uint32_t)offVram; 145 139 pView->u32ViewSize = vboxWddmVramCpuVisibleSegmentSize(pDevExt)/pDevExt->cSources; 146 140 … … 155 149 } 156 150 157 NTSTATUS vboxWddmGhDisplaySetMode (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation )158 { 159 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);160 if ( pPrimaryInfo->VidPnSourceId)151 NTSTATUS vboxWddmGhDisplaySetMode (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 152 { 153 // PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 154 if (/*pPrimaryInfo->*/VidPnSourceId) 161 155 return STATUS_SUCCESS; 162 156 … … 173 167 NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource) 174 168 { 175 PVBOXWDDM_ALLOCATION pAllocation = pSource->pAllocation; 169 170 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 171 PVBOXWDDM_ALLOCATION pAllocation = pSource->pPrimaryAllocation; 172 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 173 #else 174 PVBOXWDDM_ALLOCATION pAllocation = pSource->pShadowAllocation; 175 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pSource->pPrimaryAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 176 #endif 176 177 VBOXVIDEOOFFSET offVram = vboxWddmValidatePrimary(pAllocation); 177 178 Assert(offVram != VBOXVIDEOOFFSET_VOID); … … 182 183 * Set the current mode into the hardware. 183 184 */ 184 NTSTATUS Status = vboxWddmGhDisplaySetMode (pDevExt, pAllocation );185 NTSTATUS Status = vboxWddmGhDisplaySetMode (pDevExt, pAllocation, pPrimaryInfo->VidPnSourceId); 185 186 Assert(Status == STATUS_SUCCESS); 186 187 if (Status == STATUS_SUCCESS) 187 188 { 188 Status = vboxWddmGhDisplayPostInfoView (pDevExt, pAllocation );189 Status = vboxWddmGhDisplayPostInfoView (pDevExt, pAllocation, pPrimaryInfo->VidPnSourceId); 189 190 Assert(Status == STATUS_SUCCESS); 190 191 if (Status == STATUS_SUCCESS) 191 192 { 192 Status = vboxWddmGhDisplayPostInfoScreen (pDevExt, pAllocation );193 Status = vboxWddmGhDisplayPostInfoScreen (pDevExt, pAllocation, pPrimaryInfo->VidPnSourceId); 193 194 Assert(Status == STATUS_SUCCESS); 194 195 if (Status != STATUS_SUCCESS) … … 203 204 return Status; 204 205 } 206 207 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 208 bool vboxWddmCheckUpdateShadowAddress(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, UINT SegmentId, VBOXVIDEOOFFSET offVram) 209 { 210 if (pSource->offVram == offVram) 211 return false; 212 pSource->offVram = offVram; 213 pSource->pShadowAllocation->SegmentId = SegmentId; 214 pSource->pShadowAllocation->offVram = offVram; 215 216 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource); 217 Assert(Status == STATUS_SUCCESS); 218 if (Status != STATUS_SUCCESS) 219 drprintf((__FUNCTION__": vboxWddmGhDisplaySetInfo failed, Status (0x%x)\n", Status)); 220 221 return true; 222 } 223 224 bool vboxWddmRectIsEmpty(RECTL * pRect) 225 { 226 return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1; 227 } 228 229 bool vboxWddmRectIntersect(RECTL * pRect1, RECTL * pRect2) 230 { 231 return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left) 232 || (pRect2->left < pRect1->left && pRect2->right < pRect1->left) 233 || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top) 234 || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top)); 235 } 236 237 bool vboxWddmRectInclude(RECTL * pRect1, RECTL * pRect2) 238 { 239 return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right) 240 && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom)); 241 } 242 243 void vboxWddmRectUnited(RECT * pDst, const RECT * pRect1, const RECT * pRect2) 244 { 245 pDst->left = RT_MIN(pRect1->left, pRect2->left); 246 pDst->top = RT_MIN(pRect1->top, pRect2->top); 247 pDst->right = RT_MAX(pRect1->right, pRect2->right); 248 pDst->bottom = RT_MAX(pRect1->bottom, pRect2->bottom); 249 } 250 251 void vboxWddmRectTranslate(RECTL * pRect, int x, int y) 252 { 253 pRect->left += x; 254 pRect->top += y; 255 pRect->right += x; 256 pRect->bottom += y; 257 } 258 #endif 205 259 206 260 HGSMIHEAP* vboxWddmHgsmiGetHeapFromCmdOffset(PDEVICE_EXTENSION pDevExt, HGSMIOFFSET offCmd) … … 385 439 case D3DDDIFMT_A16B16G16R16: 386 440 return 64; 441 case D3DDDIFMT_A8P8: 442 return 16; 443 case D3DDDIFMT_P8: 444 return 8; 387 445 default: 388 446 AssertBreakpoint(); … … 561 619 pContext->pPDO = PhysicalDeviceObject; 562 620 *MiniportDeviceContext = pContext; 621 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 622 for (int i = 0; i < RT_ELEMENTS(pContext->aSources); ++i) 623 { 624 pContext->aSources[i].offVram = VBOXVIDEOOFFSET_VOID; 625 } 626 #endif 563 627 } 564 628 else … … 1169 1233 * DXGK_QUERYSEGMENTIN *pQsIn = (DXGK_QUERYSEGMENTIN*)pQueryAdapterInfo->pInputData; */ 1170 1234 DXGK_QUERYSEGMENTOUT *pQsOut = (DXGK_QUERYSEGMENTOUT*)pQueryAdapterInfo->pOutputData; 1171 #ifdef VBOXWDDM_ WITH_FAKE_SEGMENT1235 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1172 1236 # define VBOXWDDM_SEGMENTS_COUNT 2 1173 1237 #else … … 1199 1263 pDr->Flags.Value = 0; 1200 1264 pDr->Flags.CpuVisible = 1; 1201 #ifdef VBOXWDDM_ WITH_FAKE_SEGMENT1265 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1202 1266 ++pDr; 1203 1267 /* create cpu-invisible segment of the same size */ … … 1286 1350 break; 1287 1351 } 1352 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1353 case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE: 1354 { 1355 PVBOXWDDM_ALLOCATION_SHADOWSURFACE pAlloc = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHADOWSURFACE); 1356 if (pAlloc->bAssigned) 1357 { 1358 Assert(pAlloc->VidPnSourceId != D3DDDI_ID_UNINITIALIZED); 1359 /* @todo: do we need to notify host? */ 1360 vboxWddmAssignShadow(pDevExt, &pDevExt->aSources[pAlloc->VidPnSourceId], NULL, pAlloc->VidPnSourceId); 1361 } 1362 break; 1363 } 1364 #endif 1288 1365 default: 1289 1366 break; … … 1333 1410 pAllocationInfo->HintedBank.Value = 0; 1334 1411 pAllocationInfo->PreferredSegment.Value = 0; 1412 #if 1 //defined(VBOXWDDM_RENDER_FROM_SHADOW) 1335 1413 pAllocationInfo->SupportedReadSegmentSet = 1; 1336 1414 pAllocationInfo->SupportedWriteSegmentSet = 1; 1415 #else 1416 pAllocationInfo->SupportedReadSegmentSet = 2; 1417 pAllocationInfo->SupportedWriteSegmentSet = 2; 1418 #endif 1337 1419 pAllocationInfo->EvictionSegmentSet = 0; 1338 1420 pAllocationInfo->MaximumRenamingListLength = 0; 1339 1421 pAllocationInfo->hAllocation = pAllocation; 1340 1422 pAllocationInfo->Flags.Value = 0; 1423 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 1341 1424 pAllocationInfo->Flags.CpuVisible = 1; 1425 #endif 1342 1426 pAllocationInfo->pAllocationUsageHint = NULL; 1343 1427 pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_NORMAL; … … 1363 1447 } 1364 1448 case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE: 1449 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1450 { 1451 Assert(pAllocationInfo->PrivateDriverDataSize >= VBOXWDDM_ALLOCINFO_HEADSIZE()); 1452 if (pAllocationInfo->PrivateDriverDataSize >= VBOXWDDM_ALLOCINFO_HEADSIZE()) 1453 { 1454 PVBOXWDDM_ALLOCATION pAllocation = (PVBOXWDDM_ALLOCATION)vboxWddmMemAllocZero(VBOXWDDM_ALLOCATION_SIZE(VBOXWDDM_ALLOCATION_SHADOWSURFACE)); 1455 Assert(pAllocation); 1456 if (pAllocation) 1457 { 1458 pAllocation->enmType = pAllocInfo->enmType; 1459 pAllocation->offVram = VBOXVIDEOOFFSET_VOID; 1460 pAllocation->u.SurfInfo = pAllocInfo->u.SurfInfo; 1461 1462 pAllocationInfo->pPrivateDriverData = NULL; 1463 pAllocationInfo->PrivateDriverDataSize = 0; 1464 pAllocationInfo->Alignment = 0; 1465 pAllocationInfo->Size = pAllocInfo->u.SurfInfo.pitch * pAllocInfo->u.SurfInfo.height; 1466 pAllocationInfo->PitchAlignedSize = 0; 1467 pAllocationInfo->HintedBank.Value = 0; 1468 pAllocationInfo->PreferredSegment.Value = 0; 1469 pAllocationInfo->SupportedReadSegmentSet = 1; 1470 pAllocationInfo->SupportedWriteSegmentSet = 1; 1471 pAllocationInfo->EvictionSegmentSet = 0; 1472 pAllocationInfo->MaximumRenamingListLength = 0; 1473 pAllocationInfo->hAllocation = pAllocation; 1474 pAllocationInfo->Flags.Value = 0; 1475 pAllocationInfo->Flags.CpuVisible = 1; 1476 pAllocationInfo->pAllocationUsageHint = NULL; 1477 pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_NORMAL; 1478 PVBOXWDDM_ALLOCATION_SHADOWSURFACE pAlloc = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHADOWSURFACE); 1479 pAlloc->VidPnSourceId = D3DDDI_ID_UNINITIALIZED; 1480 // pAlloc->bVisible = FALSE; 1481 // pAlloc->bAssigned = FALSE; 1482 } 1483 else 1484 { 1485 drprintf((__FUNCTION__ ": ERROR: failed to create allocation description\n")); 1486 Status = STATUS_NO_MEMORY; 1487 } 1488 } 1489 else 1490 { 1491 drprintf((__FUNCTION__ ": ERROR: PrivateDriverDataSize(%d) less than cmd size(%d)\n", pAllocationInfo->PrivateDriverDataSize, VBOXWDDM_ALLOCINFO_HEADSIZE())); 1492 Status = STATUS_INVALID_PARAMETER; 1493 } 1494 break; 1495 } 1496 #endif 1365 1497 case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE: 1366 1498 { … … 1662 1794 dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter)); 1663 1795 1664 vboxVDbgBreakF v();1796 vboxVDbgBreakF(); 1665 1797 1666 1798 /* Value == 2 is Present … … 1668 1800 * we do not expect any other flags to be set here */ 1669 1801 // Assert(pPatch->Flags.Value == 2 || pPatch->Flags.Value == 4); 1670 1802 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1803 Assert(pPatch->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRIVATE_DATA)); 1804 Assert(pPatch->DmaBufferPrivateDataSubmissionEndOffset - pPatch->DmaBufferPrivateDataSubmissionStartOffset >= sizeof (VBOXWDDM_DMA_PRIVATE_DATA)); 1805 if (pPatch->DmaBufferPrivateDataSubmissionEndOffset - pPatch->DmaBufferPrivateDataSubmissionStartOffset >= sizeof (VBOXWDDM_DMA_PRIVATE_DATA)) 1806 { 1807 PVBOXWDDM_DMA_PRIVATE_DATA pPrivateData = (PVBOXWDDM_DMA_PRIVATE_DATA)((uint8_t*)pPatch->pDmaBufferPrivateData + pPatch->DmaBufferPrivateDataSubmissionStartOffset); 1808 const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[0]; 1809 Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX); 1810 Assert(pPatchList->PatchOffset == 0); 1811 const DXGK_ALLOCATIONLIST *pAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex]; 1812 Assert(pAllocationList->SegmentId); 1813 pPrivateData->segmentIdShadow = pAllocationList->SegmentId; 1814 pPrivateData->offShadow = (VBOXVIDEOOFFSET)pAllocationList->PhysicalAddress.QuadPart; 1815 } 1816 else 1817 { 1818 drprintf((__FUNCTION__": DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXWDDM_DMA_PRIVATE_DATA) (%d)\n", 1819 pPatch->DmaBufferPrivateDataSubmissionEndOffset, 1820 pPatch->DmaBufferPrivateDataSubmissionStartOffset, 1821 sizeof (VBOXWDDM_DMA_PRIVATE_DATA))); 1822 return STATUS_INVALID_PARAMETER; 1823 } 1824 #else 1671 1825 uint8_t *pBuf = ((uint8_t *)pPatch->pDmaBuffer) + pPatch->DmaBufferSubmissionStartOffset; 1672 1826 for (UINT i = pPatch->PatchLocationListSubmissionStart; i < pPatch->PatchLocationListSubmissionLength; ++i) … … 1687 1841 } 1688 1842 } 1843 #endif 1689 1844 1690 1845 dfprintf(("<== "__FUNCTION__ ", context(0x%x)\n", hAdapter)); … … 1692 1847 return Status; 1693 1848 } 1849 1850 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1851 typedef struct VBOXWDDM_SHADOW_UPDATE_COMPLETION 1852 { 1853 PDEVICE_EXTENSION pDevExt; 1854 PVBOXWDDM_DMA_PRIVATE_DATA pTransactionData; 1855 UINT SubmissionFenceId; 1856 } VBOXWDDM_SHADOW_UPDATE_COMPLETION, *PVBOXWDDM_SHADOW_UPDATE_COMPLETION; 1857 1858 BOOLEAN vboxWddmNotifyShadowUpdateCompletion(PVOID Context) 1859 { 1860 PVBOXWDDM_SHADOW_UPDATE_COMPLETION pdc = (PVBOXWDDM_SHADOW_UPDATE_COMPLETION)Context; 1861 PDEVICE_EXTENSION pDevExt = pdc->pDevExt; 1862 DXGKARGCB_NOTIFY_INTERRUPT_DATA notify; 1863 memset(¬ify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA)); 1864 1865 notify.InterruptType = DXGK_INTERRUPT_DMA_COMPLETED; 1866 notify.DmaCompleted.SubmissionFenceId = pdc->SubmissionFenceId; 1867 notify.DmaCompleted.NodeOrdinal = pdc->pTransactionData->pContext->NodeOrdinal; 1868 notify.DmaCompleted.EngineOrdinal = 0; 1869 pdc->pTransactionData->pContext->uLastCompletedCmdFenceId = pdc->SubmissionFenceId; 1870 1871 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify); 1872 1873 pDevExt->bNotifyDxDpc = TRUE; 1874 BOOLEAN bDpcQueued = pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle); 1875 Assert(bDpcQueued); 1876 1877 return bDpcQueued; 1878 } 1879 #endif 1880 1694 1881 1695 1882 NTSTATUS … … 1704 1891 // dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter)); 1705 1892 1706 vboxVDbgBreakF v();1893 vboxVDbgBreakF(); 1707 1894 1708 1895 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter; 1709 1710 1896 Assert(!pSubmitCommand->DmaBufferSegmentId); 1711 1897 … … 1724 1910 PVBOXWDDM_DMA_PRIVATE_DATA pPrivateData = (PVBOXWDDM_DMA_PRIVATE_DATA)((uint8_t*)pSubmitCommand->pDmaBufferPrivateData + pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset); 1725 1911 Assert(pPrivateData); 1912 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1913 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->srcId]; 1914 BOOLEAN bRet; 1915 vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->segmentIdShadow, pPrivateData->offShadow); 1916 VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &pPrivateData->rect); 1917 /* get DPC data at IRQL */ 1918 1919 VBOXWDDM_SHADOW_UPDATE_COMPLETION context; 1920 context.pDevExt = pDevExt; 1921 context.pTransactionData = pPrivateData; 1922 context.SubmissionFenceId = pSubmitCommand->SubmissionFenceId; 1923 Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution( 1924 pDevExt->u.primary.DxgkInterface.DeviceHandle, 1925 vboxWddmNotifyShadowUpdateCompletion, 1926 &context, 1927 0, /* IN ULONG MessageNumber */ 1928 &bRet); 1929 #else 1726 1930 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate (&pDevExt->u.primary.Vdma, 0); 1727 1931 if (!pDr) … … 1743 1947 1744 1948 vboxVdmaCBufDrSubmit (pDevExt, &pDevExt->u.primary.Vdma, pDr); 1745 1949 #endif 1746 1950 // dfprintf(("<== "__FUNCTION__ ", context(0x%x)\n", hAdapter)); 1747 1951 … … 2164 2368 } 2165 2369 2370 2371 /* the lpRgnData->Buffer comes to us as RECT 2372 * to avoid extra memcpy we cast it to PRTRECT assuming 2373 * they are identical */ 2374 AssertCompile(sizeof(RECT) == sizeof(RTRECT)); 2375 AssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(RTRECT, xLeft)); 2376 AssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(RTRECT, yBottom)); 2377 AssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(RTRECT, xRight)); 2378 AssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(RTRECT, yTop)); 2379 2166 2380 NTSTATUS 2167 2381 APIENTRY … … 2188 2402 /* the lpRgnData->Buffer comes to us as RECT 2189 2403 * to avoid extra memcpy we cast it to PRTRECT assuming 2190 * they are identical */ 2191 AssertCompile(sizeof(RECT) == sizeof(RTRECT)); 2192 AssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(RTRECT, xLeft)); 2193 AssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(RTRECT, yBottom)); 2194 AssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(RTRECT, xRight)); 2195 AssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(RTRECT, yTop)); 2404 * they are identical 2405 * see AssertCompile's above */ 2406 2196 2407 RTRECT *pRect = (RTRECT *)&lpRgnData->Buffer; 2197 2408 … … 2592 2803 PVBOXWDDM_ALLOCATION pAllocation; 2593 2804 Assert(pSetVidPnSourceAddress->hAllocation); 2594 Assert(pSetVidPnSourceAddress->hAllocation || pSource->p Allocation);2805 Assert(pSetVidPnSourceAddress->hAllocation || pSource->pPrimaryAllocation); 2595 2806 Assert (pSetVidPnSourceAddress->Flags.Value < 2); /* i.e. 0 or 1 (ModeChange) */ 2596 2807 if (pSetVidPnSourceAddress->hAllocation) … … 2600 2811 } 2601 2812 else 2602 pAllocation = pSource->p Allocation;2813 pAllocation = pSource->pPrimaryAllocation; 2603 2814 2604 2815 Assert(pAllocation); … … 2611 2822 Assert (pAllocation->SegmentId); 2612 2823 Assert (!pPrimary->bVisible); 2824 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 2613 2825 if (pPrimary->bVisible) 2614 2826 { … … 2619 2831 drprintf((__FUNCTION__": vboxWddmGhDisplaySetInfo failed, Status (0x%x)\n", Status)); 2620 2832 } 2833 #endif 2621 2834 } 2622 2835 else … … 2657 2870 { 2658 2871 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pSetVidPnSourceVisibility->VidPnSourceId]; 2659 PVBOXWDDM_ALLOCATION pAllocation = pSource->p Allocation;2872 PVBOXWDDM_ALLOCATION pAllocation = pSource->pPrimaryAllocation; 2660 2873 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimary = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 2661 2874 … … 2664 2877 { 2665 2878 pPrimary->bVisible = pSetVidPnSourceVisibility->Visible; 2879 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 2666 2880 if (pPrimary->bVisible) 2667 2881 { … … 2675 2889 vboxVdmaFlush (pDevExt, &pDevExt->u.primary.Vdma); 2676 2890 } 2891 #endif 2677 2892 } 2678 2893 } … … 3071 3286 3072 3287 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[id]; 3073 if (pSource->p Allocation != pAllocation)3288 if (pSource->pPrimaryAllocation != pAllocation) 3074 3289 return NULL; 3075 3290 … … 3111 3326 { 3112 3327 Assert(pPresent->Flags.Value == 1); /* only Blt is set, we do not support anything else for now */ 3328 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 3113 3329 UINT cbCmd = pPresent->DmaSize; 3114 3330 … … 3198 3414 Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER; 3199 3415 } 3200 3416 #else 3417 DXGK_ALLOCATIONLIST *pSrc = &pPresent->pAllocationList[DXGK_PRESENT_SOURCE_INDEX]; 3418 DXGK_ALLOCATIONLIST *pDst = &pPresent->pAllocationList[DXGK_PRESENT_DESTINATION_INDEX]; 3419 PVBOXWDDM_ALLOCATION pSrcAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pSrc); 3420 Assert(pSrcAlloc); 3421 if (pSrcAlloc) 3422 { 3423 PVBOXWDDM_ALLOCATION pDstAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pDst); 3424 Assert(pDstAlloc); 3425 if (pDstAlloc) 3426 { 3427 Assert (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE); 3428 Assert (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE); 3429 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE) 3430 { 3431 PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pDstAlloc, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE); 3432 Assert(pPrimaryInfo->bAssigned); 3433 Assert(pPrimaryInfo->bVisible); 3434 if (pPrimaryInfo->bAssigned 3435 && pPrimaryInfo->bVisible) 3436 { 3437 if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3438 { 3439 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrimaryInfo->VidPnSourceId]; 3440 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pPrimaryInfo->VidPnSourceId); 3441 Assert(pPresent->SrcRect.left == pPresent->DstRect.left); 3442 Assert(pPresent->SrcRect.right == pPresent->DstRect.right); 3443 Assert(pPresent->SrcRect.top == pPresent->DstRect.top); 3444 Assert(pPresent->SrcRect.bottom == pPresent->DstRect.bottom); 3445 RECT rect; 3446 if (pPresent->SubRectCnt) 3447 { 3448 rect = pPresent->pDstSubRects[0]; 3449 for (UINT i = 1; i < pPresent->SubRectCnt; ++i) 3450 { 3451 vboxWddmRectUnited(&rect, &rect, &pPresent->pDstSubRects[i]); 3452 } 3453 } 3454 else 3455 rect = pPresent->SrcRect; 3456 3457 // if (pSrc->SegmentId) 3458 // { 3459 // vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pSrc->SegmentId, (VBOXVIDEOOFFSET)pSrc->PhysicalAddress.QuadPart); 3460 // VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect); 3461 // } 3462 // else 3463 { 3464 #define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof(RECT) 3465 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3466 pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + sizeof (VBOXWDDM_DMA_PRIVATE_DATA); 3467 Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE); 3468 Assert(pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRIVATE_DATA)); 3469 if (pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE 3470 && pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRIVATE_DATA)) 3471 { 3472 memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST)); 3473 // pPresent->pPatchLocationListOut->PatchOffset = 0; 3474 // ++pPresent->pPatchLocationListOut; 3475 pPresent->pPatchLocationListOut->PatchOffset = 0; 3476 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX; 3477 ++pPresent->pPatchLocationListOut; 3478 pPresent->pPatchLocationListOut->PatchOffset = 4; 3479 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX; 3480 ++pPresent->pPatchLocationListOut; 3481 3482 /* we do not know the shadow address yet, perform dummy DMA cycle */ 3483 pPrivateData->rect = rect; 3484 pPrivateData->srcId = pPrimaryInfo->VidPnSourceId; 3485 if (pSrc->SegmentId) 3486 { 3487 pPrivateData->segmentIdShadow = pSrc->SegmentId; 3488 pPrivateData->offShadow = (VBOXVIDEOOFFSET)pSrc->PhysicalAddress.QuadPart; 3489 } 3490 } 3491 else 3492 { 3493 /* this should not happen actually */ 3494 // drprintf((__FUNCTION__": cbCmd too small!! (%d)\n", cbCmd)); 3495 Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER; 3496 } 3497 } 3498 } 3499 } 3500 } 3501 } 3502 } 3503 #endif 3201 3504 } 3202 3505 else -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h
r28031 r28228 29 29 #define VBOXWDDM_C_VDMA_BUFFER_SIZE (64*_1K) 30 30 31 //#define VBOXWDDM_WITH_FAKE_SEGMENT 31 #define VBOXWDDM_RENDER_FROM_SHADOW 32 32 33 33 #define VBOXWDDM_ROUNDBOUND(_v, _b) (((_v) + ((_b) - 1)) & ~((_b) - 1)) … … 83 83 { 84 84 VBOXWDDM_ALLOC_TYPE enmType; 85 UINT SegmentId; 85 86 VBOXVIDEOOFFSET offVram; 86 UINT SegmentId;87 87 union 88 88 { … … 109 109 BOOLEAN bAssigned; 110 110 } VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE, *PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE; 111 112 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 113 typedef struct VBOXWDDM_ALLOCATION_SHADOWSURFACE 114 { 115 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId; 116 // VBOXVIDEOOFFSET offAddress; 117 BOOLEAN bVisible; 118 BOOLEAN bAssigned; 119 } VBOXWDDM_ALLOCATION_SHADOWSURFACE, *PVBOXWDDM_ALLOCATION_SHADOWSURFACE; 120 #endif 111 121 112 122 typedef enum … … 142 152 { 143 153 PVBOXWDDM_CONTEXT pContext; 144 uint8_t Reserved[8]; 154 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 155 RECT rect; 156 VBOXVIDEOOFFSET offShadow; 157 UINT segmentIdShadow; 158 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId; 159 #endif 160 // uint8_t Reserved[8]; 145 161 }VBOXWDDM_DMA_PRIVATE_DATA, *PVBOXWDDM_DMA_PRIVATE_DATA; 146 162
Note:
See TracChangeset
for help on using the changeset viewer.