From b30cc1185dbfff3bdad1600f6a3ebdada08f36ee Mon Sep 17 00:00:00 2001 From: kpreisser Date: Wed, 4 Sep 2019 20:40:46 +0200 Subject: [PATCH 1/2] Fix the entrypoint declaration for CopyMemory. Contributes to #2796 --- CefSharp.Wpf/Rendering/AbstractRenderHandler.cs | 4 ++-- .../Experimental/IncreaseBufferInteropRenderHandler.cs | 2 +- CefSharp.Wpf/Rendering/InteropBitmapRenderHandler.cs | 2 +- CefSharp.Wpf/Rendering/WritableBitmapRenderHandler.cs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs b/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs index 5adbb1b9ac..c74627912e 100644 --- a/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs +++ b/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs @@ -20,8 +20,8 @@ namespace CefSharp.Wpf.Rendering /// public abstract class AbstractRenderHandler : IDisposable, IRenderHandler { - [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] - protected static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); + [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)] + protected static extern void CopyMemory(IntPtr dest, IntPtr src, UIntPtr count); internal static readonly PixelFormat PixelFormat = PixelFormats.Pbgra32; internal static int BytesPerPixel = PixelFormat.BitsPerPixel / 8; diff --git a/CefSharp.Wpf/Rendering/Experimental/IncreaseBufferInteropRenderHandler.cs b/CefSharp.Wpf/Rendering/Experimental/IncreaseBufferInteropRenderHandler.cs index d5bcab284d..0d23bc97be 100644 --- a/CefSharp.Wpf/Rendering/Experimental/IncreaseBufferInteropRenderHandler.cs +++ b/CefSharp.Wpf/Rendering/Experimental/IncreaseBufferInteropRenderHandler.cs @@ -60,7 +60,7 @@ protected override void CreateOrUpdateBitmap(bool isPopup, Rect dirtyRect, IntPt //TODO: Performance analysis to determine which is the fastest memory copy function //NativeMethodWrapper.CopyMemoryUsingHandle(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, numberOfBytes); - CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (uint)numberOfBytes); + CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (UIntPtr)(uint)numberOfBytes); //Take a reference to the backBufferHandle, once we're on the UI thread we need to check if it's still valid var backBufferHandle = mappedFile.SafeMemoryMappedFileHandle; diff --git a/CefSharp.Wpf/Rendering/InteropBitmapRenderHandler.cs b/CefSharp.Wpf/Rendering/InteropBitmapRenderHandler.cs index c6fbbd3d00..2801d9b206 100644 --- a/CefSharp.Wpf/Rendering/InteropBitmapRenderHandler.cs +++ b/CefSharp.Wpf/Rendering/InteropBitmapRenderHandler.cs @@ -54,7 +54,7 @@ protected override void CreateOrUpdateBitmap(bool isPopup, Rect dirtyRect, IntPt //TODO: Performance analysis to determine which is the fastest memory copy function //NativeMethodWrapper.CopyMemoryUsingHandle(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, numberOfBytes); - CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (uint)numberOfBytes); + CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (UIntPtr)(uint)numberOfBytes); //Take a reference to the backBufferHandle, once we're on the UI thread we need to check if it's still valid var backBufferHandle = mappedFile.SafeMemoryMappedFileHandle; diff --git a/CefSharp.Wpf/Rendering/WritableBitmapRenderHandler.cs b/CefSharp.Wpf/Rendering/WritableBitmapRenderHandler.cs index 84941e9935..d4da4e4016 100644 --- a/CefSharp.Wpf/Rendering/WritableBitmapRenderHandler.cs +++ b/CefSharp.Wpf/Rendering/WritableBitmapRenderHandler.cs @@ -64,7 +64,7 @@ protected override void CreateOrUpdateBitmap(bool isPopup, Rect dirtyRect, IntPt //TODO: Performance analysis to determine which is the fastest memory copy function //NativeMethodWrapper.CopyMemoryUsingHandle(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, numberOfBytes); - CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (uint)numberOfBytes); + CopyMemory(viewAccessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), buffer, (UIntPtr)(uint)numberOfBytes); //Take a reference to the sourceBuffer that's used to update our WritableBitmap, //once we're on the UI thread we need to check if it's still valid From 1b77af490452e8e5d039efc51255eb15e427a499 Mon Sep 17 00:00:00 2001 From: kpreisser Date: Thu, 5 Sep 2019 08:21:45 +0200 Subject: [PATCH 2/2] Follow-Up: Switch to RtlCopyMemory which is faster, but requires that the buffers do not overlap. --- CefSharp.Wpf/Rendering/AbstractRenderHandler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs b/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs index c74627912e..12ab0b43ac 100644 --- a/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs +++ b/CefSharp.Wpf/Rendering/AbstractRenderHandler.cs @@ -20,7 +20,8 @@ namespace CefSharp.Wpf.Rendering /// public abstract class AbstractRenderHandler : IDisposable, IRenderHandler { - [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)] + // Note: In contrast to RtlMoveMemory, RtlCopyMemory requires that the buffers do not overlap. + [DllImport("kernel32.dll", EntryPoint = "RtlCopyMemory", SetLastError = false)] protected static extern void CopyMemory(IntPtr dest, IntPtr src, UIntPtr count); internal static readonly PixelFormat PixelFormat = PixelFormats.Pbgra32;