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,
{
ANGLE_TRY(initResources());
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
TextureHelper11 sourceStaging;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, source.getFormatSet(), sourceSize,
StagingAccess::READ, device),
ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, source.getFormatSet(),
sourceSize, StagingAccess::READ),
sourceStaging);
deviceContext->CopySubresourceRegion(sourceStaging.getResource(), 0, 0, 0, 0,
......@@ -1602,15 +1601,14 @@ gl::Error Blit11::copyAndConvert(const TextureHelper11 &source,
{
ANGLE_TRY(initResources());
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
// HACK: Create the destination staging buffer as a read/write texture so
// ID3D11DevicContext::UpdateSubresource can be called
// using it's mapped data as a source
TextureHelper11 destStaging;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, dest.getFormatSet(), destSize,
StagingAccess::READ_WRITE, device),
ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, dest.getFormatSet(), destSize,
StagingAccess::READ_WRITE),
destStaging);
deviceContext->CopySubresourceRegion(destStaging.getResource(), 0, 0, 0, 0, dest.getResource(),
......@@ -2273,8 +2271,8 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1);
TextureHelper11 dest;
ANGLE_TRY_RESULT(CreateStagingTexture(GL_TEXTURE_2D, depthStencil->getFormatSet(), extents,
StagingAccess::READ_WRITE, device),
ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, depthStencil->getFormatSet(),
extents, StagingAccess::READ_WRITE),
dest);
const auto &copyFunction = GetCopyDepthStencilFunction(depthStencil->getInternalFormat());
......
......@@ -1465,8 +1465,8 @@ gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &rea
mStagingTexture.getExtents() != srcTextureSize)
{
ANGLE_TRY_RESULT(
CreateStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(),
srcTextureSize, StagingAccess::READ, mRenderer->getDevice()),
mRenderer->createStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(),
srcTextureSize, StagingAccess::READ),
mStagingTexture);
}
......
......@@ -4119,8 +4119,8 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
gl::Extents safeSize(safeArea.width, safeArea.height, 1);
TextureHelper11 stagingHelper;
ANGLE_TRY_RESULT(
CreateStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize,
StagingAccess::READ, mDevice),
createStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize,
StagingAccess::READ),
stagingHelper);
TextureHelper11 resolvedTextureHelper;
......@@ -4991,4 +4991,62 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
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
......@@ -404,6 +404,11 @@ class Renderer11 : public RendererD3D
const std::vector<D3DUniform *> &uniformArray) override;
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>
gl::Error allocateResource(const DescT &desc, InitDataT *initData, ResourceT *resourceOut)
{
......
......@@ -2179,66 +2179,6 @@ bool TextureHelper11::valid() const
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,
const gl::FramebufferAttachment *framebufferAttachment)
{
......
......@@ -405,12 +405,6 @@ enum class StagingAccess
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);
// 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