PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfoByMask(PVBOXMP_DEVEXT pExt, uint8_t *pScreenIdMask) { for (int i = 0; i < VBoxCommonFromDeviceExt(pExt)->cDisplays; ++i) { if (ASMBitTest(pScreenIdMask, i)) VBoxWddmInvalidateVideoModesInfo(pExt, i); } /* ensure we have all the rest populated */ VBoxWddmGetAllVideoModesInfos(pExt); return g_aVBoxVideoModeInfos; }
PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfo(PVBOXMP_DEVEXT pExt, PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo) { VBoxWddmInvalidateVideoModesInfo(pExt); if (pVidPnInfo) { for (UINT i = 0; i < pVidPnInfo->cScreenInfos; ++i) { PVBOXWDDM_RECOMMENDVIDPN_SCREEN_INFO pScreenInfo = &pVidPnInfo->aScreenInfos[i]; Assert(pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays); if (pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays) { PVBOXWDDM_VIDEOMODES_INFO pInfo = &g_aVBoxVideoModeInfos[pScreenInfo->Id]; VIDEO_MODE_INFORMATION ModeInfo = {0}; D3DDDIFORMAT enmFormat; switch (pScreenInfo->BitsPerPixel) { case 32: enmFormat = D3DDDIFMT_A8R8G8B8; break; case 24: enmFormat = D3DDDIFMT_R8G8B8; break; case 16: enmFormat = D3DDDIFMT_R5G6B5; break; case 8: enmFormat = D3DDDIFMT_P8; break; default: Assert(0); enmFormat = D3DDDIFMT_UNKNOWN; break; } if (enmFormat != D3DDDIFMT_UNKNOWN) { if (VBoxWddmFillMode(pExt, pScreenInfo->Id, &ModeInfo, enmFormat, pScreenInfo->Width, pScreenInfo->Height)) { VBoxWddmBuildVideoModesInfo(pExt, pScreenInfo->Id, pInfo, &ModeInfo, 1); } else { Assert(0); } } } } } /* ensure we have all the rest populated */ VBoxWddmGetAllVideoModesInfos(pExt); return g_aVBoxVideoModeInfos; }
void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt) { VBoxWddmInvalidateVideoModesInfo(pExt, D3DDDI_ID_ALL); }