Пример #1
0
        private static void CompileThreadProc(object stateInfo)
        {
            CompileThreadClass ctc = (CompileThreadClass)stateInfo;

            ctc.DoCompile();
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
        }