Henri Verbeet : ddraw: Implement flips inside ddraw.
Alexandre Julliard
julliard at winehq.org
Thu Dec 5 12:49:16 CST 2013
Module: wine
Branch: master
Commit: 7524258aaf57fe11de6d3dbf9d0842eb2accf966
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7524258aaf57fe11de6d3dbf9d0842eb2accf966
Author: Henri Verbeet <hverbeet at 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);
More information about the wine-cvs
mailing list