public void MatrixUploads()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var numMatrices = 1025;
            var initialData = new float4x4[numMatrices];
            var stride      = UnsafeUtility.SizeOf <float4x4>();

            for (int i = 0; i < numMatrices; ++i)
            {
                initialData[i] = float4x4.identity;
            }

            var buffer = new ComputeBuffer(initialData.Length, stride);

            buffer.SetData(initialData);

            var uploader = new SparseUploader(buffer);

            {
                var tsu       = uploader.Begin(numMatrices * UnsafeUtility.SizeOf <float4x4>(), 1);
                var deltaData = new NativeArray <float4x4>(numMatrices, Allocator.Temp);
                for (int i = 0; i < numMatrices; ++i)
                {
                    var trans = float4x4.Translate(new float3(i * 0.2f, -i * 0.4f, math.cos(i * math.PI * 0.02f)));
                    var rot   = float4x4.EulerXYZ(i * 0.1f, math.PI * 0.5f, -i * 0.3f);
                    deltaData[i] = trans * rot;
                }

                unsafe
                {
                    tsu.AddMatrixUpload(deltaData.GetUnsafeReadOnlyPtr(), numMatrices, 0, numMatrices * 64);
                }
                uploader.EndAndCommit(tsu);

                deltaData.Dispose();
            }

            var resultingData = new float4x4[initialData.Length];

            buffer.GetData(resultingData);

            for (int i = 0; i < numMatrices; ++i)
            {
                var trans = float4x4.Translate(new float3(i * 0.2f, -i * 0.4f, math.cos(i * math.PI * 0.02f)));
                var rot   = float4x4.EulerXYZ(i * 0.1f, math.PI * 0.5f, -i * 0.3f);
                var mat   = trans * rot;

                CompareMatrices(mat, resultingData[i]);
            }

            uploader.Dispose();
            buffer.Dispose();
        }
        public void BasicUploads()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var initialData = new ExampleStruct[1024];

            for (int i = 0; i < initialData.Length; ++i)
            {
                initialData[i] = new ExampleStruct {
                    someData = i
                };
            }

            var buffer = new ComputeBuffer(initialData.Length, UnsafeUtility.SizeOf <ExampleStruct>());

            buffer.SetData(initialData);

            var uploader = new SparseUploader(buffer);

            {
                var tsu = uploader.Begin(UnsafeUtility.SizeOf <ExampleStruct>(), 1);
                tsu.AddUpload(new ExampleStruct {
                    someData = 7
                }, 4);
                uploader.EndAndCommit(tsu);
            }

            var resultingData = new ExampleStruct[initialData.Length];

            buffer.GetData(resultingData);

            Assert.AreEqual(0, resultingData[0].someData);
            Assert.AreEqual(7, resultingData[1].someData);
            Assert.AreEqual(2, resultingData[2].someData);

            {
                var tsu = uploader.Begin(UnsafeUtility.SizeOf <ExampleStruct>(), 1);
                tsu.AddUpload(new ExampleStruct {
                    someData = 13
                }, 8);
                uploader.EndAndCommit(tsu);
            }

            buffer.GetData(resultingData);

            Assert.AreEqual(0, resultingData[0].someData);
            Assert.AreEqual(7, resultingData[1].someData);
            Assert.AreEqual(13, resultingData[2].someData);
            Assert.AreEqual(3, resultingData[3].someData);

            uploader.Dispose();
            buffer.Dispose();
        }
        public void SmallUpload()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var initialData = new ExampleStruct[64];

            for (int i = 0; i < initialData.Length; ++i)
            {
                initialData[i] = new ExampleStruct {
                    someData = 0
                };
            }

            var buffer = new ComputeBuffer(initialData.Length, UnsafeUtility.SizeOf <ExampleStruct>());

            buffer.SetData(initialData);

            var uploader = new SparseUploader(buffer);

            {
                var tsu = uploader.Begin(UnsafeUtility.SizeOf <ExampleStruct>() * initialData.Length, initialData.Length);
                for (int i = 0; i < initialData.Length; ++i)
                {
                    tsu.AddUpload(new ExampleStruct {
                        someData = i
                    }, i * 4);
                }
                uploader.EndAndCommit(tsu);
            }

            var resultingData = new ExampleStruct[initialData.Length];

            buffer.GetData(resultingData);

            for (int i = 0; i < resultingData.Length; ++i)
            {
                Assert.AreEqual(i, resultingData[i].someData);
            }

            uploader.Dispose();
            buffer.Dispose();
        }
        public void NoUploads()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var buffer   = new ComputeBuffer(1, UnsafeUtility.SizeOf <float>());
            var uploader = new SparseUploader(buffer);

            var tsu = uploader.Begin(1024, 1);

            uploader.EndAndCommit(tsu);

            uploader.Dispose();
            buffer.Dispose();
        }
        public void UploadFromJobs()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var initialData = new ExampleStruct[4 * 1024];
            var stride      = UnsafeUtility.SizeOf <ExampleStruct>();

            for (int i = 0; i < initialData.Length; ++i)
            {
                initialData[i] = new ExampleStruct {
                    someData = 0
                };
            }

            var buffer = new ComputeBuffer(initialData.Length, stride);

            buffer.SetData(initialData);

            var uploader = new SparseUploader(buffer);

            var job = new UploadJob();

            job.uploader = uploader.Begin(initialData.Length * stride, initialData.Length);
            job.Schedule(initialData.Length, 64).Complete();

            uploader.EndAndCommit(job.uploader);

            var resultingData = new ExampleStruct[initialData.Length];

            buffer.GetData(resultingData);

            for (int i = 0; i < resultingData.Length; ++i)
            {
                Assert.AreEqual(i, resultingData[i].someData);
            }

            uploader.Dispose();
            buffer.Dispose();
        }
 private void Setup <T>(T[] initialData) where T : struct
 {
     buffer = new ComputeBuffer(initialData.Length, UnsafeUtility.SizeOf <T>());
     buffer.SetData(initialData);
     uploader = new SparseUploader(buffer);
 }
 private void Setup <T>(int count) where T : struct
 {
     buffer   = new ComputeBuffer(count, UnsafeUtility.SizeOf <T>());
     uploader = new SparseUploader(buffer);
 }
        public void BigUploads()
        {
            if (!SystemInfo.supportsComputeShaders)
            {
                Assert.Ignore("Skipped due to platform/computer not supporting compute shaders");
                return;
            }

            var initialData = new ExampleStruct[4 * 1024];

            for (int i = 0; i < initialData.Length; ++i)
            {
                initialData[i] = new ExampleStruct {
                    someData = i
                };
            }

            var buffer = new ComputeBuffer(initialData.Length, UnsafeUtility.SizeOf <ExampleStruct>());

            buffer.SetData(initialData);

            var uploader = new SparseUploader(buffer);


            var newData = new ExampleStruct[312];

            for (int i = 0; i < newData.Length; ++i)
            {
                newData[i] = new ExampleStruct {
                    someData = i + 3000
                };
            }

            var newData2 = new ExampleStruct[316];

            for (int i = 0; i < newData2.Length; ++i)
            {
                newData2[i] = new ExampleStruct {
                    someData = i + 4000
                };
            }

            var tsu = uploader.Begin(UnsafeUtility.SizeOf <ExampleStruct>() * (newData.Length + newData2.Length), 2);

            unsafe
            {
                fixed(void *ptr = newData)
                {
                    tsu.AddUpload(ptr, newData.Length * 4, 512 * 4);
                }

                fixed(void *ptr2 = newData2)
                {
                    tsu.AddUpload(ptr2, newData2.Length * 4, 1136 * 4);
                }
            }

            uploader.EndAndCommit(tsu);

            var resultingData = new ExampleStruct[initialData.Length];

            buffer.GetData(resultingData);

            for (int i = 0; i < resultingData.Length; ++i)
            {
                if (i < 512)
                {
                    Assert.AreEqual(i, resultingData[i].someData);
                }
                else if (i < 824)
                {
                    Assert.AreEqual(i - 512 + 3000, resultingData[i].someData);
                }
                else if (i < 1136)
                {
                    Assert.AreEqual(i, resultingData[i].someData);
                }
                else if (i < 1452)
                {
                    Assert.AreEqual(i - 1136 + 4000, resultingData[i].someData);
                }
                else
                {
                    Assert.AreEqual(i, resultingData[i].someData);
                }
            }

            uploader.Dispose();
            buffer.Dispose();
        }