Added Gradient Kernel
This commit is contained in:
@@ -148,7 +148,7 @@ public class Program {
|
|||||||
int iterCount = 0;
|
int iterCount = 0;
|
||||||
var sw = new Stopwatch();
|
var sw = new Stopwatch();
|
||||||
sw.Start();
|
sw.Start();
|
||||||
Vector3[,] temp = new Vector3[width, height];
|
/*Vector3[,] temp = new Vector3[width, height];
|
||||||
|
|
||||||
var min = MAX;
|
var min = MAX;
|
||||||
var max = MIN;
|
var max = MIN;
|
||||||
@@ -169,11 +169,12 @@ public class Program {
|
|||||||
|
|
||||||
if (gradient < min) min = gradient;
|
if (gradient < min) min = gradient;
|
||||||
if (gradient > max) max = gradient;
|
if (gradient > max) max = gradient;
|
||||||
});
|
});*/
|
||||||
|
|
||||||
|
kernels.Gradient(mask.Mask, sdfA.SDF, sdfB.SDF, out var temp);
|
||||||
Console.WriteLine(
|
Console.WriteLine(
|
||||||
$"Gradient Time: {sw.Elapsed.TotalSeconds:N4}s ({iterCount / (float)sw.Elapsed.TotalSeconds:N0} pixels/s)");
|
$"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;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,37 @@ public partial class SdfKernels {
|
|||||||
sdf = buffer.GetAsArray2D();
|
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)
|
private static string GetInfoString(Accelerator a)
|
||||||
{
|
{
|
||||||
StringWriter infoString = new StringWriter();
|
StringWriter infoString = new StringWriter();
|
||||||
|
|||||||
Reference in New Issue
Block a user