protected static void RenderThreadImpl(CancellationToken t, DeviceRenderThreadBase renderThread)
 {
     renderThread.ThreadJob(t, renderThread);
 }
        protected virtual void ThreadJob(CancellationToken t, DeviceRenderThreadBase renderThread)
        {
            Tracer.TraceLine("CL Render Thread {0} started", renderThread.threadIndex);

#if VERBOSE
            try {
#endif
            var todoBuffers = new Queue<RayBuffer>();
            for (var i = 0; i < DeviceRenderBufferCount; i++)
                todoBuffers.Enqueue(renderThread.rayBuffers[i]);

            while (!t.IsCancellationRequested)
            {
                while (todoBuffers.Count > 0)
                {
                    var rayBuffer = todoBuffers.Dequeue();
                    rayBuffer.Reset();
                    renderThread._pathRayProcessors[0].FillRayBuffer(rayBuffer);
                    renderThread.intersectionDevice.PushRayBuffer(rayBuffer, renderThread.threadIndex);
                }
                var rayBuff = renderThread.intersectionDevice.PopRayBuffer(renderThread.threadIndex);
                if (rayBuff != null && rayBuff.UserData == renderThread.threadIndex)
                {
                    renderThread._pathRayProcessors[0].AdvancePaths(rayBuff);
                    todoBuffers.Enqueue(rayBuff);
                }
            }
#if VERBOSE
            }
            catch (Exception ex) {
                Tracer.TraceLine("Exiting rendering : Reason \n\r{0}", ex);
            }
#endif
            Tracer.TraceLine("CL Render Thread {0} exited", renderThread.threadIndex);
        }