Implement render target layers support.

This adds the ability to render to a specific layer of a 2D array
texture.

Change-Id: I3055d62c9964b2729704785efb068b82eef4f9ce
Reviewed-on: https://swiftshader-review.googlesource.com/14668
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp
index 7e7ca5e..f0de2f2 100644
--- a/src/Renderer/Blitter.cpp
+++ b/src/Renderer/Blitter.cpp
@@ -214,13 +214,13 @@
 		float d = static_cast<float>(source->getDepth())  / static_cast<float>(dest->getDepth());
 
 		float z = 0.5f * d;
-		for(int k = 0; k < dest->getDepth(); ++k)
+		for(int k = 0; k < dest->getDepth(); k++)
 		{
 			float y = 0.5f * h;
-			for(int j = 0; j < dest->getHeight(); ++j)
+			for(int j = 0; j < dest->getHeight(); j++)
 			{
 				float x = 0.5f * w;
-				for(int i = 0; i < dest->getWidth(); ++i)
+				for(int i = 0; i < dest->getWidth(); i++)
 				{
 					dest->copyInternal(source, i, j, k, x, y, z, true);
 					x += w;
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index a41d03b..9274233 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -465,8 +465,11 @@
 		bool textureTransformProject[8];
 
 		Surface *renderTarget[RENDERTARGETS];
+		unsigned int renderTargetLayer[RENDERTARGETS];
 		Surface *depthBuffer;
+		unsigned int depthBufferLayer;
 		Surface *stencilBuffer;
+		unsigned int stencilBufferLayer;
 
 		// Fog
 		bool fogEnable;
diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp
index f76c387..7ae45e9 100644
--- a/src/Renderer/PixelProcessor.cpp
+++ b/src/Renderer/PixelProcessor.cpp
@@ -159,19 +159,22 @@
 		}
 	}
 
-	void PixelProcessor::setRenderTarget(int index, Surface *renderTarget)
+	void PixelProcessor::setRenderTarget(int index, Surface *renderTarget, unsigned int layer)
 	{
 		context->renderTarget[index] = renderTarget;
+		context->renderTargetLayer[index] = layer;
 	}
 
-	void PixelProcessor::setDepthBuffer(Surface *depthBuffer)
+	void PixelProcessor::setDepthBuffer(Surface *depthBuffer, unsigned int layer)
 	{
 		context->depthBuffer = depthBuffer;
+		context->depthBufferLayer = layer;
 	}
 
-	void PixelProcessor::setStencilBuffer(Surface *stencilBuffer)
+	void PixelProcessor::setStencilBuffer(Surface *stencilBuffer, unsigned int layer)
 	{
 		context->stencilBuffer = stencilBuffer;
+		context->stencilBufferLayer = layer;
 	}
 
 	void PixelProcessor::setTexCoordIndex(unsigned int stage, int texCoordIndex)
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp
index 57bbb19..bb0ae7e 100644
--- a/src/Renderer/PixelProcessor.hpp
+++ b/src/Renderer/PixelProcessor.hpp
@@ -197,9 +197,9 @@
 		void setUniformBuffer(int index, sw::Resource* buffer, int offset);
 		void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
 
-		void setRenderTarget(int index, Surface *renderTarget);
-		void setDepthBuffer(Surface *depthBuffer);
-		void setStencilBuffer(Surface *stencilBuffer);
+		void setRenderTarget(int index, Surface *renderTarget, unsigned int layer = 0);
+		void setDepthBuffer(Surface *depthBuffer, unsigned int layer = 0);
+		void setStencilBuffer(Surface *stencilBuffer, unsigned int layer = 0);
 
 		void setTexCoordIndex(unsigned int stage, int texCoordIndex);
 		void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index 0b95c72..1c92576 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -606,7 +606,8 @@
 
 					if(draw->renderTarget[index])
 					{
-						data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->lockInternal(0, 0, 0, LOCK_READWRITE, MANAGED);
+						unsigned int layer = context->renderTargetLayer[index];
+						data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
 						data->colorBuffer[index] += q * ms * context->renderTarget[index]->getSliceB(true);
 						data->colorPitchB[index] = context->renderTarget[index]->getInternalPitchB();
 						data->colorSliceB[index] = context->renderTarget[index]->getInternalSliceB();
@@ -618,7 +619,8 @@
 
 				if(draw->depthBuffer)
 				{
-					data->depthBuffer = (float*)context->depthBuffer->lockInternal(0, 0, 0, LOCK_READWRITE, MANAGED);
+					unsigned int layer = context->depthBufferLayer;
+					data->depthBuffer = (float*)context->depthBuffer->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
 					data->depthBuffer += q * ms * context->depthBuffer->getSliceB(true);
 					data->depthPitchB = context->depthBuffer->getInternalPitchB();
 					data->depthSliceB = context->depthBuffer->getInternalSliceB();
@@ -626,7 +628,8 @@
 
 				if(draw->stencilBuffer)
 				{
-					data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, 0, MANAGED);
+					unsigned int layer = context->stencilBufferLayer;
+					data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, layer, MANAGED);
 					data->stencilBuffer += q * ms * context->stencilBuffer->getSliceB(true);
 					data->stencilPitchB = context->stencilBuffer->getStencilPitchB();
 					data->stencilSliceB = context->stencilBuffer->getStencilSliceB();
diff --git a/src/Shader/PixelShader.cpp b/src/Shader/PixelShader.cpp
index 954fff3..9e281d9 100644
--- a/src/Shader/PixelShader.cpp
+++ b/src/Shader/PixelShader.cpp
@@ -694,10 +694,10 @@
 						unsigned char mask = inst->dst.mask;
 						unsigned char reg = inst->dst.index;
 
-						if(mask & 0x01)	input[reg][0] = Semantic(usage, index);
+						if(mask & 0x01) input[reg][0] = Semantic(usage, index);
 						if(mask & 0x02) input[reg][1] = Semantic(usage, index);
 						if(mask & 0x04) input[reg][2] = Semantic(usage, index);
-						if(mask & 0x08)	input[reg][3] = Semantic(usage, index);
+						if(mask & 0x08) input[reg][3] = Semantic(usage, index);
 					}
 					else if(inst->dst.type == Shader::PARAMETER_MISCTYPE)
 					{