Commit d787e50b by Jamie Madill Committed by Commit Bot

Try more to use ANGLE_TRY.

Also refactor the Renderer11::copyImage functions to share code. BUG=angleproject:1384 Change-Id: I95f4266c0c9b67a13cba17797989fcc0b0d50c1d Reviewed-on: https://chromium-review.googlesource.com/347248Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 093a4c3c
...@@ -755,19 +755,12 @@ gl::Error TextureD3D_2D::setImage(GLenum target, ...@@ -755,19 +755,12 @@ gl::Error TextureD3D_2D::setImage(GLenum target,
{ {
// Will try to create RT storage if it does not exist // Will try to create RT storage if it does not exist
RenderTargetD3D *destRenderTarget = NULL; RenderTargetD3D *destRenderTarget = NULL;
gl::Error error = getRenderTarget(index, &destRenderTarget); ANGLE_TRY(getRenderTarget(index, &destRenderTarget));
if (error.isError())
{
return error;
}
gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1); gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1);
error = fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget); ANGLE_TRY(fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type,
if (error.isError()) destRenderTarget));
{
return error;
}
// Ensure we don't overwrite our newly initialized data // Ensure we don't overwrite our newly initialized data
mImageArray[level]->markClean(); mImageArray[level]->markClean();
...@@ -777,11 +770,7 @@ gl::Error TextureD3D_2D::setImage(GLenum target, ...@@ -777,11 +770,7 @@ gl::Error TextureD3D_2D::setImage(GLenum target,
if (!fastUnpacked) if (!fastUnpacked)
{ {
gl::Error error = setImageImpl(index, type, unpack, pixels, 0); ANGLE_TRY(setImageImpl(index, type, unpack, pixels, 0));
if (error.isError())
{
return error;
}
} }
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
...@@ -802,12 +791,7 @@ gl::Error TextureD3D_2D::setSubImage(GLenum target, ...@@ -802,12 +791,7 @@ gl::Error TextureD3D_2D::setSubImage(GLenum target,
if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level)) if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level))
{ {
RenderTargetD3D *renderTarget = NULL; RenderTargetD3D *renderTarget = NULL;
gl::Error error = getRenderTarget(index, &renderTarget); ANGLE_TRY(getRenderTarget(index, &renderTarget));
if (error.isError())
{
return error;
}
ASSERT(!mImageArray[level]->isDirty()); ASSERT(!mImageArray[level]->isDirty());
return fastUnpackPixels(unpack, pixels, area, getInternalFormat(level), type, renderTarget); return fastUnpackPixels(unpack, pixels, area, getInternalFormat(level), type, renderTarget);
...@@ -841,11 +825,7 @@ gl::Error TextureD3D_2D::setCompressedSubImage(GLenum target, size_t level, cons ...@@ -841,11 +825,7 @@ gl::Error TextureD3D_2D::setCompressedSubImage(GLenum target, size_t level, cons
ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0); ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0);
gl::ImageIndex index = gl::ImageIndex::Make2D(static_cast<GLint>(level)); gl::ImageIndex index = gl::ImageIndex::Make2D(static_cast<GLint>(level));
gl::Error error = TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0); ANGLE_TRY(TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0));
if (error.isError())
{
return error;
}
return commitRegion(index, area); return commitRegion(index, area);
} }
...@@ -870,31 +850,18 @@ gl::Error TextureD3D_2D::copyImage(GLenum target, ...@@ -870,31 +850,18 @@ gl::Error TextureD3D_2D::copyImage(GLenum target,
// so we should use the non-rendering copy path. // so we should use the non-rendering copy path.
if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{ {
gl::Error error = mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source); ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source));
if (error.isError())
{
return error;
}
mDirtyImages = true; mDirtyImages = true;
} }
else else
{ {
gl::Error error = ensureRenderTarget(); ANGLE_TRY(ensureRenderTarget());
if (error.isError())
{
return error;
}
mImageArray[level]->markClean(); mImageArray[level]->markClean();
if (sourceArea.width != 0 && sourceArea.height != 0 && isValidLevel(level)) if (sourceArea.width != 0 && sourceArea.height != 0 && isValidLevel(level))
{ {
error = mRenderer->copyImage2D(source, sourceArea, internalFormat, destOffset, mTexStorage, level); ANGLE_TRY(mRenderer->copyImage2D(source, sourceArea, internalFormat, destOffset,
if (error.isError()) mTexStorage, level));
{
return error;
}
} }
} }
...@@ -919,37 +886,19 @@ gl::Error TextureD3D_2D::copySubImage(GLenum target, ...@@ -919,37 +886,19 @@ gl::Error TextureD3D_2D::copySubImage(GLenum target,
// so we should use the non-rendering copy path. // so we should use the non-rendering copy path.
if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround) if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{ {
gl::Error error = mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source); ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source));
if (error.isError())
{
return error;
}
mDirtyImages = true; mDirtyImages = true;
} }
else else
{ {
gl::Error error = ensureRenderTarget(); ANGLE_TRY(ensureRenderTarget());
if (error.isError())
{
return error;
}
if (isValidLevel(level)) if (isValidLevel(level))
{ {
error = updateStorageLevel(level); ANGLE_TRY(updateStorageLevel(level));
if (error.isError()) ANGLE_TRY(mRenderer->copyImage2D(
{ source, sourceArea, gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
return error; destOffset, mTexStorage, level));
}
error = mRenderer->copyImage2D(source, sourceArea,
gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
destOffset, mTexStorage, level);
if (error.isError())
{
return error;
}
} }
} }
......
...@@ -770,11 +770,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -770,11 +770,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
GLenum filter, GLenum filter,
bool maskOffAlpha) bool maskOffAlpha)
{ {
gl::Error error = initResources(); ANGLE_TRY(initResources());
if (error.isError())
{
return error;
}
HRESULT result; HRESULT result;
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
...@@ -794,12 +790,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -794,12 +790,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
ShaderDimension dimension = (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) ? SHADER_3D : SHADER_2D; ShaderDimension dimension = (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) ? SHADER_3D : SHADER_2D;
const Shader *shader = nullptr; const Shader *shader = nullptr;
error = getBlitShader(destFormat, isSigned, dimension, &shader); ANGLE_TRY(getBlitShader(destFormat, isSigned, dimension, &shader));
if (error.isError())
{
return error;
}
const ShaderSupport &support = getShaderSupport(*shader); const ShaderSupport &support = getShaderSupport(*shader);
// Set vertices // Set vertices
...@@ -905,7 +896,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -905,7 +896,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
mRenderer->markAllStateDirty(); mRenderer->markAllStateDirty();
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error Blit11::copyStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &sourceArea, const gl::Extents &sourceSize, gl::Error Blit11::copyStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &sourceArea, const gl::Extents &sourceSize,
......
...@@ -2960,42 +2960,29 @@ const WorkaroundsD3D &RendererD3D::getWorkarounds() const ...@@ -2960,42 +2960,29 @@ const WorkaroundsD3D &RendererD3D::getWorkarounds() const
return mWorkarounds; return mWorkarounds;
} }
gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, gl::Error Renderer11::copyImageInternal(const gl::Framebuffer *framebuffer,
const gl::Offset &destOffset, TextureStorage *storage, GLint level) const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
RenderTargetD3D *destRenderTarget)
{ {
const gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer(); const gl::FramebufferAttachment *colorAttachment = framebuffer->getReadColorbuffer();
ASSERT(colorbuffer); ASSERT(colorAttachment);
RenderTarget11 *sourceRenderTarget = NULL; RenderTarget11 *sourceRenderTarget = nullptr;
gl::Error error = colorbuffer->getRenderTarget(&sourceRenderTarget); ANGLE_TRY(colorAttachment->getRenderTarget(&sourceRenderTarget));
if (error.isError())
{
return error;
}
ASSERT(sourceRenderTarget); ASSERT(sourceRenderTarget);
ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView(); ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source); ASSERT(source);
TextureStorage11_2D *storage11 = GetAs<TextureStorage11_2D>(storage);
ASSERT(storage11);
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
RenderTargetD3D *destRenderTarget = NULL;
error = storage11->getRenderTarget(index, &destRenderTarget);
if (error.isError())
{
return error;
}
ASSERT(destRenderTarget);
ID3D11RenderTargetView *dest = GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); ID3D11RenderTargetView *dest = GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView();
ASSERT(dest); ASSERT(dest);
gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1); gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1); gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1);
const bool invertSource = UsePresentPathFast(this, colorbuffer); const bool invertSource = UsePresentPathFast(this, colorAttachment);
if (invertSource) if (invertSource)
{ {
sourceArea.y = sourceSize.height - sourceRect.y; sourceArea.y = sourceSize.height - sourceRect.y;
...@@ -3005,181 +2992,87 @@ gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer, const gl:: ...@@ -3005,181 +2992,87 @@ gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer, const gl::
gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1); gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1); gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1);
// Use nearest filtering because source and destination are the same size for the direct // Use nearest filtering because source and destination are the same size for the direct copy.
// copy ANGLE_TRY(mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, nullptr,
error = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL, destFormat, GL_NEAREST, false));
destFormat, GL_NEAREST, false);
if (error.isError()) return gl::NoError();
{ }
return error;
} gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
TextureStorage *storage,
GLint level)
{
TextureStorage11_2D *storage11 = GetAs<TextureStorage11_2D>(storage);
ASSERT(storage11);
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
RenderTargetD3D *destRenderTarget = nullptr;
ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
ASSERT(destRenderTarget);
ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
storage11->invalidateSwizzleCacheLevel(level); storage11->invalidateSwizzleCacheLevel(level);
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error Renderer11::copyImageCube(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, gl::Error Renderer11::copyImageCube(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
const gl::Offset &destOffset, TextureStorage *storage, GLenum target, GLint level) const gl::Offset &destOffset, TextureStorage *storage, GLenum target, GLint level)
{ {
const gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
ASSERT(colorbuffer);
RenderTarget11 *sourceRenderTarget = NULL;
gl::Error error = colorbuffer->getRenderTarget(&sourceRenderTarget);
if (error.isError())
{
return error;
}
ASSERT(sourceRenderTarget);
ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source);
TextureStorage11_Cube *storage11 = GetAs<TextureStorage11_Cube>(storage); TextureStorage11_Cube *storage11 = GetAs<TextureStorage11_Cube>(storage);
ASSERT(storage11); ASSERT(storage11);
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
RenderTargetD3D *destRenderTarget = NULL; RenderTargetD3D *destRenderTarget = nullptr;
error = storage11->getRenderTarget(index, &destRenderTarget); ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
if (error.isError())
{
return error;
}
ASSERT(destRenderTarget); ASSERT(destRenderTarget);
ID3D11RenderTargetView *dest = GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
ASSERT(dest);
gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1);
const bool invertSource = UsePresentPathFast(this, colorbuffer);
if (invertSource)
{
sourceArea.y = sourceSize.height - sourceRect.y;
sourceArea.height = -sourceArea.height;
}
gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1);
// Use nearest filtering because source and destination are the same size for the direct
// copy
error = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST, false);
if (error.isError())
{
return error;
}
storage11->invalidateSwizzleCacheLevel(level); storage11->invalidateSwizzleCacheLevel(level);
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error Renderer11::copyImage3D(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, gl::Error Renderer11::copyImage3D(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
const gl::Offset &destOffset, TextureStorage *storage, GLint level) const gl::Offset &destOffset, TextureStorage *storage, GLint level)
{ {
const gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
ASSERT(colorbuffer);
RenderTarget11 *sourceRenderTarget = NULL;
gl::Error error = colorbuffer->getRenderTarget(&sourceRenderTarget);
if (error.isError())
{
return error;
}
ASSERT(sourceRenderTarget);
ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source);
TextureStorage11_3D *storage11 = GetAs<TextureStorage11_3D>(storage); TextureStorage11_3D *storage11 = GetAs<TextureStorage11_3D>(storage);
ASSERT(storage11); ASSERT(storage11);
gl::ImageIndex index = gl::ImageIndex::Make3D(level, destOffset.z); gl::ImageIndex index = gl::ImageIndex::Make3D(level, destOffset.z);
RenderTargetD3D *destRenderTarget = NULL; RenderTargetD3D *destRenderTarget = nullptr;
error = storage11->getRenderTarget(index, &destRenderTarget); ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
if (error.isError())
{
return error;
}
ASSERT(destRenderTarget); ASSERT(destRenderTarget);
ID3D11RenderTargetView *dest = GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
ASSERT(dest);
gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1);
gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1);
// Use nearest filtering because source and destination are the same size for the direct
// copy
error = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST, false);
if (error.isError())
{
return error;
}
storage11->invalidateSwizzleCacheLevel(level); storage11->invalidateSwizzleCacheLevel(level);
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error Renderer11::copyImage2DArray(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, gl::Error Renderer11::copyImage2DArray(const gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
const gl::Offset &destOffset, TextureStorage *storage, GLint level) const gl::Offset &destOffset, TextureStorage *storage, GLint level)
{ {
const gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
ASSERT(colorbuffer);
RenderTarget11 *sourceRenderTarget = NULL;
gl::Error error = colorbuffer->getRenderTarget(&sourceRenderTarget);
if (error.isError())
{
return error;
}
ASSERT(sourceRenderTarget);
ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source);
TextureStorage11_2DArray *storage11 = GetAs<TextureStorage11_2DArray>(storage); TextureStorage11_2DArray *storage11 = GetAs<TextureStorage11_2DArray>(storage);
ASSERT(storage11); ASSERT(storage11);
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z); gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z);
RenderTargetD3D *destRenderTarget = NULL; RenderTargetD3D *destRenderTarget = nullptr;
error = storage11->getRenderTarget(index, &destRenderTarget); ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
if (error.isError())
{
return error;
}
ASSERT(destRenderTarget); ASSERT(destRenderTarget);
ID3D11RenderTargetView *dest = GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView(); ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
ASSERT(dest);
gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1);
gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1);
// Use nearest filtering because source and destination are the same size for the direct
// copy
error = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST, false);
if (error.isError())
{
return error;
}
storage11->invalidateSwizzleCacheLevel(level); storage11->invalidateSwizzleCacheLevel(level);
return gl::Error(GL_NO_ERROR); return gl::NoError();
} }
gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT) gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT)
......
...@@ -424,6 +424,12 @@ class Renderer11 : public RendererD3D ...@@ -424,6 +424,12 @@ class Renderer11 : public RendererD3D
size_t samplerMetadataReferencedBytes, size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer); ID3D11Buffer *driverConstantBuffer);
gl::Error copyImageInternal(const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
RenderTargetD3D *destRenderTarget);
HMODULE mD3d11Module; HMODULE mD3d11Module;
HMODULE mDxgiModule; HMODULE mDxgiModule;
HMODULE mDCompModule; HMODULE mDCompModule;
......
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