static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDevice(IDXGISurface *iface, REFIID riid, void **device) { struct dxgi_surface *This = impl_from_IDXGISurface(iface); TRACE("iface %p, riid %s, device %p.\n", iface, debugstr_guid(riid), device); return IDXGIDevice_QueryInterface(This->device, riid, device); }
static void test_device_interfaces(IDXGIDevice *device) { IUnknown *obj; HRESULT hr; if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_IUnknown, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown\n"); if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_IDXGIObject, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "IDXGIDevice does not implement IDXGIObject\n"); if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_IDXGIDevice, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "IDXGIDevice does not implement IDXGIDevice\n"); if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_ID3D10Device, (void **)&obj))) IUnknown_Release(obj); ok(SUCCEEDED(hr), "IDXGIDevice does not implement ID3D10Device\n"); }
static void test_device_interfaces(void) { IDXGIDevice *device; IUnknown *iface; ULONG refcount; HRESULT hr; if (!(device = create_device())) { skip("Failed to create device, skipping tests.\n"); return; } hr = IDXGIDevice_QueryInterface(device, &IID_IUnknown, (void **)&iface); ok(SUCCEEDED(hr), "Failed to query IUnknown interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = IDXGIDevice_QueryInterface(device, &IID_IDXGIObject, (void **)&iface); ok(SUCCEEDED(hr), "Failed to query IDXGIObject interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = IDXGIDevice_QueryInterface(device, &IID_IDXGIDevice, (void **)&iface); ok(SUCCEEDED(hr), "Failed to query IDXGIDevice interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = IDXGIDevice_QueryInterface(device, &IID_ID3D10Device, (void **)&iface); ok(SUCCEEDED(hr), "Failed to query ID3D10Device interface, hr %#x.\n", hr); IUnknown_Release(iface); hr = IDXGIDevice_QueryInterface(device, &IID_ID3D10Multithread, (void **)&iface); ok(SUCCEEDED(hr), "Failed to query ID3D10Multithread interface, hr %#x.\n", hr); IUnknown_Release(iface); if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_ID3D10Device1, (void **)&iface))) IUnknown_Release(iface); ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, "Failed to query ID3D10Device1 interface, hr %#x.\n", hr); if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(device, &IID_ID3D11Device, (void **)&iface))) IUnknown_Release(iface); todo_wine ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, "Failed to query ID3D11Device interface, hr %#x.\n", hr); refcount = IDXGIDevice_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); }
static void test_createswapchain(IDXGIDevice *device) { IUnknown *obj; IDXGIAdapter *adapter; IDXGIFactory *factory; IDXGISwapChain *swapchain; DXGI_SWAP_CHAIN_DESC creation_desc, result_desc; HRESULT hr; WNDCLASSA wc = {0}; UINT i; const struct refresh_rates refresh_list[] = { {60, 60, FALSE, FALSE}, {60, 0, TRUE, FALSE}, {60, 1, TRUE, TRUE}, { 0, 60, TRUE, FALSE}, { 0, 0, TRUE, FALSE}, }; wc.lpfnWndProc = DefWindowProcA; wc.lpszClassName = "dxgi_test_wc"; RegisterClassA(&wc); creation_desc.OutputWindow = 0; creation_desc.BufferDesc.Width = 800; creation_desc.BufferDesc.Height = 600; creation_desc.BufferDesc.RefreshRate.Numerator = 60; creation_desc.BufferDesc.RefreshRate.Denominator = 60; creation_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; creation_desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; creation_desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; creation_desc.SampleDesc.Count = 1; creation_desc.SampleDesc.Quality = 0; creation_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; creation_desc.BufferCount = 1; creation_desc.OutputWindow = CreateWindowA("dxgi_test_wc", "dxgi_test", 0, 0, 0, 0, 0, 0, 0, 0, 0); creation_desc.Windowed = TRUE; creation_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; creation_desc.Flags = 0; hr = IDXGIDevice_QueryInterface(device, &IID_IUnknown, (void **)&obj); ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown\n"); hr = IDXGIDevice_GetAdapter(device, &adapter); ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr); hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory); ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr); hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain); ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, NULL); ok(hr == E_INVALIDARG, "GetDesc unexpectedly returned %#x.\n", hr); IDXGISwapChain_Release(swapchain); for (i = 0; i < sizeof(refresh_list)/sizeof(refresh_list[0]); i++) { creation_desc.BufferDesc.RefreshRate.Numerator = refresh_list[i].numerator; creation_desc.BufferDesc.RefreshRate.Denominator = refresh_list[i].denominator; hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain); ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &result_desc); ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr); if (refresh_list[i].numerator_should_pass) ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator, "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator); else todo_wine ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator, "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator); if (refresh_list[i].denominator_should_pass) ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator, "Denominator %u is %u.\n", i ,result_desc.BufferDesc.RefreshRate.Denominator); else todo_wine ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator, "Denominator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Denominator); IDXGISwapChain_Release(swapchain); } creation_desc.Windowed = FALSE; for (i = 0; i < sizeof(refresh_list)/sizeof(refresh_list[0]); i++) { creation_desc.BufferDesc.RefreshRate.Numerator = refresh_list[i].numerator; creation_desc.BufferDesc.RefreshRate.Denominator = refresh_list[i].denominator; hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain); ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &result_desc); ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr); if (refresh_list[i].numerator_should_pass) ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator, "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator); else todo_wine ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator, "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator); if (refresh_list[i].denominator_should_pass) ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator, "Denominator %u is %u.\n", i ,result_desc.BufferDesc.RefreshRate.Denominator); else todo_wine ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator, "Denominator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Denominator); hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL); todo_wine ok(SUCCEEDED(hr), "SetFullscreenState failed, hr %#x.\n", hr); IDXGISwapChain_Release(swapchain); } IDXGIFactory_Release(factory); IDXGIAdapter_Release(adapter); IUnknown_Release(obj); }