Added Gradient Kernel
This commit is contained in:
@@ -148,7 +148,7 @@ public class Program {
|
||||
int iterCount = 0;
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
Vector3[,] temp = new Vector3[width, height];
|
||||
/*Vector3[,] temp = new Vector3[width, height];
|
||||
|
||||
var min = MAX;
|
||||
var max = MIN;
|
||||
@@ -169,11 +169,12 @@ public class Program {
|
||||
|
||||
if (gradient < min) min = gradient;
|
||||
if (gradient > max) max = gradient;
|
||||
});
|
||||
});*/
|
||||
|
||||
kernels.Gradient(mask.Mask, sdfA.SDF, sdfB.SDF, out var temp);
|
||||
Console.WriteLine(
|
||||
$"Gradient Time: {sw.Elapsed.TotalSeconds:N4}s ({iterCount / (float)sw.Elapsed.TotalSeconds:N0} pixels/s)");
|
||||
Console.WriteLine($"Min: {min} | Max: {max}");
|
||||
//Console.WriteLine($"Min: {min} | Max: {max}");
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
@@ -131,6 +131,37 @@ public partial class SdfKernels {
|
||||
sdf = buffer.GetAsArray2D();
|
||||
}
|
||||
|
||||
public void Gradient(ref Vector3[,] mask, ref Vector3[,] sdfa, ref Vector3[,] sdfb, out Vector3[,] gradient) {
|
||||
var dev = gpuContext.GetPreferredDevice(preferCPU:false);
|
||||
int width = mask.GetLength(0);
|
||||
int height = mask.GetLength(1);
|
||||
gradient = new Vector3[width, height];
|
||||
using Accelerator accelerator = dev.CreateAccelerator(gpuContext);
|
||||
|
||||
using var bufferMask = accelerator.Allocate2DDenseX<Vector3>(new (width, height));
|
||||
bufferMask.CopyFromCPU(mask);
|
||||
|
||||
using var bufferSdfa = accelerator.Allocate2DDenseX<Vector3>(new (width, height));
|
||||
bufferSdfa.CopyFromCPU(sdfa);
|
||||
|
||||
using var bufferSdfb = accelerator.Allocate2DDenseX<Vector3>(new (width, height));
|
||||
bufferSdfb.CopyFromCPU(sdfb);
|
||||
|
||||
using var bufferGradient = accelerator.Allocate2DDenseX<Vector3>(new (width, height));
|
||||
|
||||
var gradientKernel = accelerator.LoadAutoGroupedStreamKernel<Index2D,
|
||||
ArrayView2D<Vector3, Stride2D.DenseX>,
|
||||
ArrayView2D<Vector3, Stride2D.DenseX>,
|
||||
ArrayView2D<Vector3, Stride2D.DenseX>,
|
||||
ArrayView2D<Vector3, Stride2D.DenseX>>(GradientKernel);
|
||||
|
||||
gradientKernel(new (width, height), bufferMask.View, bufferSdfa.View, bufferSdfb.View, bufferGradient.View);
|
||||
|
||||
accelerator.Synchronize();
|
||||
|
||||
gradient = bufferMask.GetAsArray2D();
|
||||
}
|
||||
|
||||
private static string GetInfoString(Accelerator a)
|
||||
{
|
||||
StringWriter infoString = new StringWriter();
|
||||
|
||||
Reference in New Issue
Block a user