static void test_parents(IDXGIDevice *device) { DXGI_SURFACE_DESC surface_desc; IDXGISurface *surface; IDXGIFactory *factory; IDXGIAdapter *adapter; IDXGIOutput *output; IUnknown *parent; HRESULT hr; surface_desc.Width = 512; surface_desc.Height = 512; surface_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; surface_desc.SampleDesc.Count = 1; surface_desc.SampleDesc.Quality = 0; hr = IDXGIDevice_CreateSurface(device, &surface_desc, 1, DXGI_USAGE_RENDER_TARGET_OUTPUT, NULL, &surface); ok(SUCCEEDED(hr), "Failed to create a dxgi surface, hr %#x\n", hr); hr = IDXGISurface_GetParent(surface, &IID_IDXGIDevice, (void **)&parent); IDXGISurface_Release(surface); ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr); ok(parent == (IUnknown *)device, "Got parent %p, expected %p.\n", parent, device); IUnknown_Release(parent); hr = IDXGIDevice_GetAdapter(device, &adapter); ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr); hr = IDXGIAdapter_EnumOutputs(adapter, 0, &output); if (hr == DXGI_ERROR_NOT_FOUND) { skip("Adapter has not outputs, skipping output tests.\n"); } else { ok(SUCCEEDED(hr), "EnumOutputs failed, hr %#x.\n", hr); hr = IDXGIOutput_GetParent(output, &IID_IDXGIAdapter, (void **)&parent); IDXGIOutput_Release(output); ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr); ok(parent == (IUnknown *)adapter, "Got parent %p, expected %p.\n", parent, adapter); IUnknown_Release(parent); } hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory); ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr); hr = IDXGIFactory_GetParent(factory, &IID_IUnknown, (void **)&parent); ok(hr == E_NOINTERFACE, "GetParent returned %#x, expected %#x.\n", hr, E_NOINTERFACE); ok(parent == NULL, "Got parent %p, expected %p.\n", parent, NULL); IDXGIFactory_Release(factory); hr = IDXGIDevice_GetParent(device, &IID_IDXGIAdapter, (void **)&parent); ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr); ok(parent == (IUnknown *)adapter, "Got parent %p, expected %p.\n", parent, adapter); IUnknown_Release(parent); IDXGIAdapter_Release(adapter); }
static void test_device_interfaces(void) { IDXGIAdapter *dxgi_adapter; IDXGIDevice *dxgi_device; ID3D10Device1 *device; IUnknown *iface; ULONG refcount; unsigned int i; HRESULT hr; for (i = 0; i < sizeof(d3d10_feature_levels) / sizeof(*d3d10_feature_levels); ++i) { struct device_desc device_desc; device_desc.feature_level = d3d10_feature_levels[i]; device_desc.flags = 0; if (!(device = create_device(&device_desc))) { skip("Failed to create device for feature level %#x.\n", d3d10_feature_levels[i]); continue; } hr = ID3D10Device1_QueryInterface(device, &IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Device should implement IUnknown interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = ID3D10Device1_QueryInterface(device, &IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Device should implement IDXGIObject interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = ID3D10Device1_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device); ok(SUCCEEDED(hr), "Device should implement IDXGIDevice.\n"); hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter, (void **)&dxgi_adapter); ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter.\n"); hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory, (void **)&iface); ok(SUCCEEDED(hr), "Adapter parent should implement IDXGIFactory.\n"); IUnknown_Release(iface); IDXGIAdapter_Release(dxgi_adapter); hr = IDXGIDevice_GetParent(dxgi_device, &IID_IDXGIAdapter1, (void **)&dxgi_adapter); ok(SUCCEEDED(hr), "Device parent should implement IDXGIAdapter1.\n"); hr = IDXGIAdapter_GetParent(dxgi_adapter, &IID_IDXGIFactory1, (void **)&iface); ok(hr == E_NOINTERFACE, "Adapter parent should not implement IDXGIFactory1.\n"); IDXGIAdapter_Release(dxgi_adapter); IDXGIDevice_Release(dxgi_device); hr = ID3D10Device1_QueryInterface(device, &IID_IDXGIDevice1, (void **)&iface); ok(SUCCEEDED(hr), "Device should implement IDXGIDevice1.\n"); IUnknown_Release(iface); hr = ID3D10Device1_QueryInterface(device, &IID_ID3D10Multithread, (void **)&iface); ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, "Device should implement ID3D10Multithread interface, hr %#x.\n", hr); if (SUCCEEDED(hr)) IUnknown_Release(iface); hr = ID3D10Device1_QueryInterface(device, &IID_ID3D10InfoQueue, (void **)&iface); ok(hr == E_NOINTERFACE, "Found ID3D10InfoQueue interface in non-debug mode, hr %#x.\n", hr); hr = ID3D10Device1_QueryInterface(device, &IID_ID3D10Device, (void **)&iface); ok(SUCCEEDED(hr), "Device should implement ID3D10Device interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = ID3D10Device1_QueryInterface(device, &IID_ID3D11Device, (void **)&iface); ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, "Device should implement ID3D11Device interface, hr %#x.\n", hr); if (SUCCEEDED(hr)) IUnknown_Release(iface); refcount = ID3D10Device1_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); } for (i = 0; i < sizeof(d3d10_feature_levels) / sizeof(*d3d10_feature_levels); ++i) { struct device_desc device_desc; device_desc.feature_level = d3d10_feature_levels[i]; device_desc.flags = D3D10_CREATE_DEVICE_DEBUG; if (!(device = create_device(&device_desc))) { skip("Failed to create device for feature level %#x.\n", d3d10_feature_levels[i]); continue; } hr = ID3D10Device1_QueryInterface(device, &IID_ID3D10InfoQueue, (void **)&iface); todo_wine ok(hr == S_OK, "Device should implement ID3D10InfoQueue interface, hr %#x.\n", hr); if (SUCCEEDED(hr)) IUnknown_Release(iface); refcount = ID3D10Device1_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); } }