static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IDXGIFactory1 *iface) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); ULONG refcount = InterlockedDecrement(&factory->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { UINT i; if (factory->device_window) DestroyWindow(factory->device_window); for (i = 0; i < factory->adapter_count; ++i) { IDXGIAdapter1_Release(factory->adapters[i]); } HeapFree(GetProcessHeap(), 0, factory->adapters); EnterCriticalSection(&dxgi_cs); wined3d_decref(factory->wined3d); LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); HeapFree(GetProcessHeap(), 0, factory); } return refcount; }
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 ULONG STDMETHODCALLTYPE dxgi_device_Release(IWineDXGIDevice *iface) { struct dxgi_device *device = impl_from_IWineDXGIDevice(iface); ULONG refcount = InterlockedDecrement(&device->refcount); TRACE("%p decreasing refcount to %u.\n", device, refcount); if (!refcount) { if (device->child_layer) IUnknown_Release(device->child_layer); wined3d_mutex_lock(); wined3d_device_uninit_3d(device->wined3d_device); wined3d_device_decref(device->wined3d_device); wined3d_mutex_unlock(); IDXGIAdapter1_Release(device->adapter); wined3d_private_store_cleanup(&device->private_store); HeapFree(GetProcessHeap(), 0, device); } return refcount; }
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); }
static HRESULT dxgi_factory_init(struct dxgi_factory *factory, BOOL extended) { HRESULT hr; UINT i; factory->IDXGIFactory1_iface.lpVtbl = &dxgi_factory_vtbl; factory->refcount = 1; wined3d_private_store_init(&factory->private_store); EnterCriticalSection(&dxgi_cs); factory->wined3d = wined3d_create(0); if (!factory->wined3d) { LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); return DXGI_ERROR_UNSUPPORTED; } factory->adapter_count = wined3d_get_adapter_count(factory->wined3d); LeaveCriticalSection(&dxgi_cs); factory->adapters = HeapAlloc(GetProcessHeap(), 0, factory->adapter_count * sizeof(*factory->adapters)); if (!factory->adapters) { ERR("Failed to allocate DXGI adapter array memory.\n"); hr = E_OUTOFMEMORY; goto fail; } for (i = 0; i < factory->adapter_count; ++i) { struct dxgi_adapter *adapter = HeapAlloc(GetProcessHeap(), 0, sizeof(*adapter)); if (!adapter) { UINT j; ERR("Failed to allocate DXGI adapter memory.\n"); for (j = 0; j < i; ++j) { IDXGIAdapter1_Release(factory->adapters[j]); } hr = E_OUTOFMEMORY; goto fail; } if (FAILED(hr = dxgi_adapter_init(adapter, factory, i))) { UINT j; ERR("Failed to initialize adapter, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, adapter); for (j = 0; j < i; ++j) { IDXGIAdapter1_Release(factory->adapters[j]); } goto fail; } factory->adapters[i] = &adapter->IDXGIAdapter1_iface; } factory->extended = extended; return S_OK; fail: HeapFree(GetProcessHeap(), 0, factory->adapters); EnterCriticalSection(&dxgi_cs); wined3d_decref(factory->wined3d); LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); return hr; }