From: Stefan Dösinger Subject: [PATCH 2/8] wined3d: Remove wined3d_device_present. Message-Id: <1442251072-16952-2-git-send-email-stefan@codeweavers.com> Date: Mon, 14 Sep 2015 19:17:46 +0200 --- dlls/d3d9/d3d9_private.h | 3 ++ dlls/d3d9/device.c | 125 ++++++++++++++++++++++++++++++---------------- dlls/d3d9/swapchain.c | 4 -- dlls/wined3d/device.c | 18 ------- dlls/wined3d/wined3d.spec | 1 - include/d3d9.h | 4 +- include/wine/wined3d.h | 2 - 7 files changed, 88 insertions(+), 69 deletions(-) diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index d12805f..4a6dc0c 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -167,6 +167,9 @@ struct d3d9_device LONG device_state; BOOL in_destruction; BOOL in_scene; + + UINT num_implicit_swapchains; + struct d3d9_swapchain **implicit_swapchains; }; HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wined3d *wined3d, diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 3a0376d..2a60b14 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -322,6 +322,8 @@ static ULONG WINAPI DECLSPEC_HOTPATCH d3d9_device_Release(IDirect3DDevice9Ex *if if (device->index_buffer) wined3d_buffer_decref(device->index_buffer); + HeapFree(GetProcessHeap(), 0, device->implicit_swapchains); + wined3d_device_uninit_3d(device->wined3d_device); wined3d_device_release_focus_window(device->wined3d_device); wined3d_device_decref(device->wined3d_device); @@ -565,19 +567,16 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_GetSwapChain(IDirect3DDevice UINT swapchain_idx, IDirect3DSwapChain9 **swapchain) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); - struct wined3d_swapchain *wined3d_swapchain; - struct d3d9_swapchain *swapchain_impl; HRESULT hr; TRACE("iface %p, swapchain_idx %u, swapchain %p.\n", iface, swapchain_idx, swapchain); wined3d_mutex_lock(); - if ((wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, swapchain_idx))) + if (swapchain_idx < device->num_implicit_swapchains) { - swapchain_impl = wined3d_swapchain_get_parent(wined3d_swapchain); - *swapchain = (IDirect3DSwapChain9 *)&swapchain_impl->IDirect3DSwapChain9Ex_iface; - IDirect3DSwapChain9Ex_AddRef(*swapchain); - hr = D3D_OK; + *swapchain = (IDirect3DSwapChain9 *)&device->implicit_swapchains[swapchain_idx]->IDirect3DSwapChain9Ex_iface; + IDirect3DSwapChain9Ex_AddRef(*swapchain); + hr = D3D_OK; } else { @@ -646,6 +645,25 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource) return D3D_OK; } +static HRESULT d3d9_device_get_swapchains(struct d3d9_device *device) +{ + UINT i, new_swapchain_count = wined3d_device_get_swapchain_count(device->wined3d_device); + struct wined3d_swapchain *wined3d_swapchain; + + if (!(device->implicit_swapchains = HeapAlloc(GetProcessHeap(), 0, + new_swapchain_count * sizeof(*device->implicit_swapchains)))) + return E_OUTOFMEMORY; + + for (i = 0; i < new_swapchain_count; ++i) + { + wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, i); + device->implicit_swapchains[i] = wined3d_swapchain_get_parent(wined3d_swapchain); + } + device->num_implicit_swapchains = new_swapchain_count; + + return D3D_OK; +} + static HRESULT d3d9_device_reset(struct d3d9_device *device, D3DPRESENT_PARAMETERS *present_parameters, D3DDISPLAYMODEEX *mode) { @@ -691,16 +709,22 @@ static HRESULT d3d9_device_reset(struct d3d9_device *device, if (SUCCEEDED(hr = wined3d_device_reset(device->wined3d_device, &swapchain_desc, mode ? &wined3d_mode : NULL, reset_enum_callback, !device->d3d_parent->extended))) { - struct wined3d_swapchain *wined3d_swapchain; + HeapFree(GetProcessHeap(), 0, device->implicit_swapchains); - wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, 0); - wined3d_swapchain_get_desc(wined3d_swapchain, &swapchain_desc); - present_parameters->BackBufferWidth = swapchain_desc.backbuffer_width; - present_parameters->BackBufferHeight = swapchain_desc.backbuffer_height; - present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(swapchain_desc.backbuffer_format); - present_parameters->BackBufferCount = swapchain_desc.backbuffer_count; + if (FAILED(hr = d3d9_device_get_swapchains(device))) + { + device->device_state = D3D9_DEVICE_STATE_NOT_RESET; + } + else + { + wined3d_swapchain_get_desc(device->implicit_swapchains[0]->wined3d_swapchain, &swapchain_desc); + present_parameters->BackBufferWidth = swapchain_desc.backbuffer_width; + present_parameters->BackBufferHeight = swapchain_desc.backbuffer_height; + present_parameters->BackBufferFormat = d3dformat_from_wined3dformat(swapchain_desc.backbuffer_format); + present_parameters->BackBufferCount = swapchain_desc.backbuffer_count; - device->device_state = D3D9_DEVICE_STATE_OK; + device->device_state = D3D9_DEVICE_STATE_OK; + } } else if (!device->d3d_parent->extended) { @@ -726,6 +750,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_Present(IDirect3DDevice9Ex * const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, const RGNDATA *dirty_region) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); + UINT i; HRESULT hr; TRACE("iface %p, src_rect %p, dst_rect %p, dst_window_override %p, dirty_region %p.\n", @@ -735,21 +760,26 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_Present(IDirect3DDevice9Ex * return device->d3d_parent->extended ? S_PRESENT_OCCLUDED : D3DERR_DEVICELOST; wined3d_mutex_lock(); - hr = wined3d_device_present(device->wined3d_device, src_rect, dst_rect, - dst_window_override, dirty_region, 0); + for (i = 0; i < device->num_implicit_swapchains; ++i) + { + hr = wined3d_swapchain_present(device->implicit_swapchains[i]->wined3d_swapchain, src_rect, + dst_rect, dst_window_override, dirty_region, 0); + if (FAILED(hr)) + { + wined3d_mutex_unlock(); + return hr; + } + } wined3d_mutex_unlock(); - return hr; + return D3D_OK; } static HRESULT WINAPI d3d9_device_GetBackBuffer(IDirect3DDevice9Ex *iface, UINT swapchain, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface9 **backbuffer) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); - struct wined3d_swapchain *wined3d_swapchain; - struct wined3d_resource *wined3d_resource; - struct wined3d_texture *wined3d_texture; - struct d3d9_surface *surface_impl; + HRESULT hr; TRACE("iface %p, swapchain %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, swapchain, backbuffer_idx, backbuffer_type, backbuffer); @@ -757,29 +787,21 @@ static HRESULT WINAPI d3d9_device_GetBackBuffer(IDirect3DDevice9Ex *iface, UINT /* backbuffer_type is ignored by native. */ /* No need to check for backbuffer == NULL, Windows crashes in that case. */ - wined3d_mutex_lock(); - - if (!(wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, swapchain))) - { - wined3d_mutex_unlock(); - *backbuffer = NULL; - return D3DERR_INVALIDCALL; - } + *backbuffer = NULL; - if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(wined3d_swapchain, backbuffer_idx))) + wined3d_mutex_lock(); + if (swapchain >= device->num_implicit_swapchains) { wined3d_mutex_unlock(); - *backbuffer = NULL; + WARN("Swapchain index %u is out of range, returning D3DERR_INVALIDCALL.\n", swapchain); return D3DERR_INVALIDCALL; } - wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); - surface_impl = wined3d_resource_get_parent(wined3d_resource); - *backbuffer = &surface_impl->IDirect3DSurface9_iface; - IDirect3DSurface9_AddRef(*backbuffer); - + hr = IDirect3DSwapChain9Ex_GetBackBuffer(&device->implicit_swapchains[swapchain]->IDirect3DSwapChain9Ex_iface, + backbuffer_idx, backbuffer_type, backbuffer); wined3d_mutex_unlock(); - return D3D_OK; + + return hr; } static HRESULT WINAPI d3d9_device_GetRasterStatus(IDirect3DDevice9Ex *iface, @@ -3190,6 +3212,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_PresentEx(IDirect3DDevice9Ex const RGNDATA *dirty_region, DWORD flags) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); + UINT i; HRESULT hr; TRACE("iface %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p, flags %#x.\n", @@ -3200,11 +3223,18 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_PresentEx(IDirect3DDevice9Ex return S_PRESENT_OCCLUDED; wined3d_mutex_lock(); - hr = wined3d_device_present(device->wined3d_device, src_rect, dst_rect, - dst_window_override, dirty_region, flags); + for (i = 0; i < device->num_implicit_swapchains; ++i) + { + if (FAILED(hr = wined3d_swapchain_present(device->implicit_swapchains[i]->wined3d_swapchain, src_rect, + dst_rect, dst_window_override, dirty_region, flags))) + { + wined3d_mutex_unlock(); + return hr; + } + } wined3d_mutex_unlock(); - return hr; + return D3D_OK; } static HRESULT WINAPI d3d9_device_GetGPUThreadPriority(IDirect3DDevice9Ex *iface, INT *priority) @@ -3744,12 +3774,22 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine return hr; } - wined3d_mutex_unlock(); + if (FAILED(hr = d3d9_device_get_swapchains(device))) + { + wined3d_device_uninit_3d(device->wined3d_device); + wined3d_device_release_focus_window(device->wined3d_device); + wined3d_device_decref(device->wined3d_device); + wined3d_mutex_unlock(); + return E_OUTOFMEMORY; + } for (i = 0; i < count; ++i) { present_parameters_from_wined3d_swapchain_desc(¶meters[i], &swapchain_desc[i]); } + + wined3d_mutex_unlock(); + HeapFree(GetProcessHeap(), 0, swapchain_desc); /* Initialize the converted declaration array. This creates a valid pointer @@ -3759,6 +3799,7 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine { ERR("Failed to allocate FVF vertex declaration map memory.\n"); wined3d_mutex_lock(); + HeapFree(GetProcessHeap(), 0, device->implicit_swapchains); wined3d_device_uninit_3d(device->wined3d_device); wined3d_device_release_focus_window(device->wined3d_device); wined3d_device_decref(device->wined3d_device); diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index c995afb..1355a95 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -118,10 +118,6 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_swapchain_Present(IDirect3DSwapChai struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(swapchain->parent_device); HRESULT hr; - TRACE("iface %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p, flags %#x.\n", - iface, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), - dst_window_override, dirty_region, flags); - if (device->device_state != D3D9_DEVICE_STATE_OK) return device->d3d_parent->extended ? S_PRESENT_OCCLUDED : D3DERR_DEVICELOST; diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 88f0038..e81366c 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3290,24 +3290,6 @@ HRESULT CDECL wined3d_device_end_scene(struct wined3d_device *device) return WINED3D_OK; } -HRESULT CDECL wined3d_device_present(const struct wined3d_device *device, const RECT *src_rect, - const RECT *dst_rect, HWND dst_window_override, const RGNDATA *dirty_region, DWORD flags) -{ - UINT i; - - TRACE("device %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p, flags %#x.\n", - device, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), - dst_window_override, dirty_region, flags); - - for (i = 0; i < device->swapchain_count; ++i) - { - wined3d_swapchain_present(device->swapchains[i], src_rect, - dst_rect, dst_window_override, dirty_region, flags); - } - - return WINED3D_OK; -} - HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_count, const RECT *rects, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) { diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 9531dd3..ab7c948 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -104,7 +104,6 @@ @ cdecl wined3d_device_init_3d(ptr ptr) @ cdecl wined3d_device_init_gdi(ptr ptr) @ cdecl wined3d_device_multiply_transform(ptr long ptr) -@ cdecl wined3d_device_present(ptr ptr ptr ptr ptr long) @ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long) @ cdecl wined3d_device_release_focus_window(ptr) @ cdecl wined3d_device_reset(ptr ptr ptr ptr long) diff --git a/include/d3d9.h b/include/d3d9.h index 712104b..24d2968 100644 --- a/include/d3d9.h +++ b/include/d3d9.h @@ -494,8 +494,8 @@ __CRT_UUID_DECL(IDirect3DSwapChain9Ex, 0x91886caf, 0x1c3d, 0x4d2e, 0xa0, /*** IDirect3DSwapChain9 methods ***/ #define IDirect3DSwapChain9Ex_Present(p,a,b,c,d,e) (p)->lpVtbl->Present(p,a,b,c,d,e) #define IDirect3DSwapChain9Ex_GetFrontBufferData(p,a) (p)->lpVtbl->GetFrontBufferData(p,a) -#define IDirect3DSwapChain9EX_GetBackBuffer(p,a,b,c) (p)->lpVtbl->GetBackBuffer(p,a,b,c) -#define IDirect3DSwapChain9EX_GetRasterStatus(p,a) (p)->lpVtbl->GetRasterStatus(p,a) +#define IDirect3DSwapChain9Ex_GetBackBuffer(p,a,b,c) (p)->lpVtbl->GetBackBuffer(p,a,b,c) +#define IDirect3DSwapChain9Ex_GetRasterStatus(p,a) (p)->lpVtbl->GetRasterStatus(p,a) #define IDirect3DSwapChain9Ex_GetDisplayMode(p,a) (p)->lpVtbl->GetDisplayMode(p,a) #define IDirect3DSwapChain9Ex_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) #define IDirect3DSwapChain9Ex_GetPresentParameters(p,a) (p)->lpVtbl->GetPresentParameters(p,a) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index ac1e59e..8725b0a 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2230,8 +2230,6 @@ HRESULT __cdecl wined3d_device_init_3d(struct wined3d_device *device, struct win HRESULT __cdecl wined3d_device_init_gdi(struct wined3d_device *device, struct wined3d_swapchain_desc *swapchain_desc); void __cdecl wined3d_device_multiply_transform(struct wined3d_device *device, enum wined3d_transform_state state, const struct wined3d_matrix *matrix); -HRESULT __cdecl wined3d_device_present(const struct wined3d_device *device, const RECT *src_rect, - const RECT *dst_rect, HWND dst_window_override, const RGNDATA *dirty_region, DWORD flags); HRESULT __cdecl wined3d_device_process_vertices(struct wined3d_device *device, UINT src_start_idx, UINT dst_idx, UINT vertex_count, struct wined3d_buffer *dst_buffer, const struct wined3d_vertex_declaration *declaration, DWORD flags, DWORD dst_fvf); -- 2.4.6