Refactor Renderer11::blit to use simpler control flow.
TRAC #22679
Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods
Author: Jamie Madill
git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2094 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 809f0d0..e347677 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2920,14 +2920,57 @@
bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect,
bool blitRenderTarget, bool blitDepthStencil)
{
- if (blitRenderTarget && !blitRect(readTarget, readRect, drawTarget, drawRect, BLIT_RENDERTARGET))
+ // TODO: mrt blit support
+ if (blitRenderTarget)
{
- return false;
+ gl::Renderbuffer *readBuffer = readTarget->getReadColorbuffer();
+ gl::Renderbuffer *drawBuffer = drawTarget->getColorbuffer(0);
+
+ if (!readBuffer)
+ {
+ ERR("Failed to retrieve the read buffer from the read framebuffer.");
+ return gl::error(GL_OUT_OF_MEMORY, false);
+ }
+
+ if (!drawBuffer)
+ {
+ ERR("Failed to retrieve the draw buffer from the draw framebuffer.");
+ return gl::error(GL_OUT_OF_MEMORY, false);
+ }
+
+ RenderTarget *readRenderTarget = readBuffer->getRenderTarget();
+ RenderTarget *drawRenderTarget = drawBuffer->getRenderTarget();
+
+ if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+ {
+ return false;
+ }
}
- if (blitDepthStencil && !blitRect(readTarget, readRect, drawTarget, drawRect, BLIT_DEPTHSTENCIL))
+ if (blitDepthStencil)
{
- return false;
+ gl::Renderbuffer *readBuffer = readTarget->getDepthOrStencilbuffer();
+ gl::Renderbuffer *drawBuffer = drawTarget->getDepthOrStencilbuffer();
+
+ if (!readBuffer)
+ {
+ ERR("Failed to retrieve the read depth-stencil buffer from the read framebuffer.");
+ return gl::error(GL_OUT_OF_MEMORY, false);
+ }
+
+ if (!drawBuffer)
+ {
+ ERR("Failed to retrieve the draw depth-stencil buffer from the draw framebuffer.");
+ return gl::error(GL_OUT_OF_MEMORY, false);
+ }
+
+ RenderTarget *readRenderTarget = readBuffer->getDepthStencil();
+ RenderTarget *drawRenderTarget = drawBuffer->getDepthStencil();
+
+ if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget))
+ {
+ return false;
+ }
}
return true;
@@ -3355,122 +3398,64 @@
stagingTex = NULL;
}
-bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget,
- const gl::Rectangle &drawRect, BlitTarget target)
+bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget)
{
- // TODO: mrt support
ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height);
- gl::Renderbuffer *readBuffer = NULL;
- switch (target)
+ RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget);
+ if (!readRenderTarget)
{
- case BLIT_RENDERTARGET:
- readBuffer = readTarget->getColorbuffer(0);
- break;
- case BLIT_DEPTHSTENCIL:
- readBuffer = readTarget->getDepthOrStencilbuffer();
- break;
- default: UNREACHABLE();
- }
- if (!readBuffer)
- {
- ERR("Failed to retrieve the color buffer from the read target.");
+ ERR("Failed to retrieve the read render target from the read framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
- RenderTarget11 *sourceRenderTarget = NULL;
- switch (target)
+ ID3D11Texture2D *readTexture = NULL;
+ unsigned int readSubresource = 0;
+ if (readRenderTarget->getSamples() > 0)
{
- case BLIT_RENDERTARGET:
- sourceRenderTarget = RenderTarget11::makeRenderTarget11(readBuffer->getRenderTarget());
- break;
- case BLIT_DEPTHSTENCIL:
- sourceRenderTarget = RenderTarget11::makeRenderTarget11(readBuffer->getDepthStencil());
- break;
- default: UNREACHABLE();
- }
- if (!sourceRenderTarget)
- {
- ERR("Failed to retrieve the render target from the frame buffer.");
- return gl::error(GL_OUT_OF_MEMORY, false);
- }
+ ID3D11Texture2D *unresolvedTexture = readRenderTarget11->getTexture();
- ID3D11Texture2D *source = NULL;
- unsigned int sourceSubresource = 0;
- if (sourceRenderTarget->getSamples() > 0)
- {
- ID3D11Texture2D *unresolvedTexture = sourceRenderTarget->getTexture();
-
- source = resolveMultisampledTexture(unresolvedTexture, sourceRenderTarget->getSubresourceIndex());
- sourceSubresource = 0;
+ readTexture = resolveMultisampledTexture(unresolvedTexture, readRenderTarget11->getSubresourceIndex());
+ readSubresource = 0;
unresolvedTexture->Release();
}
else
{
- source = sourceRenderTarget->getTexture();
- sourceSubresource = sourceRenderTarget->getSubresourceIndex();
+ readTexture = readRenderTarget11->getTexture();
+ readSubresource = readRenderTarget11->getSubresourceIndex();
}
- if (!source)
+ if (!readTexture)
{
- ERR("Failed to retrieve the render target view from the render target.");
+ ERR("Failed to retrieve the read render target view from the read render target.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
-
- gl::Renderbuffer *drawBuffer = NULL;
- switch (target)
- {
- case BLIT_RENDERTARGET:
- drawBuffer = drawTarget->getColorbuffer(0);
- break;
- case BLIT_DEPTHSTENCIL:
- drawBuffer = drawTarget->getDepthOrStencilbuffer();
- break;
- default: UNREACHABLE();
- }
- if (!drawBuffer)
- {
- source->Release();
- ERR("Failed to retrieve the color buffer from the draw buffer.");
- return gl::error(GL_OUT_OF_MEMORY, false);
- }
-
- RenderTarget11 *drawRenderTarget = NULL;
- switch (target)
- {
- case BLIT_RENDERTARGET:
- drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getRenderTarget());
- break;
- case BLIT_DEPTHSTENCIL:
- drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getDepthStencil());
- break;
- default: UNREACHABLE();
- }
+ RenderTarget11 *drawRenderTarget11 = RenderTarget11::makeRenderTarget11(drawRenderTarget);
if (!drawRenderTarget)
{
- source->Release();
- ERR("Failed to retrieve the render target from the render buffer.");
+ readTexture->Release();
+ ERR("Failed to retrieve the draw render target from the draw framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
- ID3D11Texture2D *dest = drawRenderTarget->getTexture();
- unsigned int destSubresource = drawRenderTarget->getSubresourceIndex();
+ ID3D11Texture2D *drawTexture = drawRenderTarget11->getTexture();
+ unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
- D3D11_BOX srcBox;
- srcBox.left = readRect.x;
- srcBox.right = readRect.x + readRect.width;
- srcBox.top = readRect.y;
- srcBox.bottom = readRect.y + readRect.height;
- srcBox.front = 0;
- srcBox.back = 1;
+ D3D11_BOX readBox;
+ readBox.left = readRect.x;
+ readBox.right = readRect.x + readRect.width;
+ readBox.top = readRect.y;
+ readBox.bottom = readRect.y + readRect.height;
+ readBox.front = 0;
+ readBox.back = 1;
- mDeviceContext->CopySubresourceRegion(dest, destSubresource, drawRect.x, drawRect.y, 0,
- source, sourceSubresource, &srcBox);
+ mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0,
+ readTexture, readSubresource, &readBox);
- source->Release();
- dest->Release();
+ readTexture->Release();
+ drawTexture->Release();
return true;
}