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
parent f9686c21
...@@ -2920,14 +2920,57 @@ bool Renderer11::getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned ...@@ -2920,14 +2920,57 @@ bool Renderer11::getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned
bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect, bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect,
bool blitRenderTarget, bool blitDepthStencil) 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; return true;
...@@ -3355,122 +3398,64 @@ void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResou ...@@ -3355,122 +3398,64 @@ void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResou
stagingTex = NULL; stagingTex = NULL;
} }
bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget)
const gl::Rectangle &drawRect, BlitTarget target)
{ {
// TODO: mrt support
ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height); ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height);
gl::Renderbuffer *readBuffer = NULL; RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget);
switch (target) 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.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *sourceRenderTarget = NULL;
switch (target)
{
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."); ERR("Failed to retrieve the read render target from the read framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
ID3D11Texture2D *source = NULL; ID3D11Texture2D *readTexture = NULL;
unsigned int sourceSubresource = 0; unsigned int readSubresource = 0;
if (sourceRenderTarget->getSamples() > 0) if (readRenderTarget->getSamples() > 0)
{ {
ID3D11Texture2D *unresolvedTexture = sourceRenderTarget->getTexture(); ID3D11Texture2D *unresolvedTexture = readRenderTarget11->getTexture();
source = resolveMultisampledTexture(unresolvedTexture, sourceRenderTarget->getSubresourceIndex()); readTexture = resolveMultisampledTexture(unresolvedTexture, readRenderTarget11->getSubresourceIndex());
sourceSubresource = 0; readSubresource = 0;
unresolvedTexture->Release(); unresolvedTexture->Release();
} }
else else
{ {
source = sourceRenderTarget->getTexture(); readTexture = readRenderTarget11->getTexture();
sourceSubresource = sourceRenderTarget->getSubresourceIndex(); readSubresource = readRenderTarget11->getSubresourceIndex();
} }
if (!source) if (!readTexture)
{
ERR("Failed to retrieve the render target view from the 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 read render target view from the read render target.");
ERR("Failed to retrieve the color buffer from the draw buffer.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
RenderTarget11 *drawRenderTarget = NULL; RenderTarget11 *drawRenderTarget11 = RenderTarget11::makeRenderTarget11(drawRenderTarget);
switch (target)
{
case BLIT_RENDERTARGET:
drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getRenderTarget());
break;
case BLIT_DEPTHSTENCIL:
drawRenderTarget = RenderTarget11::makeRenderTarget11(drawBuffer->getDepthStencil());
break;
default: UNREACHABLE();
}
if (!drawRenderTarget) if (!drawRenderTarget)
{ {
source->Release(); readTexture->Release();
ERR("Failed to retrieve the render target from the render buffer."); ERR("Failed to retrieve the draw render target from the draw framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
ID3D11Texture2D *dest = drawRenderTarget->getTexture(); ID3D11Texture2D *drawTexture = drawRenderTarget11->getTexture();
unsigned int destSubresource = drawRenderTarget->getSubresourceIndex(); unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
D3D11_BOX srcBox; D3D11_BOX readBox;
srcBox.left = readRect.x; readBox.left = readRect.x;
srcBox.right = readRect.x + readRect.width; readBox.right = readRect.x + readRect.width;
srcBox.top = readRect.y; readBox.top = readRect.y;
srcBox.bottom = readRect.y + readRect.height; readBox.bottom = readRect.y + readRect.height;
srcBox.front = 0; readBox.front = 0;
srcBox.back = 1; readBox.back = 1;
mDeviceContext->CopySubresourceRegion(dest, destSubresource, drawRect.x, drawRect.y, 0, mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0,
source, sourceSubresource, &srcBox); readTexture, readSubresource, &readBox);
source->Release(); readTexture->Release();
dest->Release(); drawTexture->Release();
return true; return true;
} }
......
...@@ -185,12 +185,6 @@ class Renderer11 : public Renderer ...@@ -185,12 +185,6 @@ class Renderer11 : public Renderer
private: private:
DISALLOW_COPY_AND_ASSIGN(Renderer11); DISALLOW_COPY_AND_ASSIGN(Renderer11);
enum BlitTarget
{
BLIT_RENDERTARGET,
BLIT_DEPTHSTENCIL,
};
void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances); void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances);
...@@ -201,8 +195,7 @@ class Renderer11 : public Renderer ...@@ -201,8 +195,7 @@ class Renderer11 : public Renderer
void maskedClear(const gl::ClearParameters &clearParams); void maskedClear(const gl::ClearParameters &clearParams);
rx::Range getViewportBounds() const; rx::Range getViewportBounds() const;
bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, bool blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, RenderTarget *drawRenderTarget);
const gl::Rectangle &drawRect, BlitTarget target);
ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource); ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
HMODULE mD3d11Module; HMODULE mD3d11Module;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment