- Timestamp:
- Jun 23, 2010 8:52:35 PM (15 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT
- Files:
-
- 3 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk
r29488 r30405 76 76 endif 77 77 VBoxDispD3D_TEMPLATE = VBOXGUESTR3DLL 78 VBoxDispD3D_DEFS = UNICODE _UNICODE 78 VBoxDispD3D_DEFS = UNICODE _UNICODE VBOXWDDM VBOXVDMA 79 ifdef VBOXWDDM_WITH_VBVA 80 VBoxDispD3D_DEFS += VBOXWDDM_WITH_VBVA 81 endif 82 79 83 ifdef VBOX_WITH_VIDEOHWACCEL 80 84 VBoxDispD3D_DEFS += VBOX_WITH_VIDEOHWACCEL … … 83 87 wddm/VBoxDispD3D.cpp \ 84 88 wddm/VBoxDispD3DIf.cpp \ 89 wddm/VBoxDispCm.cpp \ 85 90 wddm/VBoxDispD3D.def \ 86 91 wddm/VBoxDispD3D.rc -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r30346 r30405 13 13 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 14 14 */ 15 #include <windows.h>16 #include <d3d9types.h>17 //#include <d3dtypes.h>18 #include <D3dumddi.h>19 #include <d3dhal.h>20 21 22 15 #include <iprt/initterm.h> 23 16 #include <iprt/log.h> … … 28 21 #include <VBox/VBoxGuestLib.h> 29 22 23 #include "VBoxDispD3DCmn.h" 30 24 #include "VBoxDispD3D.h" 31 #include "VBoxDispD3DCmn.h"32 25 33 26 #ifdef VBOXWDDMDISP_DEBUG -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
r30215 r30405 20 20 21 21 #include <iprt/cdefs.h> 22 #include <iprt/list.h> 22 23 23 24 #define VBOXWDDMDISP_MAX_VERTEX_STREAMS 16 … … 60 61 typedef struct VBOXWDDMDISP_CONTEXT 61 62 { 63 RTLISTNODE ListNode; 62 64 struct VBOXWDDMDISP_DEVICE *pDevice; 63 65 D3DDDICB_CREATECONTEXT ContextInfo; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h
r30133 r30405 21 21 #include <D3dumddi.h> 22 22 #include <d3dhal.h> 23 24 23 25 24 #include <iprt/initterm.h> -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk
r29670 r30405 102 102 wddm/VBoxVideoVdma.cpp \ 103 103 wddm/VBoxVideoShgsmi.cpp \ 104 wddm/VBoxVideoCm.cpp \ 104 105 wddm/VBoxVideoWddm.rc 105 106 ifdef VBOXWDDM_WITH_VBVA -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r30226 r30405 118 118 #include <VBox/VBoxVideo.h> 119 119 #include "wddm/VBoxVideoIf.h" 120 #include "wddm/VBoxVideoShgsmi.h" 121 #include "wddm/VBoxVideoCm.h" 120 122 #include "wddm/VBoxVideoWddm.h" 121 #include "wddm/VBoxVideoShgsmi.h"122 123 #include "wddm/VBoxVideoVdma.h" 123 124 #include "wddm/VBoxVideoVidPn.h" … … 298 299 PDEVICE_OBJECT pPDO; 299 300 301 VBOXVIDEOCM_MGR CmMgr; 302 LIST_ENTRY ContextList3D; 303 KSPIN_LOCK SynchLock; 304 300 305 VBOXSHGSMILIST CtlList; 301 306 VBOXSHGSMILIST DmaCmdList; -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h
r30308 r30405 62 62 } VBOXWDDM_ALLOCINFO, *PVBOXWDDM_ALLOCINFO; 63 63 64 //#define VBOXWDDM_ALLOCINFO_HEADSIZE() (sizeof (VBOXWDDM_ALLOCINFO))65 //#define VBOXWDDM_ALLOCINFO_SIZE_FROMBODYSIZE(_s) (VBOXWDDM_ALLOCINFO_HEADSIZE() + (_s))66 //#define VBOXWDDM_ALLOCINFO_SIZE(_tCmd) (VBOXWDDM_ALLOCINFO_SIZE_FROMBODYSIZE(sizeof(_tCmd)))67 //#define VBOXWDDM_ALLOCINFO_BODY(_p, _t) ( (_t*)(((uint8_t*)(_p)) + VBOXWDDM_ALLOCINFO_HEADSIZE()) )68 //#define VBOXWDDM_ALLOCINFO_HEAD(_pb) ((VBOXWDDM_ALLOCINFO*)((uint8_t *)(_pb) - VBOXWDDM_ALLOCATION_HEADSIZE()))69 70 64 /* this resource is OpenResource'd rather than CreateResource'd */ 71 65 #define VBOXWDDM_RESOURCE_F_OPENNED 0x00000001 … … 149 143 } VBOXWDDM_OVERLAYFLIP_INFO, *PVBOXWDDM_OVERLAYFLIP_INFO; 150 144 145 typedef struct VBOXWDDM_CREATECONTEXT_INFO 146 { 147 /* we use uint64_t instead of HANDLE to ensure structure def is the same for both 32-bit and 64-bit 148 * since x64 kernel driver can be called by 32-bit UMD */ 149 uint64_t hUmEvent; 150 /* info to be passed to UMD notification to identify the context */ 151 uint64_t u64UmInfo; 152 } VBOXWDDM_CREATECONTEXT_INFO, *PVBOXWDDM_CREATECONTEXT_INFO; 153 154 155 typedef struct VBOXWDDM_RECTS_FLAFS 156 { 157 union 158 { 159 struct 160 { 161 UINT bPositionRectValid : 1; 162 UINT bVisibleRectsValid : 1; 163 UINT bAddHiddenRectsValid : 1; 164 UINT Reserved : 29; 165 }; 166 uint32_t Value; 167 }; 168 } VBOXWDDM_RECTS_FLAFS, *PVBOXWDDM_RECTS_FLAFS; 169 170 typedef struct VBOXWDDM_RECTS_INFO 171 { 172 uint32_t cRects; 173 RECT aRects[1]; 174 } VBOXWDDM_RECTS_INFO, *PVBOXWDDM_RECTS_INFO; 175 176 #define VBOXWDDM_RECTS_INFO_SIZE4CRECTS(_cRects) (RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[(_cRects)])) 177 #define VBOXWDDM_RECTS_INFO_SIZE(_pRects) (VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS((_pRects)->cRects)) 178 179 typedef struct VBOXVIDEOCM_CMD_HDR 180 { 181 uint64_t u64UmData; 182 uint32_t cbCmd; 183 uint32_t u32CmdSpecific; 184 }VBOXVIDEOCM_CMD_HDR, *PVBOXVIDEOCM_CMD_HDR; 185 186 typedef struct VBOXVIDEOCM_CMD_RECTS 187 { 188 VBOXWDDM_RECTS_FLAFS fFlags; 189 VBOXWDDM_RECTS_INFO RectsInfo; 190 } VBOXVIDEOCM_CMD_RECTS, *PVBOXVIDEOCM_CMD_RECTS; 191 192 #define VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(_cRects) (RT_OFFSETOF(VBOXVIDEOCM_CMD_RECTS, RectsInfo.aRects[(_cRects)])) 193 #define VBOXVIDEOCM_CMD_RECTS_SIZE(_pCmd) (VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS((_pCmd)->cRects)) 194 195 typedef struct VBOXWDDM_GETVBOXVIDEOCMCMD_HDR 196 { 197 uint32_t cbCmdsReturned; 198 uint32_t cbRemainingCmds; 199 uint32_t cbRemainingFirstCmd; 200 uint32_t u32Reserved; 201 } VBOXWDDM_GETVBOXVIDEOCMCMD_HDR, *PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR; 202 203 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() ((sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR) + 7) & ~7) 204 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA(_pHead, _t) ( (_t*)(((uint8_t*)(_pHead)) + VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET())) 205 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_SIZE(_s) ( (_s) < VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() ? 0 : (_s) - VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() ) 206 #define VBOXWDDM_GETVBOXVIDEOCMCMD_SIZE(_cbData) ((_cbData) ? VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() + (_cbData) : sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR)) 207 151 208 /* query info func */ 152 209 typedef struct VBOXWDDM_QI … … 158 215 159 216 /* submit cmd func */ 160 161 162 163 217 164 218 /* tooling */ … … 244 298 } 245 299 300 DECLINLINE(bool) vboxWddmRectIntersection(const RECT *pRect1, const RECT *pRect2, RECT *pResult) 301 { 302 if (pRect1->left < pRect2->left) 303 { 304 if (pRect1->right >= pRect2->left) 305 pResult->left = pRect2->left; 306 else 307 return false; 308 } 309 else 310 { 311 if (pRect2->right >= pRect1->left) 312 pResult->left = pRect1->left; 313 else 314 return false; 315 } 316 317 pResult->right = RT_MIN(pRect1->right, pRect2->right); 318 319 if (pRect1->top < pRect2->top) 320 { 321 if (pRect1->bottom >= pRect2->top) 322 pResult->top = pRect2->top; 323 else 324 return false; 325 } 326 else 327 { 328 if (pRect2->bottom >= pRect1->top) 329 pResult->top = pRect1->top; 330 else 331 return false; 332 } 333 334 pResult->bottom = RT_MIN(pRect1->bottom, pRect2->bottom); 335 336 return true; 337 } 338 246 339 DECLINLINE(void) vboxWddmDirtyRegionAddRect(PVBOXWDDM_DIRTYREGION pInfo, const RECT *pRect) 247 340 { -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.h
r29742 r30405 70 70 } 71 71 72 DECLINLINE(void) vboxSHGSMI CmdListDetach(PVBOXSHGSMILIST pList, PVBOXSHGSMILIST_ENTRY *ppFirst, PVBOXSHGSMILIST_ENTRY *ppLast)72 DECLINLINE(void) vboxSHGSMIListDetach(PVBOXSHGSMILIST pList, PVBOXSHGSMILIST_ENTRY *ppFirst, PVBOXSHGSMILIST_ENTRY *ppLast) 73 73 { 74 74 *ppFirst = pList->pFirst; … … 79 79 } 80 80 81 DECLINLINE(void) vboxSHGSMI CmdListDetach2List(PVBOXSHGSMILIST pList, PVBOXSHGSMILIST pDstList)81 DECLINLINE(void) vboxSHGSMIListDetach2List(PVBOXSHGSMILIST pList, PVBOXSHGSMILIST pDstList) 82 82 { 83 vboxSHGSMICmdListDetach(pList, &pDstList->pFirst, &pDstList->pLast); 83 vboxSHGSMIListDetach(pList, &pDstList->pFirst, &pDstList->pLast); 84 } 85 86 DECLINLINE(void) vboxSHGSMIListDetachEntries(PVBOXSHGSMILIST pList, PVBOXSHGSMILIST_ENTRY pBeforeDetach, PVBOXSHGSMILIST_ENTRY pLast2Detach) 87 { 88 if (pBeforeDetach) 89 { 90 pBeforeDetach->pNext = pLast2Detach->pNext; 91 if (!pBeforeDetach->pNext) 92 pList->pLast = pBeforeDetach; 93 } 94 else 95 { 96 pList->pFirst = pLast2Detach->pNext; 97 if (!pList->pFirst) 98 pList->pLast = NULL; 99 } 100 pLast2Detach->pNext = NULL; 84 101 } 85 102 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r30346 r30405 36 36 { 37 37 ExFreePool(pvMem); 38 } 39 40 DECLINLINE(void) vboxWddmDirtyRectsCalcIntersection(const RECT *pArea, const PVBOXWDDM_RECTS_INFO pRects, PVBOXWDDM_RECTS_INFO pResult) 41 { 42 pResult->cRects = 0; 43 for (uint32_t i = 0; i < pRects->cRects; ++i) 44 { 45 if (vboxWddmRectIntersection(pArea, &pRects->aRects[i], &pResult->aRects[pResult->cRects])) 46 { 47 ++pResult->cRects; 48 } 49 } 50 } 51 /** 52 * @param pDevExt 53 */ 54 NTSTATUS vboxWddmDirtyRectsProcess(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, const RECT * pContextRect, const PVBOXWDDM_RECTS_INFO pRects) 55 { 56 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 57 58 NTSTATUS Status = STATUS_SUCCESS; 59 PVBOXVIDEOCM_CMD_RECTS pCmd = NULL; 60 uint32_t cbCmd = VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pRects->cRects); 61 KeAcquireSpinLockAtDpcLevel(&pDevExt->SynchLock); 62 for (PLIST_ENTRY pCur = pDevExt->ContextList3D.Flink; pCur != &pDevExt->ContextList3D; pCur = pCur->Flink) 63 { 64 if (pCur != &pContext->ListEntry) 65 { 66 PVBOXWDDM_CONTEXT pCurContext = VBOXWDDMENTRY_2_CONTEXT(pCur); 67 if (!pCmd) 68 { 69 pCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pCurContext->CmContext, cbCmd); 70 Assert(pCmd); 71 if (!pCmd) 72 { 73 Status = STATUS_NO_MEMORY; 74 break; 75 } 76 } 77 else 78 { 79 pCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdReinitForContext(pCmd, &pCurContext->CmContext); 80 } 81 82 vboxWddmDirtyRectsCalcIntersection(&pContext->ViewRect, pRects, &pCmd->RectsInfo); 83 if (pCmd->RectsInfo.cRects) 84 { 85 Assert(pCmd->fFlags.Value == 0); 86 pCmd->fFlags.bAddHiddenRectsValid = 1; 87 vboxVideoCmCmdSubmit(pCmd, VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pCmd->RectsInfo.cRects)); 88 pCmd = NULL; 89 } 90 } 91 else 92 { 93 bool bRectShanged = (pContext->ViewRect.left != pContextRect->left 94 || pContext->ViewRect.top != pContextRect->top 95 || pContext->ViewRect.right != pContextRect->right 96 || pContext->ViewRect.bottom != pContextRect->bottom); 97 PVBOXVIDEOCM_CMD_RECTS pDrCmd; 98 99 if (bRectShanged) 100 { 101 uint32_t cbDrCmd = VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pRects->cRects + 1); 102 pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pContext->CmContext, cbDrCmd); 103 Assert(pDrCmd); 104 if (!pDrCmd) 105 { 106 Status = STATUS_NO_MEMORY; 107 break; 108 } 109 pDrCmd->RectsInfo.cRects = pRects->cRects + 1; 110 } 111 else 112 { 113 if (pCmd) 114 { 115 pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdReinitForContext(pCmd, &pContext->CmContext); 116 pCmd = NULL; 117 } 118 else 119 { 120 pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmd); 121 Assert(pDrCmd); 122 if (!pDrCmd) 123 { 124 Status = STATUS_NO_MEMORY; 125 break; 126 } 127 } 128 pDrCmd->RectsInfo.cRects = pRects->cRects; 129 } 130 131 Assert(pDrCmd->fFlags.Value == 0); 132 RECT *pDirtyRect; 133 if (bRectShanged) 134 { 135 pDrCmd->fFlags.bPositionRectValid = 1; 136 pDrCmd->RectsInfo.aRects[0] = *pContextRect; 137 pDirtyRect = &pDrCmd->RectsInfo.aRects[1]; 138 } 139 else 140 pDirtyRect = &pDrCmd->RectsInfo.aRects[0]; 141 142 pDrCmd->fFlags.bVisibleRectsValid = 1; 143 memcpy (pDirtyRect, pRects->aRects, sizeof (RECT) * pRects->cRects); 144 145 vboxVideoCmCmdSubmit(pDrCmd, VBOXVIDEOCM_SUBMITSIZE_DEFAULT); 146 } 147 } 148 InsertHeadList(&pDevExt->ContextList3D, &pContext->ListEntry); 149 KeReleaseSpinLockFromDpcLevel(&pDevExt->SynchLock); 150 151 if (pCmd) 152 vboxVideoCmCmdRelease(pCmd); 153 154 return Status; 38 155 } 39 156 … … 651 768 vboxVhwaInit(pContext); 652 769 #endif 770 vboxVideoCmInit(&pContext->CmMgr); 771 InitializeListHead(&pContext->ContextList3D); 772 KeInitializeSpinLock(&pContext->SynchLock); 653 773 } 654 774 else … … 696 816 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)MiniportDeviceContext; 697 817 NTSTATUS Status = STATUS_SUCCESS; 818 819 vboxVideoCmTerm(&pDevExt->CmMgr); 698 820 699 821 /* do everything we did on DxgkDdiStartDevice in the reverse order */ … … 968 1090 PVBOXWDDM_GETDPCDATA_CONTEXT pdc = (PVBOXWDDM_GETDPCDATA_CONTEXT)Context; 969 1091 970 vboxSHGSMI CmdListDetach2List(&pdc->pDevExt->CtlList, &pdc->data.CtlList);971 vboxSHGSMI CmdListDetach2List(&pdc->pDevExt->DmaCmdList, &pdc->data.DmaCmdList);1092 vboxSHGSMIListDetach2List(&pdc->pDevExt->CtlList, &pdc->data.CtlList); 1093 vboxSHGSMIListDetach2List(&pdc->pDevExt->DmaCmdList, &pdc->data.DmaCmdList); 972 1094 #ifdef VBOX_WITH_VIDEOHWACCEL 973 vboxSHGSMI CmdListDetach2List(&pdc->pDevExt->VhwaCmdList, &pdc->data.VhwaCmdList);1095 vboxSHGSMIListDetach2List(&pdc->pDevExt->VhwaCmdList, &pdc->data.VhwaCmdList); 974 1096 #endif 975 1097 pdc->data.bNotifyDpc = pdc->pDevExt->bNotifyDxDpc; … … 2522 2644 NTSTATUS Status = STATUS_NOT_SUPPORTED; 2523 2645 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter; 2646 Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE)); 2524 2647 if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE)) 2525 2648 { … … 2527 2650 switch (pEscapeHdr->escapeCode) 2528 2651 { 2652 case VBOXESC_GETVBOXVIDEOCMCMD: 2653 { 2654 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 2655 Assert(pContext); 2656 PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pHdr = VBOXDISPIFESCAPE_DATA(pEscapeHdr, VBOXWDDM_GETVBOXVIDEOCMCMD_HDR); 2657 Status = vboxVideoCmEscape(&pContext->CmContext, pHdr, VBOXDISPIFESCAPE_DATA_SIZE(pEscape->PrivateDriverDataSize)); 2658 Assert(Status == STATUS_SUCCESS); 2659 break; 2660 } 2529 2661 case VBOXESC_SETVISIBLEREGION: 2530 2662 { … … 3559 3691 Assert (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE); 3560 3692 #else 3561 Assert ((pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE 3562 && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE) 3563 || (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 3564 && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE)); 3693 if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM) 3694 { 3695 Assert ((pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE 3696 && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE) 3697 || (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 3698 && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE)); 3699 } 3565 3700 #endif 3566 3701 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 3567 3702 && pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3568 3703 { 3704 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM); 3569 3705 Assert(pDstAlloc->bAssigned); 3570 3706 Assert(pDstAlloc->bVisible); … … 3899 4035 NTSTATUS Status = STATUS_SUCCESS; 3900 4036 PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice; 4037 PDEVICE_EXTENSION pDevExt = pDevice->pAdapter; 3901 4038 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)vboxWddmMemAllocZero(sizeof (VBOXWDDM_CONTEXT)); 3902 3903 pContext->pDevice = pDevice; 3904 pContext->hContext = pCreateContext->hContext; 3905 pContext->EngineAffinity = pCreateContext->EngineAffinity; 3906 pContext->NodeOrdinal = pCreateContext->NodeOrdinal; 3907 if (pCreateContext->Flags.SystemContext) 3908 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_SYSTEM; 3909 // else 3910 // { 3911 // AssertBreakpoint(); /* we do not support custom contexts for now */ 3912 // drprintf((__FUNCTION__ ", we do not support custom contexts for now, hDevice (0x%x)\n", hDevice)); 3913 // } 3914 3915 pCreateContext->hContext = pContext; 3916 pCreateContext->ContextInfo.DmaBufferSize = VBOXWDDM_C_DMA_BUFFER_SIZE; 3917 pCreateContext->ContextInfo.DmaBufferSegmentSet = 0; 3918 pCreateContext->ContextInfo.DmaBufferPrivateDataSize = sizeof (VBOXWDDM_DMA_PRIVATE_DATA); 3919 pCreateContext->ContextInfo.AllocationListSize = VBOXWDDM_C_ALLOC_LIST_SIZE; 3920 pCreateContext->ContextInfo.PatchLocationListSize = VBOXWDDM_C_PATH_LOCATION_LIST_SIZE; 3921 //#if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN7) 3922 //# error port to Win7 DDI 3923 // //pCreateContext->ContextInfo.DmaBufferAllocationGroup = ???; 3924 //#endif // DXGKDDI_INTERFACE_VERSION 4039 Assert(pContext); 4040 if (pContext) 4041 { 4042 InitializeListHead(&pContext->ListEntry); 4043 pContext->pDevice = pDevice; 4044 pContext->hContext = pCreateContext->hContext; 4045 pContext->EngineAffinity = pCreateContext->EngineAffinity; 4046 pContext->NodeOrdinal = pCreateContext->NodeOrdinal; 4047 vboxVideoCmCtxInitEmpty(&pContext->CmContext); 4048 if (pCreateContext->Flags.SystemContext) 4049 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_SYSTEM; 4050 else if (pCreateContext->Flags.Value == 0) 4051 { 4052 Assert(pCreateContext->PrivateDriverDataSize == sizeof (VBOXWDDM_CREATECONTEXT_INFO)); 4053 Assert(pCreateContext->pPrivateDriverData); 4054 if (pCreateContext->PrivateDriverDataSize == sizeof (VBOXWDDM_CREATECONTEXT_INFO)) 4055 { 4056 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D; 4057 PVBOXWDDM_CREATECONTEXT_INFO pInfo = (PVBOXWDDM_CREATECONTEXT_INFO)pCreateContext->pPrivateDriverData; 4058 Status = vboxVideoCmCtxAdd(&pDevice->pAdapter->CmMgr, &pContext->CmContext, (HANDLE)pInfo->hUmEvent, pInfo->u64UmInfo); 4059 Assert(Status == STATUS_SUCCESS); 4060 if (Status == STATUS_SUCCESS) 4061 { 4062 KIRQL OldIrql; 4063 KeAcquireSpinLock(&pDevExt->SynchLock, &OldIrql); 4064 InsertHeadList(&pDevExt->ContextList3D, &pContext->ListEntry); 4065 KeReleaseSpinLock(&pDevExt->SynchLock, OldIrql); 4066 } 4067 } 4068 else 4069 { 4070 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D; 4071 } 4072 } 4073 else 4074 { 4075 AssertBreakpoint(); /* we do not support custom contexts for now */ 4076 drprintf((__FUNCTION__ ", we do not support custom contexts for now, hDevice (0x%x)\n", hDevice)); 4077 } 4078 4079 if (Status == STATUS_SUCCESS) 4080 { 4081 pCreateContext->hContext = pContext; 4082 pCreateContext->ContextInfo.DmaBufferSize = VBOXWDDM_C_DMA_BUFFER_SIZE; 4083 pCreateContext->ContextInfo.DmaBufferSegmentSet = 0; 4084 pCreateContext->ContextInfo.DmaBufferPrivateDataSize = sizeof (VBOXWDDM_DMA_PRIVATE_DATA); 4085 pCreateContext->ContextInfo.AllocationListSize = VBOXWDDM_C_ALLOC_LIST_SIZE; 4086 pCreateContext->ContextInfo.PatchLocationListSize = VBOXWDDM_C_PATH_LOCATION_LIST_SIZE; 4087 //#if (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WIN7) 4088 //# error port to Win7 DDI 4089 // //pCreateContext->ContextInfo.DmaBufferAllocationGroup = ???; 4090 //#endif // DXGKDDI_INTERFACE_VERSION 4091 } 4092 else 4093 vboxWddmMemFree(pContext); 4094 } 4095 else 4096 Status = STATUS_NO_MEMORY; 3925 4097 3926 4098 dfprintf(("<== "__FUNCTION__ ", hDevice(0x%x)\n", hDevice)); … … 3936 4108 dfprintf(("==> "__FUNCTION__ ", hContext(0x%x)\n", hContext)); 3937 4109 vboxVDbgBreakFv(); 3938 vboxWddmMemFree(hContext); 4110 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext; 4111 PDEVICE_EXTENSION pDevExt = pContext->pDevice->pAdapter; 4112 if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D) 4113 { 4114 KIRQL OldIrql; 4115 KeAcquireSpinLock(&pDevExt->SynchLock, &OldIrql); 4116 RemoveEntryList(&pContext->ListEntry); 4117 KeReleaseSpinLock(&pDevExt->SynchLock, OldIrql); 4118 } 4119 4120 NTSTATUS Status = vboxVideoCmCtxRemove(&pContext->pDevice->pAdapter->CmMgr, &pContext->CmContext); 4121 Assert(Status == STATUS_SUCCESS); 4122 if (Status == STATUS_SUCCESS) 4123 vboxWddmMemFree(pContext); 4124 3939 4125 dfprintf(("<== "__FUNCTION__ ", hContext(0x%x)\n", hContext)); 3940 return STATUS_SUCCESS; 4126 4127 return Status; 3941 4128 } 3942 4129 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h
r30308 r30405 112 112 { 113 113 VBOXWDDM_CONTEXT_TYPE_UNDEFINED = 0, 114 VBOXWDDM_CONTEXT_TYPE_SYSTEM 114 VBOXWDDM_CONTEXT_TYPE_SYSTEM, 115 VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D, 116 VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D 115 117 } VBOXWDDM_CONTEXT_TYPE; 116 118 117 119 typedef struct VBOXWDDM_CONTEXT 118 120 { 121 LIST_ENTRY ListEntry; 119 122 struct VBOXWDDM_DEVICE * pDevice; 120 123 HANDLE hContext; … … 123 126 UINT EngineAffinity; 124 127 UINT uLastCompletedCmdFenceId; 128 RECT ViewRect; 129 VBOXVIDEOCM_CTX CmContext; 125 130 } VBOXWDDM_CONTEXT, *PVBOXWDDM_CONTEXT; 131 132 #define VBOXWDDMENTRY_2_CONTEXT(_pE) ((PVBOXWDDM_CONTEXT)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_CONTEXT, ListEntry))) 126 133 127 134 typedef struct VBOXWDDM_DMA_PRIVATE_DATA -
trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h
r28800 r30405 20 20 #ifdef VBOXWDDM 21 21 # define VBOXESC_REINITVIDEOMODES 0xABCD9003 22 # define VBOXESC_GETVBOXVIDEOCMCMD 0xABCD9004 22 23 23 24 typedef struct … … 36 37 37 38 #define VBOXWDDM_RECOMMENDVIDPN_SIZE(_c) (RT_OFFSETOF(VBOXWDDM_RECOMMENDVIDPN, aScreenInfos[_c])) 39 38 40 #endif /* #ifdef VBOXWDDM */ 39 41
Note:
See TracChangeset
for help on using the changeset viewer.