Commit c1f51be4 by Geoff Lang Committed by Shannon Woods

Renderer11::blitRenderbufferRect now can handle stretching a blit rectangle and…

Renderer11::blitRenderbufferRect now can handle stretching a blit rectangle and different interpolation methods. TRAC #23211 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang
parent 758d5b21
...@@ -3293,7 +3293,7 @@ void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResou ...@@ -3293,7 +3293,7 @@ void Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResou
bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget, bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTarget *readRenderTarget,
RenderTarget *drawRenderTarget, GLenum filter) RenderTarget *drawRenderTarget, GLenum filter)
{ {
ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height); bool result = true;
RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget); RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget);
if (!readRenderTarget) if (!readRenderTarget)
...@@ -3303,6 +3303,7 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3303,6 +3303,7 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
} }
ID3D11Resource *readTexture = NULL; ID3D11Resource *readTexture = NULL;
ID3D11ShaderResourceView *readSRV = NULL;
unsigned int readSubresource = 0; unsigned int readSubresource = 0;
if (readRenderTarget->getSamples() > 0) if (readRenderTarget->getSamples() > 0)
{ {
...@@ -3316,12 +3317,20 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3316,12 +3317,20 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
readSubresource = 0; readSubresource = 0;
unresolvedTexture->Release(); unresolvedTexture->Release();
HRESULT result = mDevice->CreateShaderResourceView(readTexture, NULL, &readSRV);
if (FAILED(result))
{
readTexture->Release();
return gl::error(GL_OUT_OF_MEMORY, false);
}
} }
} }
else else
{ {
readTexture = readRenderTarget11->getTexture(); readTexture = readRenderTarget11->getTexture();
readSubresource = readRenderTarget11->getSubresourceIndex(); readSubresource = readRenderTarget11->getSubresourceIndex();
readSRV = readRenderTarget11->getShaderResourceView();
} }
if (!readTexture) if (!readTexture)
...@@ -3340,30 +3349,65 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3340,30 +3349,65 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
ID3D11Resource *drawTexture = drawRenderTarget11->getTexture(); ID3D11Resource *drawTexture = drawRenderTarget11->getTexture();
unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex(); unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
ID3D11RenderTargetView *drawRTV = drawRenderTarget11->getRenderTargetView();
ID3D11DepthStencilView *drawDSV = drawRenderTarget11->getDepthStencilView();
D3D11_BOX readBox; bool wholeBufferCopy = readRect.x == 0 && readRect.width == readRenderTarget11->getWidth() &&
readBox.left = readRect.x; readRect.y == 0 && readRect.height == readRenderTarget11->getHeight() &&
readBox.right = readRect.x + readRect.width; drawRect.x == 0 && drawRect.width == drawRenderTarget->getWidth() &&
readBox.top = readRect.y; drawRect.y == 0 && drawRect.height == drawRenderTarget->getHeight();
readBox.bottom = readRect.y + readRect.height;
readBox.front = 0;
readBox.back = 1;
bool wholeBufferCopy = readRect.x == 0 && readRect.y == 0 && bool stretchRequired = readRect.width != drawRect.width || readRect.height != drawRect.height;
readRect.width == readRenderTarget->getWidth() &&
readRect.height == readRenderTarget->getHeight();
// D3D11 needs depth-stencil CopySubresourceRegions to have a NULL pSrcBox bool depthStencilBlit = gl::GetDepthBits(readRenderTarget->getInternalFormat(), getCurrentClientVersion()) > 0 ||
// We also require complete framebuffer copies for depth-stencil blit. gl::GetStencilBits(readRenderTarget->getInternalFormat(), getCurrentClientVersion()) > 0;
D3D11_BOX *pSrcBox = wholeBufferCopy ? NULL : &readBox;
mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0, if (readRenderTarget11->getActualFormat() == drawRenderTarget->getActualFormat() &&
readTexture, readSubresource, pSrcBox); !stretchRequired && (!depthStencilBlit || wholeBufferCopy))
{
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;
readTexture->Release(); // D3D11 needs depth-stencil CopySubresourceRegions to have a NULL pSrcBox
drawTexture->Release(); // We also require complete framebuffer copies for depth-stencil blit.
D3D11_BOX *pSrcBox = wholeBufferCopy ? NULL : &readBox;
return true; mDeviceContext->CopySubresourceRegion(drawTexture, drawSubresource, drawRect.x, drawRect.y, 0,
readTexture, readSubresource, pSrcBox);
result = true;
}
else
{
gl::Box readArea(readRect.x, readRect.y, 0, readRect.width, readRect.height, 1);
gl::Extents readSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1);
gl::Box drawArea(drawRect.x, drawRect.y, 0, drawRect.width, drawRect.height, 1);
gl::Extents drawSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1);
GLenum format = gl::GetFormat(drawRenderTarget->getInternalFormat(), getCurrentClientVersion());
if (depthStencilBlit)
{
UNIMPLEMENTED();
}
else
{
result = mBlit->copyTexture(readSRV, readArea, readSize, drawRTV, drawArea, drawSize, format, filter);
}
}
SafeRelease(readTexture);
SafeRelease(readSRV);
SafeRelease(drawTexture);
SafeRelease(drawRTV);
SafeRelease(drawDSV);
return result;
} }
ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource) ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource)
......
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