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/.travis.yml b/.travis.yml
index 58e4769..25a651f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,11 +23,11 @@
   - make
   - ./unittests
 
-notifications:

-  email:

-    recipients:

-      - swiftshader-team@google.com

-    on_success: never

+notifications:
+  email:
+    recipients:
+      - swiftshader-team@google.com
+    on_success: never
     on_failure: always
 
 deploy:
diff --git a/src/Common/Resource.cpp b/src/Common/Resource.cpp
index 0e71e05..3a63810 100644
--- a/src/Common/Resource.cpp
+++ b/src/Common/Resource.cpp
@@ -15,6 +15,7 @@
 #include "Resource.hpp"
 
 #include "Memory.hpp"
+#include "Debug.hpp"
 
 namespace sw
 {
@@ -106,6 +107,7 @@
 	void Resource::unlock()
 	{
 		criticalSection.lock();
+		ASSERT(count > 0);
 
 		count--;
 
@@ -131,6 +133,7 @@
 	void Resource::unlock(Accessor relinquisher)
 	{
 		criticalSection.lock();
+		ASSERT(count > 0);
 
 		while(count > 0 && accessor == relinquisher)
 		{
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);