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_output_GetParent(IDXGIOutput *iface, REFIID riid, void **parent) { struct dxgi_output *This = impl_from_IDXGIOutput(iface); TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent); return IDXGIAdapter_QueryInterface((IDXGIAdapter *)This->adapter, riid, parent); }
static HRESULT STDMETHODCALLTYPE dxgi_device_GetParent(IWineDXGIDevice *iface, REFIID riid, void **parent) { IDXGIAdapter *adapter; HRESULT hr; TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent); hr = IWineDXGIDevice_GetAdapter(iface, &adapter); if (FAILED(hr)) { ERR("Failed to get adapter, hr %#x.\n", hr); return hr; } hr = IDXGIAdapter_QueryInterface(adapter, riid, parent); IDXGIAdapter_Release(adapter); return hr; }
HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *layer, IDXGIFactory *factory, IDXGIAdapter *adapter) { struct wined3d_device_parent *wined3d_device_parent; IWineDXGIDeviceParent *dxgi_device_parent; IWineDXGIAdapter *wine_adapter; UINT adapter_ordinal; struct wined3d *wined3d; void *layer_base; HRESULT hr; WINED3DCAPS caps; device->IWineDXGIDevice_iface.lpVtbl = &dxgi_device_vtbl; device->refcount = 1; layer_base = device + 1; hr = layer->create(layer->id, &layer_base, 0, device, &IID_IUnknown, (void **)&device->child_layer); if (FAILED(hr)) { WARN("Failed to create device, returning %#x.\n", hr); goto fail; } hr = IDXGIFactory_QueryInterface(factory, &IID_IWineDXGIFactory, (void **)&device->factory); if (FAILED(hr)) { WARN("This is not the factory we're looking for, returning %#x.\n", hr); goto fail; } wined3d = IWineDXGIFactory_get_wined3d(device->factory); hr = IDXGIAdapter_QueryInterface(adapter, &IID_IWineDXGIAdapter, (void **)&wine_adapter); if (FAILED(hr)) { WARN("This is not the adapter we're looking for, returning %#x.\n", hr); EnterCriticalSection(&dxgi_cs); wined3d_decref(wined3d); LeaveCriticalSection(&dxgi_cs); goto fail; } adapter_ordinal = IWineDXGIAdapter_get_ordinal(wine_adapter); IWineDXGIAdapter_Release(wine_adapter); hr = IWineDXGIDevice_QueryInterface(&device->IWineDXGIDevice_iface, &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent); if (FAILED(hr)) { ERR("DXGI device should implement IWineD3DDeviceParent.\n"); goto fail; } wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent); FIXME("Ignoring adapter type.\n"); hr = wined3d_get_device_caps(wined3d, adapter_ordinal, WINED3D_DEVICE_TYPE_HAL, &caps); if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4) { WARN("Direct3D 10 is not supported on this GPU with the current shader backend.\n"); if (SUCCEEDED(hr)) hr = E_FAIL; goto fail; } EnterCriticalSection(&dxgi_cs); hr = wined3d_device_create(wined3d, adapter_ordinal, WINED3D_DEVICE_TYPE_HAL, NULL, 0, 4, wined3d_device_parent, &device->wined3d_device); IWineDXGIDeviceParent_Release(dxgi_device_parent); wined3d_decref(wined3d); LeaveCriticalSection(&dxgi_cs); if (FAILED(hr)) { WARN("Failed to create a wined3d device, returning %#x.\n", hr); goto fail; } return S_OK; fail: if (device->wined3d_device) { EnterCriticalSection(&dxgi_cs); wined3d_device_decref(device->wined3d_device); LeaveCriticalSection(&dxgi_cs); } if (device->factory) IWineDXGIFactory_Release(device->factory); if (device->child_layer) IUnknown_Release(device->child_layer); return hr; }
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); }