示例#1
0
文件: device.c 项目: ErikBjare/wine
static void test_adapter_desc(IDXGIDevice *device)
{
    DXGI_ADAPTER_DESC1 desc1;
    IDXGIAdapter1 *adapter1;
    DXGI_ADAPTER_DESC desc;
    IDXGIAdapter *adapter;
    HRESULT hr;

    hr = IDXGIDevice_GetAdapter(device, &adapter);
    ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);

    hr = IDXGIAdapter_GetDesc(adapter, NULL);
    ok(hr == E_INVALIDARG, "GetDesc returned %#x, expected %#x.\n",
            hr, E_INVALIDARG);

    hr = IDXGIAdapter_GetDesc(adapter, &desc);
    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);

    trace("%s.\n", wine_dbgstr_w(desc.Description));
    trace("%04x: %04x:%04x (rev %02x).\n",
            desc.SubSysId, desc.VendorId, desc.DeviceId, desc.Revision);
    trace("Dedicated video memory: %lu (%lu MB).\n",
            desc.DedicatedVideoMemory, desc.DedicatedVideoMemory / (1024 * 1024));
    trace("Dedicated system memory: %lu (%lu MB).\n",
            desc.DedicatedSystemMemory, desc.DedicatedSystemMemory / (1024 * 1024));
    trace("Shared system memory: %lu (%lu MB).\n",
            desc.SharedSystemMemory, desc.SharedSystemMemory / (1024 * 1024));
    trace("LUID: %08x:%08x.\n", desc.AdapterLuid.HighPart, desc.AdapterLuid.LowPart);

    hr = IDXGIAdapter_QueryInterface(adapter, &IID_IDXGIAdapter1, (void **)&adapter1);
    ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE), "Got unexpected hr %#x.\n", hr);
    if (hr == E_NOINTERFACE)
        goto done;

    hr = IDXGIAdapter1_GetDesc1(adapter1, &desc1);
    ok(SUCCEEDED(hr), "GetDesc1 failed, hr %#x.\n", hr);

    ok(!lstrcmpW(desc.Description, desc1.Description),
            "Got unexpected description %s.\n", wine_dbgstr_w(desc1.Description));
    ok(desc1.VendorId == desc.VendorId, "Got unexpected vendor ID %04x.\n", desc1.VendorId);
    ok(desc1.DeviceId == desc.DeviceId, "Got unexpected device ID %04x.\n", desc1.DeviceId);
    ok(desc1.SubSysId == desc.SubSysId, "Got unexpected sub system ID %04x.\n", desc1.SubSysId);
    ok(desc1.Revision == desc.Revision, "Got unexpected revision %02x.\n", desc1.Revision);
    ok(desc1.DedicatedVideoMemory == desc.DedicatedVideoMemory,
            "Got unexpected dedicated video memory %lu.\n", desc1.DedicatedVideoMemory);
    ok(desc1.DedicatedSystemMemory == desc.DedicatedSystemMemory,
            "Got unexpected dedicated system memory %lu.\n", desc1.DedicatedSystemMemory);
    ok(desc1.SharedSystemMemory == desc.SharedSystemMemory,
            "Got unexpected shared system memory %lu.\n", desc1.SharedSystemMemory);
    ok(!memcmp(&desc.AdapterLuid, &desc1.AdapterLuid, sizeof(desc.AdapterLuid)),
            "Got unexpected adapter LUID %08x:%08x.\n", desc1.AdapterLuid.HighPart, desc1.AdapterLuid.LowPart);
    trace("Flags: %08x.\n", desc1.Flags);

    IDXGIAdapter1_Release(adapter1);

done:
    IDXGIAdapter_Release(adapter);
}
示例#2
0
文件: factory.c 项目: ccpgames/wine
static HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapterByLuid(IWineDXGIFactory *iface,
        LUID luid, REFIID iid, void **adapter)
{
    unsigned int adapter_index;
    DXGI_ADAPTER_DESC1 desc;
    IDXGIAdapter1 *adapter1;
    HRESULT hr;

    TRACE("iface %p, luid %08x:%08x, iid %s, adapter %p.\n",
            iface, luid.HighPart, luid.LowPart, debugstr_guid(iid), adapter);

    adapter_index = 0;
    while ((hr = dxgi_factory_EnumAdapters1(iface, adapter_index, &adapter1)) == S_OK)
    {
        if (FAILED(hr = IDXGIAdapter1_GetDesc1(adapter1, &desc)))
        {
            WARN("Failed to get adapter %u desc, hr %#x.\n", adapter_index, hr);
            ++adapter_index;
            continue;
        }

        if (desc.AdapterLuid.LowPart == luid.LowPart
                && desc.AdapterLuid.HighPart == luid.HighPart)
        {
            hr = IDXGIAdapter1_QueryInterface(adapter1, iid, adapter);
            IDXGIAdapter1_Release(adapter1);
            return hr;
        }

        IDXGIAdapter1_Release(adapter1);
        ++adapter_index;
    }
    if (hr != DXGI_ERROR_NOT_FOUND)
        WARN("Failed to enumerate adapters, hr %#x.\n", hr);

    WARN("Adapter could not be found.\n");
    return DXGI_ERROR_NOT_FOUND;
}
示例#3
0
static void d3d_init(struct MPGLContext *ctx)
{
    HRESULT hr;
    struct priv *p = ctx->priv;
    struct vo *vo = ctx->vo;
    IDXGIDevice *dxgi_dev = NULL;
    IDXGIAdapter *dxgi_adapter = NULL;
    IDXGIAdapter1 *dxgi_adapter1 = NULL;
    IDXGIFactory *dxgi_factory = NULL;

    PFNEGLQUERYDISPLAYATTRIBEXTPROC eglQueryDisplayAttribEXT =
        (PFNEGLQUERYDISPLAYATTRIBEXTPROC)eglGetProcAddress("eglQueryDisplayAttribEXT");
    PFNEGLQUERYDEVICEATTRIBEXTPROC eglQueryDeviceAttribEXT =
        (PFNEGLQUERYDEVICEATTRIBEXTPROC)eglGetProcAddress("eglQueryDeviceAttribEXT");
    if (!eglQueryDisplayAttribEXT || !eglQueryDeviceAttribEXT) {
        MP_VERBOSE(vo, "Missing EGL_EXT_device_query\n");
        goto done;
    }

    EGLAttrib dev_attr;
    if (!eglQueryDisplayAttribEXT(p->egl_display, EGL_DEVICE_EXT, &dev_attr)) {
        MP_VERBOSE(vo, "Missing EGL_EXT_device_query\n");
        goto done;
    }

    // If ANGLE is in D3D11 mode, get the underlying ID3D11Device
    EGLDeviceEXT dev = (EGLDeviceEXT)dev_attr;
    EGLAttrib d3d11_dev_attr;
    if (eglQueryDeviceAttribEXT(dev, EGL_D3D11_DEVICE_ANGLE, &d3d11_dev_attr)) {
        ID3D11Device *d3d11_dev = (ID3D11Device*)d3d11_dev_attr;

        hr = ID3D11Device_QueryInterface(d3d11_dev, &IID_IDXGIDevice,
            (void**)&dxgi_dev);
        if (FAILED(hr)) {
            MP_ERR(vo, "Device is not a IDXGIDevice\n");
            goto done;
        }

        hr = IDXGIDevice_GetAdapter(dxgi_dev, &dxgi_adapter);
        if (FAILED(hr)) {
            MP_ERR(vo, "Couldn't get IDXGIAdapter\n");
            goto done;
        }

        // Windows 8 can choose a software adapter even if mpv didn't ask for
        // one. If this is the case, show a warning message.
        hr = IDXGIAdapter_QueryInterface(dxgi_adapter, &IID_IDXGIAdapter1,
            (void**)&dxgi_adapter1);
        if (SUCCEEDED(hr)) {
            DXGI_ADAPTER_DESC1 desc;
            hr = IDXGIAdapter1_GetDesc1(dxgi_adapter1, &desc);
            if (SUCCEEDED(hr)) {
                if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
                    show_sw_adapter_msg(ctx);

                // If the primary display adapter is a software adapter, the
                // DXGI_ADAPTER_FLAG_SOFTWARE won't be set, but the device IDs
                // should still match the Microsoft Basic Render Driver
                if (desc.VendorId == 0x1414 && desc.DeviceId == 0x8c)
                    show_sw_adapter_msg(ctx);
            }
        }

        hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory,
            (void**)&dxgi_factory);
        if (FAILED(hr)) {
            MP_ERR(vo, "Couldn't get IDXGIFactory\n");
            goto done;
        }

        // Prevent DXGI from making changes to the VO window, otherwise in
        // non-DirectComposition mode it will hook the Alt+Enter keystroke and
        // make it trigger an ugly transition to exclusive fullscreen mode
        // instead of running the user-set command.
        IDXGIFactory_MakeWindowAssociation(dxgi_factory, vo_w32_hwnd(vo),
            DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER |
            DXGI_MWA_NO_PRINT_SCREEN);
    }

done:
    if (dxgi_dev)
        IDXGIDevice_Release(dxgi_dev);
    if (dxgi_adapter)
        IDXGIAdapter_Release(dxgi_adapter);
    if (dxgi_adapter1)
        IDXGIAdapter1_Release(dxgi_adapter1);
    if (dxgi_factory)
        IDXGIFactory_Release(dxgi_factory);
}