Module: wine Branch: master Commit: 7524258aaf57fe11de6d3dbf9d0842eb2accf966 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7524258aaf57fe11de6d3dbf9d...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Dec 5 10:34:17 2013 +0100
ddraw: Implement flips inside ddraw.
---
dlls/ddraw/surface.c | 38 ++++++++++++++++++++++++++++++++++++-- dlls/wined3d/resource.c | 5 +++++ dlls/wined3d/surface.c | 23 ----------------------- dlls/wined3d/wined3d.spec | 2 +- include/wine/wined3d.h | 2 +- 5 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 4c96da8..59c88c0 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -1175,6 +1175,8 @@ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDra struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface7(iface); struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface7(src); DDSCAPS2 caps = {DDSCAPS_FLIP, 0, 0, 0}; + struct wined3d_surface *tmp, *rt; + struct wined3d_texture *texture; IDirectDrawSurface7 *current; HRESULT hr;
@@ -1185,6 +1187,10 @@ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDra
wined3d_mutex_lock();
+ tmp = dst_impl->wined3d_surface; + texture = dst_impl->wined3d_texture; + rt = wined3d_device_get_render_target(dst_impl->ddraw->wined3d_device, 0); + if (src_impl) { for (current = iface; current != src;) @@ -1216,9 +1222,37 @@ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDra ddraw_surface7_Release(current); }
- if (SUCCEEDED(hr = wined3d_surface_flip(dst_impl->wined3d_surface, src_impl->wined3d_surface, flags)) - && (dst_impl->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) + if (rt == dst_impl->wined3d_surface) + wined3d_device_set_render_target(dst_impl->ddraw->wined3d_device, 0, src_impl->wined3d_surface, FALSE); + wined3d_resource_set_parent(wined3d_surface_get_resource(src_impl->wined3d_surface), dst_impl); + dst_impl->wined3d_surface = src_impl->wined3d_surface; + wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture), + wined3d_texture_get_parent(dst_impl->wined3d_texture)); + dst_impl->wined3d_texture = src_impl->wined3d_texture; + + /* We don't have to worry about potential texture bindings, since + * flippable surfaces can never be textures. */ + if (rt == src_impl->wined3d_surface) + wined3d_device_set_render_target(dst_impl->ddraw->wined3d_device, 0, tmp, FALSE); + wined3d_resource_set_parent(wined3d_surface_get_resource(tmp), src_impl); + src_impl->wined3d_surface = tmp; + wined3d_resource_set_parent(wined3d_texture_get_resource(texture), + wined3d_texture_get_parent(src_impl->wined3d_texture)); + src_impl->wined3d_texture = texture; + + if (flags) + { + static UINT once; + if (!once++) + FIXME("Ignoring flags %#x.\n", flags); + else + WARN("Ignoring flags %#x.\n", flags); + } + + if (dst_impl->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) hr = ddraw_surface_update_frontbuffer(dst_impl, NULL, FALSE); + else + hr = DD_OK;
wined3d_mutex_unlock();
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 6a0a29b..b76783f 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -328,6 +328,11 @@ void * CDECL wined3d_resource_get_parent(const struct wined3d_resource *resource return resource->parent; }
+void CDECL wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent) +{ + resource->parent = parent; +} + void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, struct wined3d_resource_desc *desc) { desc->resource_type = resource->type; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 48512eb..5b28e9b 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -3414,29 +3414,6 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) return WINED3D_OK; }
-HRESULT CDECL wined3d_surface_flip(struct wined3d_surface *surface, struct wined3d_surface *override, DWORD flags) -{ - TRACE("surface %p, override %p, flags %#x.\n", surface, override, flags); - - if (flags) - { - static UINT once; - if (!once++) - FIXME("Ignoring flags %#x.\n", flags); - else - WARN("Ignoring flags %#x.\n", flags); - } - - if (surface->swapchain) - { - ERR("Not supported on swapchain surfaces.\n"); - return WINEDDERR_NOTFLIPPABLE; - } - - flip_surface(surface, override); - return WINED3D_OK; -} - static void read_from_framebuffer(struct wined3d_surface *surface) { struct wined3d_device *device = surface->resource.device; diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 03f10d2..ed8e24b 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -176,6 +176,7 @@ @ cdecl wined3d_resource_get_desc(ptr ptr) @ cdecl wined3d_resource_get_parent(ptr) @ cdecl wined3d_resource_get_private_data(ptr ptr ptr ptr) +@ cdecl wined3d_resource_set_parent(ptr ptr) @ cdecl wined3d_resource_set_private_data(ptr ptr ptr long long)
@ cdecl wined3d_rendertarget_view_create(ptr ptr ptr) @@ -206,7 +207,6 @@
@ cdecl wined3d_surface_blt(ptr ptr ptr ptr long ptr long) @ cdecl wined3d_surface_decref(ptr) -@ cdecl wined3d_surface_flip(ptr ptr long) @ cdecl wined3d_surface_from_resource(ptr) @ cdecl wined3d_surface_get_blt_status(ptr long) @ cdecl wined3d_surface_get_flip_status(ptr long) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 269aa23..2c748ed 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2261,6 +2261,7 @@ void __cdecl wined3d_resource_get_desc(const struct wined3d_resource *resource, void * __cdecl wined3d_resource_get_parent(const struct wined3d_resource *resource); HRESULT __cdecl wined3d_resource_get_private_data(const struct wined3d_resource *resource, REFGUID guid, void *data, DWORD *data_size); +void __cdecl wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent); HRESULT __cdecl wined3d_resource_set_private_data(struct wined3d_resource *resource, REFGUID guid, const void *data, DWORD data_size, DWORD flags);
@@ -2304,7 +2305,6 @@ HRESULT __cdecl wined3d_surface_blt(struct wined3d_surface *dst_surface, const R struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags, const WINEDDBLTFX *blt_fx, enum wined3d_texture_filter_type filter); ULONG __cdecl wined3d_surface_decref(struct wined3d_surface *surface); -HRESULT __cdecl wined3d_surface_flip(struct wined3d_surface *surface, struct wined3d_surface *override, DWORD flags); struct wined3d_surface * __cdecl wined3d_surface_from_resource(struct wined3d_resource *resource); HRESULT __cdecl wined3d_surface_get_blt_status(const struct wined3d_surface *surface, DWORD flags); HRESULT __cdecl wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags);