Create a global and thread-safe Blitter.

Bug 21716622

Change-Id: I090154cdfbb6f8781df578b3f493d3ecd297c847
Reviewed-on: https://swiftshader-review.googlesource.com/3437
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp
index aaf1c89..f3b9ab6 100644
--- a/src/Renderer/Blitter.cpp
+++ b/src/Renderer/Blitter.cpp
@@ -16,6 +16,8 @@
 
 namespace sw
 {
+	Blitter blitter;
+
 	Blitter::Blitter()
 	{
 		blitCache = new RoutineCache<BlitState>(1024);
@@ -400,6 +402,7 @@
 		state.destFormat = dest->getInternalFormat();
 		state.filter = filter;
 
+		criticalSection.lock();
 		Routine *blitRoutine = blitCache->query(state);
 		
 		if(!blitRoutine)
@@ -408,12 +411,15 @@
 
 			if(!blitRoutine)
 			{
+				criticalSection.unlock();
 				return false;
 			}
 
 			blitCache->add(state, blitRoutine);
 		}
 
+		criticalSection.unlock();
+
 		void (*blitFunction)(const BlitData *data) = (void(*)(const BlitData*))blitRoutine->getEntry();
 
 		BlitData data;
diff --git a/src/Renderer/Blitter.hpp b/src/Renderer/Blitter.hpp
index 6c20ecb..ca7ec66 100644
--- a/src/Renderer/Blitter.hpp
+++ b/src/Renderer/Blitter.hpp
@@ -69,7 +69,10 @@
 		Routine *generate(BlitState &state);

 

 		RoutineCache<BlitState> *blitCache;

+		BackoffLock criticalSection;

 	};

+

+	extern Blitter blitter;

 }

 

 #endif   // sw_Blitter_hpp

diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp
index 5b64563..894b4e0 100644
--- a/src/Renderer/Renderer.hpp
+++ b/src/Renderer/Renderer.hpp
@@ -442,8 +442,6 @@
 		VertexProcessor::State vertexState;
 		SetupProcessor::State setupState;
 		PixelProcessor::State pixelState;
-
-		Blitter blitter;
 	};
 }