コード例 #1
0
ファイル: StDXManager.cpp プロジェクト: gkv311/sview
bool StDXManager::getInfo(StDXInfo&  theInfo,
                          const bool theForced) {
    if(!theForced) {
        if(ST_DX_HAS_CACHED_INFO) {
            theInfo = ST_DX_CACHED_INFO;
            return true;
        }
    }

    const StStringUtfWide AQBS_TEST_CLASS = L"StTESTAqbsWin";
    HINSTANCE anAppInst = GetModuleHandle(NULL);
    WNDCLASSW aWinClass;
    aWinClass.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    aWinClass.lpfnWndProc   = (WNDPROC )aDummyWinProc;
    aWinClass.cbClsExtra    = 0;
    aWinClass.cbWndExtra    = 0;
    aWinClass.hInstance     = anAppInst;
    aWinClass.hIcon         = LoadIcon(anAppInst, L"A");
    aWinClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    aWinClass.hbrBackground = NULL;
    aWinClass.lpszMenuName  = NULL;
    aWinClass.lpszClassName = AQBS_TEST_CLASS.toCString(); // class name
    if(RegisterClassW(&aWinClass) == 0) {
        ST_DEBUG_LOG("Failed to RegisterClass '" + AQBS_TEST_CLASS.toUtf8() + "'");
        return false;
    }
    HWND aWinHandle = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE | WS_EX_NOACTIVATE,
                                      AQBS_TEST_CLASS.toCString(), L"StTESTAqbs Window",
                                      WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
                                      32, 32, 32, 32, NULL, NULL, anAppInst, NULL);
    if(aWinHandle == NULL) {
        ST_DEBUG_LOG("Failed to create 'StTESTAqbsWin' window (" + int(GetLastError()) + ")");
        UnregisterClassW(AQBS_TEST_CLASS.toCString(), anAppInst);
        return false;
    }

    StHandle<StDXManager> aDXManager = new StDXManager();

    // test AQBS support
    theInfo.hasAqbsSupport = aDXManager->checkAqbsSupport(aWinHandle);

    // enumerate available adapters
    if(aDXManager->myD3dLib != NULL) {
        const UINT aD3dAdaptersNb = aDXManager->getAdapterCount();
        D3DADAPTER_IDENTIFIER9 anAdapterInfo;
        for(UINT anAdapterIter = 0; anAdapterIter < aD3dAdaptersNb; ++anAdapterIter) {
            aDXManager->getAdapterIdentifier(anAdapterIter, 0, &anAdapterInfo);
            if(anAdapterInfo.VendorId == ST_DX_VENDOR_AMD) {
                theInfo.hasAmdAdapter = true;
            } else if(anAdapterInfo.VendorId == ST_DX_VENDOR_NVIDIA) {
                theInfo.hasNvAdapter  = true;
            }
        }
    }

    // release resources
    aDXManager.nullify();
    DestroyWindow(aWinHandle);
    UnregisterClass(AQBS_TEST_CLASS.toCString(), anAppInst);

    // check NVIDIA Stereo enabled state
    if(NvAPI_Initialize() == NVAPI_OK) {
        NvU8 isStereoEnabled = FALSE;
        NvAPI_Stereo_IsEnabled(&isStereoEnabled);
        theInfo.hasNvStereoSupport = isStereoEnabled == TRUE;
    }

    //ST_DEBUG_LOG("DXInfo, AMD(" + int(theInfo.hasAmdAdapter) + "), AQBS(" + int(theInfo.hasAqbsSupport)
    //           + "); NVIDIA(" + int(theInfo.hasNvAdapter) + "), NvStereo(" + int(theInfo.hasNvStereoSupport) + ")");

    // cache the state to avoid unnecessary calls
    ST_DX_CACHED_INFO = theInfo;
    ST_DX_HAS_CACHED_INFO = true;

    return true;
}