public override void Trace(RayBuffer rayBuffer) {
     var device = this;
     var raysArg = rayBuffer.RaysInfo;
     
     GCHandle raysHandle = GCHandle.Alloc(raysArg, GCHandleType.Pinned);
     clContext.kernel.SetValueArgument(7, rayBuffer.GetRayCount());
     device.clContext.commands.Write(device.rays, true, 0, rayBuffer.Size, raysHandle.AddrOfPinnedObject(), null);
     device.clContext.commands.Execute(device.clContext.kernel, null, new long[] { rayBuffer.RaysInfo.Length }, new long[] { 32 }, null);
     //device.clContext.commands.Finish();
     GCHandle arrCHandle = GCHandle.Alloc(rayBuffer.rayHits, GCHandleType.Pinned);
     device.clContext.commands.Read(device.rayHits, true, 0, rayBuffer.Size, arrCHandle.AddrOfPinnedObject(), null);
     //var cc = rayBuffer.rayHits.Where(item => item.Index >0 && item.Index < 12);
     //foreach (var rayHit in cc)
     //{
     //    Tracer.TraceLine("FirstTriangle hit {0}", rayHit.Index);                
     //}
     //device.clContext.commands.Finish();
     rayBuffer.traced = true;
     arrCHandle.Free();
     raysHandle.Free();
 }
        public override void Trace(RayBuffer rayBuffer) {
#if DEBUG
            try
            {
#endif
                var device = this;
                var raysArg = rayBuffer.RaysInfo;
                GCHandle raysHandle = GCHandle.Alloc(raysArg, GCHandleType.Pinned);
                clContext.kernel.SetValueArgument(7, rayBuffer.GetRayCount());
                device.clContext.commands.Write(device.rays, true, 0, rayBuffer.Size, raysHandle.AddrOfPinnedObject(),
                                                null);
                device.clContext.commands.Execute(device.clContext.kernel, null, new long[] {rayBuffer.RaysInfo.Length},
                                                  new long[] {32}, null);
                //device.clContext.commands.Finish();
                GCHandle arrCHandle = GCHandle.Alloc(rayBuffer.rayHits, GCHandleType.Pinned);
                device.clContext.commands.Read(device.rayHits, false, 0, rayBuffer.Size, arrCHandle.AddrOfPinnedObject(),
                                               null);
                //device.clContext.commands.Finish();
                rayBuffer.traced = true;
                arrCHandle.Free();
                raysHandle.Free();
#if DEBUG

            }
            catch (Exception ex)
            {
                Tracer.TraceLine("Exception in Trace Method {0}", ex.Message);
                Tracer.TraceLine("{0}", ex.StackTrace);
            }
#endif

        }
        public override void Trace(RayBuffer rayBuffer) {
            var device = this;
            var raysArg = rayBuffer.RaysInfo;
            TLHit[] hits = new TLHit[rayBuffer.Size];

            GCHandle raysHandle = GCHandle.Alloc(raysArg, GCHandleType.Pinned);
            GCHandle trrCHandle = GCHandle.Alloc(hits, GCHandleType.Pinned);
            TopLevelKernel.SetValueArgument(4, rayBuffer.GetRayCount());
            device.clContext.commands.Write(device.rays, true, 0, rayBuffer.Size, raysHandle.AddrOfPinnedObject(), null);
            device.clContext.commands.Execute(TopLevelKernel, null, new long[] { rayBuffer.RaysInfo.Length }, new long[] { 32 }, null);
            device.clContext.commands.Finish();
            device.clContext.commands.Read(tlhits, true, 0, rayBuffer.Size, trrCHandle.AddrOfPinnedObject(), null);
            //device.clContext.commands.Finish();

            //Comparer<RayHit> comparer = Comparer<RayHit>.Create((t1,t2) => { return t1.Index.CompareTo(t2.Index); });
            //Array.Sort(rayBuffer.rayHits, comparer);
            //Array.Sort(rayBuffer.RaysInfo, (data, rayData) => { data.});
            //device.clContext.commands.Write(device.rayHits, true, 0, rayBuffer.Size, arrCHandle.AddrOfPinnedObject(), null);
            BottomLevelKernel.SetValueArgument(8, rayBuffer.GetRayCount());
            BottomLevelKernel.SetMemoryArgument(9, tlhits);
            GCHandle arrCHandle = GCHandle.Alloc(rayBuffer.rayHits, GCHandleType.Pinned);
            device.clContext.commands.Execute(BottomLevelKernel, null, new long[] { rayBuffer.RaysInfo.Length }, new long[] { 32 }, null);
            device.clContext.commands.Read(device.rayHits, true, 0, rayBuffer.Size, arrCHandle.AddrOfPinnedObject(), null);
            device.clContext.commands.Finish();
            rayBuffer.traced = true;
            arrCHandle.Free();
            raysHandle.Free();
        }
 public override void Trace(RayBuffer rayBuffer) {
     var device = this;
     var raysArg = rayBuffer.RaysInfo;
     GCHandle raysHandle = GCHandle.Alloc(raysArg, GCHandleType.Pinned);
     clContext.kernel.SetValueArgument(7, rayBuffer.GetRayCount());
     device.clContext.commands.Write(device.rays, true, 0, rayBuffer.Size, raysHandle.AddrOfPinnedObject(), null);
     device.clContext.commands.Execute(device.clContext.kernel, null, new long[] { rayBuffer.RaysInfo.Length }, new long[] { 32 }, null);
     //device.clContext.commands.Finish();
     GCHandle arrCHandle = GCHandle.Alloc(rayBuffer.rayHits, GCHandleType.Pinned);
     device.clContext.commands.Read(device.rayHits, true, 0, rayBuffer.Size, arrCHandle.AddrOfPinnedObject(), null);
     //device.clContext.commands.Finish();
     rayBuffer.traced = true;
     arrCHandle.Free();
     raysHandle.Free();
 }