static HRESULT WINAPI d3dadapter9_CreateDeviceEx( struct d3dadapter9 *This, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, D3DDISPLAYMODEEX *pFullscreenDisplayMode, IDirect3DDevice9Ex **ppReturnedDeviceInterface ) { ID3DPresentGroup *present; HRESULT hr; SDL_Window* sdl_win = (SDL_Window*)hFocusWindow; if (Adapter >= d3dadapter9_GetAdapterCount(This)) { WARN("Adapter %u does not exist.\n", Adapter); return D3DERR_INVALIDCALL; } if (!sdl_win) { ERR("no SDL_Window specified\n"); return D3DERR_INVALIDCALL; } { UINT nparams = 1; UINT ordinal = 0; hr = dri3_create_present_group(sdl_win, ordinal, pPresentationParameters, nparams, &present); } if (FAILED(hr)) { WARN("Failed to create PresentGroup.\n"); return hr; } if (This->ex) { hr = ADAPTER_PROC(CreateDeviceEx, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, pFullscreenDisplayMode, (IDirect3D9Ex *)This, present, ppReturnedDeviceInterface); } else { /* CreateDevice on non-ex */ hr = ADAPTER_PROC(CreateDevice, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, (IDirect3D9 *)This, present, (IDirect3DDevice9 **)ppReturnedDeviceInterface); } if (FAILED(hr)) { WARN("ADAPTER_PROC failed.\n"); ID3DPresentGroup_Release(present); } return hr; }
static HRESULT WINAPI DECLSPEC_HOTPATCH d3dadapter9_CreateDeviceEx( struct d3dadapter9 *This, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, D3DDISPLAYMODEEX *pFullscreenDisplayMode, IDirect3DDevice9Ex **ppReturnedDeviceInterface ) { ID3DPresentGroup *present; HRESULT hr; boolean no_window_changes; if (Adapter >= d3dadapter9_GetAdapterCount(This)) { WARN("Adapter %u does not exist.\n", Adapter); return D3DERR_INVALIDCALL; } { struct adapter_group *group = &ADAPTER_GROUP; unsigned nparams, ordinal; if (BehaviorFlags & D3DCREATE_ADAPTERGROUP_DEVICE) { nparams = group->noutputs; ordinal = 0; } else { nparams = 1; ordinal = Adapter - This->map[Adapter].master; } no_window_changes = !!(BehaviorFlags & D3DCREATE_NOWINDOWCHANGES); hr = present_create_present_group(This->gdi_display, group->devname, ordinal, hFocusWindow, pPresentationParameters, nparams, &present, This->ex, no_window_changes); } if (FAILED(hr)) { WARN("Failed to create PresentGroup.\n"); return hr; } if (This->ex) { hr = ADAPTER_PROC(CreateDeviceEx, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, pFullscreenDisplayMode, (IDirect3D9Ex *)This, present, ppReturnedDeviceInterface); } else { /* CreateDevice on non-ex */ hr = ADAPTER_PROC(CreateDevice, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, (IDirect3D9 *)This, present, (IDirect3DDevice9 **)ppReturnedDeviceInterface); } if (FAILED(hr)) { WARN("ADAPTER_PROC failed.\n"); ID3DPresentGroup_Release(present); } /* Nine returns different vtables for Ex, non Ex and * if you use the multithread flag or not. This prevents * things like Steam overlay to work, in addition to the problem * that functions nine side are not recognized by wine as * hotpatch-able. If possible, we use our vtable wrapper, * which solves the problem described above. */ if (enable_device_vtable_wrapper()) (*ppReturnedDeviceInterface)->lpVtbl = get_device_vtable(); return hr; }