Changeset 51260 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video
- Timestamp:
- May 15, 2014 3:35:56 PM (11 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxD3DIf.cpp
r50940 r51260 889 889 DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext; 890 890 DdiEscape.hDevice = pDevice->hDevice; 891 // DdiEscape.Flags.Value = 0; 891 DdiEscape.Flags.Value = 0; 892 DdiEscape.Flags.HardwareAccess = 1; 892 893 DdiEscape.pPrivateDriverData = &SetHostID; 893 894 DdiEscape.PrivateDriverDataSize = sizeof (SetHostID); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r50987 r51260 119 119 volatile uint32_t cContexts2D; 120 120 volatile uint32_t cContextsDispIfResize; 121 volatile uint32_t cRenderFromShadowDisabledContexts;122 121 volatile uint32_t cUnlockedVBVADisabled; 123 122 … … 125 124 126 125 DWORD dwDrvCfgFlags; 127 /* this is examined and swicthed by DxgkDdiSubmitCommand only! */128 volatile BOOLEAN fRenderToShadowDisabled;129 126 #ifdef VBOX_WITH_CROGL 130 127 BOOLEAN f3DEnabled; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp
r50862 r51260 1446 1446 1447 1447 #ifdef DEBUG_misha 1448 g_VBoxDbgBreakModes = 0;1449 #endif1450 1451 #ifdef DEBUG_misha1452 1448 LOGREL(("modes changed for target %d", i)); 1453 1449 #else … … 1481 1477 } 1482 1478 1483 PVBOXWDDM_TARGET pTarget = &pExt->aTargets[pMode->Mode.Id];1484 1479 /* @todo: this info should go from the target actually */ 1485 1480 PVBOXWDDM_SOURCE pSource = &pExt->aSources[pMode->Mode.Id]; … … 1505 1500 } 1506 1501 1507 if (p Target->HeightVisible/* <- active */1502 if (pSource->cTargets /* <- active */ 1508 1503 && pSource->AllocData.SurfDesc.width == pMode->Mode.Width 1509 1504 && pSource->AllocData.SurfDesc.height == pMode->Mode.Height -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r50940 r51260 1921 1921 Assert((UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays > pGetScanLine->VidPnTargetId); 1922 1922 VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[pGetScanLine->VidPnTargetId]; 1923 Assert(pTarget->HeightTotal); 1924 Assert(pTarget->HeightVisible); 1925 Assert(pTarget->HeightTotal >= pTarget->HeightVisible); 1926 if (pTarget->HeightTotal) 1923 Assert(pTarget->Size.cx); 1924 Assert(pTarget->Size.cy); 1925 if (pTarget->Size.cy) 1927 1926 { 1928 1927 uint32_t curScanLine; … … 1942 1941 VSyncTime.QuadPart = VSyncTime.QuadPart - DevVSyncTime.QuadPart; 1943 1942 /* time is in 100ns, */ 1944 curScanLine = (uint32_t)((pTarget-> HeightTotal* VSyncTime.QuadPart) / DevVSyncTime.QuadPart);1943 curScanLine = (uint32_t)((pTarget->Size.cy * VSyncTime.QuadPart) / DevVSyncTime.QuadPart); 1945 1944 if (pDevExt->bVSyncTimerEnabled) 1946 1945 { 1947 if (curScanLine >= pTarget-> HeightTotal)1946 if (curScanLine >= pTarget->Size.cy) 1948 1947 curScanLine = 0; 1949 1948 } 1950 1949 else 1951 1950 { 1952 curScanLine %= pTarget-> HeightTotal;1953 } 1954 } 1955 1956 bVBlank = (!curScanLine || curScanLine > pTarget-> HeightVisible);1951 curScanLine %= pTarget->Size.cy; 1952 } 1953 } 1954 1955 bVBlank = (!curScanLine || curScanLine > pTarget->Size.cy); 1957 1956 pGetScanLine->ScanLine = curScanLine; 1958 1957 pGetScanLine->InVerticalBlank = bVBlank; … … 2067 2066 } 2068 2067 2069 void vboxWddmDmAdjustDefaultVramLocations(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID ModifiedVidPnSourceId )2070 { 2071 PVBOXWDDM_SOURCE pSource = &p DevExt->aSources[ModifiedVidPnSourceId];2068 void vboxWddmDmAdjustDefaultVramLocations(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID ModifiedVidPnSourceId, VBOXWDDM_SOURCE *paSources) 2069 { 2070 PVBOXWDDM_SOURCE pSource = &paSources[ModifiedVidPnSourceId]; 2072 2071 PHYSICAL_ADDRESS PhAddr; 2073 2072 AssertRelease(pSource->AllocData.Addr.SegmentId); … … 2080 2079 PhAddr.QuadPart += pSource->AllocData.SurfDesc.cbSize; 2081 2080 PhAddr.QuadPart = ROUND_TO_PAGES(PhAddr.QuadPart); 2082 pSource = &p DevExt->aSources[i];2081 pSource = &paSources[i]; 2083 2082 if (pSource->AllocData.Addr.offVram != PhAddr.QuadPart 2084 2083 || pSource->AllocData.Addr.SegmentId != 1) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h
r50940 r51260 185 185 void vboxWddmDiInitDefault(DXGK_DISPLAY_INFORMATION *pInfo, PHYSICAL_ADDRESS PhAddr, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId); 186 186 void vboxWddmDiToAllocData(PVBOXMP_DEVEXT pDevExt, const DXGK_DISPLAY_INFORMATION *pInfo, struct VBOXWDDM_ALLOC_DATA *pAllocData); 187 void vboxWddmDmAdjustDefaultVramLocations(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID ModifiedVidPnSourceId );187 void vboxWddmDmAdjustDefaultVramLocations(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID ModifiedVidPnSourceId, struct VBOXWDDM_SOURCE *paSources); 188 188 #endif 189 189 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r51121 r51260 39 39 #endif 40 40 41 #ifdef DEBUG_misha42 extern DWORD g_VBoxDbgBreakModes;43 #endif44 45 41 #if 0 46 42 #include <iprt/avl.h> … … 119 115 #define VBOXWDDM_HGSYNC_F_SYNCED_LOCATION 0x02 120 116 #define VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY 0x04 121 #define VBOXWDDM_HGSYNC_F_SYNCED_ALL (VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS | VBOXWDDM_HGSYNC_F_SYNCED_LOCATION | VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY) 117 #define VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY 0x08 118 #define VBOXWDDM_HGSYNC_F_SYNCED_ALL (VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS | VBOXWDDM_HGSYNC_F_SYNCED_LOCATION | VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY | VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY) 122 119 #define VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY (VBOXWDDM_HGSYNC_F_SYNCED_ALL & ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION) 120 #define VBOXWDDM_HGSYNC_F_CHANGED_TOPOLOGY_ONLY (VBOXWDDM_HGSYNC_F_SYNCED_ALL & ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY) 123 121 124 122 typedef struct VBOXWDDM_SOURCE 125 123 { 126 124 struct VBOXWDDM_ALLOCATION * pPrimaryAllocation; 127 #ifdef VBOXWDDM_RENDER_FROM_SHADOW128 struct VBOXWDDM_ALLOCATION * pShadowAllocation;129 #endif130 125 VBOXWDDM_ALLOC_DATA AllocData; 131 126 uint8_t u8SyncState; 127 BOOLEAN fTargetsReported; 132 128 BOOLEAN bVisible; 133 129 #ifdef VBOX_WITH_CROGL … … 148 144 POINT VScreenPos; 149 145 VBOXWDDM_POINTER_INFO PointerInfo; 146 uint32_t cTargets; 147 VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap); 150 148 } VBOXWDDM_SOURCE, *PVBOXWDDM_SOURCE; 151 149 152 150 typedef struct VBOXWDDM_TARGET 153 151 { 154 uint32_t HeightVisible; 155 uint32_t HeightTotal; 152 RTRECTSIZE Size; 153 uint32_t u32Id; 154 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId; 156 155 /* since there coul be multiple state changes on auto-resize, 157 156 * we pend notifying host to avoid flickering */ 158 volatile bool fStateSyncPening;157 uint8_t u8SyncState; 159 158 bool fConnected; 160 159 bool fConfigured; … … 167 166 LIST_ENTRY SwapchainEntry; 168 167 VBOXWDDM_ALLOC_TYPE enmType; 169 volatile uint32_t cRefs;170 168 D3DDDI_RESOURCEFLAGS fRcFlags; 171 169 #ifdef VBOX_WITH_VIDEOHWACCEL -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
r51121 r51260 1342 1342 } 1343 1343 1344 int VBoxCmdVbvaConCmdResize(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint16_t fFlags)1344 int VBoxCmdVbvaConCmdResize(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint16_t fFlags) 1345 1345 { 1346 1346 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); … … 1359 1359 if (RT_SUCCESS(rc)) 1360 1360 { 1361 memcpy(&pResize->Resize.aEntries[0].aTargetMap, pTargetMap, sizeof (pResize->Resize.aEntries[0].aTargetMap)); 1361 1362 rc = vboxCmdVbvaCtlSubmitSync(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx, &pResize->Hdr); 1362 1363 if (RT_SUCCESS(rc)) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h
r51121 r51260 247 247 int VBoxCmdVbvaConCmdSubmitAsync(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA_CRCMD_CMD* pCmd, FNVBOXSHGSMICMDCOMPLETION pfnCompletion, void *pvCompletion); 248 248 int VBoxCmdVbvaConCmdCompletionData(void *pvCmd, VBOXCMDVBVA_CRCMD_CMD **ppCmd); 249 int VBoxCmdVbvaConCmdResize(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint16_t fFlags);249 int VBoxCmdVbvaConCmdResize(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint16_t fFlags); 250 250 #endif /* #ifdef VBOX_WITH_CROGL */ 251 251 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r50987 r51260 1136 1136 } 1137 1137 1138 1139 static NTSTATUS vboxVdmaProcessVRegTexPresent(PVBOXMP_DEVEXT pDevExt, 1140 VBOXMP_CRPACKER *pCrPacker, 1141 uint32_t u32CrConClientID, 1142 const VBOXWDDM_ALLOC_DATA *pSrcAllocData, 1143 const VBOXWDDM_ALLOC_DATA *pDstAllocData, 1144 const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects) 1145 { 1146 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId = pDstAllocData->SurfDesc.VidPnSourceId; 1147 if (srcId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays) 1148 { 1149 WARN(("invalid srcId")); 1150 return STATUS_NOT_SUPPORTED; 1151 } 1152 1153 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[srcId]; 1154 1155 bool fPrimary = vboxWddmAddrVramEqual(&pDstAllocData->Addr, &pSource->AllocData.Addr); 1156 /* we care only about screen regions */ 1157 if (!fPrimary) 1158 { 1159 WARN(("non-primary allocation passed to vboxWddmSubmitBltCmd!")); 1160 return STATUS_NOT_SUPPORTED; 1161 } 1162 1163 NTSTATUS Status = STATUS_UNSUCCESSFUL; 1164 uint32_t hostID = pSrcAllocData->hostID; 1165 int rc; 1166 if (hostID) 1167 { 1168 // Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D); 1169 int32_t posX = pDstRects->ContextRect.left - pSrcRect->left; 1170 int32_t posY = pDstRects->ContextRect.top - pSrcRect->top; 1171 1172 Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, posX, posY, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 1173 if (NT_SUCCESS(Status)) 1174 { 1175 rc = VBoxVrListRectsSubst(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, NULL); 1176 if (RT_SUCCESS(rc)) 1177 pSource->fHas3DVrs = TRUE; 1178 else 1179 WARN(("VBoxVrListRectsSubst failed rc %d, ignoring..", rc)); 1180 } 1181 else 1182 WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status)); 1183 } 1184 else 1185 { 1186 Assert(fPrimary); 1187 1188 bool fChanged = false; 1189 Assert(pSource->pPrimaryAllocation->bVisible); 1190 rc = VBoxVrListRectsAdd(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, &fChanged); 1191 if (RT_SUCCESS(rc)) 1192 { 1193 if (fChanged) 1194 { 1195 Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, 0, 0, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 1196 if (NT_SUCCESS(Status)) 1197 { 1198 if (pSource->fHas3DVrs) 1199 { 1200 if (VBoxVrListRectsCount(&pSource->VrList) == 1) 1201 { 1202 RTRECT Rect; 1203 VBoxVrListRectsGet(&pSource->VrList, 1, &Rect); 1204 if (Rect.xLeft == 0 1205 && Rect.yTop == 0 1206 && Rect.xRight == pDstAllocData->SurfDesc.width 1207 && Rect.yBottom == pDstAllocData->SurfDesc.height) 1208 { 1209 pSource->fHas3DVrs = FALSE; 1210 } 1211 } 1212 } 1213 } 1214 else 1215 WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status)); 1216 } 1217 } 1218 else 1219 WARN(("VBoxVrListRectsAdd failed rc %d, ignoring..", rc)); 1220 } 1221 1222 return Status; 1223 } 1224 1138 1225 static NTSTATUS vboxVdmaProcessVReg(PVBOXMP_DEVEXT pDevExt, 1139 1226 VBOXMP_CRPACKER *pCrPacker, … … 1149 1236 if (pDevExt->fTexPresentEnabled) 1150 1237 { 1151 /* we care only about screen regions */ 1152 if (pDstAlloc != pSource->pPrimaryAllocation) 1153 { 1154 WARN(("non-primary allocation passed to vboxWddmSubmitBltCmd!")); 1155 return STATUS_NOT_SUPPORTED; 1156 } 1157 1158 uint32_t hostID = pSrcAlloc->AllocData.hostID; 1159 int rc; 1160 if (hostID) 1161 { 1162 // Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D); 1163 int32_t posX = pDstRects->ContextRect.left - pSrcRect->left; 1164 int32_t posY = pDstRects->ContextRect.top - pSrcRect->top; 1165 1166 Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, posX, posY, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 1167 if (NT_SUCCESS(Status)) 1168 { 1169 rc = VBoxVrListRectsSubst(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, NULL); 1170 if (RT_SUCCESS(rc)) 1171 pSource->fHas3DVrs = TRUE; 1172 else 1173 WARN(("VBoxVrListRectsSubst failed rc %d, ignoring..", rc)); 1174 } 1175 else 1176 WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status)); 1177 } 1178 else if (pSource->pPrimaryAllocation == pDstAlloc) 1179 { 1180 bool fChanged = false; 1181 Assert(pSource->pPrimaryAllocation->bVisible); 1182 rc = VBoxVrListRectsAdd(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, &fChanged); 1183 if (RT_SUCCESS(rc)) 1184 { 1185 if (fChanged) 1186 { 1187 Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, hostID, srcId, 0, 0, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects); 1188 if (NT_SUCCESS(Status)) 1189 { 1190 if (pSource->fHas3DVrs) 1191 { 1192 if (VBoxVrListRectsCount(&pSource->VrList) == 1) 1193 { 1194 RTRECT Rect; 1195 VBoxVrListRectsGet(&pSource->VrList, 1, &Rect); 1196 if (Rect.xLeft == 0 1197 && Rect.yTop == 0 1198 && Rect.xRight == pDstAlloc->AllocData.SurfDesc.width 1199 && Rect.yBottom == pDstAlloc->AllocData.SurfDesc.height) 1200 { 1201 pSource->fHas3DVrs = FALSE; 1202 } 1203 } 1204 } 1205 } 1206 else 1207 WARN(("vboxVdmaTexPresentSubmit failed Status 0x%x", Status)); 1208 } 1209 } 1210 else 1211 WARN(("VBoxVrListRectsAdd failed rc %d, ignoring..", rc)); 1212 } 1213 else 1214 { 1215 WARN(("unexpected")); 1216 Status = STATUS_INVALID_PARAMETER; 1217 } 1238 Status = vboxVdmaProcessVRegTexPresent(pDevExt, pCrPacker, u32CrConClientID, 1239 &pSrcAlloc->AllocData, &pDstAlloc->AllocData, 1240 pSrcRect, pDstRects); 1218 1241 } 1219 1242 else … … 1238 1261 } 1239 1262 1240 NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pRealFbAlloc)1263 NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData) 1241 1264 { 1242 1265 VBOXMP_CRPACKER CrPacker; … … 1254 1277 Rect.left = 0; 1255 1278 Rect.top = 0; 1256 Rect.right = pRealFbAlloc->AllocData.SurfDesc.width; 1257 Rect.bottom = pRealFbAlloc->AllocData.SurfDesc.height; 1258 1259 VBOXVDMAPIPE_RECTS RectInfo; 1260 RectInfo.ContextRect = Rect; 1261 RectInfo.UpdateRects.cRects = 1; 1262 RectInfo.UpdateRects.aRects[0] = Rect; 1263 1264 return vboxVdmaProcessVReg(pDevExt, &CrPacker, u32CrConClientID, 1265 pRealFbAlloc, pRealFbAlloc, 1266 &Rect, &RectInfo); 1279 Rect.right = pAllocData->SurfDesc.width; 1280 Rect.bottom = pAllocData->SurfDesc.height; 1281 1282 if (pDevExt->fCmdVbvaEnabled) 1283 return vboxVdmaTexPresentSubmit(pDevExt, &CrPacker, u32CrConClientID, pAllocData->hostID, pAllocData->SurfDesc.VidPnSourceId, 0, 0, 1, (RTRECT*)&Rect); 1284 1285 if (pDevExt->fTexPresentEnabled) 1286 { 1287 VBOXVDMAPIPE_RECTS RectInfo; 1288 RectInfo.ContextRect = Rect; 1289 RectInfo.UpdateRects.cRects = 1; 1290 RectInfo.UpdateRects.aRects[0] = Rect; 1291 1292 return vboxVdmaProcessVRegTexPresent(pDevExt, &CrPacker, u32CrConClientID, 1293 pAllocData, pAllocData, 1294 &Rect, &RectInfo); 1295 } 1296 1297 return STATUS_NOT_IMPLEMENTED; 1267 1298 } 1268 1299 … … 1309 1340 PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc; 1310 1341 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 1311 BOOLEAN fRenderFromSharedDisabled = pDevExt->fRenderToShadowDisabled;1312 1342 BOOLEAN fVRAMUpdated = FALSE; 1313 1343 #ifdef VBOX_WITH_CROGL … … 1321 1351 1322 1352 #ifdef VBOX_WITH_CROGL 1323 if (VBOXWDDM_IS_ REAL_FB_ALLOCATION(pDevExt, pDstAlloc)1353 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc) 1324 1354 && pDstAlloc->bVisible) 1325 1355 { … … 1328 1358 Assert(pSource->pPrimaryAllocation == pDstAlloc); 1329 1359 1330 1331 1360 if (fVRAMUpdated) 1332 1361 vboxVdmaBltDirtyRectsUpdate(pDevExt, pSource, pBlt->Blt.DstRects.UpdateRects.cRects, pBlt->Blt.DstRects.UpdateRects.aRects); … … 1348 1377 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 1349 1378 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 1350 vboxWddmAssignPrimary(p DevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId);1379 vboxWddmAssignPrimary(pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 1351 1380 #ifdef VBOX_WITH_CROGL 1352 1381 if (pAlloc->AllocData.hostID) … … 2043 2072 return STATUS_NO_MEMORY; 2044 2073 } 2045 2046 #ifdef VBOXWDDM_RENDER_FROM_SHADOW2047 NTSTATUS vboxVdmaHlpUpdatePrimary(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RECT* pRect)2048 {2049 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];2050 Assert(pSource->pPrimaryAllocation);2051 Assert(pSource->pShadowAllocation);2052 if (!pSource->pPrimaryAllocation)2053 return STATUS_INVALID_PARAMETER;2054 if (!pSource->pShadowAllocation)2055 return STATUS_INVALID_PARAMETER;2056 2057 if (vboxWddmAddrFramOffset(&pSource->pPrimaryAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID)2058 {2059 WARN(("invalid primary"));2060 return STATUS_INVALID_PARAMETER;2061 }2062 if (vboxWddmAddrFramOffset(&pSource->pShadowAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID)2063 {2064 WARN(("invalid secondary"));2065 return STATUS_INVALID_PARAMETER;2066 }2067 2068 NTSTATUS Status = vboxVdmaGgDmaBltPerform(pDevExt, &pSource->pShadowAllocation->AllocData, pRect, &pSource->pPrimaryAllocation->AllocData, pRect);2069 Assert(Status == STATUS_SUCCESS);2070 return Status;2071 }2072 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r50940 r51260 115 115 } 116 116 117 #ifdef VBOXWDDM_RENDER_FROM_SHADOW118 NTSTATUS vboxVdmaHlpUpdatePrimary(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RECT* pRect);119 #endif120 121 117 #if 0 122 118 typedef DECLCALLBACK(int) FNVBOXVDMASUBMIT(struct _DEVICE_EXTENSION* pDevExt, struct VBOXVDMAINFO * pInfo, HGSMIOFFSET offDr, PVOID pvContext); … … 320 316 NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF); 321 317 #ifdef VBOX_WITH_CROGL 322 NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pRealFbAlloc);318 NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData); 323 319 #endif 324 320 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVhwa.cpp
r50987 r51260 890 890 PVBOXWDDM_ALLOCATION pAlloc = pCF->ClrFill.Alloc.pAlloc; 891 891 Assert(pAlloc->pResource == pOverlay->pResource); 892 #ifdef VBOXWDDM_RENDER_FROM_SHADOW893 if (pAlloc->bAssigned)894 {895 /* check if this is a primary surf */896 PVBOXWDDM_SOURCE pSource = &pOverlay->pDevExt->aSources[pOverlay->VidPnSourceId];897 if (pSource->pPrimaryAllocation == pAlloc)898 {899 pAlloc = pSource->pShadowAllocation;900 Assert(pAlloc->pResource == pOverlay->pResource);901 }902 }903 #endif904 892 905 893 if (pAlloc->AllocData.Addr.SegmentId != 1) … … 1135 1123 1136 1124 vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay); 1137 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 1125 1138 1126 RECT DstRect; 1139 1127 vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect); 1140 NTSTATUS Status = vboxVdmaHlpUpdatePrimary(pDevExt, VidPnSourceId, &DstRect); 1141 Assert(Status == STATUS_SUCCESS); 1142 /* ignore primary update failure */ 1143 Status = STATUS_SUCCESS; 1144 #endif 1128 1145 1129 rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, DstRect.right ? &DstRect : NULL); 1146 1130 if (!RT_SUCCESS(rc)) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
r50628 r51260 453 453 pNewVidPnTargetModeInfo->Preference = fPreferred ? D3DKMDT_MP_PREFERRED : D3DKMDT_MP_NOTPREFERRED; 454 454 return vboxVidPnPopulateVideoSignalInfo(&pNewVidPnTargetModeInfo->VideoSignalInfo, pResolution, 60 /* ULONG VSync */); 455 } 456 457 void VBoxVidPnStTargetCleanup(PVBOXWDDM_SOURCE paSources, uint32_t cScreens, PVBOXWDDM_TARGET pTarget) 458 { 459 if (pTarget->VidPnSourceId == D3DDDI_ID_UNINITIALIZED) 460 return; 461 462 Assert(pTarget->VidPnSourceId < cScreens); 463 464 PVBOXWDDM_SOURCE pSource = &paSources[pTarget->VidPnSourceId]; 465 if (!pSource) 466 return; 467 Assert(pSource->cTargets); 468 Assert(ASMBitTest(pSource->aTargetMap, pTarget->u32Id)); 469 ASMBitClear(pSource->aTargetMap, pTarget->u32Id); 470 pSource->cTargets--; 471 pTarget->VidPnSourceId = D3DDDI_ID_UNINITIALIZED; 472 473 pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY; 474 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY; 475 } 476 477 void VBoxVidPnStSourceTargetAdd(PVBOXWDDM_SOURCE paSources, uint32_t cScreens, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET pTarget) 478 { 479 if (pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId) 480 return; 481 482 VBoxVidPnStTargetCleanup(paSources, cScreens, pTarget); 483 484 ASMBitSet(pSource->aTargetMap, pTarget->u32Id); 485 pSource->cTargets++; 486 pTarget->VidPnSourceId = pSource->AllocData.SurfDesc.VidPnSourceId; 487 488 pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY; 489 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY; 490 } 491 492 void VBoxVidPnStTIterInit(PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET paTargets, uint32_t cTargets, VBOXWDDM_TARGET_ITER *pIter) 493 { 494 pIter->pSource = pSource; 495 pIter->paTargets = paTargets; 496 pIter->cTargets = cTargets; 497 pIter->i = 0; 498 pIter->c = 0; 499 } 500 501 PVBOXWDDM_TARGET VBoxVidPnStTIterNext(VBOXWDDM_TARGET_ITER *pIter) 502 { 503 PVBOXWDDM_SOURCE pSource = pIter->pSource; 504 if (pSource->cTargets <= pIter->c) 505 return NULL; 506 507 int i = (!pIter->c) ? ASMBitFirstSet(pSource->aTargetMap, pIter->cTargets) 508 : ASMBitNextSet(pSource->aTargetMap, pIter->cTargets, pIter->i); 509 if (i < 0) 510 STOP_FATAL(); 511 512 pIter->i = (uint32_t)i; 513 pIter->c++; 514 return &pIter->paTargets[i]; 515 } 516 517 void VBoxVidPnStSourceCleanup(PVBOXWDDM_SOURCE paSources, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, PVBOXWDDM_TARGET paTargets, uint32_t cTargets) 518 { 519 PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId]; 520 VBOXWDDM_TARGET_ITER Iter; 521 VBoxVidPnStTIterInit(pSource, paTargets, cTargets, &Iter); 522 for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter); 523 pTarget; 524 pTarget = VBoxVidPnStTIterNext(&Iter)) 525 { 526 Assert(pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId); 527 VBoxVidPnStTargetCleanup(paSources, cTargets, pTarget); 528 /* iterator is not safe wrt target removal, reinit it */ 529 VBoxVidPnStTIterInit(pSource, paTargets, cTargets, &Iter); 530 } 531 } 532 533 void VBoxVidPnStCleanup(PVBOXWDDM_SOURCE paSources, PVBOXWDDM_TARGET paTargets, uint32_t cScreens) 534 { 535 for (UINT i = 0; i < cScreens; ++i) 536 { 537 PVBOXWDDM_TARGET pTarget = &paTargets[i]; 538 VBoxVidPnStTargetCleanup(paSources, cScreens, pTarget); 539 } 540 } 541 542 void VBoxVidPnAllocDataInit(VBOXWDDM_ALLOC_DATA *pData, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 543 { 544 memset(pData, 0, sizeof (*pData)); 545 pData->SurfDesc.VidPnSourceId = VidPnSourceId; 546 pData->Addr.offVram = VBOXVIDEOOFFSET_VOID; 547 } 548 549 void VBoxVidPnSourceInit(PVBOXWDDM_SOURCE pSource, const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId) 550 { 551 memset(pSource, 0, sizeof (*pSource)); 552 VBoxVidPnAllocDataInit(&pSource->AllocData, VidPnSourceId); 553 } 554 555 void VBoxVidPnTargetInit(PVBOXWDDM_TARGET pTarget, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId) 556 { 557 memset(pTarget, 0, sizeof (*pTarget)); 558 pTarget->u32Id = VidPnTargetId; 559 pTarget->VidPnSourceId = D3DDDI_ID_UNINITIALIZED; 560 } 561 562 void VBoxVidPnSourcesInit(PVBOXWDDM_SOURCE pSources, uint32_t cScreens) 563 { 564 for (uint32_t i = 0; i < cScreens; ++i) 565 VBoxVidPnSourceInit(&pSources[i], i); 566 } 567 568 void VBoxVidPnTargetsInit(PVBOXWDDM_TARGET pTargets, uint32_t cScreens) 569 { 570 for (uint32_t i = 0; i < cScreens; ++i) 571 VBoxVidPnTargetInit(&pTargets[i], i); 572 } 573 574 void VBoxVidPnSourceCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc) 575 { 576 uint8_t u8SyncState = pDst->u8SyncState; 577 *pDst = *pSrc; 578 pDst->u8SyncState |= u8SyncState; 579 } 580 581 void VBoxVidPnTargetCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc) 582 { 583 uint8_t u8SyncState = pDst->u8SyncState; 584 *pDst = *pSrc; 585 pDst->u8SyncState |= u8SyncState; 586 } 587 588 void VBoxVidPnSourcesCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc, uint32_t cScreens) 589 { 590 for (uint32_t i = 0; i < cScreens; ++i) 591 VBoxVidPnSourceCopy(&pDst[i], &pSrc[i]); 592 } 593 594 void VBoxVidPnTargetsCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc, uint32_t cScreens) 595 { 596 for (uint32_t i = 0; i < cScreens; ++i) 597 VBoxVidPnTargetCopy(&pDst[i], &pSrc[i]); 455 598 } 456 599 … … 2088 2231 } 2089 2232 2090 NTSTATUS vboxVidPnSetupSourceInfo(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_SOURCE pSource, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation) 2091 { 2233 NTSTATUS vboxVidPnSetupSourceInfo(PVBOXMP_DEVEXT pDevExt, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation, 2234 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources) 2235 { 2236 PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId]; 2092 2237 /* pVidPnSourceModeInfo could be null if STATUS_GRAPHICS_MODE_NOT_PINNED, 2093 * see vboxVidPnCommitSourceModeForSrcId */2238 * see VBoxVidPnCommitSourceModeForSrcId */ 2094 2239 uint8_t fChanges = 0; 2095 2240 if (pVidPnSourceModeInfo) … … 2134 2279 if (g_VBoxDisplayOnly) 2135 2280 { 2136 vboxWddmDmAdjustDefaultVramLocations(pDevExt, srcId);2281 vboxWddmDmAdjustDefaultVramLocations(pDevExt, VidPnSourceId, paSources); 2137 2282 } 2138 2283 #endif … … 2140 2285 else 2141 2286 { 2287 VBoxVidPnAllocDataInit(&pSource->AllocData, VidPnSourceId); 2142 2288 Assert(!pAllocation); 2143 2289 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_ALL; 2144 2290 } 2145 2291 2146 vboxWddmAssignPrimary(p DevExt, pSource, pAllocation, srcId);2147 2148 Assert(pSource->AllocData.SurfDesc.VidPnSourceId == srcId);2292 vboxWddmAssignPrimary(pSource, pAllocation, VidPnSourceId); 2293 2294 Assert(pSource->AllocData.SurfDesc.VidPnSourceId == VidPnSourceId); 2149 2295 pSource->u8SyncState &= ~fChanges; 2150 2296 return STATUS_SUCCESS; 2151 2297 } 2152 2298 2153 NTSTATUS vboxVidPnCommitSourceMode(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation) 2154 { 2155 Assert(srcId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 2156 if (srcId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays) 2157 { 2158 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[srcId]; 2159 return vboxVidPnSetupSourceInfo(pDevExt, srcId, pSource, pVidPnSourceModeInfo, pAllocation); 2160 } 2161 2162 LOGREL(("invalid srcId (%d), cSources(%d)", srcId, VBoxCommonFromDeviceExt(pDevExt)->cDisplays)); 2299 NTSTATUS vboxVidPnCommitSourceMode(PVBOXMP_DEVEXT pDevExt, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation, 2300 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources) 2301 { 2302 if (VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays) 2303 return vboxVidPnSetupSourceInfo(pDevExt, pVidPnSourceModeInfo, pAllocation, VidPnSourceId, paSources); 2304 2305 WARN(("invalid srcId (%d), cSources(%d)", VidPnSourceId, VBoxCommonFromDeviceExt(pDevExt)->cDisplays)); 2163 2306 return STATUS_INVALID_PARAMETER; 2164 2307 } … … 2169 2312 D3DKMDT_HVIDPN hVidPn; 2170 2313 const DXGK_VIDPN_INTERFACE* pVidPnInterface; 2314 VBOXWDDM_SOURCE *paSources; 2315 VBOXWDDM_TARGET *paTargets; 2171 2316 } VBOXVIDPNCOMMITTARGETMODE; 2172 2317 … … 2187 2332 if (Status == STATUS_SUCCESS) 2188 2333 { 2189 VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[VidPnTargetId]; 2190 if (pTarget->HeightVisible != pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy 2191 || pTarget->HeightTotal != pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy) 2192 { 2193 pTarget->HeightVisible = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy; 2194 pTarget->HeightTotal = pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy; 2195 } 2334 VBOXWDDM_SOURCE *pSource = &pInfo->paSources[VidPnSourceId]; 2335 VBOXWDDM_TARGET *pTarget = &pInfo->paTargets[VidPnTargetId]; 2336 pTarget->Size.cx = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cx; 2337 pTarget->Size.cy = pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy; 2338 2339 VBoxVidPnStSourceTargetAdd(pInfo->paSources, VBoxCommonFromDeviceExt(pDevExt)->cDisplays, pSource, pTarget); 2340 2341 pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2342 2196 2343 pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hVidPnTargetModeSet, pPinnedVidPnTargetModeInfo); 2197 2344 } 2345 else 2346 WARN(("pfnAcquirePinnedModeInfo failed Status(0x%x)", Status)); 2198 2347 2199 2348 pInfo->pVidPnInterface->pfnReleaseTargetModeSet(pInfo->hVidPn, hVidPnTargetModeSet); 2200 2349 } 2201 2350 else 2202 LOGREL(("pfnAcquireTargetModeSet failed Status(0x%x)", Status));2351 WARN(("pfnAcquireTargetModeSet failed Status(0x%x)", Status)); 2203 2352 2204 2353 pInfo->Status = Status; … … 2206 2355 } 2207 2356 2208 #ifdef DEBUG_misha 2209 DWORD g_VBoxDbgBreakModes = 0; 2210 #endif 2211 2212 NTSTATUS vboxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_ALLOCATION pAllocation) 2357 NTSTATUS VBoxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, 2358 PVBOXWDDM_ALLOCATION pAllocation, 2359 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets) 2213 2360 { 2214 2361 D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet; 2215 2362 const DXGK_VIDPNSOURCEMODESET_INTERFACE *pCurVidPnSourceModeSetInterface; 2216 2363 2217 #ifdef DEBUG_misha 2218 if (pAllocation) 2219 { 2220 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == srcId); 2221 } 2222 #endif 2364 PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId]; 2365 VBOXWDDM_TARGET_ITER Iter; 2366 VBoxVidPnStTIterInit(pSource, paTargets, (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays, &Iter); 2367 for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter); 2368 pTarget; 2369 pTarget = VBoxVidPnStTIterNext(&Iter)) 2370 { 2371 Assert(pTarget->VidPnSourceId == pSource->AllocData.SurfDesc.VidPnSourceId); 2372 pTarget->Size.cx = 0; 2373 pTarget->Size.cy = 0; 2374 pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL; 2375 } 2376 2377 VBoxVidPnStSourceCleanup(paSources, VidPnSourceId, paTargets, (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 2223 2378 2224 2379 NTSTATUS Status = pVidPnInterface->pfnAcquireSourceModeSet(hDesiredVidPn, 2225 srcId,2380 VidPnSourceId, 2226 2381 &hCurVidPnSourceModeSet, 2227 2382 &pCurVidPnSourceModeSetInterface); … … 2235 2390 { 2236 2391 Assert(pPinnedVidPnSourceModeInfo); 2237 Status = vboxVidPnCommitSourceMode(pDevExt, srcId, pPinnedVidPnSourceModeInfo, pAllocation);2392 Status = vboxVidPnCommitSourceMode(pDevExt, pPinnedVidPnSourceModeInfo, pAllocation, VidPnSourceId, paSources); 2238 2393 Assert(Status == STATUS_SUCCESS); 2239 2394 if (Status == STATUS_SUCCESS) … … 2249 2404 TgtModeInfo.hVidPn = hDesiredVidPn; 2250 2405 TgtModeInfo.pVidPnInterface = pVidPnInterface; 2406 TgtModeInfo.paSources = paSources; 2407 TgtModeInfo.paTargets = paTargets; 2251 2408 Status = vboxVidPnEnumTargetsForSource(pDevExt, hVidPnTopology, pVidPnTopologyInterface, 2252 srcId,2409 VidPnSourceId, 2253 2410 vboxVidPnCommitTargetModeEnum, &TgtModeInfo); 2254 2411 Assert(Status == STATUS_SUCCESS || Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY); … … 2275 2432 else if (Status == STATUS_GRAPHICS_MODE_NOT_PINNED) 2276 2433 { 2277 #ifdef DEBUG_misha 2278 Assert(!g_VBoxDbgBreakModes); 2279 ++g_VBoxDbgBreakModes; 2280 #endif 2281 Status = vboxVidPnCommitSourceMode(pDevExt, srcId, NULL, pAllocation); 2434 Status = vboxVidPnCommitSourceMode(pDevExt, NULL, pAllocation, VidPnSourceId, paSources); 2282 2435 Assert(Status == STATUS_SUCCESS); 2283 2436 } … … 2294 2447 return Status; 2295 2448 } 2449 2450 typedef struct VBOXVIDPNCOMMIT 2451 { 2452 NTSTATUS Status; 2453 PVBOXMP_DEVEXT pDevExt; 2454 D3DKMDT_HVIDPN hVidPn; 2455 const DXGK_VIDPN_INTERFACE* pVidPnInterface; 2456 PVBOXWDDM_ALLOCATION pAllocation; 2457 VBOXWDDM_SOURCE *paSources; 2458 VBOXWDDM_TARGET *paTargets; 2459 } VBOXVIDPNCOMMIT, *PVBOXVIDPNCOMMIT; 2296 2460 2297 2461 DECLCALLBACK(BOOLEAN) vboxVidPnCommitPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, … … 2301 2465 PVBOXVIDPNCOMMIT pCommitInfo = (PVBOXVIDPNCOMMIT)pContext; 2302 2466 PVBOXMP_DEVEXT pDevExt = pCommitInfo->pDevExt; 2303 const D3DKMDT_HVIDPN hDesiredVidPn = pCommitInfo-> pCommitVidPnArg->hFunctionalVidPn;2467 const D3DKMDT_HVIDPN hDesiredVidPn = pCommitInfo->hVidPn; 2304 2468 const DXGK_VIDPN_INTERFACE* pVidPnInterface = pCommitInfo->pVidPnInterface; 2305 2469 2306 if (pCommitInfo->pCommitVidPnArg->AffectedVidPnSourceId == D3DDDI_ID_ALL 2307 || pCommitInfo->pCommitVidPnArg->AffectedVidPnSourceId == pVidPnPresentPathInfo->VidPnSourceId) 2308 { 2309 Status = vboxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pVidPnPresentPathInfo->VidPnSourceId, (PVBOXWDDM_ALLOCATION)pCommitInfo->pCommitVidPnArg->hPrimaryAllocation); 2310 Assert(Status == STATUS_SUCCESS); 2311 if (Status != STATUS_SUCCESS) 2312 LOGREL(("vboxVidPnCommitSourceModeForSrcId failed Status(0x%x)", Status)); 2313 } 2470 Status = VBoxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pCommitInfo->pAllocation, 2471 pVidPnPresentPathInfo->VidPnSourceId, pCommitInfo->paSources, pCommitInfo->paTargets); 2472 if (Status != STATUS_SUCCESS) 2473 WARN(("VBoxVidPnCommitSourceModeForSrcId failed Status(0x%x)", Status)); 2314 2474 2315 2475 pCommitInfo->Status = Status; 2316 2476 pVidPnTopologyInterface->pfnReleasePathInfo(hVidPnTopology, pVidPnPresentPathInfo); 2317 2477 return Status == STATUS_SUCCESS; 2478 } 2479 2480 NTSTATUS VBoxVidPnCommitAll(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, 2481 PVBOXWDDM_ALLOCATION pAllocation, 2482 VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets) 2483 { 2484 D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology; 2485 const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface; 2486 NTSTATUS Status = pVidPnInterface->pfnGetTopology(hDesiredVidPn, &hVidPnTopology, &pVidPnTopologyInterface); 2487 if (!NT_SUCCESS(Status)) 2488 { 2489 WARN(("pfnGetTopology failed Status 0x%x", Status)); 2490 return Status; 2491 } 2492 2493 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 2494 { 2495 PVBOXWDDM_TARGET pTarget = &paTargets[i]; 2496 pTarget->Size.cx = 0; 2497 pTarget->Size.cy = 0; 2498 pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL; 2499 2500 if (pTarget->VidPnSourceId == D3DDDI_ID_UNINITIALIZED) 2501 continue; 2502 2503 Assert(pTarget->VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 2504 2505 VBOXWDDM_SOURCE *pSource = &paSources[pTarget->VidPnSourceId]; 2506 VBoxVidPnAllocDataInit(&pSource->AllocData, pTarget->VidPnSourceId); 2507 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL; 2508 } 2509 2510 VBoxVidPnStCleanup(paSources, paTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 2511 2512 VBOXVIDPNCOMMIT CbContext; 2513 memset(&CbContext, 0, sizeof (CbContext)); 2514 CbContext.pDevExt = pDevExt; 2515 CbContext.hVidPn = hDesiredVidPn; 2516 CbContext.pVidPnInterface = pVidPnInterface; 2517 CbContext.pAllocation = pAllocation; 2518 CbContext.paSources = paSources; 2519 CbContext.paTargets = paTargets; 2520 Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface, 2521 vboxVidPnCommitPathEnum, &CbContext); 2522 if (!NT_SUCCESS(Status)) 2523 { 2524 WARN(("vboxVidPnEnumPaths failed Status 0x%x", Status)); 2525 return Status; 2526 } 2527 2528 Status = CbContext.Status; 2529 if (!NT_SUCCESS(Status)) 2530 { 2531 WARN(("vboxVidPnCommitPathEnum failed Status 0x%x", Status)); 2532 return Status; 2533 } 2534 2535 return Status; 2318 2536 } 2319 2537 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h
r48070 r51260 22 22 #define VBOXVDPN_C_DISPLAY_HBLANK_SIZE 200 23 23 #define VBOXVDPN_C_DISPLAY_VBLANK_SIZE 180 24 25 void VBoxVidPnAllocDataInit(struct VBOXWDDM_ALLOC_DATA *pData, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId); 26 27 void VBoxVidPnSourceInit(PVBOXWDDM_SOURCE pSource, const D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId); 28 void VBoxVidPnTargetInit(PVBOXWDDM_TARGET pTarget, const D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId); 29 void VBoxVidPnSourceCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc); 30 void VBoxVidPnTargetCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc); 31 32 void VBoxVidPnSourcesInit(PVBOXWDDM_SOURCE pSources, uint32_t cScreens); 33 void VBoxVidPnTargetsInit(PVBOXWDDM_TARGET pTargets, uint32_t cScreens); 34 void VBoxVidPnSourcesCopy(VBOXWDDM_SOURCE *pDst, const VBOXWDDM_SOURCE *pSrc, uint32_t cScreens); 35 void VBoxVidPnTargetsCopy(VBOXWDDM_TARGET *pDst, const VBOXWDDM_TARGET *pSrc, uint32_t cScreens); 36 37 typedef struct VBOXWDDM_TARGET_ITER 38 { 39 PVBOXWDDM_SOURCE pSource; 40 PVBOXWDDM_TARGET paTargets; 41 uint32_t cTargets; 42 uint32_t i; 43 uint32_t c; 44 } VBOXWDDM_TARGET_ITER; 45 46 void VBoxVidPnStCleanup(PVBOXWDDM_SOURCE paSources, PVBOXWDDM_TARGET paTargets, uint32_t cScreens); 47 void VBoxVidPnStTIterInit(PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET paTargets, uint32_t cTargets, VBOXWDDM_TARGET_ITER *pIter); 48 PVBOXWDDM_TARGET VBoxVidPnStTIterNext(VBOXWDDM_TARGET_ITER *pIter); 24 49 25 50 NTSTATUS vboxVidPnCheckSourceModeInfo(const D3DKMDT_HVIDPN hDesiredVidPn, … … 62 87 } VBOXVIDPNCOFUNCMODALITY, *PVBOXVIDPNCOFUNCMODALITY; 63 88 64 typedef struct VBOXVIDPNCOMMIT65 {66 NTSTATUS Status;67 PVBOXMP_DEVEXT pDevExt;68 const DXGK_VIDPN_INTERFACE* pVidPnInterface;69 CONST DXGKARG_COMMITVIDPN* pCommitVidPnArg;70 } VBOXVIDPNCOMMIT, *PVBOXVIDPNCOMMIT;71 72 89 /* !!!NOTE: The callback is responsible for releasing the path */ 73 90 typedef DECLCALLBACK(BOOLEAN) FNVBOXVIDPNENUMPATHS(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, … … 105 122 const D3DKMDT_VIDPN_TARGET_MODE *pNewVidPnTargetModeInfo, PVOID pContext); 106 123 107 DECLCALLBACK(BOOLEAN) vboxVidPnCommitPathEnum(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, 108 const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo, PVOID pContext); 124 NTSTATUS VBoxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, 125 PVBOXWDDM_ALLOCATION pAllocation, 126 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets); 109 127 110 NTSTATUS vboxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, struct VBOXWDDM_ALLOCATION *pAllocation); 128 NTSTATUS VBoxVidPnCommitAll(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface, 129 PVBOXWDDM_ALLOCATION pAllocation, 130 VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets); 111 131 112 132 NTSTATUS vboxVidPnEnumPaths(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r51157 r51260 271 271 } 272 272 273 NTSTATUS vboxWddmGhDisplayPostResize (PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint16_t fFlags)273 NTSTATUS vboxWddmGhDisplayPostResizeLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint16_t fFlags) 274 274 { 275 275 int rc; 276 #ifdef VBOX_WITH_CROGL277 if (pDevExt->fCmdVbvaEnabled)278 {279 rc = VBoxCmdVbvaConCmdResize(pDevExt, pAllocData, pVScreenPos, fFlags);280 if (RT_SUCCESS(rc))281 return STATUS_SUCCESS;282 283 WARN(("VBoxCmdVbvaConCmdResize failed %d", rc));284 285 if (rc != VERR_NOT_IMPLEMENTED)286 {287 WARN(("VBoxCmdVbvaConCmdResize unexpected error occured %d", rc));288 return STATUS_UNSUCCESSFUL;289 }290 }291 #endif292 276 293 277 if (!(fFlags & VBVA_SCREEN_F_DISABLED)) … … 311 295 } 312 296 313 NTSTATUS vboxWddmGhDisplayHideScreen(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId) 314 { 315 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnTargetId]; 316 317 NTSTATUS Status = vboxWddmGhDisplayPostResize(pDevExt, &pSource->AllocData, &pSource->VScreenPos, VBVA_SCREEN_F_ACTIVE | VBVA_SCREEN_F_DISABLED); 318 if (!NT_SUCCESS(Status)) 319 WARN(("vboxWddmGhDisplayPostResize failed Status 0x%x", Status)); 320 return Status; 321 } 322 323 BOOL vboxWddmGhDisplayCheckCompletePeningScreenInfo(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId) 324 { 325 if (!ASMAtomicCmpXchgBool(&pDevExt->aTargets[VidPnTargetId].fStateSyncPening, false, true)) 326 return FALSE; 327 return vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, &pDevExt->aSources[VidPnTargetId]); 297 NTSTATUS vboxWddmGhDisplayPostResizeNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint16_t fFlags) 298 { 299 int rc = VBoxCmdVbvaConCmdResize(pDevExt, pAllocData, pTargetMap, pVScreenPos, fFlags); 300 if (RT_SUCCESS(rc)) 301 return STATUS_SUCCESS; 302 303 WARN(("VBoxCmdVbvaConCmdResize failed %d", rc)); 304 return STATUS_UNSUCCESSFUL; 328 305 } 329 306 330 307 NTSTATUS vboxWddmGhDisplaySetMode(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData) 331 308 { 332 // PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pPrimaryInfo = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);333 if (/*pPrimaryInfo->*/pAllocData->SurfDesc.VidPnSourceId)334 return STATUS_SUCCESS;335 336 309 VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr);; 337 310 if (offVram == VBOXVIDEOOFFSET_VOID) … … 366 339 } 367 340 368 NTSTATUS vboxWddmGhDisplayUpdateScreenPos(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, const POINT *pVScreenPos) 369 { 370 if (pSource->VScreenPos.x == pVScreenPos->x 371 && pSource->VScreenPos.y == pVScreenPos->y) 372 return STATUS_SUCCESS; 373 374 pSource->VScreenPos = *pVScreenPos; 375 376 NTSTATUS Status = vboxWddmGhDisplayPostResize(pDevExt, &pSource->AllocData, &pSource->VScreenPos, VBVA_SCREEN_F_ACTIVE); 377 Assert(Status == STATUS_SUCCESS); 378 return Status; 379 } 380 381 NTSTATUS vboxWddmGhDisplaySetInfo(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pRealFbAlloc, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState) 382 { 383 NTSTATUS Status; 341 NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState) 342 { 343 NTSTATUS Status = STATUS_SUCCESS; 344 bool fEnabled = !!pAllocData->SurfDesc.width; 345 uint16_t fu16Flags = fEnabled ? VBVA_SCREEN_F_ACTIVE : VBVA_SCREEN_F_DISABLED; 346 if (fEnabled) 347 { 384 348 #ifdef VBOX_WITH_CROGL 385 if ((u8CurCyncState & VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) == VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY 386 && pRealFbAlloc->AllocData.hostID) 387 { 388 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pRealFbAlloc); 389 if (!NT_SUCCESS(Status)) 390 WARN(("vboxVdmaTexPresentSetAlloc failed, Status 0x%x", Status)); 391 return Status; 392 } 393 #endif 394 Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocData); 349 if ((u8CurCyncState & VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) == VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY 350 && pAllocData->hostID) 351 { 352 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData); 353 if (!NT_SUCCESS(Status)) 354 WARN(("vboxVdmaTexPresentSetAlloc failed, Status 0x%x", Status)); 355 return Status; 356 } 357 #endif 358 359 if (pAllocData->SurfDesc.VidPnSourceId == 0) 360 Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocData); 361 } 362 395 363 if (NT_SUCCESS(Status)) 396 364 { 397 Status = vboxWddmGhDisplayPostResize(pDevExt, pAllocData, pVScreenPos, VBVA_SCREEN_F_ACTIVE); 365 Status = vboxWddmGhDisplayPostResizeLegacy(pDevExt, pAllocData, pVScreenPos, 366 fu16Flags); 398 367 if (NT_SUCCESS(Status)) 399 368 { 400 369 #ifdef VBOX_WITH_CROGL 401 if ( pDevExt->f3DEnabled)402 { 403 Status = vboxVdmaTexPresentSetAlloc(pDevExt, p RealFbAlloc);370 if (fEnabled && pDevExt->f3DEnabled) 371 { 372 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData); 404 373 if (NT_SUCCESS(Status)) 405 374 return STATUS_SUCCESS; … … 420 389 } 421 390 422 bool vboxWddmGhDisplaySetInfoFromSourceTarget(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_TARGET pTarget) 423 { 424 if (!pTarget->HeightVisible) 425 { 426 vboxWddmGhDisplayHideScreen(pDevExt, pSource->AllocData.SurfDesc.VidPnSourceId); 391 NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState) 392 { 393 NTSTATUS Status = STATUS_SUCCESS; 394 bool fEnabled = !!pAllocData->SurfDesc.width; 395 uint16_t fu16Flags = fEnabled ? VBVA_SCREEN_F_ACTIVE : VBVA_SCREEN_F_DISABLED; 396 if (fEnabled) 397 { 398 #ifdef VBOX_WITH_CROGL 399 if ((u8CurCyncState & VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) == VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY 400 && pAllocData->hostID) 401 { 402 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData); 403 if (!NT_SUCCESS(Status)) 404 WARN(("vboxVdmaTexPresentSetAlloc failed, Status 0x%x", Status)); 405 return Status; 406 } 407 #endif 408 409 if (ASMBitTest(pTargetMap, 0)) 410 Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocData); 411 } 412 413 if (NT_SUCCESS(Status)) 414 { 415 Status = vboxWddmGhDisplayPostResizeNew(pDevExt, pAllocData, pTargetMap, pVScreenPos, fu16Flags); 416 if (NT_SUCCESS(Status)) 417 { 418 #ifdef VBOX_WITH_CROGL 419 if (fEnabled && pDevExt->f3DEnabled) 420 { 421 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData); 422 if (NT_SUCCESS(Status)) 423 return STATUS_SUCCESS; 424 else 425 WARN(("vboxVdmaTexPresentSetAlloc failed, Status 0x%x", Status)); 426 } 427 #else 428 return STATUS_SUCCESS; 429 #endif 430 } 431 else 432 WARN(("vboxWddmGhDisplayPostResizeNew failed, Status 0x%x", Status)); 433 } 434 else 435 WARN(("vboxWddmGhDisplaySetMode failed, Status 0x%x", Status)); 436 437 return Status; 438 } 439 440 bool vboxWddmGhDisplayCheckSetInfoFromSourceNew(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, bool fReportTargets) 441 { 442 if (pSource->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL) 443 { 444 if (!pSource->fTargetsReported && fReportTargets) 445 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY; 446 else 447 return false; 448 } 449 450 if (!pSource->AllocData.Addr.SegmentId) 451 return false; 452 453 VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap); 454 uint32_t *pTargetMap; 455 if (fReportTargets) 456 pTargetMap = pSource->aTargetMap; 457 else 458 { 459 memset(aTargetMap, 0, sizeof (aTargetMap)); 460 pTargetMap = aTargetMap; 461 } 462 463 NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState); 464 if (NT_SUCCESS(Status)) 465 { 466 if (fReportTargets && (pSource->u8SyncState & VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) != VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) 467 { 468 VBOXWDDM_TARGET_ITER Iter; 469 VBoxVidPnStTIterInit(pSource, pDevExt->aTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays, &Iter); 470 471 for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter); 472 pTarget; 473 pTarget = VBoxVidPnStTIterNext(&Iter)) 474 { 475 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 476 } 477 } 478 427 479 pSource->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 480 pSource->fTargetsReported = !!fReportTargets; 428 481 return true; 429 482 } 430 483 431 PVBOXWDDM_ALLOCATION pFbAlloc = VBOXWDDM_FB_ALLOCATION(pDevExt, pSource); 432 PVBOXWDDM_ALLOCATION pRealFbAlloc = pSource->pPrimaryAllocation; 433 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 434 # ifdef VBOX_WDDM_WIN8 435 if (!g_VBoxDisplayOnly) 436 # endif 437 { 438 if (!pRealFbAlloc) 439 return false; 440 441 if (!pFbAlloc) 442 pFbAlloc = pRealFbAlloc; 443 444 if (!pFbAlloc || vboxWddmAddrFramOffset(&pFbAlloc->AllocData.Addr) == VBOXVIDEOOFFSET_VOID) 445 { 446 return false; 447 } 448 } 449 #endif 450 451 #ifdef VBOX_WDDM_WIN8 452 Assert(!g_VBoxDisplayOnly == !!pFbAlloc); 453 #else 454 Assert(pFbAlloc); 455 #endif 456 #ifndef VBOXWDDM_RENDER_FROM_SHADOW 457 Assert(!pFbAlloc || pFbAlloc->AllocData.Addr.offVram == pSource->AllocData.Addr.offVram); 458 #endif 459 Assert(!pFbAlloc || pFbAlloc->AllocData.Addr.SegmentId == pSource->AllocData.Addr.SegmentId); 460 461 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pRealFbAlloc, pFbAlloc ? &pFbAlloc->AllocData : &pSource->AllocData, &pSource->VScreenPos, pSource->u8SyncState); 462 if (NT_SUCCESS(Status)) 463 pSource->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 464 else 465 WARN(("vboxWddmGhDisplaySetInfo failed, Status (0x%x)", Status)); 466 467 vboxVideoCmSignalEvents(&pDevExt->SeamlessCtxMgr); 468 469 return true; 470 } 471 472 bool vboxWddmGhDisplayCheckSetInfoFromSource(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource) 473 { 474 Assert(VBOXVIDEOOFFSET_VOID != pSource->AllocData.Addr.offVram 475 || !pDevExt->aTargets[pSource->AllocData.SurfDesc.VidPnSourceId].HeightVisible); 484 WARN(("vboxWddmGhDisplaySetInfoNew failed, Status (0x%x)", Status)); 485 return false; 486 } 487 488 bool vboxWddmGhDisplayCheckSetInfoFromSourceLegacy(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, bool fReportTargets) 489 { 490 if (!fReportTargets) 491 return false; 476 492 477 493 if (pSource->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL) 478 494 return false; 479 495 480 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[pSource->AllocData.SurfDesc.VidPnSourceId]; 481 if (ASMAtomicUoReadBool(&pTarget->fStateSyncPening)) 496 if (!pSource->AllocData.Addr.SegmentId) 482 497 return false; 483 498 484 return vboxWddmGhDisplaySetInfoFromSourceTarget(pDevExt, pSource, pTarget); 485 } 486 487 static VOID vboxWddmModeRenderFromShadowDisableOnSubmitCommand(PVBOXMP_DEVEXT pDevExt, BOOLEAN fDisable) 488 { 499 VBOXWDDM_TARGET_ITER Iter; 500 VBoxVidPnStTIterInit(pSource, pDevExt->aTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays, &Iter); 501 uint8_t u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 502 VBOXWDDM_ALLOC_DATA AllocData = pSource->AllocData; 503 504 for (PVBOXWDDM_TARGET pTarget = VBoxVidPnStTIterNext(&Iter); 505 pTarget; 506 pTarget = VBoxVidPnStTIterNext(&Iter)) 507 { 508 AllocData.SurfDesc.VidPnSourceId = pTarget->u32Id; 509 NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState); 510 if (NT_SUCCESS(Status)) 511 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 512 else 513 { 514 WARN(("vboxWddmGhDisplaySetInfoLegacy failed, Status (0x%x)", Status)); 515 u8SyncState = 0; 516 } 517 } 518 519 pSource->u8SyncState |= u8SyncState; 520 521 return true; 522 } 523 524 bool vboxWddmGhDisplayCheckSetInfoFromSourceEx(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, bool fReportTargets) 525 { 526 if (pDevExt->fCmdVbvaEnabled) 527 return vboxWddmGhDisplayCheckSetInfoFromSourceNew(pDevExt, pSource, fReportTargets); 528 return vboxWddmGhDisplayCheckSetInfoFromSourceLegacy(pDevExt, pSource, fReportTargets); 529 } 530 531 bool vboxWddmGhDisplayCheckSetInfoFromSource(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource) 532 { 533 bool fReportTargets = !pDevExt->cContextsDispIfResize; 534 return vboxWddmGhDisplayCheckSetInfoFromSourceEx(pDevExt, pSource, fReportTargets); 535 } 536 537 bool vboxWddmGhDisplayCheckSetInfoForDisabledTargetsNew(PVBOXMP_DEVEXT pDevExt) 538 { 539 VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap); 540 541 memset(aTargetMap, 0, sizeof (aTargetMap)); 542 543 bool fFound = false; 489 544 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 490 545 { 491 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 492 PVBOXWDDM_ALLOCATION pFromAllocation; 493 PVBOXWDDM_ALLOCATION pToAllocation; 494 if (fDisable) 495 { 496 pFromAllocation = pSource->pShadowAllocation; 497 pToAllocation = pSource->pPrimaryAllocation; 498 } 546 VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[i]; 547 Assert(pTarget->u32Id == i); 548 if (pTarget->VidPnSourceId != D3DDDI_ID_UNINITIALIZED) 549 { 550 Assert(pTarget->VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 551 continue; 552 } 553 554 if (pTarget->u8SyncState != VBOXWDDM_HGSYNC_F_SYNCED_ALL) 555 fFound = true; 556 557 ASMBitSet(aTargetMap, i); 558 } 559 560 if (!fFound) 561 return false; 562 563 POINT VScreenPos = {0}; 564 VBOXWDDM_ALLOC_DATA AllocData; 565 VBoxVidPnAllocDataInit(&AllocData, D3DDDI_ID_UNINITIALIZED); 566 NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0); 567 if (!NT_SUCCESS(Status)) 568 { 569 WARN(("vboxWddmGhDisplaySetInfoNew failed %#x", Status)); 570 return false; 571 } 572 573 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 574 { 575 VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[i]; 576 if (pTarget->VidPnSourceId != D3DDDI_ID_UNINITIALIZED) 577 { 578 Assert(pTarget->VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 579 continue; 580 } 581 582 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 583 } 584 585 return true; 586 } 587 588 bool vboxWddmGhDisplayCheckSetInfoForDisabledTargetsLegacy(PVBOXMP_DEVEXT pDevExt) 589 { 590 POINT VScreenPos = {0}; 591 bool fFound = false; 592 VBOXWDDM_ALLOC_DATA AllocData; 593 VBoxVidPnAllocDataInit(&AllocData, D3DDDI_ID_UNINITIALIZED); 594 595 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 596 { 597 VBOXWDDM_TARGET *pTarget = &pDevExt->aTargets[i]; 598 Assert(pTarget->u32Id == i); 599 if (pTarget->VidPnSourceId != D3DDDI_ID_UNINITIALIZED) 600 { 601 Assert(pTarget->VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 602 continue; 603 } 604 605 if (pTarget->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL) 606 continue; 607 608 fFound = true; 609 AllocData.SurfDesc.VidPnSourceId = i; 610 NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0); 611 if (NT_SUCCESS(Status)) 612 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 499 613 else 500 { 501 pToAllocation = pSource->pShadowAllocation; 502 pFromAllocation = pSource->pPrimaryAllocation; 503 } 504 505 if (pToAllocation->AllocData.Addr.SegmentId == 1 && pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID 506 && pFromAllocation->AllocData.Addr.SegmentId == 1 && pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 507 { 508 RECT Rect; 509 Rect.left = 0; 510 Rect.top = 0; 511 Rect.right = pToAllocation->AllocData.SurfDesc.width; 512 Rect.bottom = pToAllocation->AllocData.SurfDesc.height; 513 vboxVdmaGgDmaBltPerform(pDevExt, &pFromAllocation->AllocData, &Rect, 514 &pToAllocation->AllocData, &Rect); 515 } 516 else 517 WARN(("invalid allocation data")); 518 519 /* ensure we issue resize command on next update */ 520 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 521 } 522 } 523 524 static BOOLEAN vboxWddmModeRenderFromShadowCheckOnSubmitCommand(PVBOXMP_DEVEXT pDevExt, BOOLEAN *pbSwitched) 525 { 526 BOOLEAN fDisabled, fNeedSwitch; 527 uint32_t cCount = ASMAtomicUoReadU32(&pDevExt->cRenderFromShadowDisabledContexts); 528 529 fDisabled = !!cCount; 530 fNeedSwitch = (!fDisabled != !pDevExt->fRenderToShadowDisabled); 531 532 if (fNeedSwitch) 533 { 534 vboxWddmModeRenderFromShadowDisableOnSubmitCommand(pDevExt, fDisabled); 535 pDevExt->fRenderToShadowDisabled = fDisabled; 536 } 537 538 if (pbSwitched) 539 *pbSwitched = fNeedSwitch; 540 541 return fDisabled; 542 } 543 544 545 static VOID vboxWddmModeRenderFromShadowDisableRegister(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext) 546 { 547 if (pContext->fRenderFromShadowDisabled) 548 return; 549 ASMAtomicIncU32(&pDevExt->cRenderFromShadowDisabledContexts); 550 pContext->fRenderFromShadowDisabled = TRUE; 551 } 552 553 static VOID vboxWddmModeRenderFromShadowDisableUnregister(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext) 554 { 555 if (!pContext->fRenderFromShadowDisabled) 556 return; 557 558 uint32_t cCount = ASMAtomicDecU32(&pDevExt->cRenderFromShadowDisabledContexts); 559 Assert(cCount < UINT32_MAX); 560 pContext->fRenderFromShadowDisabled = FALSE; 614 WARN(("vboxWddmGhDisplaySetInfoLegacy failed, Status (0x%x)", Status)); 615 } 616 617 return fFound; 618 } 619 620 void vboxWddmGhDisplayCheckSetInfoForDisabledTargets(PVBOXMP_DEVEXT pDevExt) 621 { 622 if (pDevExt->fCmdVbvaEnabled) 623 vboxWddmGhDisplayCheckSetInfoForDisabledTargetsNew(pDevExt); 624 else 625 vboxWddmGhDisplayCheckSetInfoForDisabledTargetsLegacy(pDevExt); 626 } 627 628 void vboxWddmGhDisplayCheckSetInfoForDisabledTargetsCheck(PVBOXMP_DEVEXT pDevExt) 629 { 630 bool fReportTargets = !pDevExt->cContextsDispIfResize; 631 632 if (fReportTargets) 633 vboxWddmGhDisplayCheckSetInfoForDisabledTargets(pDevExt); 634 } 635 636 void vboxWddmGhDisplayCheckSetInfoEx(PVBOXMP_DEVEXT pDevExt, bool fReportTargets) 637 { 638 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 639 { 640 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[i]; 641 vboxWddmGhDisplayCheckSetInfoFromSourceEx(pDevExt, pSource, fReportTargets); 642 } 643 644 if (fReportTargets) 645 vboxWddmGhDisplayCheckSetInfoForDisabledTargets(pDevExt); 646 } 647 648 void vboxWddmGhDisplayCheckSetInfo(PVBOXMP_DEVEXT pDevExt) 649 { 650 bool fReportTargets = !pDevExt->cContextsDispIfResize; 651 vboxWddmGhDisplayCheckSetInfoEx(pDevExt, fReportTargets); 561 652 } 562 653 … … 681 772 PWCHAR pName = (PWCHAR)(((uint8_t*)pDevExt) + VBOXWDDM_ROUNDBOUND(sizeof(VBOXMP_DEVEXT), 8)); 682 773 RtlInitUnicodeString(&pDevExt->RegKeyName, pName); 683 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 684 for (int i = 0; i < RT_ELEMENTS(pDevExt->aSources); ++i) 685 { 686 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 687 pSource->AllocData.SurfDesc.VidPnSourceId = i; 688 pSource->AllocData.Addr.offVram = VBOXVIDEOOFFSET_VOID; 689 } 690 #endif 774 775 VBoxVidPnSourcesInit(pDevExt->aSources, RT_ELEMENTS(pDevExt->aSources)); 776 777 VBoxVidPnTargetsInit(pDevExt->aTargets, RT_ELEMENTS(pDevExt->aTargets)); 691 778 } 692 779 … … 2284 2371 { 2285 2372 /* @todo: do we need to notify host? */ 2286 vboxWddmAssignPrimary( pDevExt,&pDevExt->aSources[pAllocation->AllocData.SurfDesc.VidPnSourceId], NULL, pAllocation->AllocData.SurfDesc.VidPnSourceId);2373 vboxWddmAssignPrimary(&pDevExt->aSources[pAllocation->AllocData.SurfDesc.VidPnSourceId], NULL, pAllocation->AllocData.SurfDesc.VidPnSourceId); 2287 2374 } 2288 2375 break; 2289 2376 } 2290 #ifdef VBOXWDDM_RENDER_FROM_SHADOW2291 case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:2292 {2293 if (pAllocation->bAssigned)2294 {2295 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId != D3DDDI_ID_UNINITIALIZED);2296 /* @todo: do we need to notify host? */2297 vboxWddmAssignShadow(pDevExt, &pDevExt->aSources[pAllocation->AllocData.SurfDesc.VidPnSourceId], NULL, pAllocation->AllocData.SurfDesc.VidPnSourceId);2298 }2299 break;2300 }2301 #endif2302 2377 default: 2303 2378 break; … … 2374 2449 return pAllocation; 2375 2450 } 2376 2377 VOID vboxWddmAllocationWaitDereference(PVBOXWDDM_ALLOCATION pAllocation)2378 {2379 vboxWddmCounterU32Wait(&pAllocation->cRefs, 1);2380 }2381 2382 2451 2383 2452 NTSTATUS vboxWddmAllocationCreate(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_RESOURCE pResource, uint32_t iIndex, DXGK_ALLOCATIONINFO* pAllocationInfo) … … 2413 2482 pAllocation->AllocData.Addr.SegmentId = 0; 2414 2483 pAllocation->AllocData.Addr.offVram = VBOXVIDEOOFFSET_VOID; 2415 pAllocation->cRefs = 1;2416 2484 pAllocation->bVisible = FALSE; 2417 2485 pAllocation->bAssigned = FALSE; … … 2613 2681 for (UINT j = 0; j < i; ++j) 2614 2682 { 2615 vboxWddmAllocationCleanup(pDevExt, (PVBOXWDDM_ALLOCATION)pCreateAllocation->pAllocationInfo[j].hAllocation); 2616 vboxWddmAllocationRelease((PVBOXWDDM_ALLOCATION)pCreateAllocation->pAllocationInfo[j].hAllocation); 2683 PVBOXWDDM_ALLOCATION pAllocation = (PVBOXWDDM_ALLOCATION)pCreateAllocation->pAllocationInfo[j].hAllocation; 2684 vboxWddmAllocationCleanup(pDevExt, pAllocation); 2685 vboxWddmAllocationDestroy(pAllocation); 2617 2686 } 2618 2687 } … … 2657 2726 vboxWddmAllocationCleanupAssignment(pDevExt, pAlloc); 2658 2727 /* wait for all current allocation-related ops are completed */ 2659 vboxWddmAllocationWaitDereference(pAlloc);2660 2728 vboxWddmAllocationCleanup(pDevExt, pAlloc); 2661 vboxWddmAllocation Release(pAlloc);2729 vboxWddmAllocationDestroy(pAlloc); 2662 2730 } 2663 2731 … … 2935 3003 switch (pPrivateDataBase->enmCmd) 2936 3004 { 2937 case VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY:2938 {2939 PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY pS2P = (PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY)pPrivateDataBase;2940 Assert(pPatch->PatchLocationListSubmissionLength == 2);2941 const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];2942 Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX);2943 Assert(pPatchList->PatchOffset == 0);2944 const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];2945 Assert(pSrcAllocationList->SegmentId);2946 pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc = pSrcAllocationList->SegmentId;2947 pS2P->Shadow2Primary.ShadowAlloc.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;2948 //2949 // pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart + 1];2950 // Assert(pPatchList->AllocationIndex == DXGK_PRESENT_DESTINATION_INDEX);2951 // Assert(pPatchList->PatchOffset == 4);2952 // const DXGK_ALLOCATIONLIST *pDstAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];2953 // Assert(pDstAllocationList->SegmentId);2954 // pPrivateData->DstAllocInfo.segmentIdAlloc = pDstAllocationList->SegmentId;2955 // pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;2956 break;2957 }2958 3005 case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT: 2959 3006 { … … 3332 3379 } 3333 3380 3334 if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D)3335 vboxWddmModeRenderFromShadowDisableRegister(pDevExt, pContext);3336 3337 3381 switch (enmCmd) 3338 3382 { 3339 #ifdef VBOXWDDM_RENDER_FROM_SHADOW3340 case VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY:3341 {3342 PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY pS2P = (PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY)pPrivateDataBase;3343 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pS2P->Shadow2Primary.VidPnSourceId];3344 PVBOXWDDM_ALLOCATION pSrcAlloc = pS2P->Shadow2Primary.ShadowAlloc.pAlloc;3345 BOOLEAN fShadowChanged = vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc, pS2P->Shadow2Primary.ShadowAlloc.offAlloc);3346 if (fShadowChanged)3347 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION;3348 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pS2P->Shadow2Primary.VidPnSourceId);3349 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);3350 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource);3351 if (pSrcAlloc->bVisible)3352 {3353 uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);3354 if (!cUnlockedVBVADisabled)3355 VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &pS2P->Shadow2Primary.SrcRect);3356 else3357 {3358 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);3359 VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &pS2P->Shadow2Primary.SrcRect);3360 }3361 }3362 3363 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_COMPLETED);3364 break;3365 }3366 #endif3367 3383 case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT: 3368 3384 { … … 3377 3393 fSrcChanged = vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pBlt->Blt.SrcAlloc.segmentIdAlloc, pBlt->Blt.SrcAlloc.offAlloc); 3378 3394 3379 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3380 3381 if (VBOXWDDM_IS_REAL_FB_ALLOCATION(pDevExt, pDstAlloc)) 3395 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc)) 3382 3396 { 3383 3397 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId]; … … 3396 3410 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 3397 3411 } 3398 else 3399 #endif 3400 if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3401 { 3402 if (fSrcChanged) 3403 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 3404 3405 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->AllocData.SurfDesc.VidPnSourceId); 3406 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 3407 } 3408 3409 Assert(pSource->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL || pDevExt->aTargets[pDstAlloc->AllocData.SurfDesc.VidPnSourceId].fStateSyncPening); 3412 #endif 3410 3413 } 3411 3414 … … 3424 3427 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 3425 3428 vboxWddmAddrSetVram(&pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc); 3426 vboxWddmAssignPrimary(p DevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId);3429 vboxWddmAssignPrimary(pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 3427 3430 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 3428 3431 … … 4500 4503 Status = STATUS_SUCCESS; 4501 4504 break; 4502 case VBOXESC_SCREENLAYOUT:4503 {4504 /* set screen layout (unused currently) */4505 if (pEscape->PrivateDriverDataSize < sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT))4506 {4507 WARN(("VBOXESC_SCREENLAYOUT: incorrect buffer size (%d) < sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT) (%d)",4508 pEscape->PrivateDriverDataSize, sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT)));4509 Status = STATUS_INVALID_PARAMETER;4510 break;4511 }4512 4513 PVBOXDISPIFESCAPE_SCREENLAYOUT pLo = (PVBOXDISPIFESCAPE_SCREENLAYOUT)pEscapeHdr;4514 if (pLo->ScreenLayout.cScreens > (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)4515 {4516 WARN(("VBOXESC_SCREENLAYOUT: number of screens too big (%d), should be <= (%d)",4517 pLo->ScreenLayout.cScreens, VBoxCommonFromDeviceExt(pDevExt)->cDisplays));4518 Status = STATUS_INVALID_PARAMETER;4519 break;4520 }4521 4522 for (UINT i = 0; i < pLo->ScreenLayout.cScreens; ++i)4523 {4524 PVBOXSCREENLAYOUT_ELEMENT pEl = &pLo->ScreenLayout.aScreens[i];4525 Assert(pEl->VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);4526 if (pEl->VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)4527 {4528 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pEl->VidPnSourceId];4529 NTSTATUS tmpStatus = vboxWddmGhDisplayUpdateScreenPos(pDevExt, pSource, &pEl->pos);4530 Assert(tmpStatus == STATUS_SUCCESS);4531 }4532 }4533 4534 Status = STATUS_SUCCESS;4535 break;4536 }4537 4505 #ifdef VBOX_WITH_CROGL 4538 4506 case VBOXESC_SETCTXHOSTID: … … 4792 4760 } 4793 4761 4762 if (!pEscape->Flags.HardwareAccess) 4763 { 4764 WARN(("VBOXESC_SETALLOCHOSTID not HardwareAccess")); 4765 Status = STATUS_INVALID_PARAMETER; 4766 break; 4767 } 4768 4794 4769 PVBOXDISPIFESCAPE_SETALLOCHOSTID pSetHostID = (PVBOXDISPIFESCAPE_SETALLOCHOSTID)pEscapeHdr; 4795 4770 PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromHandle(pDevExt, (D3DKMT_HANDLE)pSetHostID->hAlloc); … … 4809 4784 4810 4785 pSetHostID->rc = VBoxWddmOaSetHostID(pDevice, pAlloc, pSetHostID->hostID, &pSetHostID->EscapeHdr.u32CmdSpecific); 4786 4787 if (pAlloc->bAssigned) 4788 { 4789 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter; 4790 Assert(pAlloc->AllocData.SurfDesc.VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 4791 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 4792 if (pSource->AllocData.hostID != pAlloc->AllocData.hostID) 4793 { 4794 pSource->AllocData.hostID = pAlloc->AllocData.hostID; 4795 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 4796 4797 vboxWddmGhDisplayCheckSetInfo(pDevExt); 4798 } 4799 } 4800 4811 4801 Status = STATUS_SUCCESS; 4812 4802 break; … … 5332 5322 { 5333 5323 pAllocation = (PVBOXWDDM_ALLOCATION)pSetVidPnSourceAddress->hAllocation; 5334 vboxWddmAssignPrimary(p DevExt, pSource, pAllocation, pSetVidPnSourceAddress->VidPnSourceId);5324 vboxWddmAssignPrimary(pSource, pAllocation, pSetVidPnSourceAddress->VidPnSourceId); 5335 5325 } 5336 5326 else … … 5362 5352 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 5363 5353 5364 if (pDevExt->fCmdVbvaEnabled || pSource->bVisible) 5365 { 5366 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 5367 } 5354 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 5368 5355 5369 5356 LOGF(("LEAVE, status(0x%x), context(0x%x)", Status, hAdapter)); … … 5420 5407 { 5421 5408 pSource->bVisible = pSetVidPnSourceVisibility->Visible; 5422 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY;5423 if (pDevExt->fCmdVbvaEnabled || pSource->bVisible)5424 {5425 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource);5426 }5409 // pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY; 5410 // if (pDevExt->fCmdVbvaEnabled || pSource->bVisible) 5411 // { 5412 // vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 5413 // } 5427 5414 } 5428 5415 … … 5430 5417 5431 5418 return Status; 5432 }5433 5434 static DECLCALLBACK(BOOLEAN) vboxWddmVidPnCleanupTargetsForSrcEnum(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface,5435 CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId, SIZE_T cTgtPaths, PVOID pContext)5436 {5437 AssertRelease(VidPnTargetId < RT_ELEMENTS(pDevExt->aTargets));5438 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[VidPnTargetId];5439 /* see comments in DxgkDdiCommitVidPn */5440 pTarget->HeightVisible = 0;5441 return TRUE;5442 5419 } 5443 5420 … … 5456 5433 vboxVDbgBreakFv(); 5457 5434 5435 VBOXWDDM_SOURCE *paSources = (VBOXWDDM_SOURCE*)RTMemAlloc(sizeof (VBOXWDDM_SOURCE) * VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5436 if (!paSources) 5437 { 5438 WARN(("RTMemAlloc failed")); 5439 return STATUS_NO_MEMORY; 5440 } 5441 5442 VBOXWDDM_TARGET *paTargets = (VBOXWDDM_TARGET*)RTMemAlloc(sizeof (VBOXWDDM_TARGET) * VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5443 if (!paTargets) 5444 { 5445 WARN(("RTMemAlloc failed")); 5446 RTMemFree(paSources); 5447 return STATUS_NO_MEMORY; 5448 } 5449 5450 VBoxVidPnSourcesInit(paSources, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5451 5452 VBoxVidPnTargetsInit(paTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5453 5454 VBoxVidPnSourcesCopy(paSources, pDevExt->aSources, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5455 VBoxVidPnTargetsCopy(paTargets, pDevExt->aTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5456 5458 5457 do { 5459 5458 const DXGK_VIDPN_INTERFACE* pVidPnInterface = NULL; … … 5471 5470 if (pCommitVidPnArg->AffectedVidPnSourceId != D3DDDI_ID_ALL) 5472 5471 { 5473 /* there is not VidPn on driver start, check that */ 5474 if (pDevExt->u.primary.hCommittedVidPn) 5475 { 5476 D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology; 5477 CONST DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface; 5478 const DXGK_VIDPN_INTERFACE* pOldVidPnInterface = NULL; 5479 Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(pDevExt->u.primary.hCommittedVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pOldVidPnInterface); 5480 if (!NT_SUCCESS(Status)) 5481 { 5482 WARN(("DxgkCbQueryVidPnInterface for current VidPn failed Status 0x%x", Status)); 5483 break; 5484 } 5485 5486 Status = pOldVidPnInterface->pfnGetTopology(pDevExt->u.primary.hCommittedVidPn, &hVidPnTopology, &pVidPnTopologyInterface); 5487 if (!NT_SUCCESS(Status)) 5488 { 5489 WARN(("pfnGetTopology for current VidPn failed Status 0x%x", Status)); 5490 break; 5491 } 5492 5493 /* this will zero up visible height for all targets of the given source, see above comment */ 5494 Status = vboxVidPnEnumTargetsForSource(pDevExt, hVidPnTopology, pVidPnTopologyInterface, 5495 pCommitVidPnArg->AffectedVidPnSourceId, 5496 vboxWddmVidPnCleanupTargetsForSrcEnum, NULL); 5497 if (Status == STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY) 5498 Status = STATUS_SUCCESS; 5499 5500 if (!NT_SUCCESS(Status)) 5501 { 5502 WARN(("vboxVidPnEnumTargetsForSource for current VidPn failed Status 0x%x", Status)); 5503 break; 5504 } 5505 } 5506 5507 Status = vboxVidPnCommitSourceModeForSrcId( 5472 Status = VBoxVidPnCommitSourceModeForSrcId( 5508 5473 pDevExt, 5509 5474 pCommitVidPnArg->hFunctionalVidPn, pVidPnInterface, 5510 pCommitVidPnArg->AffectedVidPnSourceId, (PVBOXWDDM_ALLOCATION)pCommitVidPnArg->hPrimaryAllocation); 5475 (PVBOXWDDM_ALLOCATION)pCommitVidPnArg->hPrimaryAllocation, 5476 pCommitVidPnArg->AffectedVidPnSourceId, paSources, paTargets); 5511 5477 if (!NT_SUCCESS(Status)) 5512 5478 { 5513 WARN((" vboxVidPnCommitSourceModeForSrcId for current VidPn failed Status 0x%x", Status));5479 WARN(("VBoxVidPnCommitSourceModeForSrcId for current VidPn failed Status 0x%x", Status)); 5514 5480 break; 5515 5481 } … … 5517 5483 else 5518 5484 { 5519 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 5520 { 5521 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i]; 5522 /* see above comment */ 5523 pTarget->HeightVisible = 0; 5524 } 5525 5526 /* clear all current primaries */ 5527 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 5528 { 5529 vboxWddmAssignPrimary(pDevExt, &pDevExt->aSources[i], NULL, i); 5530 } 5531 5532 D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology; 5533 const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface; 5534 Status = pVidPnInterface->pfnGetTopology(pCommitVidPnArg->hFunctionalVidPn, &hVidPnTopology, &pVidPnTopologyInterface); 5485 Status = VBoxVidPnCommitAll(pDevExt, pCommitVidPnArg->hFunctionalVidPn, pVidPnInterface, 5486 (PVBOXWDDM_ALLOCATION)pCommitVidPnArg->hPrimaryAllocation, 5487 paSources, paTargets); 5535 5488 if (!NT_SUCCESS(Status)) 5536 5489 { 5537 WARN(("pfnGetTopology failed Status 0x%x", Status)); 5538 break; 5539 } 5540 5541 VBOXVIDPNCOMMIT CbContext = {0}; 5542 CbContext.pDevExt = pDevExt; 5543 CbContext.pVidPnInterface = pVidPnInterface; 5544 CbContext.pCommitVidPnArg = pCommitVidPnArg; 5545 Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface, 5546 vboxVidPnCommitPathEnum, &CbContext); 5547 if (!NT_SUCCESS(Status)) 5548 { 5549 WARN(("vboxVidPnEnumPaths failed Status 0x%x", Status)); 5550 break; 5551 } 5552 5553 Status = CbContext.Status; 5554 if (!NT_SUCCESS(Status)) 5555 { 5556 WARN(("vboxVidPnCommitPathEnum failed Status 0x%x", Status)); 5490 WARN(("VBoxVidPnCommitAll for current VidPn failed Status 0x%x", Status)); 5557 5491 break; 5558 5492 } … … 5561 5495 Assert(NT_SUCCESS(Status)); 5562 5496 pDevExt->u.primary.hCommittedVidPn = pCommitVidPnArg->hFunctionalVidPn; 5563 5564 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 5565 { 5566 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i]; 5567 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 5568 uint32_t cAutoresizes = pDevExt->cContextsDispIfResize; 5569 if (!cAutoresizes) 5570 { 5571 if (pSource->bVisible || !pTarget->HeightVisible) 5572 { 5573 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_VISIBILITY; 5574 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 5575 } 5576 else if (pDevExt->fCmdVbvaEnabled) 5577 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 5578 } 5579 else 5580 pTarget->fStateSyncPening = true; 5581 } 5582 5583 LOGF(("LEAVE, SUCCESS status(0x%x), context(0x%x)", Status, hAdapter)); 5584 5585 return Status; 5497 VBoxVidPnSourcesCopy(pDevExt->aSources, paSources, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5498 VBoxVidPnTargetsCopy(pDevExt->aTargets, paTargets, VBoxCommonFromDeviceExt(pDevExt)->cDisplays); 5499 5500 vboxWddmGhDisplayCheckSetInfo(pDevExt); 5586 5501 } while (0); 5587 5502 5588 AssertRelease(!NT_SUCCESS(Status)); 5589 5590 LOGF(("LEAVE, !!FAILURE!! status(0x%x), context(0x%x)", Status, hAdapter)); 5503 RTMemFree(paSources); 5504 RTMemFree(paTargets); 5505 5506 LOGF(("LEAVE, status(0x%x), context(0x%x)", Status, hAdapter)); 5507 5591 5508 return Status; 5592 5509 } … … 6914 6831 int rc = vboxVhwaHlpOverlayUpdate(pOverlay, &pUpdateOverlay->OverlayInfo); 6915 6832 AssertRC(rc); 6916 if (RT_SUCCESS(rc)) 6917 { 6918 RECT DstRect; 6919 vboxVhwaHlpOverlayDstRectGet(pOverlay->pDevExt, pOverlay, &DstRect); 6920 Status = vboxVdmaHlpUpdatePrimary(pOverlay->pDevExt, pOverlay->VidPnSourceId, &DstRect); 6921 Assert(Status == STATUS_SUCCESS); 6922 } 6923 else 6833 if (RT_FAILURE(rc)) 6924 6834 Status = STATUS_UNSUCCESSFUL; 6925 6835 … … 7232 7142 Assert(cContexts < UINT32_MAX/2); 7233 7143 if (!cContexts) 7234 { 7235 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 7236 { 7237 vboxWddmGhDisplayCheckCompletePeningScreenInfo(pDevExt, i); 7238 } 7239 } 7144 vboxWddmGhDisplayCheckSetInfoEx(pDevExt, true); 7240 7145 break; 7241 7146 } … … 7259 7164 } 7260 7165 #endif 7261 7262 vboxWddmModeRenderFromShadowDisableUnregister(pDevExt, pContext);7263 7166 7264 7167 #ifdef VBOX_WITH_CROGL -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r51121 r51260 88 88 VOID vboxWddmAllocationDestroy(PVBOXWDDM_ALLOCATION pAllocation); 89 89 90 DECLINLINE(VOID) vboxWddmAllocationRelease(PVBOXWDDM_ALLOCATION pAllocation)91 {92 uint32_t cRefs = ASMAtomicDecU32(&pAllocation->cRefs);93 Assert(cRefs < UINT32_MAX/2);94 if (!cRefs)95 {96 vboxWddmAllocationDestroy(pAllocation);97 }98 }99 100 DECLINLINE(VOID) vboxWddmAllocationRetain(PVBOXWDDM_ALLOCATION pAllocation)101 {102 ASMAtomicIncU32(&pAllocation->cRefs);103 }104 105 90 DECLINLINE(BOOLEAN) vboxWddmAddrSetVram(PVBOXWDDM_ADDR pAddr, UINT SegmentId, VBOXVIDEOOFFSET offVram) 106 91 { … … 113 98 } 114 99 115 DECLINLINE(bool) vboxWddmAddrVramEqual( PVBOXWDDM_ADDR pAddr1, PVBOXWDDM_ADDRpAddr2)100 DECLINLINE(bool) vboxWddmAddrVramEqual(const VBOXWDDM_ADDR *pAddr1, const VBOXWDDM_ADDR *pAddr2) 116 101 { 117 102 return pAddr1->SegmentId == pAddr2->SegmentId && pAddr1->offVram == pAddr2->offVram; … … 125 110 } 126 111 127 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 128 DECLINLINE(void) vboxWddmAssignShadow(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 129 { 130 #ifdef VBOX_WITH_CROGL 131 if (pDevExt->fCmdVbvaEnabled) 132 { 133 WARN(("Trying to assign shadow surface for CmdVbva enabled mode!")); 112 DECLINLINE(VOID) vboxWddmAssignPrimary(PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 113 { 114 /* vboxWddmAssignPrimary can not be run in reentrant order, so safely do a direct unlocked check here */ 115 if (pSource->pPrimaryAllocation == pAllocation) 134 116 return; 135 } 136 #endif 137 138 if (pSource->pShadowAllocation == pAllocation) 139 { 140 Assert(pAllocation->bAssigned); 141 return; 142 } 143 144 if (pSource->pShadowAllocation) 145 { 146 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pShadowAllocation; 117 118 if (pSource->pPrimaryAllocation) 119 { 120 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation; 147 121 /* clear the visibility info fo the current primary */ 148 122 pOldAlloc->bVisible = FALSE; 149 123 pOldAlloc->bAssigned = FALSE; 150 124 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId); 151 /* release the shadow surface */152 pOldAlloc->AllocData.SurfDesc.VidPnSourceId = D3DDDI_ID_UNINITIALIZED;153 125 } 154 126 155 127 if (pAllocation) 156 128 { 157 Assert(!pAllocation->bAssigned); 158 Assert(!pAllocation->bVisible); 159 /* this check ensures the shadow is not used for other source simultaneously */ 160 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == D3DDDI_ID_UNINITIALIZED); 161 pAllocation->AllocData.SurfDesc.VidPnSourceId = srcId; 129 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == srcId); 162 130 pAllocation->bAssigned = TRUE; 163 131 pAllocation->bVisible = pSource->bVisible; 164 132 165 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr))166 {167 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */168 pSource->AllocData.Addr = pAllocation->AllocData.Addr;169 }170 133 if (pSource->AllocData.hostID != pAllocation->AllocData.hostID) 171 134 { … … 173 136 pSource->AllocData.hostID = pAllocation->AllocData.hostID; 174 137 } 175 } 176 else 177 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 178 179 pSource->pShadowAllocation = pAllocation; 180 } 181 #endif 182 183 DECLINLINE(VOID) vboxWddmAssignPrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_ALLOCATION pAllocation, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 184 { 185 /* vboxWddmAssignPrimary can not be run in reentrant order, so safely do a direct unlocked check here */ 186 if (pSource->pPrimaryAllocation == pAllocation) 187 return; 188 189 if (pSource->pPrimaryAllocation) 190 { 191 PVBOXWDDM_ALLOCATION pOldAlloc = pSource->pPrimaryAllocation; 192 /* clear the visibility info fo the current primary */ 193 pOldAlloc->bVisible = FALSE; 194 pOldAlloc->bAssigned = FALSE; 195 Assert(pOldAlloc->AllocData.SurfDesc.VidPnSourceId == srcId); 196 197 vboxWddmAllocationRelease(pOldAlloc); 198 } 199 200 if (pAllocation) 201 { 202 Assert(pAllocation->AllocData.SurfDesc.VidPnSourceId == srcId); 203 pAllocation->bAssigned = TRUE; 204 pAllocation->bVisible = pSource->bVisible; 205 206 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr)) 138 139 if (!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr)) 207 140 { 208 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 141 if (!pAllocation->AllocData.hostID) 142 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 143 209 144 pSource->AllocData.Addr = pAllocation->AllocData.Addr; 210 145 } 211 if (pSource->AllocData.hostID != pAllocation->AllocData.hostID)212 {213 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */214 pSource->AllocData.hostID = pAllocation->AllocData.hostID;215 }216 217 vboxWddmAllocationRetain(pAllocation);218 146 } 219 147 else 148 { 220 149 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 150 /*ensure we do not refer to the deleted host id */ 151 pSource->AllocData.hostID = 0; 152 } 221 153 222 154 KIRQL OldIrql; … … 224 156 pSource->pPrimaryAllocation = pAllocation; 225 157 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql); 226 }227 228 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmAquirePrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)229 {230 PVBOXWDDM_ALLOCATION pPrimary;231 KIRQL OldIrql;232 KeAcquireSpinLock(&pSource->AllocationLock, &OldIrql);233 pPrimary = pSource->pPrimaryAllocation;234 if (pPrimary)235 vboxWddmAllocationRetain(pPrimary);236 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);237 return pPrimary;238 158 } 239 159 … … 267 187 } 268 188 269 bool vboxWddmGhDisplayCheckSetInfoFromSource(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource);270 271 189 #ifdef VBOX_WITH_CROGL 272 190 #define VBOXWDDMENTRY_2_SWAPCHAIN(_pE) ((PVBOXWDDM_SWAPCHAIN)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_SWAPCHAIN, DevExtListEntry))) … … 284 202 #endif 285 203 286 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 287 288 # define VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, _pAlloc) ( (_pAlloc)->bAssigned \ 289 && ( (_pAlloc)->AllocData.hostID \ 290 || (_pAlloc)->enmType == \ 291 ((VBOXWDDM_IS_DISPLAYONLY() || (_pDevExt)->fRenderToShadowDisabled) ? VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE : VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) \ 292 )) 293 294 # define VBOXWDDM_IS_REAL_FB_ALLOCATION(_pDevExt, _pAlloc) ( (_pAlloc)->bAssigned \ 295 && ( (_pAlloc)->AllocData.hostID \ 296 || (_pAlloc)->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE \ 297 )) 298 299 # define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ( ((_pSrc)->pPrimaryAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pPrimaryAllocation)) ? \ 300 (_pSrc)->pPrimaryAllocation : ( \ 301 ((_pSrc)->pShadowAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pShadowAllocation)) ? \ 302 (_pSrc)->pShadowAllocation : NULL \ 303 ) \ 304 ) 305 # define VBOXWDDM_NONFB_ALLOCATION(_pDevExt, _pSrc) ( !((_pSrc)->pPrimaryAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pPrimaryAllocation)) ? \ 306 (_pSrc)->pPrimaryAllocation : ( \ 307 ((_pSrc)->pShadowAllocation && VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, (_pSrc)->pShadowAllocation)) ? \ 308 (_pSrc)->pShadowAllocation : NULL \ 309 ) \ 310 ) 311 #else 204 # define VBOXWDDM_IS_FB_ALLOCATION(_pDevExt, _pAlloc) ((_pAlloc)->bAssigned) 205 312 206 # define VBOXWDDM_FB_ALLOCATION(_pDevExt, _pSrc) ((_pSrc)->pPrimaryAllocation) 313 #endif314 207 315 208 #define VBOXWDDM_CTXLOCK_INIT(_p) do { \
Note:
See TracChangeset
for help on using the changeset viewer.