static ULONG STDMETHODCALLTYPE dxgi_device_Release(IWineDXGIDevice *iface) { struct dxgi_device *This = impl_from_IWineDXGIDevice(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { if (This->child_layer) IUnknown_Release(This->child_layer); wined3d_mutex_lock(); wined3d_device_uninit_3d(This->wined3d_device); wined3d_device_decref(This->wined3d_device); wined3d_mutex_unlock(); IDXGIFactory1_Release(This->factory); wined3d_private_store_cleanup(&This->private_store); HeapFree(GetProcessHeap(), 0, This); } return refcount; }
HRESULT dxgi_factory_create(REFIID riid, void **factory, BOOL extended) { struct dxgi_factory *object; HRESULT hr; if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; if (FAILED(hr = dxgi_factory_init(object, extended))) { WARN("Failed to initialize factory, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); return hr; } TRACE("Created factory %p.\n", object); hr = IDXGIFactory1_QueryInterface(&object->IDXGIFactory1_iface, riid, factory); IDXGIFactory1_Release(&object->IDXGIFactory1_iface); return hr; }
static inline bool gl_shtex_init_d3d11(void) { D3D_FEATURE_LEVEL level_used; IDXGIFactory1 *factory; IDXGIAdapter *adapter; HRESULT hr; HMODULE d3d11 = load_system_library("d3d11.dll"); if (!d3d11) { hlog("gl_shtex_init_d3d11: failed to load D3D11.dll: %d", GetLastError()); return false; } HMODULE dxgi = load_system_library("dxgi.dll"); if (!dxgi) { hlog("gl_shtex_init_d3d11: failed to load DXGI.dll: %d", GetLastError()); return false; } DXGI_SWAP_CHAIN_DESC desc = {0}; desc.BufferCount = 2; desc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; desc.BufferDesc.Width = 2; desc.BufferDesc.Height = 2; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.SampleDesc.Count = 1; desc.Windowed = true; desc.OutputWindow = data.hwnd; create_dxgi_factory1_t create_factory = (void*)GetProcAddress(dxgi, "CreateDXGIFactory1"); if (!create_factory) { hlog("gl_shtex_init_d3d11: failed to load CreateDXGIFactory1 " "procedure: %d", GetLastError()); return false; } PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN create = (void*)GetProcAddress( d3d11, "D3D11CreateDeviceAndSwapChain"); if (!create) { hlog("gl_shtex_init_d3d11: failed to load " "D3D11CreateDeviceAndSwapChain procedure: %d", GetLastError()); return false; } hr = create_factory(&GUID_IDXGIFactory1, (void**)&factory); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create factory", hr); return false; } hr = IDXGIFactory1_EnumAdapters1(factory, 0, (IDXGIAdapter1**)&adapter); IDXGIFactory1_Release(factory); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create adapter", hr); return false; } hr = create(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, feature_levels, sizeof(feature_levels) / sizeof(D3D_FEATURE_LEVEL), D3D11_SDK_VERSION, &desc, &data.dxgi_swap, &data.d3d11_device, &level_used, &data.d3d11_context); IDXGIAdapter_Release(adapter); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create device", hr); return false; } return true; }
static void test_create_factory(void) { IDXGIFactory1 *factory; IUnknown *iface; HRESULT hr; iface = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIDevice, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); hr = CreateDXGIFactory(&IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IUnknown, hr %#x.\n", hr); IUnknown_Release(iface); hr = CreateDXGIFactory(&IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIObject, hr %#x.\n", hr); IUnknown_Release(iface); factory = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr); hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!factory, "Got unexpected factory %p.\n", factory); IUnknown_Release(iface); iface = (void *)0xdeadbeef; hr = CreateDXGIFactory(&IID_IDXGIFactory1, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); if (!pCreateDXGIFactory1) { win_skip("CreateDXGIFactory1 not available, skipping tests.\n"); return; } iface = (void *)0xdeadbeef; hr = pCreateDXGIFactory1(&IID_IDXGIDevice, (void **)&iface); ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr); ok(!iface, "Got unexpected iface %p.\n", iface); hr = pCreateDXGIFactory1(&IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IUnknown, hr %#x.\n", hr); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIObject, hr %#x.\n", hr); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIFactory, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr); hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory); ok(SUCCEEDED(hr), "Failed to query IDXGIFactory1 interface, hr %#x.\n", hr); IDXGIFactory1_Release(factory); IUnknown_Release(iface); hr = pCreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&iface); ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory1, hr %#x.\n", hr); IUnknown_Release(iface); }