protected static void RenderThreadImpl(CancellationToken t, CorrectorRenderThread renderThread) { renderThread.ThreadJob(t, renderThread); }
protected virtual void ThreadJob(CancellationToken t, CorrectorRenderThread renderThread) { Tracer.TraceLine("CL Render Thread {0} started", renderThread.threadIndex); if (!started) return; #if VERBOSE try { #endif var todoBuffers = new Queue<RayBuffer>(); for (var i = 0; i < DeviceRenderBufferCount; i++) todoBuffers.Enqueue(renderThread.rayBuffers[i]); while (true) { if ((frameManager.FrameReady || t.IsCancellationRequested)) { break; } while (todoBuffers.Count > 0) { var rayBuffer = todoBuffers.Dequeue(); rayBuffer.Reset(); renderThread._pathRayProcessors.FillRayBuffer(rayBuffer); renderThread.intersectionDevice.PushRayBuffer(rayBuffer, renderThread.threadIndex); } var rayBuff = renderThread.intersectionDevice.PopRayBuffer(renderThread.threadIndex); if (rayBuff != null && rayBuff.UserData == renderThread.threadIndex) { renderThread._pathRayProcessors.AdvancePaths(rayBuff); todoBuffers.Enqueue(rayBuff); } } started = false; #if VERBOSE } catch (Exception ex) { Tracer.TraceLine("Exiting rendering : Reason \n\r{0}", ex); } #endif //frameManager.Complete(); Tracer.TraceLine("CL Render Thread {0} exited", renderThread.threadIndex); }