Skip to content

Commit 9f0a4be

Browse files
author
Alexandre Mutel
committed
[Toolkit.Graphics] Improve release of Disposable objects on WP8. Still a small memory leak somewhere...
1 parent e9f6b75 commit 9f0a4be

File tree

6 files changed

+57
-40
lines changed

6 files changed

+57
-40
lines changed

Source/SharpDX/Diagnostics/ObjectReference.cs

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,13 @@ public class ObjectReference
3535
/// <param name="creationTime">The creation time.</param>
3636
/// <param name="comObject">The com object to track.</param>
3737
/// <param name="stackTrace">The stack trace.</param>
38-
#if W8CORE
39-
public ObjectReference(DateTime creationTime, ComObject comObject)
40-
{
41-
CreationTime = creationTime;
42-
// Creates a long week reference to the ComObject
43-
Object = new WeakReference(comObject, true);
44-
}
45-
#else
46-
public ObjectReference(DateTime creationTime, ComObject comObject, StackTrace stackTrace)
38+
public ObjectReference(DateTime creationTime, ComObject comObject, string stackTrace)
4739
{
4840
CreationTime = creationTime;
4941
// Creates a long week reference to the ComObject
5042
Object = new WeakReference(comObject, true);
5143
StackTrace = stackTrace;
5244
}
53-
#endif
5445

5546
/// <summary>
5647
/// Gets the time the object was created.
@@ -64,13 +55,12 @@ public ObjectReference(DateTime creationTime, ComObject comObject, StackTrace st
6455
/// <value>The weak reference to the tracked object.</value>
6556
public WeakReference Object { get; private set; }
6657

67-
#if !W8CORE
6858
/// <summary>
6959
/// Gets the stack trace when the track object was created.
7060
/// </summary>
7161
/// <value>The stack trace.</value>
72-
public StackTrace StackTrace { get; private set; }
73-
#endif
62+
public string StackTrace { get; private set; }
63+
7464
/// <summary>
7565
/// Gets a value indicating whether the tracked object is alive.
7666
/// </summary>
@@ -90,18 +80,7 @@ public override string ToString()
9080
return "";
9181

9282
var builder = new StringBuilder();
93-
builder.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "Active COM Object: [0x{0:X}] Class: [{1}] Time [{2}] Stack:", comObject.NativePointer.ToInt64(), comObject.GetType().FullName, CreationTime).AppendLine();
94-
#if !W8CORE
95-
foreach (var stackFrame in StackTrace.GetFrames())
96-
{
97-
// Skip system/generated frame
98-
if (stackFrame.GetFileLineNumber() == 0)
99-
continue;
100-
builder.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "\t{0}({1},{2}) : {3}", stackFrame.GetFileName(), stackFrame.GetFileLineNumber(),
101-
stackFrame.GetFileColumnNumber(),
102-
stackFrame.GetMethod()).AppendLine();
103-
}
104-
#endif
83+
builder.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "Active COM Object: [0x{0:X}] Class: [{1}] Time [{2}] Stack:\r\n{3}", comObject.NativePointer.ToInt64(), comObject.GetType().FullName, CreationTime, StackTrace).AppendLine();
10584
return builder.ToString();
10685
}
10786
}

Source/SharpDX/Diagnostics/ObjectTracker.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,21 @@ public static void Track(ComObject comObject)
109109
ObjectReferences.Add(comObject.NativePointer, referenceList);
110110
}
111111
#if W8CORE
112-
referenceList.Add(new ObjectReference(DateTime.Now, comObject));
112+
referenceList.Add(new ObjectReference(DateTime.Now, comObject, "Not Available on this platform"));
113113
#else
114-
referenceList.Add(new ObjectReference(DateTime.Now, comObject, new StackTrace(3, true)));
114+
var stackTraceText = new StringBuilder();
115+
var stackTrace = new StackTrace(3, true);
116+
foreach (var stackFrame in stackTrace.GetFrames())
117+
{
118+
// Skip system/generated frame
119+
if (stackFrame.GetFileLineNumber() == 0)
120+
continue;
121+
stackTraceText.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "\t{0}({1},{2}) : {3}", stackFrame.GetFileName(), stackFrame.GetFileLineNumber(),
122+
stackFrame.GetFileColumnNumber(),
123+
stackFrame.GetMethod()).AppendLine();
124+
}
125+
126+
referenceList.Add(new ObjectReference(DateTime.Now, comObject, stackTraceText.ToString()));
115127
#endif
116128
// Fire Tracked event.
117129
OnTracked(comObject);

Source/Toolkit/SharpDX.Toolkit.Game/WindowsPhone/GamePlatformPhone.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,13 @@ public override GraphicsDevice CreateDevice(GraphicsDeviceInformation deviceInfo
106106
SampleDescription = new DXGI.SampleDescription(1, 0)
107107
};
108108

109-
var renderTarget = Graphics.Texture2D.New(device, renderTargetDesc);
110-
var BackBuffer = RenderTarget2D.New(device, new RenderTargetView(device, renderTarget));
109+
var backBuffer = RenderTarget2D.New(device, renderTargetDesc);
111110

112-
var graphicsPresenter = new RenderTargetGraphicsPresenter(device, BackBuffer, deviceInformation.PresentationParameters.DepthStencilFormat);
111+
var graphicsPresenter = new RenderTargetGraphicsPresenter(device, backBuffer, deviceInformation.PresentationParameters.DepthStencilFormat, true);
113112
device.Presenter = graphicsPresenter;
114113

115114
var gameWindowXaml = (GameWindowPhoneXaml)gameWindow;
116-
gameWindowXaml.CreateSynchronizedTexture(renderTarget);
115+
gameWindowXaml.CreateSynchronizedTexture(backBuffer);
117116

118117
return device;
119118
}

Source/Toolkit/SharpDX.Toolkit.Game/WindowsPhone/GameWindowPhoneXaml.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ public override bool Visible
105105
private RenderTargetGraphicsPresenter graphicsPresenter;
106106
private DrawingSurfaceSynchronizedTexture synchronizedTexture;
107107

108-
public void CreateSynchronizedTexture(Graphics.Texture2D renderTarget2D)
108+
public void CreateSynchronizedTexture(SharpDX.Direct3D11.Texture2D texture2D)
109109
{
110110
Utilities.Dispose(ref synchronizedTexture);
111-
synchronizedTexture = host.CreateSynchronizedTexture((Texture2D)renderTarget2D);
111+
synchronizedTexture = host.CreateSynchronizedTexture(texture2D);
112112
}
113113

114114
void IDrawingSurfaceContentProviderNative.Connect(DrawingSurfaceRuntimeHost host)
@@ -118,20 +118,27 @@ void IDrawingSurfaceContentProviderNative.Connect(DrawingSurfaceRuntimeHost host
118118

119119
void IDrawingSurfaceContentProviderNative.Disconnect()
120120
{
121-
// Dispose the graphics device
122-
if (graphicsDeviceService.GraphicsDevice != null)
123-
{
124-
graphicsDeviceService.GraphicsDevice.Dispose();
125-
}
126-
127121
Utilities.Dispose(ref synchronizedTexture);
122+
//Utilities.Dispose(ref host);
128123
}
129124

130125
void IDrawingSurfaceContentProviderNative.PrepareResources(DateTime presentTargetTime, out Bool isContentDirty)
131126
{
132127
isContentDirty = true;
133128
}
134129

130+
private void DisposeAll()
131+
{
132+
// Dispose the graphics device
133+
if (graphicsDeviceService.GraphicsDevice != null)
134+
{
135+
var presenter = graphicsDeviceService.GraphicsDevice.Presenter;
136+
Utilities.Dispose(ref presenter);
137+
138+
graphicsDeviceService.GraphicsDevice.Dispose();
139+
}
140+
}
141+
135142
void IDrawingSurfaceContentProviderNative.GetTexture(DrawingSizeF surfaceSize, out DrawingSurfaceSynchronizedTexture synchronizedTexture, out RectangleF textureSubRectangle)
136143
{
137144
try
@@ -148,6 +155,8 @@ void IDrawingSurfaceContentProviderNative.GetTexture(DrawingSizeF surfaceSize, o
148155
}
149156
else if (this.synchronizedTexture == null)
150157
{
158+
DisposeAll();
159+
151160
// Make sure that the graphics device is created
152161
graphicsDeviceManager.CreateDevice();
153162
}

Source/Toolkit/SharpDX.Toolkit.Graphics/RenderTarget2D.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,16 @@ public static Texture2DDescription CreateDescription(GraphicsDevice device, int
307307
return CreateDescription(device.MainDevice, width, height, format, TextureFlags.RenderTarget, 1, arraySize, multiSampleCount);
308308
}
309309

310+
/// <summary>
311+
/// <see cref="SharpDX.Direct3D11.Texture2D"/> casting operator.
312+
/// </summary>
313+
/// <param name="from">From the Texture1D.</param>
314+
public static implicit operator SharpDX.Direct3D11.Texture2D(RenderTarget2D from)
315+
{
316+
// Don't bother with multithreading here
317+
return from == null ? null : from.Resource;
318+
}
319+
310320
internal static Texture2DDescription CreateDescription(GraphicsDevice device, int width, int height, PixelFormat format, TextureFlags textureFlags, int mipCount, int arraySize, MSAALevel multiSampleCount)
311321
{
312322
// Make sure that the texture to create is a render target

Source/Toolkit/SharpDX.Toolkit.Graphics/RenderTargetGraphicsPresenter.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ public class RenderTargetGraphicsPresenter : GraphicsPresenter
2929
{
3030
private RenderTarget2D backBuffer;
3131

32-
public RenderTargetGraphicsPresenter(GraphicsDevice device, RenderTarget2D renderTarget, DepthFormat depthFormat = DepthFormat.None)
32+
public RenderTargetGraphicsPresenter(GraphicsDevice device, RenderTarget2D renderTarget, DepthFormat depthFormat = DepthFormat.None, bool disposeRenderTarget = false)
3333
: base(device, CreatePresentationParameters(renderTarget, depthFormat))
3434
{
3535
PresentInterval = Description.PresentationInterval;
3636

37+
if (disposeRenderTarget)
38+
ToDispose(renderTarget);
39+
3740
// Initialize the swap chain
3841
backBuffer = renderTarget;
3942
}
@@ -92,5 +95,10 @@ public override bool IsFullScreen
9295
public override void Present()
9396
{
9497
}
98+
99+
protected override void Dispose(bool disposeManagedResources)
100+
{
101+
base.Dispose(disposeManagedResources);
102+
}
95103
}
96104
}

0 commit comments

Comments
 (0)