Beispiel #1
0
        public void WarpDimension(int warpMultiplier)
        {
            var length = Accelerator.WarpSize * warpMultiplier;

            using (var lengthBuffer = Accelerator.Allocate <int>(length))
            {
                using (var idxBuffer = Accelerator.Allocate <int>(length))
                {
                    Execute(length, lengthBuffer.View, idxBuffer.View);

                    var expectedLength = Enumerable.Repeat(
                        Accelerator.WarpSize, length).ToArray();
                    Verify(lengthBuffer, expectedLength);

                    var expectedIndices = new int[length];
                    for (int i = 0; i < length; ++i)
                    {
                        expectedIndices[i] = i % Accelerator.WarpSize;
                    }
                    Verify(idxBuffer, expectedIndices);
                }
            }
        }
Beispiel #2
0
        static void LaunchKernel(
            Accelerator accelerator,
            Action <Index, ArrayView <int> > method,
            int?expectedValue)
        {
            var kernel = accelerator.LoadAutoGroupedStreamKernel(method);

            using (var buffer = accelerator.Allocate <int>(1024))
            {
                kernel(buffer.Length, buffer.View);

                // Wait for the kernel to finish...
                accelerator.Synchronize();

                if (expectedValue.HasValue)
                {
                    var data = buffer.GetAsArray();
                    for (int i = 0, e = data.Length; i < e; ++i)
                    {
                        Debug.Assert(data[i] == expectedValue);
                    }
                }
            }
        }
Beispiel #3
0
        static void LaunchKernel(
            Accelerator accelerator,
            Action <Index1, ArrayView <double>, double> method)
        {
            Console.WriteLine("Launching: " + method.Method.Name);

            var kernel = accelerator.LoadAutoGroupedStreamKernel(method);

            using (var buffer = accelerator.Allocate <double>(1))
            {
                buffer.MemSetToZero();

                kernel(1024, buffer.View, 2.0);

                // Wait for the kernel to finish...
                accelerator.Synchronize();

                var data = buffer.GetAsArray();
                for (int i = 0, e = data.Length; i < e; ++i)
                {
                    Console.WriteLine($"Data[{i}] = {data[i]}");
                }
            }
        }
Beispiel #4
0
        private void Render()
        {
            Vector3[] output = new Vector3[RenderWidth * RenderHeight];

            var myKernel = accelerator.LoadAutoGroupedStreamKernel <Index2, ArrayView2D <Vector3>, Scene, ArrayView <Models.Geometry>, ArrayView <Light>, int>(Raytracer.Kernel);

            using (var gpuBuffer = accelerator.Allocate <Vector3>(new Index2(RenderWidth, RenderHeight)))
            {
                using var geometryBuffer = accelerator.Allocate <Geometry>(sceneGeometry.Length);
                geometryBuffer.CopyFrom(accelerator.DefaultStream, sceneGeometry, 0, 0, sceneGeometry.Length);
                using var lightBuffer = accelerator.Allocate <Light>(sceneLights.Length);
                lightBuffer.CopyFrom(accelerator.DefaultStream, sceneLights, 0, 0, sceneLights.Length);
                gpuBuffer.CopyFrom(accelerator.DefaultStream, colorBuffer, 0, Index2.Zero, RenderWidth * RenderHeight);
                accelerator.DefaultStream.Synchronize();

                scene.Camera = new Camera(scene.Camera.Position, scene.Camera.LookAt, scene.Camera.FocalLength, RenderWidth, RenderHeight);

                while (rendering)
                {
                    myKernel(gpuBuffer.Extent, gpuBuffer.View, scene, geometryBuffer.View, lightBuffer.View, new Random().Next());
                    accelerator.Synchronize();

                    passes += 1;
                    Dispatcher?.InvokeAsync(() => { statusLabel.Content = $"Passes: {passes}    Elapsed: {(DateTime.Now - renderStartTime).ToString(@"hh\:mm\:ss")}    Passes/s: {passes / (float)(DateTime.Now - renderStartTime).TotalSeconds}"; });

                    if ((passes - 1) % 20 == 0)
                    {
                        gpuBuffer.CopyTo(colorBuffer, Index2.Zero, 0, new Index2(RenderWidth, RenderHeight));
                        Dispatcher?.InvokeAsync(UpdateBitmap);
                    }
                }

                gpuBuffer.CopyTo(colorBuffer, Index2.Zero, 0, new Index2(RenderWidth, RenderHeight));
                Dispatcher?.InvokeAsync(UpdateBitmap);
            }
        }