148 lines
5.1 KiB
C#
148 lines
5.1 KiB
C#
using NUnit.Framework;
|
|
using Unity.Collections;
|
|
using Rukhanka.Toolbox;
|
|
using Unity.Mathematics;
|
|
using UnityEngine;
|
|
using Random = Unity.Mathematics.Random;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
namespace Rukhanka.Tests
|
|
{
|
|
public class ComputeBufferToolsTests
|
|
{
|
|
[Test]
|
|
public void ComputeBufferClearTest()
|
|
{
|
|
var bufferSize = 0xffff;
|
|
var readbackData = new int[bufferSize];
|
|
var srcData = new NativeArray<int>(bufferSize, Allocator.Temp);
|
|
using var buf = new GraphicsBuffer(GraphicsBuffer.Target.Raw, GraphicsBuffer.UsageFlags.None, bufferSize, sizeof(int));
|
|
|
|
var rng = new Random((uint)bufferSize);
|
|
|
|
// Fill buffer with random data
|
|
for (var k = 0; k < bufferSize; ++k)
|
|
{
|
|
srcData[k] = rng.NextInt();
|
|
}
|
|
|
|
var numIterations = 10;
|
|
for (var i = 0; i < numIterations; ++i)
|
|
{
|
|
buf.SetData(srcData);
|
|
|
|
// Now clear portion of buffer and check result
|
|
var startIndex = rng.NextUInt((uint)bufferSize - 1);
|
|
var count = rng.NextUInt((uint)bufferSize - startIndex);
|
|
var clearValue = rng.NextInt();
|
|
ComputeBufferTools.Clear(buf, startIndex * 4, count * 4, (uint)clearValue);
|
|
|
|
buf.GetData(readbackData);
|
|
|
|
// Verify correctness
|
|
for (var k = 0; k < bufferSize; ++k)
|
|
{
|
|
var v = readbackData[k];
|
|
var srcV = srcData[k];
|
|
if (k < startIndex || k >= startIndex + count)
|
|
{
|
|
Assert.IsTrue(v == srcV);
|
|
}
|
|
else
|
|
{
|
|
Assert.IsTrue(v == clearValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
[Test]
|
|
public void ComputeBufferCopyTest()
|
|
{
|
|
var bufferSize = 0xffff;
|
|
using var srcBuf = new GraphicsBuffer(GraphicsBuffer.Target.Raw, GraphicsBuffer.UsageFlags.None, bufferSize, sizeof(int));
|
|
var srcData = new NativeArray<int>(srcBuf.count, Allocator.Temp);
|
|
using var dstBuf = new GraphicsBuffer(GraphicsBuffer.Target.Raw, GraphicsBuffer.UsageFlags.None, bufferSize * 2, sizeof(int));
|
|
var dstData = new NativeArray<int>(dstBuf.count, Allocator.Temp);
|
|
var readbackData = new int[dstBuf.count];
|
|
|
|
var rng = new Random((uint)bufferSize);
|
|
|
|
// Fill buffer with random data
|
|
for (var k = 0; k < srcData.Length; ++k)
|
|
srcData[k] = rng.NextInt();
|
|
|
|
for (var k = 0; k < dstData.Length; ++k)
|
|
dstData[k] = rng.NextInt();
|
|
|
|
var numIterations = 100;
|
|
for (var i = 0; i < numIterations; ++i)
|
|
{
|
|
srcBuf.SetData(srcData);
|
|
dstBuf.SetData(dstData);
|
|
|
|
var srcIndex = rng.NextUInt((uint)srcData.Length - 1);
|
|
var copyCount = rng.NextUInt((uint)srcData.Length - srcIndex);
|
|
var dstIndex = rng.NextUInt((uint)dstData.Length - copyCount);
|
|
ComputeBufferTools.Copy(srcBuf, dstBuf, srcIndex * 4, dstIndex * 4, copyCount * 4);
|
|
|
|
dstBuf.GetData(readbackData);
|
|
|
|
// Verify correctness
|
|
for (var k = 0; k < readbackData.Length; ++k)
|
|
{
|
|
var v = readbackData[k];
|
|
var si = k - dstIndex;
|
|
if (si < 0 || si >= copyCount)
|
|
{
|
|
var sv = dstData[k];
|
|
Assert.IsTrue(v == sv);
|
|
}
|
|
else
|
|
{
|
|
var sv = srcData[(int)(si + srcIndex)];
|
|
Assert.IsTrue(v == sv);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
[Test]
|
|
public void ComputeBufferResizeTest()
|
|
{
|
|
var srcBufferSize = 0xffff;
|
|
var dstBufferSize = srcBufferSize * 2;
|
|
var srcData = new NativeArray<int>(srcBufferSize, Allocator.Temp);
|
|
|
|
var rng = new Random((uint)srcBufferSize);
|
|
|
|
// Fill buffer with random data
|
|
for (var k = 0; k < srcData.Length; ++k)
|
|
srcData[k] = rng.NextInt();
|
|
|
|
var numIterations = 10;
|
|
for (var i = 0; i < numIterations; ++i)
|
|
{
|
|
var srcBuf = new GraphicsBuffer(GraphicsBuffer.Target.Raw, GraphicsBuffer.UsageFlags.None, srcBufferSize, sizeof(int));
|
|
srcBuf.SetData(srcData);
|
|
var newSize = rng.NextInt(dstBufferSize);
|
|
using var newBuf = ComputeBufferTools.Resize(srcBuf, newSize);
|
|
srcBuf.Release();
|
|
var readbackBuf = new int[newSize];
|
|
newBuf.GetData(readbackBuf);
|
|
|
|
var sz = math.min(newSize, srcData.Length);
|
|
for (var k = 0; k < sz; ++k)
|
|
{
|
|
Assert.IsTrue(readbackBuf[k] == srcData[k]);
|
|
}
|
|
newBuf.Release();
|
|
}
|
|
}
|
|
}
|
|
} |