Hash :
11dc1635
        
        Author :
  
        
        Date :
2019-09-18T14:46:23
        
      
Add support for generating UWP (Windows Store) projects again Until late 2017, ANGLE supported Windows Store apps on Windows 8.1, Windows Phone 8.1, and Windows 10 (via the Universal Windows Platform, aka UWP). Unfortunately ANGLE deprecated support for Windows Store when it switched from GYP to GN in 2017. Since then, users have been able to use Microsoft\angle for their UWP apps but this isn't ideal since it's based on a 2017 copy of Google\angle. This PR bring back support for UWPs, so that UWP users can use Google\angle again. Specifically it: - Adds support for generating UWP projects via GN - Adds helper/util functions specific to UWP (they're mostly similar to the desktop Windows helpers) - Fixes some existing Windows Store code that's rotted since 2017 - Disables async shader compilation for UWPs, since its implementation calls wait on the UI thread (which is forbidden in UWPs) - Renames 'ANGLE_ENABLE_WINDOWS_STORE' to 'ANGLE_ENABLE_WINDOWS_UWP', since ANGLE only support UWPs now - Fixes misc other related issues (such as dependencies on D3D9 headers in API-agnostic code) Note that this doesn't bring back support for Windows/Phone 8.1. BUG=angleproject:3922 Change-Id: Ia79ae05a5e0e0a0625eb633bf1928722dfd3e85f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1811871 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
//
// Copyright 2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// SystemInfo_win.cpp: implementation of the Windows-specific parts of SystemInfo.h
#include "gpu_info_util/SystemInfo_internal.h"
#include "common/debug.h"
#include "common/string_utils.h"
// Windows.h needs to be included first
#include <windows.h>
#include <dxgi.h>
#include <array>
#include <sstream>
namespace angle
{
namespace
{
bool GetDevicesFromDXGI(std::vector<GPUDeviceInfo> *devices)
{
#if defined(ANGLE_ENABLE_WINDOWS_UWP)
    IDXGIFactory1 *factory;
    if (!SUCCEEDED(
            CreateDXGIFactory1(__uuidof(IDXGIFactory1), reinterpret_cast<void **>(&factory))))
    {
        return false;
    }
#else
    IDXGIFactory *factory;
    if (!SUCCEEDED(CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast<void **>(&factory))))
    {
        return false;
    }
#endif
    UINT i                = 0;
    IDXGIAdapter *adapter = nullptr;
    while (factory->EnumAdapters(i++, &adapter) != DXGI_ERROR_NOT_FOUND)
    {
        DXGI_ADAPTER_DESC desc;
        adapter->GetDesc(&desc);
        LARGE_INTEGER umdVersion;
        if (adapter->CheckInterfaceSupport(__uuidof(IDXGIDevice), &umdVersion) ==
            DXGI_ERROR_UNSUPPORTED)
        {
            adapter->Release();
            continue;
        }
        // The UMD driver version here is the same as in the registry except for the last number.
        uint64_t intVersion = umdVersion.QuadPart;
        std::ostringstream o;
        constexpr uint64_t kMask16 = std::numeric_limits<uint16_t>::max();
        o << ((intVersion >> 48) & kMask16) << ".";
        o << ((intVersion >> 32) & kMask16) << ".";
        o << ((intVersion >> 16) & kMask16) << ".";
        o << (intVersion & kMask16);
        GPUDeviceInfo device;
        device.vendorId      = desc.VendorId;
        device.deviceId      = desc.DeviceId;
        device.driverVersion = o.str();
        devices->push_back(device);
        adapter->Release();
    }
    factory->Release();
    return (i > 0);
}
}  // anonymous namespace
bool GetSystemInfo(SystemInfo *info)
{
    if (!GetDevicesFromDXGI(&info->gpus))
    {
        return false;
    }
    if (info->gpus.size() == 0)
    {
        return false;
    }
    // Call GetDualGPUInfo to populate activeGPUIndex, isOptimus, and isAMDSwitchable.
    GetDualGPUInfo(info);
    // Override activeGPUIndex. The first index returned by EnumAdapters is the active GPU. We
    // can override the heuristic to find the active GPU
    info->activeGPUIndex = 0;
#if !defined(ANGLE_ENABLE_WINDOWS_UWP)
    // Override isOptimus. nvd3d9wrap.dll is loaded into all processes when Optimus is enabled.
    HMODULE nvd3d9wrap = GetModuleHandleW(L"nvd3d9wrap.dll");
    info->isOptimus    = nvd3d9wrap != nullptr;
#endif
    return true;
}
}  // namespace angle