From d977e91b11bd8f2bf3ae6fe7a899ee7e2db4ca7c Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 26 Apr 2010 21:33:01 +0200 Subject: [PATCH] wined3d: Store back buffer surfaces as IWineD3DSurfaceImpl pointers in the swapchain. --- dlls/wined3d/context.c | 2 +- dlls/wined3d/device.c | 36 +++++++++++---------- dlls/wined3d/surface.c | 8 ++--- dlls/wined3d/swapchain.c | 57 ++++++++++++++++++---------------- dlls/wined3d/swapchain_base.c | 5 +-- dlls/wined3d/swapchain_gdi.c | 17 +++++----- dlls/wined3d/wined3d_private.h | 2 +- 7 files changed, 68 insertions(+), 59 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index cc385c4e255..ccb3174413f 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1827,7 +1827,7 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur else { IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->swapchains[0]; - if (swapchain->backBuffer) target = (IWineD3DSurfaceImpl *)swapchain->backBuffer[0]; + if (swapchain->back_buffers) target = swapchain->back_buffers[0]; else target = swapchain->front_buffer; } } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d9dbd086acd..062fb204d75 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1622,9 +1622,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, } This->swapchains[0] = (IWineD3DSwapChain *) swapchain; - if(swapchain->backBuffer && swapchain->backBuffer[0]) { - TRACE("Setting rendertarget to %p\n", swapchain->backBuffer); - This->render_targets[0] = (IWineD3DSurfaceImpl *)swapchain->backBuffer[0]; + if (swapchain->back_buffers && swapchain->back_buffers[0]) + { + TRACE("Setting rendertarget to %p.\n", swapchain->back_buffers); + This->render_targets[0] = swapchain->back_buffers[0]; } else { @@ -5645,10 +5646,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa return WINED3DERR_INVALIDCALL; } - if (!swapchain->backBuffer) + if (!swapchain->back_buffers) { - swapchain->backBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->backBuffer)); - if (!swapchain->backBuffer) + swapchain->back_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->back_buffers)); + if (!swapchain->back_buffers) { ERR("Failed to allocate back buffer array memory.\n"); IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); @@ -5675,16 +5676,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa } } - if (swapchain->backBuffer[0] != back) + if (swapchain->back_buffers[0] != back_impl) { - TRACE("Changing the back buffer from %p to %p.\n", swapchain->backBuffer[0], back); + TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl); - if (swapchain->backBuffer[0]) + if (swapchain->back_buffers[0]) { - IWineD3DSurface_SetContainer(swapchain->backBuffer[0], NULL); - ((IWineD3DSurfaceImpl *)swapchain->backBuffer[0])->Flags &= ~SFLAG_SWAPCHAIN; + IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[0], NULL); + swapchain->back_buffers[0]->Flags &= ~SFLAG_SWAPCHAIN; } - swapchain->backBuffer[0] = back; + swapchain->back_buffers[0] = back_impl; if (back) { @@ -5699,8 +5700,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa else { swapchain->presentParms.BackBufferCount = 0; - HeapFree(GetProcessHeap(), 0, swapchain->backBuffer); - swapchain->backBuffer = NULL; + HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); + swapchain->back_buffers = NULL; } } @@ -6333,7 +6334,7 @@ static HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwap return E_OUTOFMEMORY; } - target = swapchain->backBuffer ? (IWineD3DSurfaceImpl *)swapchain->backBuffer[0] : swapchain->front_buffer; + target = swapchain->back_buffers ? swapchain->back_buffers[0] : swapchain->front_buffer; if (!(context = context_create(swapchain, target, swapchain->ds_format))) { WARN("Failed to create context.\n"); @@ -6518,8 +6519,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE return hr; } - for(i = 0; i < swapchain->presentParms.BackBufferCount; i++) { - hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->backBuffer[i], pPresentationParameters); + for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i) + { + hr = updateSurfaceDesc(swapchain->back_buffers[i], pPresentationParameters); if(FAILED(hr)) { IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 951bfd72db6..bba6ad9cd65 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -935,7 +935,7 @@ GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) return GL_NONE; } - if (swapchain->backBuffer && (IWineD3DSurfaceImpl *)swapchain->backBuffer[0] == surface) + if (swapchain->back_buffers && swapchain->back_buffers[0] == surface) { if (swapchain->render_to_fbo) { @@ -3204,7 +3204,7 @@ static void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *dst_surface, IWine IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&src_swapchain); if (src_swapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)src_swapchain); - if (!src_swapchain || src_surface == (IWineD3DSurfaceImpl *)src_swapchain->backBuffer[0]) + if (!src_swapchain || src_surface == src_swapchain->back_buffers[0]) { src = backup ? backup : src_surface->texture_name; } @@ -3438,9 +3438,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, if (src_surface) surface_get_rect(src_surface, SrcRect, &src_rect); /* The only case where both surfaces on a swapchain are supported is a back buffer -> front buffer blit on the same swapchain */ - if (dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->backBuffer + if (dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->back_buffers && dst_surface == dstSwapchain->front_buffer - && src_surface == (IWineD3DSurfaceImpl *)dstSwapchain->backBuffer[0]) + && src_surface == dstSwapchain->back_buffers[0]) { /* Half-life does a Blt from the back buffer to the front buffer, * Full surface size, no flags... Use present instead diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index df36838f73f..e1cb2ad74a2 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -46,7 +46,7 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma); - /* Release the swapchain's draw buffers. Make sure This->backBuffer[0] is + /* Release the swapchain's draw buffers. Make sure This->back_buffers[0] is * the last buffer to be destroyed, FindContext() depends on that. */ if (This->front_buffer) { @@ -59,19 +59,19 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) This->front_buffer = NULL; } - if (This->backBuffer) + if (This->back_buffers) { UINT i = This->presentParms.BackBufferCount; while (i--) { - IWineD3DSurface_SetContainer(This->backBuffer[i], 0); - if (IWineD3DSurface_Release(This->backBuffer[i])) + IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) WARN("(%p) Something's still holding back buffer %u (%p).\n", - This, i, This->backBuffer[i]); + This, i, This->back_buffers[i]); } - HeapFree(GetProcessHeap(), 0, This->backBuffer); - This->backBuffer = NULL; + HeapFree(GetProcessHeap(), 0, This->back_buffers); + This->back_buffers = NULL; } for (i = 0; i < This->num_contexts; ++i) @@ -100,7 +100,7 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context * const RECT *src_rect, const RECT *dst_rect) { IWineD3DDeviceImpl *device = This->device; - IWineD3DSurfaceImpl *backbuffer = ((IWineD3DSurfaceImpl *) This->backBuffer[0]); + IWineD3DSurfaceImpl *backbuffer = This->back_buffers[0]; UINT src_w = src_rect->right - src_rect->left; UINT src_h = src_rect->bottom - src_rect->top; GLenum gl_filter; @@ -142,7 +142,7 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context * float tex_right = src_rect->right; float tex_bottom = src_rect->bottom; - context2 = context_acquire(This->device, (IWineD3DSurfaceImpl *)This->backBuffer[0], CTXUSAGE_BLIT); + context2 = context_acquire(This->device, This->back_buffers[0], CTXUSAGE_BLIT); if(backbuffer->Flags & SFLAG_NORMCOORD) { @@ -220,7 +220,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride); - context = context_acquire(This->device, (IWineD3DSurfaceImpl *)This->backBuffer[0], CTXUSAGE_RESOURCELOAD); + context = context_acquire(This->device, This->back_buffers[0], CTXUSAGE_RESOURCELOAD); if (!context->valid) { context_release(context); @@ -267,14 +267,15 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO if (This->presentParms.Windowed) { MapWindowPoints(NULL, This->win_handle, (LPPOINT)&destRect, 2); } - IWineD3DSurface_Blt(This->backBuffer[0], &destRect, (IWineD3DSurface *)&cursor, + IWineD3DSurface_Blt((IWineD3DSurface *)This->back_buffers[0], &destRect, (IWineD3DSurface *)&cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT); } if (This->device->logo_surface) { /* Blit the logo into the upper left corner of the drawable. */ - IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY); + IWineD3DSurface_BltFast((IWineD3DSurface *)This->back_buffers[0], 0, 0, + This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY); } TRACE("Presenting HDC %p.\n", context->hdc); @@ -318,8 +319,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO */ if (!This->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - IWineD3DSurface_LoadLocation(This->backBuffer[0], SFLAG_INTEXTURE, NULL); - IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, FALSE); + IWineD3DSurface_LoadLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INTEXTURE, NULL); + IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, FALSE); This->render_to_fbo = TRUE; /* Force the context manager to update the render target configuration next draw. */ @@ -424,13 +425,13 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO } if (!This->render_to_fbo && ((This->front_buffer->Flags & SFLAG_INSYSMEM) - || (((IWineD3DSurfaceImpl *)This->backBuffer[0])->Flags & SFLAG_INSYSMEM))) + || (This->back_buffers[0]->Flags & SFLAG_INSYSMEM))) { /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying * Doesn't work with render_to_fbo because we're not flipping */ IWineD3DSurfaceImpl *front = This->front_buffer; - IWineD3DSurfaceImpl *back = (IWineD3DSurfaceImpl *) This->backBuffer[0]; + IWineD3DSurfaceImpl *back = This->back_buffers[0]; if(front->resource.size == back->resource.size) { DWORD fbflags; @@ -456,8 +457,9 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO * If the swapeffect is COPY, the content remains the same. If it is FLIP however, * the texture / sysmem copy needs to be reloaded from the drawable */ - if(This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) { - IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, TRUE); + if (This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) + { + IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, TRUE); } } @@ -832,9 +834,9 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface if (swapchain->presentParms.BackBufferCount > 0) { - swapchain->backBuffer = HeapAlloc(GetProcessHeap(), 0, - sizeof(*swapchain->backBuffer) * swapchain->presentParms.BackBufferCount); - if (!swapchain->backBuffer) + swapchain->back_buffers = HeapAlloc(GetProcessHeap(), 0, + sizeof(*swapchain->back_buffers) * swapchain->presentParms.BackBufferCount); + if (!swapchain->back_buffers) { ERR("Failed to allocate backbuffer array memory.\n"); hr = E_OUTOFMEMORY; @@ -847,15 +849,16 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface hr = IWineD3DDeviceParent_CreateRenderTarget(device->device_parent, parent, swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight, swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType, - swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, &swapchain->backBuffer[i]); + swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, + (IWineD3DSurface **)&swapchain->back_buffers[i]); if (FAILED(hr)) { WARN("Failed to create back buffer %u, hr %#x.\n", i, hr); goto err; } - IWineD3DSurface_SetContainer(swapchain->backBuffer[i], (IWineD3DBase *)swapchain); - ((IWineD3DSurfaceImpl *)swapchain->backBuffer[i])->Flags |= SFLAG_SWAPCHAIN; + IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[i], (IWineD3DBase *)swapchain); + swapchain->back_buffers[i]->Flags |= SFLAG_SWAPCHAIN; } } @@ -901,13 +904,13 @@ err: ChangeDisplaySettingsExW(adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL); } - if (swapchain->backBuffer) + if (swapchain->back_buffers) { for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i) { - if (swapchain->backBuffer[i]) IWineD3DSurface_Release(swapchain->backBuffer[i]); + if (swapchain->back_buffers[i]) IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]); } - HeapFree(GetProcessHeap(), 0, swapchain->backBuffer); + HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); } if (swapchain->context) diff --git a/dlls/wined3d/swapchain_base.c b/dlls/wined3d/swapchain_base.c index ea577ce9e9b..1817de2079a 100644 --- a/dlls/wined3d/swapchain_base.c +++ b/dlls/wined3d/swapchain_base.c @@ -106,12 +106,13 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, * used (there This->backBuffer is always NULL). We need this because this function has * to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default * scissorrect dimensions. */ - if( !This->backBuffer ) { + if (!This->back_buffers) + { *ppBackBuffer = NULL; return WINED3DERR_INVALIDCALL; } - *ppBackBuffer = This->backBuffer[iBackBuffer]; + *ppBackBuffer = (IWineD3DSurface *)This->back_buffers[iBackBuffer]; TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer); /* Note inc ref on returned surface */ diff --git a/dlls/wined3d/swapchain_gdi.c b/dlls/wined3d/swapchain_gdi.c index a2ecf948db3..5885518f239 100644 --- a/dlls/wined3d/swapchain_gdi.c +++ b/dlls/wined3d/swapchain_gdi.c @@ -46,16 +46,18 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface) } } - if(This->backBuffer) { + if (This->back_buffers) + { UINT i; - for(i = 0; i < This->presentParms.BackBufferCount; i++) { - IWineD3DSurface_SetContainer(This->backBuffer[i], 0); - if (IWineD3DSurface_Release(This->backBuffer[i]) > 0) + for (i = 0; i < This->presentParms.BackBufferCount; ++i) + { + IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) { WARN("(%p) Something's still holding the back buffer\n",This); } } - HeapFree(GetProcessHeap(), 0, This->backBuffer); + HeapFree(GetProcessHeap(), 0, This->back_buffers); } /* Restore the screen resolution if we rendered in fullscreen @@ -173,12 +175,13 @@ static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface; IWineD3DSurfaceImpl *front, *back; - if(!This->backBuffer) { + if (!This->back_buffers) + { WARN("Swapchain doesn't have a backbuffer, returning WINED3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } front = This->front_buffer; - back = (IWineD3DSurfaceImpl *) This->backBuffer[0]; + back = This->back_buffers[0]; /* Flip the DC */ { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 0a25e4aff3c..27bc6aa8fda 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2564,7 +2564,7 @@ struct IWineD3DSwapChainImpl IWineD3DDeviceImpl *device; /* IWineD3DSwapChain fields */ - IWineD3DSurface **backBuffer; + IWineD3DSurfaceImpl **back_buffers; IWineD3DSurfaceImpl *front_buffer; WINED3DPRESENT_PARAMETERS presentParms; DWORD orig_width, orig_height;