Merge remote-tracking branch 'origin/ILGpu' into ILGpu

This commit is contained in:
mm00
2025-04-03 18:09:29 +02:00
3 changed files with 47 additions and 5 deletions

View File

@@ -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;
} }

View File

@@ -69,5 +69,15 @@ public partial class SdfKernels {
sdf[index] = new(minDist); sdf[index] = new(minDist);
} }
} private static void GradientKernel(Index2D index,
ArrayView2D<Vector3, Stride2D.DenseX> mask,
ArrayView2D<Vector3, Stride2D.DenseX> sdfa,
ArrayView2D<Vector3, Stride2D.DenseX> sdfb,
ArrayView2D<Vector3, Stride2D.DenseX> 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));
}
}

View File

@@ -128,6 +128,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();