Fix stencil buffer memory leak.

Locking stencil buffers with a NULL format resulted in nullptr being
returned without acquiring the resource lock, while unlocking did
release the lock.

Instead of not releasing it on unlock, we must acquire it on lock
because otherwise the object could get destroyed before draw operations
end and attempt to unlock.

Bug b/116876483

Change-Id: Ie883115a1d6df3b40eb7c1feb5dcfde7316ec970
Reviewed-on: https://swiftshader-review.googlesource.com/21148
Reviewed-by: Krzysztof Kosiński <krzysio@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Krzysztof Kosiński <krzysio@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 9c47f1c..e06f2bd 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -1389,9 +1389,9 @@
 
 		deallocate(stencil.buffer);
 
-		external.buffer = 0;
-		internal.buffer = 0;
-		stencil.buffer = 0;
+		external.buffer = nullptr;
+		internal.buffer = nullptr;
+		stencil.buffer = nullptr;
 	}
 
 	void *Surface::lockExternal(int x, int y, int z, Lock lock, Accessor client)
@@ -1529,13 +1529,13 @@
 
 	void *Surface::lockStencil(int x, int y, int front, Accessor client)
 	{
+		resource->lock(client);
+
 		if(stencil.format == FORMAT_NULL)
 		{
 			return nullptr;
 		}
 
-		resource->lock(client);
-
 		if(!stencil.buffer)
 		{
 			stencil.buffer = allocateBuffer(stencil.width, stencil.height, stencil.depth, stencil.border, stencil.samples, stencil.format);