Esempio n. 1
0
 public void Visit(Node node)
 {
     if (!node.Shared)
     {
         UnsafeMemory.Copy(Dst + node.Offset, node.Data, DataSize);
     }
 }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
            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);
            }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
            //        }
            //    }
            //});
        }