Beispiel #1
0
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;
}
Beispiel #2
0
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;
}