Henri Verbeet : wined3d: Merge the IWineD3DSurface::Flip() implementations.
Alexandre Julliard
julliard at winehq.org
Fri Apr 29 11:09:17 CDT 2011
Module: wine
Branch: master
Commit: 0b523df93c30fc7455a10dfe5da599d003929f56
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0b523df93c30fc7455a10dfe5da599d003929f56
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Fri Apr 29 13:03:38 2011 +0200
wined3d: Merge the IWineD3DSurface::Flip() implementations.
---
dlls/wined3d/surface.c | 163 ++++++++++++++++++----------------------
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 73 insertions(+), 91 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 80c9263..d5fe048 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1037,6 +1037,31 @@ static HRESULT surface_getdc(IWineD3DSurfaceImpl *surface)
return hr;
}
+static HRESULT surface_flip(IWineD3DSurfaceImpl *surface, IWineD3DSurfaceImpl *override)
+{
+ TRACE("surface %p, override %p.\n", surface, override);
+
+ /* Flipping is only supported on render targets and overlays. */
+ if (!(surface->resource.usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_OVERLAY)))
+ {
+ WARN("Tried to flip a non-render target, non-overlay surface.\n");
+ return WINEDDERR_NOTFLIPPABLE;
+ }
+
+ if (surface->resource.usage & WINED3DUSAGE_OVERLAY)
+ {
+ flip_surface(surface, override);
+
+ /* Update the overlay if it is visible */
+ if (surface->overlay_dest)
+ return surface->surface_ops->surface_draw_overlay(surface);
+ else
+ return WINED3D_OK;
+ }
+
+ return WINED3D_OK;
+}
+
static HRESULT surface_set_mem(IWineD3DSurfaceImpl *surface, void *mem)
{
TRACE("surface %p, mem %p.\n", surface, mem);
@@ -1207,6 +1232,7 @@ static const struct wined3d_surface_ops surface_ops =
surface_map,
surface_unmap,
surface_getdc,
+ surface_flip,
surface_set_mem,
};
@@ -1383,6 +1409,13 @@ static HRESULT gdi_surface_getdc(IWineD3DSurfaceImpl *surface)
return hr;
}
+static HRESULT gdi_surface_flip(IWineD3DSurfaceImpl *surface, IWineD3DSurfaceImpl *override)
+{
+ TRACE("surface %p, override %p.\n", surface, override);
+
+ return WINED3D_OK;
+}
+
static HRESULT gdi_surface_set_mem(IWineD3DSurfaceImpl *surface, void *mem)
{
TRACE("surface %p, mem %p.\n", surface, mem);
@@ -1440,6 +1473,7 @@ static const struct wined3d_surface_ops gdi_surface_ops =
gdi_surface_map,
gdi_surface_unmap,
gdi_surface_getdc,
+ gdi_surface_flip,
gdi_surface_set_mem,
};
@@ -4133,6 +4167,42 @@ static HRESULT WINAPI IWineD3DBaseSurfaceImpl_ReleaseDC(IWineD3DSurface *iface,
return WINED3D_OK;
}
+static HRESULT WINAPI IWineD3DBaseSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD flags)
+{
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface;
+ struct wined3d_swapchain *swapchain;
+ HRESULT hr;
+
+ TRACE("iface %p, override %p, flags %#x.\n", iface, override, flags);
+
+ if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN)
+ {
+ ERR("Flipped surface is not on a swapchain.\n");
+ return WINEDDERR_NOTFLIPPABLE;
+ }
+ swapchain = surface->container.u.swapchain;
+
+ hr = surface->surface_ops->surface_flip(surface, (IWineD3DSurfaceImpl *)override);
+ if (FAILED(hr))
+ return hr;
+
+ /* Just overwrite the swapchain presentation interval. This is ok because
+ * only ddraw apps can call Flip, and only d3d8 and d3d9 applications
+ * specify the presentation interval. */
+ if (!(flags & (WINEDDFLIP_NOVSYNC | WINEDDFLIP_INTERVAL2 | WINEDDFLIP_INTERVAL3 | WINEDDFLIP_INTERVAL4)))
+ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_ONE;
+ else if (flags & WINEDDFLIP_NOVSYNC)
+ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_IMMEDIATE;
+ else if (flags & WINEDDFLIP_INTERVAL2)
+ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_TWO;
+ else if (flags & WINEDDFLIP_INTERVAL3)
+ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_THREE;
+ else
+ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_FOUR;
+
+ return wined3d_swapchain_present(swapchain, NULL, NULL, swapchain->win_handle, NULL, 0);
+}
+
/* ****************************************************
IWineD3DSurface IWineD3DResource parts follow
**************************************************** */
@@ -5076,63 +5146,6 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) {
}
}
-static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD flags)
-{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- struct wined3d_swapchain *swapchain = NULL;
-
- TRACE("iface %p, override %p, flags %#x.\n", iface, override, flags);
-
- /* Flipping is only supported on RenderTargets and overlays*/
- if( !(This->resource.usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_OVERLAY)) ) {
- WARN("Tried to flip a non-render target, non-overlay surface\n");
- return WINEDDERR_NOTFLIPPABLE;
- }
-
- if(This->resource.usage & WINED3DUSAGE_OVERLAY) {
- flip_surface(This, (IWineD3DSurfaceImpl *) override);
-
- /* Update the overlay if it is visible */
- if (This->overlay_dest)
- return This->surface_ops->surface_draw_overlay(This);
- else
- return WINED3D_OK;
- }
-
- if(override) {
- /* DDraw sets this for the X11 surfaces, so don't confuse the user
- * FIXME("(%p) Target override is not supported by now\n", This);
- * Additionally, it isn't really possible to support triple-buffering
- * properly on opengl at all
- */
- }
-
- if (This->container.type != WINED3D_CONTAINER_SWAPCHAIN)
- {
- ERR("Flipped surface is not on a swapchain\n");
- return WINEDDERR_NOTFLIPPABLE;
- }
- swapchain = This->container.u.swapchain;
-
- /* Just overwrite the swapchain presentation interval. This is ok because only ddraw apps can call Flip,
- * and only d3d8 and d3d9 apps specify the presentation interval
- */
- if (!(flags & (WINEDDFLIP_NOVSYNC | WINEDDFLIP_INTERVAL2 | WINEDDFLIP_INTERVAL3 | WINEDDFLIP_INTERVAL4)))
- /* Most common case first to avoid wasting time on all the other cases */
- swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_ONE;
- else if (flags & WINEDDFLIP_NOVSYNC)
- swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_IMMEDIATE;
- else if (flags & WINEDDFLIP_INTERVAL2)
- swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_TWO;
- else if (flags & WINEDDFLIP_INTERVAL3)
- swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_THREE;
- else
- swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_FOUR;
-
- /* Flipping a OpenGL surface -> present. */
- return wined3d_swapchain_present(swapchain, NULL, NULL, swapchain->win_handle, NULL, 0);
-}
-
/* Does a direct frame buffer -> texture copy. Stretching is done
* with single pixel copy calls
*/
@@ -7082,7 +7095,7 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
IWineD3DBaseSurfaceImpl_Unmap,
IWineD3DBaseSurfaceImpl_GetDC,
IWineD3DBaseSurfaceImpl_ReleaseDC,
- IWineD3DSurfaceImpl_Flip,
+ IWineD3DBaseSurfaceImpl_Flip,
IWineD3DSurfaceImpl_Blt,
IWineD3DBaseSurfaceImpl_GetBltStatus,
IWineD3DBaseSurfaceImpl_GetFlipStatus,
@@ -7349,38 +7362,6 @@ static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined
return TRUE;
}
-/*****************************************************************************
- * IWineD3DSurface::Flip, GDI version
- *
- * Flips 2 flipping enabled surfaces. Determining the 2 targets is done by
- * the parent library. This implementation changes the data pointers of the
- * surfaces and copies the new front buffer content to the screen
- *
- * Params:
- * override: Flipping target(e.g. back buffer)
- *
- * Returns:
- * WINED3D_OK on success
- *
- *****************************************************************************/
-static HRESULT WINAPI IWineGDISurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD flags)
-{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface;
- struct wined3d_swapchain *swapchain;
- HRESULT hr;
-
- if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN)
- {
- ERR("Flipped surface is not on a swapchain\n");
- return WINEDDERR_NOTFLIPPABLE;
- }
-
- swapchain = surface->container.u.swapchain;
- hr = wined3d_swapchain_present(swapchain, NULL, NULL, swapchain->win_handle, NULL, 0);
-
- return hr;
-}
-
static const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
{
/* IUnknown */
@@ -7401,7 +7382,7 @@ static const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
IWineD3DBaseSurfaceImpl_Unmap,
IWineD3DBaseSurfaceImpl_GetDC,
IWineD3DBaseSurfaceImpl_ReleaseDC,
- IWineGDISurfaceImpl_Flip,
+ IWineD3DBaseSurfaceImpl_Flip,
IWineD3DBaseSurfaceImpl_Blt,
IWineD3DBaseSurfaceImpl_GetBltStatus,
IWineD3DBaseSurfaceImpl_GetFlipStatus,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e3c025c..5fb2a67 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2026,6 +2026,7 @@ struct wined3d_surface_ops
void (*surface_map)(struct IWineD3DSurfaceImpl *surface, const RECT *rect, DWORD flags);
void (*surface_unmap)(struct IWineD3DSurfaceImpl *surface);
HRESULT (*surface_getdc)(struct IWineD3DSurfaceImpl *surface);
+ HRESULT (*surface_flip)(struct IWineD3DSurfaceImpl *surface, struct IWineD3DSurfaceImpl *override);
HRESULT (*surface_set_mem)(struct IWineD3DSurfaceImpl *surface, void *mem);
};
More information about the wine-cvs
mailing list