Stefan Dösinger : wined3d: Disconnect allocatedMemory and Heap allocation.
Alexandre Julliard
julliard at winehq.org
Thu Nov 1 07:39:43 CDT 2007
Module: wine
Branch: master
Commit: 4d4fce7e3313bb8d2d76993361004c5a4b4dd63b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4d4fce7e3313bb8d2d76993361004c5a4b4dd63b
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Mon Oct 22 13:02:03 2007 +0200
wined3d: Disconnect allocatedMemory and Heap allocation.
---
dlls/wined3d/device.c | 5 +++--
dlls/wined3d/resource.c | 3 ++-
dlls/wined3d/surface.c | 17 ++++++++++++-----
dlls/wined3d/surface_base.c | 4 ++--
dlls/wined3d/surface_gdi.c | 10 +++++++++-
dlls/wined3d/swapchain.c | 4 ++++
dlls/wined3d/wined3d_private.h | 3 ++-
7 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 17aeea2..db7a4e3 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -101,13 +101,14 @@ static void WINAPI IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3
} \
WineD3DAdapterChangeGLRam(This, _size); \
} \
- object->resource.allocatedMemory = (0 == _size ? NULL : HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, _size + 4)); \
- if (object->resource.allocatedMemory == NULL && _size != 0) { \
+ object->resource.heapMemory = (0 == _size ? NULL : HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, _size + 4)); \
+ if (object->resource.heapMemory == NULL && _size != 0) { \
FIXME("Out of memory!\n"); \
HeapFree(GetProcessHeap(), 0, object); \
*pp##type = NULL; \
return WINED3DERR_OUTOFVIDEOMEMORY; \
} \
+ object->resource.allocatedMemory = object->resource.heapMemory; \
*pp##type = (IWineD3D##type *) object; \
IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object) ;\
TRACE("(%p) : Created resource %p\n", This, object); \
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 4a620f6..9faaea5 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -82,8 +82,9 @@ void IWineD3DResourceImpl_CleanUp(IWineD3DResource *iface){
}
}
- HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
This->resource.allocatedMemory = 0;
+ This->resource.heapMemory = 0;
if (This->resource.wineD3DDevice != NULL) {
IWineD3DDevice_ResourceReleased((IWineD3DDevice *)This->resource.wineD3DDevice, iface);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 07501f2..6637539 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -668,15 +668,17 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) {
checkGLcall("glBindBufferARB");
/* We don't need the system memory anymore and we can't even use it for PBOs */
- HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
This->resource.allocatedMemory = NULL;
+ This->resource.heapMemory = NULL;
This->Flags |= SFLAG_PBO;
LEAVE_GL();
} else if(!(This->resource.allocatedMemory || This->Flags & SFLAG_PBO)) {
/* Whatever surface we have, make sure that there is memory allocated for the downloaded copy,
* or a pbo to map
*/
- This->resource.allocatedMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + 4);
+ This->resource.heapMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + 4);
+ This->resource.allocatedMemory = This->resource.heapMemory;
if(This->Flags & SFLAG_INSYSMEM) {
ERR("Surface without memory or pbo has SFLAG_INSYSMEM set!\n");
}
@@ -2024,8 +2026,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
#endif
if (!(This->Flags & SFLAG_DONOTFREE)) {
- HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
This->resource.allocatedMemory = NULL;
+ This->resource.heapMemory = NULL;
IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, FALSE);
}
@@ -2257,7 +2260,8 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem) {
This->hDC = NULL;
This->Flags &= ~SFLAG_DIBSECTION;
} else if(!(This->Flags & SFLAG_USERPTR)) {
- release = This->resource.allocatedMemory;
+ release = This->resource.heapMemory;
+ This->resource.heapMemory = NULL;
}
This->resource.allocatedMemory = Mem;
This->Flags |= SFLAG_USERPTR | SFLAG_INSYSMEM;
@@ -2277,6 +2281,8 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem) {
} else if(This->Flags & SFLAG_USERPTR) {
/* Lockrect and GetDC will re-create the dib section and allocated memory */
This->resource.allocatedMemory = NULL;
+ /* HeapMemory should be NULL already */
+ if(This->resource.heapMemory != NULL) ERR("User pointer surface has heap memory allocated\n");
This->Flags &= ~SFLAG_USERPTR;
if(This->Flags & SFLAG_CLIENT) {
@@ -2839,8 +2845,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT *
}
if(!(This->Flags & SFLAG_DONOTFREE)) {
- HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
This->resource.allocatedMemory = NULL;
+ This->resource.heapMemory = NULL;
} else {
This->Flags &= ~SFLAG_INSYSMEM;
}
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index a9c5a07..6b9c631 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -483,7 +483,6 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
int extraline = 0;
SYSTEM_INFO sysInfo;
- void *oldmem = This->resource.allocatedMemory;
BITMAPINFO* b_info;
HDC ddc;
DWORD *masks;
@@ -609,7 +608,8 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) {
This->Flags |= SFLAG_DIBSECTION;
- HeapFree(GetProcessHeap(), 0, oldmem);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
+ This->resource.heapMemory = NULL;
return WINED3D_OK;
}
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index d3cb89d..a5ca3db 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -329,6 +329,13 @@ IWineGDISurfaceImpl_Flip(IWineD3DSurface *iface,
tmp = This->resource.allocatedMemory;
This->resource.allocatedMemory = Target->resource.allocatedMemory;
Target->resource.allocatedMemory = tmp;
+
+ if(This->resource.heapMemory) {
+ ERR("GDI Surface %p has heap memory allocated\n", This);
+ }
+ if(Target->resource.heapMemory) {
+ ERR("GDI Surface %p has heap memory allocated\n", Target);
+ }
}
/* client_memory should not be different, but just in case */
@@ -630,8 +637,9 @@ IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface)
/* Sysmem textures have memory already allocated -
* release it, this avoids an unnecessary memcpy
*/
- HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
This->resource.allocatedMemory = NULL;
+ This->resource.heapMemory = NULL;
/* We don't mind the nonpow2 stuff in GDI */
This->pow2Width = This->currentDesc.Width;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 330f928..501c7cd 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -322,6 +322,10 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
tmp = front->resource.allocatedMemory;
front->resource.allocatedMemory = back->resource.allocatedMemory;
back->resource.allocatedMemory = tmp;
+
+ tmp = front->resource.heapMemory;
+ front->resource.heapMemory = back->resource.heapMemory;
+ back->resource.heapMemory = tmp;
}
/* Flip the PBO */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8362aa1..fdfd43f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -817,7 +817,8 @@ typedef struct IWineD3DResourceClass
UINT size;
DWORD usage;
WINED3DFORMAT format;
- BYTE *allocatedMemory;
+ BYTE *allocatedMemory; /* Pointer to the real data location */
+ BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */
struct list privateData;
} IWineD3DResourceClass;
More information about the wine-cvs
mailing list