From 366a5c1cab7bd3f8f361450a368660ae193def34 Mon Sep 17 00:00:00 2001 From: Samuele Lorefice Date: Thu, 3 Apr 2025 18:02:43 +0200 Subject: [PATCH] Added Gradient Kernel --- SDFMapCreator/Program.cs | 7 ++++--- SDFMapCreator/SdfKernels.cs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/SDFMapCreator/Program.cs b/SDFMapCreator/Program.cs index 872033d..869002f 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.cs b/SDFMapCreator/SdfKernels.cs index 3a96c35..bd7cfc5 100644 --- a/SDFMapCreator/SdfKernels.cs +++ b/SDFMapCreator/SdfKernels.cs @@ -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(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();