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); }
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; }
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); }