Add a critical section for dynamic code generation.

Bug 19864302

Change-Id: Iaca49fa72146ff35b6f1e5e40ade5cd2c5c48d0e
Reviewed-on: https://swiftshader-review.googlesource.com/2657
Reviewed-by: Greg Hartman <ghartman@google.com>
Tested-by: Greg Hartman <ghartman@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index 8cc7651..1cc97d8 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -69,6 +69,8 @@
 	TranscendentalPrecision rsqPrecision = ACCURATE;
 	bool perspectiveCorrection = true;
 
+	BackoffLock Renderer::codegenMutex;
+
 	struct Parameters
 	{
 		Renderer *renderer;
@@ -230,9 +232,13 @@
 				setupState = SetupProcessor::update();
 				pixelState = PixelProcessor::update();
 
+				codegenMutex.lock();
+
 				vertexRoutine = VertexProcessor::routine(vertexState);
 				setupRoutine = SetupProcessor::routine(setupState);
 				pixelRoutine = PixelProcessor::routine(pixelState);
+
+				codegenMutex.unlock();
 			}
 
 			int batch = batchSize / ms;
@@ -593,9 +599,9 @@
 
 			draw->references = (count + batch - 1) / batch;
 
-			mutex.lock();
+			schedulerMutex.lock();
 			nextDraw++;
-			mutex.unlock();
+			schedulerMutex.unlock();
 
 			if(!threadsAwake)
 			{
@@ -726,7 +732,7 @@
 
 	void Renderer::scheduleTask(int threadIndex)
 	{
-		mutex.lock();
+		schedulerMutex.lock();
 
 		if((int)qSize < threadCount - threadsAwake + 1)
 		{
@@ -763,7 +769,7 @@
 			threadsAwake--;
 		}
 
-		mutex.unlock();
+		schedulerMutex.unlock();
 	}
 
 	void Renderer::executeTask(int threadIndex)
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp
index af1a950..3408ab5 100644
--- a/src/Renderer/Renderer.hpp
+++ b/src/Renderer/Renderer.hpp
@@ -403,7 +403,8 @@
 		unsigned int qHead;
 		unsigned int qSize;
 
-		BackoffLock mutex;
+		BackoffLock schedulerMutex;
+		static BackoffLock codegenMutex;
 
 		#if PERF_HUD
 			int64_t vertexTime[16];