public void Visit(Node node) { if (!node.Shared) { UnsafeMemory.Copy(Dst + node.Offset, node.Data, DataSize); } }
protected override unsafe void Execute(Action <IntPtr, IntPtr, UIntPtr> fn, out string result, out string expected) { const int cnt = 17; var d = new uint[] { 0x00000000, 0x10101010, 0x20100804, 0x30200003, 0x40204040, 0x5000004D, 0x60302E2C, 0x706F6E6D, 0x807F4F2F, 0x90349001, 0xA0010203, 0xB03204AB, 0xC023AFBD, 0xD0D0D0C0, 0xE0AABBCC, 0xFFFFFFFF, 0xF8F4F2F1 }; var s = new uint[] { 0xE0E0E0E0, 0xA0008080, 0x341F1E1A, 0xFEFEFEFE, 0x80302010, 0x49490A0B, 0x998F7798, 0x00000000, 0x01010101, 0xA0264733, 0xBAB0B1B9, 0xFF000000, 0xDAB0A0C1, 0xE0BACFDA, 0x99887766, 0xFFFFFF80, 0xEE0A5FEC }; var rawptr = Marshal.AllocHGlobal((cnt + 3) * sizeof(uint) + 8); var pdst = new IntPtr(16 * (((long)rawptr + 15) / 16)); rawptr = Marshal.AllocHGlobal((cnt + 3) * sizeof(uint) + 8); var psrc = new IntPtr(16 * (((long)rawptr + 15) / 16)); UnsafeMemory.Copy(pdst, Marshal.UnsafeAddrOfPinnedArrayElement(d, 0), cnt * sizeof(uint)); UnsafeMemory.Copy(psrc, Marshal.UnsafeAddrOfPinnedArrayElement(s, 0), cnt * sizeof(uint)); var e = new uint[cnt]; for (var z = 0; z < cnt; z++) { e[z] = BlendSrcOver(d[z], s[z]); } fn(pdst, psrc, (UIntPtr)cnt); UnsafeMemory.Copy(Marshal.UnsafeAddrOfPinnedArrayElement(d, 0), pdst, cnt * sizeof(uint)); result = string.Join(",", d); expected = string.Join(",", e); }
internal static Node NewNode(Pointer data, int size, int offset, bool shared) { var node = new Node(); node.Link[0] = null; node.Link[1] = null; node.Level = 1; node.Shared = shared; node.Offset = offset; node.Data = UnsafeMemory.Allocate(size); UnsafeMemory.Copy(node.Data, data, size); return(node); }
private DataNode CreateDataNode(Pointer data, int size) { var clonedData = UnsafeMemory.Allocate(size); if (clonedData == Pointer.Invalid) { return(null); } _dataAllocations.Add(clonedData); if (data != Pointer.Invalid) { UnsafeMemory.Copy(clonedData, data, size); } return(new DataNode(clonedData, size)); }
private static void RunTest() { const int cnt = 17; var d = new uint[] { 0x00000000, 0x10101010, 0x20100804, 0x30200003, 0x40204040, 0x5000004D, 0x60302E2C, 0x706F6E6D, 0x807F4F2F, 0x90349001, 0xA0010203, 0xB03204AB, 0xC023AFBD, 0xD0D0D0C0, 0xE0AABBCC, 0xFFFFFFFF, 0xF8F4F2F1 }; var s = new uint[] { 0xE0E0E0E0, 0xA0008080, 0x341F1E1A, 0xFEFEFEFE, 0x80302010, 0x49490A0B, 0x998F7798, 0x00000000, 0x01010101, 0xA0264733, 0xBAB0B1B9, 0xFF000000, 0xDAB0A0C1, 0xE0BACFDA, 0x99887766, 0xFFFFFF80, 0xEE0A5FEC }; var rawptr = Marshal.AllocHGlobal((cnt + 3) * sizeof(uint) + 8); var pdst = new IntPtr(16 * (((long)rawptr + 15) / 16)); rawptr = Marshal.AllocHGlobal((cnt + 3) * sizeof(uint) + 8); var psrc = new IntPtr(16 * (((long)rawptr + 15) / 16)); UnsafeMemory.Copy(pdst, Marshal.UnsafeAddrOfPinnedArrayElement(d, 0), cnt * sizeof(uint)); UnsafeMemory.Copy(psrc, Marshal.UnsafeAddrOfPinnedArrayElement(s, 0), cnt * sizeof(uint)); var t1 = new ExecutionTimer(); var t2 = new ExecutionTimer(); t1.Start(); for (int i = 0; i < 1000000; i++) { var e = new uint[cnt]; for (var z = 0; z < cnt; z++) { e[z] = BlendSrcOver(d[z], s[z]); } } t1.Stop(); var tt1 = t1.Milliseconds; var fn = Make(); t2.Start(); for (int i = 0; i < 1000000; i++) { fn(pdst, psrc, (UIntPtr)cnt); } t2.Stop(); var tt2 = t2.Milliseconds; Console.WriteLine("NET: " + tt1); Console.WriteLine("Asm: " + tt2); Console.ReadKey(); UnsafeMemory.Copy(Marshal.UnsafeAddrOfPinnedArrayElement(d, 0), pdst, cnt * sizeof(uint)); }
public void Clear() { //for (int i = 0; i != 128; ++i) // keycolor[i] = (i % 12) switch // { // 1 or 3 or 6 or 8 or 10 => 0xFF000000, // _ => 0xFFFFFFFF, // }; fixed(uint *p = keycolor) UnsafeMemory.Copy(p, keyColors, 512); //for (int i = keyh; i < Height; ++i) //{ // //for (int j = 0; j < Width; ++j) // //data[i][j] = 0xFF000000; // UnsafeMemory.Copy(data[i], emptyData, (ulong)Width * 4); //} UnsafeMemory.Copy(frame, emptyFrame, (ulong)(Width * Height) * 4); }
public Canvas(int width, int height, int keyHeight, int fps, string videoName, int crf = 13, uint lineColor = 0xFF000080, string ffArg = "") { Width = width; Height = height; keyh = keyHeight; this.fps = fps; string ffarg = string.Concat("ffmpeg -y -hide_banner -f rawvideo -pix_fmt rgba -s ", width, "x", height, " -r ", fps, " -i - -pix_fmt yuv420p -preset ultrafast -crf ", crf, " \"", videoName + "\" ", ffArg); ffpipe = CStream.OpenPipe(ffarg, "wb"); frame = (uint *)UnsafeMemory.Allocate((ulong)width * (ulong)height * 4); UnsafeMemory.Set(frame, 0, (ulong)width * (ulong)height * 4); data = (uint **)UnsafeMemory.Allocate((ulong)height * (ulong)sizeof(void *)); for (uint i = 0; i < height; ++i) { data[i] = frame + (height - 1 - i) * width; } for (int i = 0; i != 128; ++i) { keyx[i] = (i / 12 * 126 + genkeyx[i % 12]) * Width / 1350; } for (int i = 0; i != 127; ++i) { keyw[i] = (i % 12) switch { 1 or 3 or 6 or 8 or 10 => width * 9 / 1350, 4 or 11 => keyx[i + 1] - keyx[i], _ => keyx[i + 2] - keyx[i], } } ; keyw[127] = width - keyx[127]; linc = lineColor; for (int i = 0; i != 128; ++i) { keycolor[i] = (i % 12) switch { 1 or 3 or 6 or 8 or 10 => 0xFF000000, _ => 0xFFFFFFFF, } } ; keyColors = (uint *)UnsafeMemory.Allocate(512); fixed(uint *p = keycolor) UnsafeMemory.Copy(keyColors, p, 512); emptyFrame = (uint *)UnsafeMemory.Allocate((ulong)width * (ulong)height * 4); for (int i = 0; i < Height; ++i) { for (int j = 0; j < Width; ++j) { data[i][j] = 0xFF000000; } } UnsafeMemory.Copy(emptyFrame, frame, (ulong)width * (ulong)height * 4); //renderPush = Task.Run(() => //{ // while (!destoryed) // { // if (!FrameList.IsEmpty) // { // FrameList.TryDequeue(out IntPtr f); // void* currFrame = f.ToPointer(); // ffpipe.Write(currFrame, (ulong)Width * (ulong)Height, 4); // UnsafeMemory.Free(currFrame); // } // } //}); }