Stefan Dösinger : wined3d: Implement IWineD3DDevice:: SetFrontBackBuffers.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue May 16 06:24:46 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 7cd41b944ba57914521f3502714802fd805a360f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=7cd41b944ba57914521f3502714802fd805a360f
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Mon May 15 20:09:07 2006 +0200
wined3d: Implement IWineD3DDevice::SetFrontBackBuffers.
---
dlls/wined3d/device.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ed50b26..943e38f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6474,8 +6474,70 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetR
}
HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface, IWineD3DSurface *Front, IWineD3DSurface *Back) {
- FIXME("This call is a d3d7 merge stub. It will be implemented later\n");
- return WINED3DERR_INVALIDCALL;
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DSurfaceImpl *FrontImpl = (IWineD3DSurfaceImpl *) Front;
+ IWineD3DSurfaceImpl *BackImpl = (IWineD3DSurfaceImpl *) Back;
+ IWineD3DSwapChainImpl *Swapchain;
+ HRESULT hr;
+
+ TRACE("(%p)->(%p,%p)\n", This, FrontImpl, BackImpl);
+
+ hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **) &Swapchain);
+ if(hr != WINED3D_OK) {
+ ERR("Can't get the swapchain\n");
+ return hr;
+ }
+
+ /* Make sure to release the swapchain */
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *) Swapchain);
+
+ if(FrontImpl && !(FrontImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) {
+ ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+ else if(BackImpl && !(BackImpl->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
+ ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if(Swapchain->frontBuffer != Front) {
+ TRACE("Changing the front buffer from %p to %p\n", Swapchain->frontBuffer, Front);
+
+ if(Swapchain->frontBuffer)
+ IWineD3DSurface_SetContainer(Swapchain->frontBuffer, NULL);
+ Swapchain->frontBuffer = Front;
+
+ if(Swapchain->frontBuffer) {
+ IWineD3DSurface_SetContainer(Swapchain->frontBuffer, (IWineD3DBase *) Swapchain);
+ }
+ }
+ if(Swapchain->backBuffer != Back) {
+ TRACE("Changing the back buffer from %p to %p\n", Swapchain->backBuffer, Back);
+ ENTER_GL();
+ if(!Swapchain->backBuffer) {
+ /* GL was told to draw to the front buffer at creation,
+ * undo that
+ */
+ glDrawBuffer(GL_BACK);
+ checkGLcall("glDrawBuffer(GL_BACK)");
+ } else if (!Back) {
+ /* That makes problems - disable for now */
+ /* glDrawBuffer(GL_FRONT); */
+ checkGLcall("glDrawBuffer(GL_FRONT)");
+ }
+ LEAVE_GL();
+
+ if(Swapchain->backBuffer)
+ IWineD3DSurface_SetContainer(Swapchain->backBuffer, NULL);
+ Swapchain->backBuffer = Back;
+
+ if(Swapchain->backBuffer) {
+ IWineD3DSurface_SetContainer(Swapchain->backBuffer, (IWineD3DBase *) Swapchain);
+ }
+
+ }
+
+ return WINED3D_OK;
}
HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) {
More information about the wine-cvs
mailing list