예제 #1
0
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;
}
예제 #3
0
void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt)
{
    VBoxWddmInvalidateVideoModesInfo(pExt, D3DDDI_ID_ALL);
}