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