diff --git a/BizHawk.MultiClient/DisplayManager/DisplayManager.cs b/BizHawk.MultiClient/DisplayManager/DisplayManager.cs index b3678331a5..5b6c638b01 100644 --- a/BizHawk.MultiClient/DisplayManager/DisplayManager.cs +++ b/BizHawk.MultiClient/DisplayManager/DisplayManager.cs @@ -556,6 +556,11 @@ namespace BizHawk.MultiClient } } + public void ReleaseSurface(DisplaySurface surface) + { + lock (this) ReleasedSurfaces.Enqueue(surface); + } + /// /// returns the current buffer, making the most recent pending buffer (if there is such) as the new current first. /// @@ -629,6 +634,9 @@ namespace BizHawk.MultiClient suspendReplyEvent.WaitOne(); } + + SwappableDisplaySurfaceSet nativeDisplaySurfaceSet = new SwappableDisplaySurfaceSet(); + /// /// internal display worker proc; runs through the multiply layered display pipeline /// @@ -655,35 +663,36 @@ namespace BizHawk.MultiClient int w = currNativeWidth; int h = currNativeHeight; - using (var nativeBmp = new DisplaySurface(w,h)) + var nativeBmp = nativeDisplaySurfaceSet.AllocateSurface(w, h, true); + using (var g = Graphics.FromImage(nativeBmp.PeekBitmap())) { - using (var g = Graphics.FromImage(nativeBmp.PeekBitmap())) - { - //scale the source bitmap to the desired size of the render panel - g.PixelOffsetMode = PixelOffsetMode.HighSpeed; - g.InterpolationMode = InterpolationMode.NearestNeighbor; - g.CompositingMode = CompositingMode.SourceCopy; - g.CompositingQuality = CompositingQuality.HighSpeed; - g.DrawImage(currentSourceSurface.PeekBitmap(), 0, 0, w, h); - g.Clip = new Region(new Rectangle(0, 0, nativeBmp.Width, nativeBmp.Height)); + //scale the source bitmap to the desired size of the render panel + g.PixelOffsetMode = PixelOffsetMode.HighSpeed; + g.InterpolationMode = InterpolationMode.NearestNeighbor; + g.CompositingMode = CompositingMode.SourceCopy; + g.CompositingQuality = CompositingQuality.HighSpeed; + g.DrawImage(currentSourceSurface.PeekBitmap(), 0, 0, w, h); + g.Clip = new Region(new Rectangle(0, 0, nativeBmp.Width, nativeBmp.Height)); - //switch to fancier composition for OSD overlays and such - g.CompositingMode = CompositingMode.SourceOver; + //switch to fancier composition for OSD overlays and such + g.CompositingMode = CompositingMode.SourceOver; - //apply a lua layer - var luaSurface = luaNativeSurfaceSet.GetCurrent(); - if (luaSurface != null) g.DrawImageUnscaled(luaSurface.PeekBitmap(), 0, 0); - //although we may want to change this if we want to fade out messages or have some other fancy alpha faded gui stuff + //apply a lua layer + var luaSurface = luaNativeSurfaceSet.GetCurrent(); + if (luaSurface != null) g.DrawImageUnscaled(luaSurface.PeekBitmap(), 0, 0); + //although we may want to change this if we want to fade out messages or have some other fancy alpha faded gui stuff - //draw the OSD at native resolution - Global.OSD.DrawScreenInfo(g); - Global.OSD.DrawMessages(g); - g.Clip.Dispose(); - } - - //send the native resolution image to the render panel - Global.RenderPanel.Render(nativeBmp); + //draw the OSD at native resolution + Global.OSD.DrawScreenInfo(g); + Global.OSD.DrawMessages(g); + g.Clip.Dispose(); } + + //send the native resolution image to the render panel + Global.RenderPanel.Render(nativeBmp); + + //release the native resolution image + nativeDisplaySurfaceSet.ReleaseSurface(nativeBmp); } Thread displayThread;