Commit 9d7d719c by Jamie Madill Committed by Commit Bot

D3D11: Move CreateStagingTexture to Renderer11.

This will make staging texture tracking easier. BUG=angleproject:2034 Change-Id: I2f0418cc5784100bf6fba59b4bda1b2dd9dc18d1 Reviewed-on: https://chromium-review.googlesource.com/503251Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 4f0e003e
...@@ -1533,12 +1533,11 @@ gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source, ...@@ -1533,12 +1533,11 @@ gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source,
{ {
ANGLE_TRY(initResources()); ANGLE_TRY(initResources());
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
TextureHelper11 sourceStaging; TextureHelper11 sourceStaging;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, source.getFormatSet(), sourceSize, ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, source.getFormatSet(),
StagingAccess::READ, device), sourceSize, StagingAccess::READ),
sourceStaging); sourceStaging);
deviceContext->CopySubresourceRegion(sourceStaging.getResource(), 0, 0, 0, 0, deviceContext->CopySubresourceRegion(sourceStaging.getResource(), 0, 0, 0, 0,
...@@ -1602,15 +1601,14 @@ gl::Error Blit11::copyAndConvert(const TextureHelper11 &source, ...@@ -1602,15 +1601,14 @@ gl::Error Blit11::copyAndConvert(const TextureHelper11 &source,
{ {
ANGLE_TRY(initResources()); ANGLE_TRY(initResources());
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
// HACK: Create the destination staging buffer as a read/write texture so // HACK: Create the destination staging buffer as a read/write texture so
// ID3D11DevicContext::UpdateSubresource can be called // ID3D11DevicContext::UpdateSubresource can be called
// using it's mapped data as a source // using it's mapped data as a source
TextureHelper11 destStaging; TextureHelper11 destStaging;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, dest.getFormatSet(), destSize, ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, dest.getFormatSet(), destSize,
StagingAccess::READ_WRITE, device), StagingAccess::READ_WRITE),
destStaging); destStaging);
deviceContext->CopySubresourceRegion(destStaging.getResource(), 0, 0, 0, 0, dest.getResource(), deviceContext->CopySubresourceRegion(destStaging.getResource(), 0, 0, 0, 0, dest.getResource(),
...@@ -2273,8 +2271,8 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS ...@@ -2273,8 +2271,8 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1); gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1);
TextureHelper11 dest; TextureHelper11 dest;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, depthStencil->getFormatSet(), extents, ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, depthStencil->getFormatSet(),
StagingAccess::READ_WRITE, device), extents, StagingAccess::READ_WRITE),
dest); dest);
const auto &copyFunction = GetCopyDepthStencilFunction(depthStencil->getInternalFormat()); const auto &copyFunction = GetCopyDepthStencilFunction(depthStencil->getInternalFormat());
......
...@@ -1465,8 +1465,8 @@ gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &rea ...@@ -1465,8 +1465,8 @@ gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &rea
mStagingTexture.getExtents() != srcTextureSize) mStagingTexture.getExtents() != srcTextureSize)
{ {
ANGLE_TRY_RESULT( ANGLE_TRY_RESULT(
CreateStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(), mRenderer->createStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(),
srcTextureSize, StagingAccess::READ, mRenderer->getDevice()), srcTextureSize, StagingAccess::READ),
mStagingTexture); mStagingTexture);
} }
......
...@@ -4119,8 +4119,8 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt ...@@ -4119,8 +4119,8 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
gl::Extents safeSize(safeArea.width, safeArea.height, 1); gl::Extents safeSize(safeArea.width, safeArea.height, 1);
TextureHelper11 stagingHelper; TextureHelper11 stagingHelper;
ANGLE_TRY_RESULT( ANGLE_TRY_RESULT(
CreateStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize, createStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize,
StagingAccess::READ, mDevice), StagingAccess::READ),
stagingHelper); stagingHelper);
TextureHelper11 resolvedTextureHelper; TextureHelper11 resolvedTextureHelper;
...@@ -4991,4 +4991,62 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D, ...@@ -4991,4 +4991,62 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
return gl::NoError(); return gl::NoError();
} }
gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture(
GLenum textureType,
const d3d11::Format &formatSet,
const gl::Extents &size,
StagingAccess readAndWriteAccess)
{
if (textureType == GL_TEXTURE_2D)
{
D3D11_TEXTURE2D_DESC stagingDesc;
stagingDesc.Width = size.width;
stagingDesc.Height = size.height;
stagingDesc.MipLevels = 1;
stagingDesc.ArraySize = 1;
stagingDesc.Format = formatSet.texFormat;
stagingDesc.SampleDesc.Count = 1;
stagingDesc.SampleDesc.Quality = 0;
stagingDesc.Usage = D3D11_USAGE_STAGING;
stagingDesc.BindFlags = 0;
stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
stagingDesc.MiscFlags = 0;
if (readAndWriteAccess == StagingAccess::READ_WRITE)
{
stagingDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE;
}
ID3D11Texture2D *stagingTex = nullptr;
HRESULT result = mDevice->CreateTexture2D(&stagingDesc, nullptr, &stagingTex);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "createStagingTexture failed, HRESULT: 0x%X.",
result);
}
return TextureHelper11::MakeAndPossess2D(stagingTex, formatSet);
}
ASSERT(textureType == GL_TEXTURE_3D);
D3D11_TEXTURE3D_DESC stagingDesc;
stagingDesc.Width = size.width;
stagingDesc.Height = size.height;
stagingDesc.Depth = 1;
stagingDesc.MipLevels = 1;
stagingDesc.Format = formatSet.texFormat;
stagingDesc.Usage = D3D11_USAGE_STAGING;
stagingDesc.BindFlags = 0;
stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
stagingDesc.MiscFlags = 0;
ID3D11Texture3D *stagingTex = nullptr;
HRESULT result = mDevice->CreateTexture3D(&stagingDesc, nullptr, &stagingTex);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "createStagingTexture failed, HRESULT: 0x%X.", result);
}
return TextureHelper11::MakeAndPossess3D(stagingTex, formatSet);
}
} // namespace rx } // namespace rx
...@@ -404,6 +404,11 @@ class Renderer11 : public RendererD3D ...@@ -404,6 +404,11 @@ class Renderer11 : public RendererD3D
const std::vector<D3DUniform *> &uniformArray) override; const std::vector<D3DUniform *> &uniformArray) override;
gl::Error applyComputeShader(const gl::ContextState &data); gl::Error applyComputeShader(const gl::ContextState &data);
gl::ErrorOrResult<TextureHelper11> createStagingTexture(GLenum textureType,
const d3d11::Format &formatSet,
const gl::Extents &size,
StagingAccess readAndWriteAccess);
template <typename DescT, typename InitDataT, typename ResourceT> template <typename DescT, typename InitDataT, typename ResourceT>
gl::Error allocateResource(const DescT &desc, InitDataT *initData, ResourceT *resourceOut) gl::Error allocateResource(const DescT &desc, InitDataT *initData, ResourceT *resourceOut)
{ {
......
...@@ -2179,66 +2179,6 @@ bool TextureHelper11::valid() const ...@@ -2179,66 +2179,6 @@ bool TextureHelper11::valid() const
return (mTextureType != GL_NONE); return (mTextureType != GL_NONE);
} }
gl::ErrorOrResult<TextureHelper11> CreateStagingTexture(GLenum textureType,
const d3d11::Format &formatSet,
const gl::Extents &size,
StagingAccess readAndWriteAccess,
ID3D11Device *device)
{
if (textureType == GL_TEXTURE_2D)
{
D3D11_TEXTURE2D_DESC stagingDesc;
stagingDesc.Width = size.width;
stagingDesc.Height = size.height;
stagingDesc.MipLevels = 1;
stagingDesc.ArraySize = 1;
stagingDesc.Format = formatSet.texFormat;
stagingDesc.SampleDesc.Count = 1;
stagingDesc.SampleDesc.Quality = 0;
stagingDesc.Usage = D3D11_USAGE_STAGING;
stagingDesc.BindFlags = 0;
stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
stagingDesc.MiscFlags = 0;
if (readAndWriteAccess == StagingAccess::READ_WRITE)
{
stagingDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE;
}
ID3D11Texture2D *stagingTex = nullptr;
HRESULT result = device->CreateTexture2D(&stagingDesc, nullptr, &stagingTex);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "CreateStagingTextureFor failed, HRESULT: 0x%X.",
result);
}
return TextureHelper11::MakeAndPossess2D(stagingTex, formatSet);
}
ASSERT(textureType == GL_TEXTURE_3D);
D3D11_TEXTURE3D_DESC stagingDesc;
stagingDesc.Width = size.width;
stagingDesc.Height = size.height;
stagingDesc.Depth = 1;
stagingDesc.MipLevels = 1;
stagingDesc.Format = formatSet.texFormat;
stagingDesc.Usage = D3D11_USAGE_STAGING;
stagingDesc.BindFlags = 0;
stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
stagingDesc.MiscFlags = 0;
ID3D11Texture3D *stagingTex = nullptr;
HRESULT result = device->CreateTexture3D(&stagingDesc, nullptr, &stagingTex);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "CreateStagingTextureFor failed, HRESULT: 0x%X.",
result);
}
return TextureHelper11::MakeAndPossess3D(stagingTex, formatSet);
}
bool UsePresentPathFast(const Renderer11 *renderer, bool UsePresentPathFast(const Renderer11 *renderer,
const gl::FramebufferAttachment *framebufferAttachment) const gl::FramebufferAttachment *framebufferAttachment)
{ {
......
...@@ -405,12 +405,6 @@ enum class StagingAccess ...@@ -405,12 +405,6 @@ enum class StagingAccess
READ_WRITE, READ_WRITE,
}; };
gl::ErrorOrResult<TextureHelper11> CreateStagingTexture(GLenum textureType,
const d3d11::Format &formatSet,
const gl::Extents &size,
StagingAccess readAndWriteAccess,
ID3D11Device *device);
bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer); bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer);
// Used for state change notifications between buffers and vertex arrays. // Used for state change notifications between buffers and vertex arrays.
......
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