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();