diff --git a/SDFMapCreator/Program.cs b/SDFMapCreator/Program.cs index 1bf0be0..53b158a 100644 --- a/SDFMapCreator/Program.cs +++ b/SDFMapCreator/Program.cs @@ -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; } diff --git a/SDFMapCreator/SdfKernels.Kernels.cs b/SDFMapCreator/SdfKernels.Kernels.cs index 35ea606..a10f793 100644 --- a/SDFMapCreator/SdfKernels.Kernels.cs +++ b/SDFMapCreator/SdfKernels.Kernels.cs @@ -69,5 +69,15 @@ public partial class SdfKernels { sdf[index] = new(minDist); } - -} \ No newline at end of file + + private static void GradientKernel(Index2D index, + ArrayView2D mask, + ArrayView2D sdfa, + ArrayView2D sdfb, + ArrayView2D gradient + ) { //early exit if not on mask + if(mask[index].X == 0f || mask[index].Y == 0f) return; + float a = sdfa[index].X; float b = sdfb[index].X; + gradient[index] = new (a / (a + b)); + } +} diff --git a/SDFMapCreator/SdfKernels.cs b/SDFMapCreator/SdfKernels.cs index 958fa18..21dd878 100644 --- a/SDFMapCreator/SdfKernels.cs +++ b/SDFMapCreator/SdfKernels.cs @@ -128,6 +128,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(new (width, height)); + bufferMask.CopyFromCPU(mask); + + using var bufferSdfa = accelerator.Allocate2DDenseX(new (width, height)); + bufferSdfa.CopyFromCPU(sdfa); + + using var bufferSdfb = accelerator.Allocate2DDenseX(new (width, height)); + bufferSdfb.CopyFromCPU(sdfb); + + using var bufferGradient = accelerator.Allocate2DDenseX(new (width, height)); + + var gradientKernel = accelerator.LoadAutoGroupedStreamKernel, + ArrayView2D, + ArrayView2D, + ArrayView2D>(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();