Make Blitter part of Renderer.

This fixes two issues. We had a global 'blitter' instance which doesn't
get destroyed until the library us unloaded. This is reported as a
memory leak (albeit benign). Potentially worse is that the singleton was
shared between all threads, and the Routine cache isn't thread safe.

Bug chromium:732691

Change-Id: I7b90d7d2bc67b4a9f78cdf4f54a76fa2f798b7cc
Reviewed-on: https://swiftshader-review.googlesource.com/10128
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index a8f6032..a84423d 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -114,6 +114,7 @@
 
 		setRenderTarget(0, 0);
 		clipper = new Clipper(symmetricNormalizedDepth);
+		blitter = new Blitter;
 
 		updateViewMatrix = true;
 		updateBaseMatrix = true;
@@ -177,7 +178,10 @@
 		sync->destruct();
 
 		delete clipper;
-		clipper = 0;
+		clipper = nullptr;
+
+		delete blitter;
+		blitter = nullptr;
 
 		terminateThreads();
 		delete resumeApp;
@@ -202,21 +206,6 @@
 		sw::deallocate(mem);
 	}
 
-	void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask)
-	{
-		blitter.clear(pixel, format, dest, dRect, rgbaMask);
-	}
-
-	void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil)
-	{
-		blitter.blit(source, sRect, dest, dRect, filter, isStencil);
-	}
-
-	void Renderer::blit3D(Surface *source, Surface *dest)
-	{
-		blitter.blit3D(source, dest);
-	}
-
 	void Renderer::draw(DrawType drawType, unsigned int indexOffset, unsigned int count, bool update)
 	{
 		#ifndef NDEBUG
@@ -681,6 +670,21 @@
 		}
 	}
 
+	void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask)
+	{
+		blitter->clear(pixel, format, dest, dRect, rgbaMask);
+	}
+
+	void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil)
+	{
+		blitter->blit(source, sRect, dest, dRect, filter, isStencil);
+	}
+
+	void Renderer::blit3D(Surface *source, Surface *dest)
+	{
+		blitter->blit3D(source, dest);
+	}
+
 	void Renderer::threadFunction(void *parameters)
 	{
 		Renderer *renderer = static_cast<Parameters*>(parameters)->renderer;