private static void CompileThreadProc(object stateInfo) { CompileThreadClass ctc = (CompileThreadClass)stateInfo; ctc.DoCompile(); }
private bool CompileCombos() { DoProgress(2, 0); DoStatus("Compiling combos ..."); m_CompilationResults.Clear(); m_CompileError = false; m_CompileErrors.Clear(); CalcNumCombos(); if (m_NumCombos > 0x7fffffff) { DoError("Too many combos."); return(false); } string sourceString; string profileString = m_Profile.ToString(); WriteSourceString(out sourceString); int numCombos = (int)m_NumCombos; int queuedComobos = 0; for (int i = 0; i < numCombos; ++i) { DoProgress(2, (double)i / (double)m_NumCombos, false); DefineCombos(i); bool skip = m_Expression.Eval(); if (!skip) { // abort as we learn about past compile errors: if (m_CompileError) { break; } DoStatus("Queueing combo " + (i + 1) + "/" + m_NumCombos + " for compilation ...", false); CompileThreadClass ctc = new CompileThreadClass( this, sourceString, profileString, MakeMacros(i), i ); if (!ThreadPool.QueueUserWorkItem( CompileThreadProc, ctc )) { DoError("Failed to queue on ThreadPool for shaderCombo_" + i); return(false); } ++queuedComobos; } } int remainingCompiles = 0; while (0 != (remainingCompiles = Interlocked.CompareExchange(ref m_OutstandingCompiles, 0, 0))) { DoProgress(3, (double)(queuedComobos - remainingCompiles) / (double)queuedComobos); DoStatus("Waiting for combo compilation to finish (" + remainingCompiles + " remaining) ..."); Thread.Sleep(100); } if (0 < m_CompileErrors.Count) { DoError("Found compile errors, limiting to one error:"); DoError(m_CompileErrors.First.Value); return(false); } DoProgress(3, 1); return(true); }
private bool CompileCombos() { DoProgress(2, 0); DoStatus("Compiling combos ..."); m_CompilationResults.Clear(); m_CompileError = false; m_CompileErrors.Clear(); CalcNumCombos(); if (m_NumCombos > 0x7fffffff) { DoError("Too many combos."); return false; } string sourceString; string profileString = m_Profile.ToString(); WriteSourceString(out sourceString); int numCombos = (int)m_NumCombos; int queuedComobos = 0; for (int i = 0; i < numCombos; ++i) { DoProgress(2, (double)i / (double)m_NumCombos, false); DefineCombos(i); bool skip = m_Expression.Eval(); if (!skip) { // abort as we learn about past compile errors: if (m_CompileError) break; DoStatus("Queueing combo " + (i + 1) + "/" + m_NumCombos + " for compilation ...", false); CompileThreadClass ctc = new CompileThreadClass( this, sourceString, profileString, MakeMacros(i), i ); if (!ThreadPool.QueueUserWorkItem( CompileThreadProc, ctc )) { DoError("Failed to queue on ThreadPool for shaderCombo_" + i); return false; } ++queuedComobos; } } int remainingCompiles = 0; while (0 != (remainingCompiles = Interlocked.CompareExchange(ref m_OutstandingCompiles, 0, 0))) { DoProgress(3, (double)(queuedComobos - remainingCompiles) / (double)queuedComobos); DoStatus("Waiting for combo compilation to finish (" + remainingCompiles + " remaining) ..."); Thread.Sleep(100); } if (0 < m_CompileErrors.Count) { DoError("Found compile errors, limiting to one error:"); DoError(m_CompileErrors.First.Value); return false; } DoProgress(3, 1); return true; }