Use ANGLE's rect instead of D3D's in blitFramebuffer.

TRAC #22093 Signed-off-by: Geoff Lang Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1443 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 39cee2e7
...@@ -3592,146 +3592,157 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1 ...@@ -3592,146 +3592,157 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
int drawBufferWidth = drawFramebuffer->getColorbuffer()->getWidth(); int drawBufferWidth = drawFramebuffer->getColorbuffer()->getWidth();
int drawBufferHeight = drawFramebuffer->getColorbuffer()->getHeight(); int drawBufferHeight = drawFramebuffer->getColorbuffer()->getHeight();
RECT sourceRect; Rectangle sourceRect;
RECT destRect; Rectangle destRect;
if (srcX0 < srcX1) if (srcX0 < srcX1)
{ {
sourceRect.left = srcX0; sourceRect.x = srcX0;
sourceRect.right = srcX1; destRect.x = dstX0;
destRect.left = dstX0; sourceRect.width = srcX1 - srcX0;
destRect.right = dstX1; destRect.width = dstX1 - dstX0;
} }
else else
{ {
sourceRect.left = srcX1; sourceRect.x = srcX1;
destRect.left = dstX1; destRect.x = dstX1;
sourceRect.right = srcX0; sourceRect.width = srcX0 - srcX1;
destRect.right = dstX0; destRect.width = dstX0 - dstX1;
} }
if (srcY0 < srcY1) if (srcY0 < srcY1)
{ {
sourceRect.bottom = srcY1; sourceRect.height = srcY1 - srcY0;
destRect.bottom = dstY1; destRect.height = dstY1 - dstY0;
sourceRect.top = srcY0; sourceRect.y = srcY0;
destRect.top = dstY0; destRect.y = dstY0;
} }
else else
{ {
sourceRect.bottom = srcY0; sourceRect.height = srcY0 - srcY1;
destRect.bottom = dstY0; destRect.height = dstY0 - srcY1;
sourceRect.top = srcY1; sourceRect.y = srcY1;
destRect.top = dstY1; destRect.y = dstY1;
} }
RECT sourceScissoredRect = sourceRect; Rectangle sourceScissoredRect = sourceRect;
RECT destScissoredRect = destRect; Rectangle destScissoredRect = destRect;
if (mState.rasterizer.scissorTest) if (mState.rasterizer.scissorTest)
{ {
// Only write to parts of the destination framebuffer which pass the scissor test // Only write to parts of the destination framebuffer which pass the scissor test.
// Please note: the destRect is now in D3D-style coordinates, so the *top* of the if (destRect.x < mState.scissor.x)
// rect will be checked against scissorY, rather than the bottom.
if (destRect.left < mState.scissor.x)
{ {
int xDiff = mState.scissor.x - destRect.left; int xDiff = mState.scissor.x - destRect.x;
destScissoredRect.left = mState.scissor.x; destScissoredRect.x = mState.scissor.x;
sourceScissoredRect.left += xDiff; destScissoredRect.width -= xDiff;
sourceScissoredRect.x += xDiff;
sourceScissoredRect.width -= xDiff;
} }
if (destRect.right > mState.scissor.x + mState.scissor.width) if (destRect.x + destRect.width > mState.scissor.x + mState.scissor.width)
{ {
int xDiff = destRect.right - (mState.scissor.x + mState.scissor.width); int xDiff = (destRect.x + destRect.width) - (mState.scissor.x + mState.scissor.width);
destScissoredRect.right = mState.scissor.x + mState.scissor.width; destScissoredRect.width -= xDiff;
sourceScissoredRect.right -= xDiff; sourceScissoredRect.width -= xDiff;
} }
if (destRect.top < mState.scissor.y) if (destRect.y < mState.scissor.y)
{ {
int yDiff = mState.scissor.y - destRect.top; int yDiff = mState.scissor.y - destRect.y;
destScissoredRect.top = mState.scissor.y; destScissoredRect.y = mState.scissor.y;
sourceScissoredRect.top += yDiff; destScissoredRect.height -= yDiff;
sourceScissoredRect.y += yDiff;
sourceScissoredRect.height -= yDiff;
} }
if (destRect.bottom > mState.scissor.y + mState.scissor.height) if (destRect.y + destRect.height > mState.scissor.y + mState.scissor.height)
{ {
int yDiff = destRect.bottom - (mState.scissor.y + mState.scissor.height); int yDiff = (destRect.y + destRect.height) - (mState.scissor.y + mState.scissor.height);
destScissoredRect.bottom = mState.scissor.y + mState.scissor.height; destScissoredRect.height -= yDiff;
sourceScissoredRect.bottom -= yDiff; sourceScissoredRect.height -= yDiff;
} }
} }
bool blitRenderTarget = false; bool blitRenderTarget = false;
bool blitDepthStencil = false; bool blitDepthStencil = false;
RECT sourceTrimmedRect = sourceScissoredRect; Rectangle sourceTrimmedRect = sourceScissoredRect;
RECT destTrimmedRect = destScissoredRect; Rectangle destTrimmedRect = destScissoredRect;
// The source & destination rectangles also may need to be trimmed if they fall out of the bounds of // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of
// the actual draw and read surfaces. // the actual draw and read surfaces.
if (sourceTrimmedRect.left < 0) if (sourceTrimmedRect.x < 0)
{ {
int xDiff = 0 - sourceTrimmedRect.left; int xDiff = 0 - sourceTrimmedRect.x;
sourceTrimmedRect.left = 0; sourceTrimmedRect.x = 0;
destTrimmedRect.left += xDiff; sourceTrimmedRect.width -= xDiff;
destTrimmedRect.x += xDiff;
destTrimmedRect.width -= xDiff;
} }
if (sourceTrimmedRect.right > readBufferWidth) if (sourceTrimmedRect.x + sourceTrimmedRect.width > readBufferWidth)
{ {
int xDiff = sourceTrimmedRect.right - readBufferWidth; int xDiff = (sourceTrimmedRect.x + sourceTrimmedRect.width) - readBufferWidth;
sourceTrimmedRect.right = readBufferWidth; sourceTrimmedRect.width -= xDiff;
destTrimmedRect.right -= xDiff; destTrimmedRect.width -= xDiff;
} }
if (sourceTrimmedRect.top < 0) if (sourceTrimmedRect.y < 0)
{ {
int yDiff = 0 - sourceTrimmedRect.top; int yDiff = 0 - sourceTrimmedRect.y;
sourceTrimmedRect.top = 0; sourceTrimmedRect.y = 0;
destTrimmedRect.top += yDiff; sourceTrimmedRect.height -= yDiff;
destTrimmedRect.y += yDiff;
destTrimmedRect.height -= yDiff;
} }
if (sourceTrimmedRect.bottom > readBufferHeight) if (sourceTrimmedRect.y + sourceTrimmedRect.height > readBufferHeight)
{ {
int yDiff = sourceTrimmedRect.bottom - readBufferHeight; int yDiff = (sourceTrimmedRect.y + sourceTrimmedRect.height) - readBufferHeight;
sourceTrimmedRect.bottom = readBufferHeight; sourceTrimmedRect.height -= yDiff;
destTrimmedRect.bottom -= yDiff; destTrimmedRect.height -= yDiff;
} }
if (destTrimmedRect.left < 0) if (destTrimmedRect.x < 0)
{ {
int xDiff = 0 - destTrimmedRect.left; int xDiff = 0 - destTrimmedRect.x;
destTrimmedRect.left = 0; destTrimmedRect.x = 0;
sourceTrimmedRect.left += xDiff; destTrimmedRect.width -= xDiff;
sourceTrimmedRect.x += xDiff;
sourceTrimmedRect.width -= xDiff;
} }
if (destTrimmedRect.right > drawBufferWidth) if (destTrimmedRect.x + destTrimmedRect.width > drawBufferWidth)
{ {
int xDiff = destTrimmedRect.right - drawBufferWidth; int xDiff = (destTrimmedRect.x + destTrimmedRect.width) - drawBufferWidth;
destTrimmedRect.right = drawBufferWidth; destTrimmedRect.width -= xDiff;
sourceTrimmedRect.right -= xDiff; sourceTrimmedRect.width -= xDiff;
} }
if (destTrimmedRect.top < 0) if (destTrimmedRect.y < 0)
{ {
int yDiff = 0 - destTrimmedRect.top; int yDiff = 0 - destTrimmedRect.y;
destTrimmedRect.top = 0; destTrimmedRect.y = 0;
sourceTrimmedRect.top += yDiff; destTrimmedRect.height -= yDiff;
sourceTrimmedRect.y += yDiff;
sourceTrimmedRect.height -= yDiff;
} }
if (destTrimmedRect.bottom > drawBufferHeight) if (destTrimmedRect.y + destTrimmedRect.height > drawBufferHeight)
{ {
int yDiff = destTrimmedRect.bottom - drawBufferHeight; int yDiff = (destTrimmedRect.y + destTrimmedRect.height) - drawBufferHeight;
destTrimmedRect.bottom = drawBufferHeight; destTrimmedRect.height -= yDiff;
sourceTrimmedRect.bottom -= yDiff; sourceTrimmedRect.height -= yDiff;
} }
bool partialBufferCopy = false; bool partialBufferCopy = false;
if (sourceTrimmedRect.bottom - sourceTrimmedRect.top < readBufferHeight || if (sourceTrimmedRect.height < readBufferHeight ||
sourceTrimmedRect.right - sourceTrimmedRect.left < readBufferWidth || sourceTrimmedRect.width < readBufferWidth ||
destTrimmedRect.bottom - destTrimmedRect.top < drawBufferHeight || destTrimmedRect.height < drawBufferHeight ||
destTrimmedRect.right - destTrimmedRect.left < drawBufferWidth || destTrimmedRect.width < drawBufferWidth ||
sourceTrimmedRect.top != 0 || destTrimmedRect.top != 0 || sourceTrimmedRect.left != 0 || destTrimmedRect.left != 0) sourceTrimmedRect.y != 0 || destTrimmedRect.y != 0 || sourceTrimmedRect.x != 0 || destTrimmedRect.x != 0)
{ {
partialBufferCopy = true; partialBufferCopy = true;
} }
...@@ -3820,8 +3831,19 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1 ...@@ -3820,8 +3831,19 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
IDirect3DSurface9* readRenderTarget = readFramebuffer->getRenderTarget(); IDirect3DSurface9* readRenderTarget = readFramebuffer->getRenderTarget();
IDirect3DSurface9* drawRenderTarget = drawFramebuffer->getRenderTarget(); IDirect3DSurface9* drawRenderTarget = drawFramebuffer->getRenderTarget();
HRESULT result = mDevice->StretchRect(readRenderTarget, &sourceTrimmedRect, RECT finalSrcRect, finalDstRect; // TEMPORARY
drawRenderTarget, &destTrimmedRect, D3DTEXF_NONE); finalSrcRect.left = sourceTrimmedRect.x;
finalSrcRect.right = sourceTrimmedRect.x + sourceTrimmedRect.width;
finalSrcRect.top = sourceTrimmedRect.y;
finalSrcRect.bottom = sourceTrimmedRect.y + sourceTrimmedRect.height;
finalDstRect.left = destTrimmedRect.x;
finalDstRect.right = destTrimmedRect.x + destTrimmedRect.width;
finalDstRect.top = destTrimmedRect.y;
finalDstRect.bottom = destTrimmedRect.y + destTrimmedRect.height;
HRESULT result = mDevice->StretchRect(readRenderTarget, &finalSrcRect,
drawRenderTarget, &finalDstRect, D3DTEXF_NONE);
readRenderTarget->Release(); readRenderTarget->Release();
drawRenderTarget->Release(); drawRenderTarget->Release();
......
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