Changeset 42217 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
- Timestamp:
- Jul 18, 2012 8:41:29 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 79234
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h
r38739 r42217 42 42 43 43 #ifdef VBOX_WDDM_MINIPORT 44 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt); 45 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfo(PVBOXMP_DEVEXT pExt, PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo); 44 void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt); 45 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId); 46 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfoByMask(PVBOXMP_DEVEXT pExt, uint8_t *pScreenIdMask); 47 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateAllVideoModesInfos(PVBOXMP_DEVEXT pExt); 46 48 NTSTATUS VBoxWddmGetModesForResolution(VIDEO_MODE_INFORMATION *pAllModes, uint32_t cAllModes, int iSearchPreferredMode, 47 49 const D3DKMDT_2DREGION *pResolution, VIDEO_MODE_INFORMATION * pModes, … … 50 52 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmGetVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId); 51 53 bool VBoxWddmFillMode(VIDEO_MODE_INFORMATION *pInfo, D3DDDIFORMAT enmFormat, ULONG w, ULONG h); 54 bool VBoxWddmFillMode(VIDEO_MODE_INFORMATION *pInfo, D3DDDIFORMAT enmFormat, ULONG w, ULONG h); 55 void VBoxWddmAdjustMode(PVBOXMP_DEVEXT pExt, PVBOXWDDM_ADJUSTVIDEOMODE pMode); 56 void VBoxWddmAdjustModes(PVBOXMP_DEVEXT pExt, uint32_t cModes, PVBOXWDDM_ADJUSTVIDEOMODE aModes); 52 57 #endif 53 58 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp
r42128 r42217 1090 1090 } 1091 1091 1092 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt) 1093 { 1092 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId) 1093 { 1094 if (VidPnTargetId != D3DDDI_ID_ALL) 1095 { 1096 if (VidPnTargetId >= RT_ELEMENTS(g_aVBoxVideoModeInfos)) 1097 { 1098 WARN(("VidPnTargetId (%d) must be less than (%d)", VidPnTargetId, RT_ELEMENTS(g_aVBoxVideoModeInfos))); 1099 return; 1100 } 1101 g_aVBoxVideoModeInfos[VidPnTargetId].cModes = 0; 1102 return; 1103 } 1104 1094 1105 for (UINT i = 0; i < RT_ELEMENTS(g_aVBoxVideoModeInfos); ++i) 1095 1106 { … … 1098 1109 } 1099 1110 1100 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfo(PVBOXMP_DEVEXT pExt, PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo) 1101 { 1102 VBoxWddmInvalidateVideoModesInfo(pExt); 1103 1104 if (pVidPnInfo) 1105 { 1106 for (UINT i = 0; i < pVidPnInfo->cScreenInfos; ++i) 1107 { 1108 PVBOXWDDM_RECOMMENDVIDPN_SCREEN_INFO pScreenInfo = &pVidPnInfo->aScreenInfos[i]; 1109 Assert(pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays); 1110 if (pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays) 1111 { 1112 PVBOXWDDM_VIDEOMODES_INFO pInfo = &g_aVBoxVideoModeInfos[pScreenInfo->Id]; 1113 VIDEO_MODE_INFORMATION ModeInfo = {0}; 1114 D3DDDIFORMAT enmFormat; 1115 switch (pScreenInfo->BitsPerPixel) 1116 { 1117 case 32: 1118 enmFormat = D3DDDIFMT_A8R8G8B8; 1119 break; 1120 case 24: 1121 enmFormat = D3DDDIFMT_R8G8B8; 1122 break; 1123 case 16: 1124 enmFormat = D3DDDIFMT_R5G6B5; 1125 break; 1126 case 8: 1127 enmFormat = D3DDDIFMT_P8; 1128 break; 1129 default: 1130 Assert(0); 1131 enmFormat = D3DDDIFMT_UNKNOWN; 1132 break; 1133 } 1134 if (enmFormat != D3DDDIFMT_UNKNOWN) 1135 { 1136 if (VBoxWddmFillMode(pExt, pScreenInfo->Id, &ModeInfo, enmFormat, pScreenInfo->Width, pScreenInfo->Height)) 1137 { 1138 VBoxWddmBuildVideoModesInfo(pExt, pScreenInfo->Id, pInfo, &ModeInfo, 1); 1139 } 1140 else 1141 { 1142 Assert(0); 1143 } 1144 } 1145 } 1146 } 1111 void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt) 1112 { 1113 VBoxWddmInvalidateVideoModesInfo(pExt, D3DDDI_ID_ALL); 1114 } 1115 1116 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfoByMask(PVBOXMP_DEVEXT pExt, uint8_t *pScreenIdMask) 1117 { 1118 for (int i = 0; i < VBoxCommonFromDeviceExt(pExt)->cDisplays; ++i) 1119 { 1120 if (ASMBitTest(pScreenIdMask, i)) 1121 VBoxWddmInvalidateVideoModesInfo(pExt, i); 1147 1122 } 1148 1123 … … 1150 1125 VBoxWddmGetAllVideoModesInfos(pExt); 1151 1126 return g_aVBoxVideoModeInfos; 1127 } 1128 1129 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateAllVideoModesInfos(PVBOXMP_DEVEXT pExt) 1130 { 1131 VBoxWddmInvalidateAllVideoModesInfos(pExt); 1132 1133 /* ensure we have all the rest populated */ 1134 VBoxWddmGetAllVideoModesInfos(pExt); 1135 return g_aVBoxVideoModeInfos; 1136 } 1137 1138 void VBoxWddmAdjustMode(PVBOXMP_DEVEXT pExt, PVBOXWDDM_ADJUSTVIDEOMODE pMode) 1139 { 1140 pMode->fFlags = 0; 1141 1142 if (pMode->Mode.Id >= (UINT)VBoxCommonFromDeviceExt(pExt)->cDisplays) 1143 { 1144 WARN(("invalid screen id (%d)", pMode->Mode.Id)); 1145 pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_INVALISCREENID; 1146 return; 1147 } 1148 1149 PVBOXWDDM_TARGET pTarget = &pExt->aTargets[pMode->Mode.Id]; 1150 /* @todo: this info should go from the target actually */ 1151 PVBOXWDDM_SOURCE pSource = &pExt->aSources[pMode->Mode.Id]; 1152 if (pTarget->HeightVisible /* <- active */ 1153 && pSource->AllocData.SurfDesc.width == pMode->Mode.Width 1154 && pSource->AllocData.SurfDesc.height == pMode->Mode.Height 1155 && pSource->AllocData.SurfDesc.bpp == pMode->Mode.BitsPerPixel) 1156 { 1157 pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_CURRENT; 1158 return; 1159 } 1160 1161 UINT newWidth = pMode->Mode.Width; 1162 UINT newHeight = pMode->Mode.Height; 1163 UINT newBpp = pMode->Mode.BitsPerPixel; 1164 1165 if (!VBoxMPValidateVideoModeParams(pExt, pMode->Mode.Id, newWidth, newHeight, newBpp)) 1166 { 1167 PVBOXWDDM_SOURCE pSource = &pExt->aSources[pMode->Mode.Id]; 1168 pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED; 1169 } 1170 1171 if (pMode->Mode.Width != newWidth 1172 || pMode->Mode.Height != newHeight 1173 || pMode->Mode.BitsPerPixel != newBpp) 1174 { 1175 pMode->fFlags |= VBOXWDDM_ADJUSTVIDEOMODE_F_ADJUSTED; 1176 pMode->Mode.Width = newWidth; 1177 pMode->Mode.Height = newHeight; 1178 pMode->Mode.BitsPerPixel = newBpp; 1179 } 1180 1181 if (pTarget->HeightVisible /* <- active */ 1182 && pSource->AllocData.SurfDesc.width == pMode->Mode.Width 1183 && pSource->AllocData.SurfDesc.height == pMode->Mode.Height 1184 && pSource->AllocData.SurfDesc.bpp == pMode->Mode.BitsPerPixel) 1185 { 1186 pMode->fFlags |= VBOXWDDM_ADJUSTVIDEOMODE_F_CURRENT; 1187 if (pMode->fFlags & VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED) 1188 { 1189 WARN(("current mode is reported as unsupported, cleaning the unsupported flag")); 1190 pMode->fFlags &= ~VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED; 1191 } 1192 } 1193 } 1194 1195 void VBoxWddmAdjustModes(PVBOXMP_DEVEXT pExt, uint32_t cModes, PVBOXWDDM_ADJUSTVIDEOMODE aModes) 1196 { 1197 for (UINT i = 0; i < cModes; ++i) 1198 { 1199 PVBOXWDDM_ADJUSTVIDEOMODE pMode = &aModes[i]; 1200 VBoxWddmAdjustMode(pExt, pMode); 1201 } 1152 1202 } 1153 1203 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
r42158 r42217 219 219 NTSTATUS Status = STATUS_SUCCESS; 220 220 221 pVsi->VideoStandard = D3DKMDT_VSS_ VESA_DMT;221 pVsi->VideoStandard = D3DKMDT_VSS_OTHER; 222 222 pVsi->ActiveSize = *pResolution; 223 223 pVsi->VSyncFreq.Numerator = VSync * 1000; 224 224 pVsi->VSyncFreq.Denominator = 1000; 225 pVsi->TotalSize.cx = pVsi->ActiveSize.cx + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;226 pVsi->TotalSize.cy = pVsi->ActiveSize.cy + VBOXVDPN_C_DISPLAY_VBLANK_SIZE;225 pVsi->TotalSize.cx = pVsi->ActiveSize.cx;// + VBOXVDPN_C_DISPLAY_HBLANK_SIZE; 226 pVsi->TotalSize.cy = pVsi->ActiveSize.cy;// + VBOXVDPN_C_DISPLAY_VBLANK_SIZE; 227 227 pVsi->PixelRate = pVsi->TotalSize.cx * pVsi->TotalSize.cy * VSync; 228 228 pVsi->HSyncFreq.Numerator = (UINT)((pVsi->PixelRate / pVsi->TotalSize.cy) * 1000); … … 527 527 D3DKMDT_2DREGION *paResolutions; 528 528 uint32_t cResolutions; 529 BOOLEAN fMatch ;529 BOOLEAN fMatched; 530 530 } VBOXVIDPNMATCHMONMODESENUM, *PVBOXVIDPNMATCHMONMODESENUM; 531 531 … … 535 535 PVBOXVIDPNMATCHMONMODESENUM pInfo = (PVBOXVIDPNMATCHMONMODESENUM)pContext; 536 536 537 Assert(pInfo->fMatch); 537 Assert(pInfo->fMatched); 538 539 BOOLEAN fFound = FALSE; 538 540 539 541 for (UINT i = 0; i < pInfo->cResolutions; ++i) 540 542 { 541 543 D3DKMDT_2DREGION *pResolution = &pInfo->paResolutions[i]; 542 if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx != pResolution->cx543 || pMonitorSMI->VideoSignalInfo.ActiveSize.cy != pResolution->cy)544 { 545 pInfo->fMatch = FALSE;544 if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx == pResolution->cx 545 && pMonitorSMI->VideoSignalInfo.ActiveSize.cy == pResolution->cy) 546 { 547 fFound = TRUE; 546 548 break; 547 549 } 548 550 } 549 551 552 if (!fFound) 553 pInfo->fMatched = FALSE; 554 550 555 pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI); 551 556 552 return pInfo->fMatch ;557 return pInfo->fMatched; 553 558 } 554 559 … … 585 590 } 586 591 587 VBOXVIDPNMATCHMONMODESENUM Info; 588 Info.paResolutions = pResolutions; 589 Info.cResolutions = cResolutions; 590 Info.fMatch = TRUE; 591 592 Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info); 592 /* we care only about monitor modes covering all needed resolutions, 593 * we do NOT care if resolutions do not cover some monitor modes */ 594 SIZE_T cModes = 0; 595 Status = pMonitorSMSIf->pfnGetNumModes(hMonitorSMS, &cModes); 593 596 if (NT_SUCCESS(Status)) 594 597 { 595 *pfMatch = Info.fMatch; 596 } 598 if (cModes < cResolutions) 599 *pfMatch = FALSE; 600 else 601 { 602 VBOXVIDPNMATCHMONMODESENUM Info; 603 Info.paResolutions = pResolutions; 604 Info.cResolutions = cResolutions; 605 Info.fMatched = TRUE; 606 607 Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info); 608 if (NT_SUCCESS(Status)) 609 *pfMatch = Info.fMatched; 610 } 611 } 612 else 613 WARN(("pfnGetNumModes failed, Status 0x%x", Status)); 597 614 598 615 NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS); … … 1299 1316 { 1300 1317 Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, i == pInfo->iPreferredResolution); 1301 Assert(Status == STATUS_SUCCESS);1302 1318 if (NT_SUCCESS(Status)) 1303 1319 { … … 1309 1325 continue; 1310 1326 } 1327 else 1328 { 1329 WARN(("pfnAddMode failed, Status 0x%x", Status)); 1330 } 1331 } 1332 else 1333 { 1334 WARN(("vboxVidPnPopulateTargetModeInfoFromLegacy failed, Status 0x%x", Status)); 1311 1335 } 1312 1336 … … 1314 1338 Assert(tmpStatus == STATUS_SUCCESS); 1315 1339 } 1340 1316 1341 /* we're here because of an error */ 1317 1342 Assert(!NT_SUCCESS(Status)); 1318 break; 1343 /* ignore mode addition failure */ 1344 Status = STATUS_SUCCESS; 1345 continue; 1319 1346 } 1320 1347 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r42170 r42217 681 681 682 682 bChanged[i] = !fMatch; 683 684 if (!fMatch) 685 { 686 Status = vboxWddmChildStatusReportReconnected(pDevExt, i); 687 if (!NT_SUCCESS(Status)) 683 } 684 685 if (!NT_SUCCESS(Status)) 686 { 687 WARN(("updating monitor modes failed, Status(0x%x)", Status)); 688 return Status; 689 } 690 691 for (i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 692 { 693 if (bChanged[i]) 694 { 695 NTSTATUS tmpStatus = vboxWddmChildStatusReportReconnected(pDevExt, i); 696 if (!NT_SUCCESS(tmpStatus)) 688 697 { 689 698 WARN(("vboxWddmChildStatusReportReconnected failed Status(0x%x)", Status)); … … 692 701 } 693 702 } 694 }695 696 if (!NT_SUCCESS(Status))697 {698 WARN(("updating monitor modes failed, Status(0x%x)", Status));699 return Status;700 703 } 701 704 … … 1121 1124 1122 1125 VBoxMPCmnInitCustomVideoModes(pDevExt); 1123 VBoxWddmInvalidateVideoModesInfo(pDevExt); 1126 VBoxWddmInvalidateAllVideoModesInfos(pDevExt); 1127 1128 pDevExt->fAnyX = VBoxVideoAnyWidthAllowed(); 1124 1129 #if 0 1125 1130 vboxShRcTreeInit(pDevExt); … … 4137 4142 case VBOXESC_REINITVIDEOMODES: 4138 4143 { 4139 PVBOXWDDM_VIDEOMODES_INFO pInfo = VBoxWddmUpdateVideoModesInfo(pDevExt, NULL); 4140 Status = vboxWddmChildStatusCheck(pDevExt, pInfo); 4144 if (pEscape->Flags.HardwareAccess) 4145 { 4146 WARN(("VBOXESC_REINITVIDEOMODES called with HardwareAccess flag set, failing")); 4147 Status = STATUS_INVALID_PARAMETER; 4148 break; 4149 } 4150 WARN(("VBOXESC_REINITVIDEOMODESBYMASK should be called instead")); 4151 PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateAllVideoModesInfos(pDevExt); 4152 Status = vboxWddmChildStatusCheck(pDevExt, pInfos); 4141 4153 if (!NT_SUCCESS(Status)) 4142 4154 { … … 4144 4156 } 4145 4157 break; 4158 } 4159 case VBOXESC_REINITVIDEOMODESBYMASK: 4160 { 4161 BOOLEAN fCheckDisplayRecconect = (pEscapeHdr->u32CmdSpecific & VBOXWDDM_REINITVIDEOMODESBYMASK_F_RECONNECT_DISPLAYS_ON_CHANGE); 4162 if (fCheckDisplayRecconect && pEscape->Flags.HardwareAccess) 4163 { 4164 WARN(("VBOXESC_REINITVIDEOMODESBYMASK called with HardwareAccess flag set, failing")); 4165 Status = STATUS_INVALID_PARAMETER; 4166 break; 4167 } 4168 if (pEscape->PrivateDriverDataSize != sizeof (VBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK)) 4169 { 4170 WARN(("invalid private driver size %d", pEscape->PrivateDriverDataSize)); 4171 Status = STATUS_INVALID_PARAMETER; 4172 break; 4173 } 4174 PVBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK pData = (PVBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK)pEscapeHdr; 4175 PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateVideoModesInfoByMask(pDevExt, pData->ScreenMask); 4176 if (fCheckDisplayRecconect) 4177 { 4178 Status = vboxWddmChildStatusCheck(pDevExt, pInfos); 4179 if (!NT_SUCCESS(Status)) 4180 { 4181 WARN(("vboxWddmChildStatusCheck failed, Status 0x%x", Status)); 4182 } 4183 } 4184 break; 4185 } 4186 case VBOXESC_ADJUSTVIDEOMODES: 4187 { 4188 if (!pEscape->Flags.HardwareAccess) 4189 { 4190 WARN(("VBOXESC_ADJUSTVIDEOMODES called without HardwareAccess flag set, failing")); 4191 Status = STATUS_INVALID_PARAMETER; 4192 break; 4193 } 4194 4195 uint32_t cModes = pEscapeHdr->u32CmdSpecific; 4196 if (cModes > VBOXWDDM_TRAILARRAY_MAXELEMENTSU32(VBOXDISPIFESCAPE_ADJUSTVIDEOMODES, aScreenInfos) 4197 || pEscape->PrivateDriverDataSize != RT_OFFSETOF(VBOXDISPIFESCAPE_ADJUSTVIDEOMODES, aScreenInfos[cModes])) 4198 { 4199 WARN(("invalid modes count passed")); 4200 Status = STATUS_INVALID_PARAMETER; 4201 break; 4202 } 4203 4204 PVBOXDISPIFESCAPE_ADJUSTVIDEOMODES pPodesInfo = (PVBOXDISPIFESCAPE_ADJUSTVIDEOMODES)pEscapeHdr; 4205 VBoxWddmAdjustModes(pDevExt, cModes, pPodesInfo->aScreenInfos); 4206 Status = STATUS_SUCCESS; 4146 4207 } 4147 4208 case VBOXESC_SHRC_ADDREF: … … 4394 4455 PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo = pRecommendFunctionalVidPnArg->PrivateDriverDataSize >= sizeof (VBOXWDDM_RECOMMENDVIDPN) ? 4395 4456 (PVBOXWDDM_RECOMMENDVIDPN)pRecommendFunctionalVidPnArg->pPrivateDriverData : NULL; 4396 PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdate VideoModesInfo(pDevExt, NULL /*pVidPnInfo*/);4457 PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateAllVideoModesInfos(pDevExt); 4397 4458 int i; 4398 4459 … … 4410 4471 Status = vboxVidPnCheckAddMonitorModes(pDevExt, i, D3DKMDT_MCO_DRIVER, pInfo->aResolutions, pInfo->cResolutions, pInfo->iPreferredResolution); 4411 4472 #endif 4412 Assert(Status == STATUS_SUCCESS);4413 4473 if (Status != STATUS_SUCCESS) 4414 4474 { 4415 LOGREL(("vboxVidPnCheckAddMonitorModes failed Status(0x%x)", Status));4475 WARN(("vboxVidPnCheckAddMonitorModes failed Status(0x%x)", Status)); 4416 4476 break; 4417 4477 }
Note:
See TracChangeset
for help on using the changeset viewer.