Commit 9e3f24f6 by Geoff Lang

Update Renderer::copyToRenderTarget to return Error objects.

BUG=angle:520 Change-Id: Ieab2d031d638056676e07d80aa024b6c6f12f3d6 Reviewed-on: https://chromium-review.googlesource.com/216642Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 431cbc8e
......@@ -170,10 +170,10 @@ class Renderer
virtual int getMaxSwapInterval() const = 0;
// Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source) = 0;
virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) = 0;
virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) = 0;
virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) = 0;
virtual gl::Error copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source) = 0;
virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) = 0;
......
......@@ -664,7 +664,7 @@ bool TextureD3D_2D::ensureRenderTarget()
{
TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget2D(newRenderTargetStorage, mTexStorage))
if (mRenderer->copyToRenderTarget2D(newRenderTargetStorage, mTexStorage).isError())
{
delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false);
......@@ -1121,7 +1121,7 @@ bool TextureD3D_Cube::ensureRenderTarget()
{
TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTargetCube(newRenderTargetStorage, mTexStorage))
if (mRenderer->copyToRenderTargetCube(newRenderTargetStorage, mTexStorage).isError())
{
delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false);
......@@ -1609,7 +1609,7 @@ bool TextureD3D_3D::ensureRenderTarget()
{
TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget3D(newRenderTargetStorage, mTexStorage))
if (mRenderer->copyToRenderTarget3D(newRenderTargetStorage, mTexStorage).isError())
{
delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false);
......@@ -2090,7 +2090,7 @@ bool TextureD3D_2DArray::ensureRenderTarget()
{
TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget2DArray(newRenderTargetStorage, mTexStorage))
if (mRenderer->copyToRenderTarget2DArray(newRenderTargetStorage, mTexStorage).isError())
{
delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false);
......
......@@ -1879,72 +1879,60 @@ int Renderer11::getMaxSwapInterval() const
return 4;
}
bool Renderer11::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer11::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source)
{
if (source && dest)
{
TextureStorage11_2D *source11 = TextureStorage11_2D::makeTextureStorage11_2D(source);
TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest);
ASSERT(source && dest);
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
TextureStorage11_2D *source11 = TextureStorage11_2D::makeTextureStorage11_2D(source);
TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest);
dest11->invalidateSwizzleCache();
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
return true;
}
dest11->invalidateSwizzleCache();
return false;
return gl::Error(GL_NO_ERROR);
}
bool Renderer11::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer11::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source)
{
if (source && dest)
{
TextureStorage11_Cube *source11 = TextureStorage11_Cube::makeTextureStorage11_Cube(source);
TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest);
ASSERT(source && dest);
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
TextureStorage11_Cube *source11 = TextureStorage11_Cube::makeTextureStorage11_Cube(source);
TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest);
dest11->invalidateSwizzleCache();
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
return true;
}
dest11->invalidateSwizzleCache();
return false;
return gl::Error(GL_NO_ERROR);
}
bool Renderer11::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer11::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source)
{
if (source && dest)
{
TextureStorage11_3D *source11 = TextureStorage11_3D::makeTextureStorage11_3D(source);
TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest);
ASSERT(source && dest);
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
TextureStorage11_3D *source11 = TextureStorage11_3D::makeTextureStorage11_3D(source);
TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest);
dest11->invalidateSwizzleCache();
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
return true;
}
dest11->invalidateSwizzleCache();
return false;
return gl::Error(GL_NO_ERROR);
}
bool Renderer11::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer11::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source)
{
if (source && dest)
{
TextureStorage11_2DArray *source11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(source);
TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest);
ASSERT(source && dest);
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
TextureStorage11_2DArray *source11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(source);
TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest);
dest11->invalidateSwizzleCache();
mDeviceContext->CopyResource(dest11->getResource(), source11->getResource());
return true;
}
dest11->invalidateSwizzleCache();
return false;
return gl::Error(GL_NO_ERROR);
}
gl::Error Renderer11::copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
......
......@@ -115,10 +115,10 @@ class Renderer11 : public Renderer
virtual int getMaxSwapInterval() const;
// Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level);
......
......@@ -2336,80 +2336,74 @@ int Renderer9::getMaxSwapInterval() const
return mMaxSwapInterval;
}
bool Renderer9::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer9::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source)
{
bool result = false;
ASSERT(source && dest);
if (source && dest)
{
TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source);
TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest);
TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source);
TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest);
int levels = source9->getLevelCount();
for (int i = 0; i < levels; ++i)
{
IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false);
IDirect3DSurface9 *dstSurf = dest9->getSurfaceLevel(i, false);
int levels = source9->getLevelCount();
for (int i = 0; i < levels; ++i)
{
IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false);
IDirect3DSurface9 *dstSurf = dest9->getSurfaceLevel(i, false);
result = copyToRenderTarget(dstSurf, srcSurf, source9->isManaged());
gl::Error error = copyToRenderTarget(dstSurf, srcSurf, source9->isManaged());
SafeRelease(srcSurf);
SafeRelease(dstSurf);
SafeRelease(srcSurf);
SafeRelease(dstSurf);
if (!result)
{
return false;
}
if (error.isError())
{
return error;
}
}
return result;
return gl::Error(GL_NO_ERROR);
}
bool Renderer9::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer9::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source)
{
bool result = false;
ASSERT(source && dest);
if (source && dest)
TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source);
TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest);
int levels = source9->getLevelCount();
for (int f = 0; f < 6; f++)
{
TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source);
TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest);
int levels = source9->getLevelCount();
for (int f = 0; f < 6; f++)
for (int i = 0; i < levels; i++)
{
for (int i = 0; i < levels; i++)
{
IDirect3DSurface9 *srcSurf = source9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false);
IDirect3DSurface9 *dstSurf = dest9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true);
IDirect3DSurface9 *srcSurf = source9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false);
IDirect3DSurface9 *dstSurf = dest9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true);
result = copyToRenderTarget(dstSurf, srcSurf, source9->isManaged());
gl::Error error = copyToRenderTarget(dstSurf, srcSurf, source9->isManaged());
SafeRelease(srcSurf);
SafeRelease(dstSurf);
SafeRelease(srcSurf);
SafeRelease(dstSurf);
if (!result)
{
return false;
}
if (error.isError())
{
return error;
}
}
}
return result;
return gl::Error(GL_NO_ERROR);
}
bool Renderer9::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer9::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source)
{
// 3D textures are not available in the D3D9 backend.
UNREACHABLE();
return false;
return gl::Error(GL_INVALID_OPERATION);
}
bool Renderer9::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source)
gl::Error Renderer9::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source)
{
// 2D array textures are not supported by the D3D9 backend.
UNREACHABLE();
return false;
return gl::Error(GL_INVALID_OPERATION);
}
D3DPOOL Renderer9::getBufferPool(DWORD usage) const
......@@ -2995,41 +2989,40 @@ D3DPOOL Renderer9::getTexturePool(DWORD usage) const
return D3DPOOL_DEFAULT;
}
bool Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged)
gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged)
{
if (source && dest)
{
HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
ASSERT(source && dest);
if (fromManaged)
{
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
IDirect3DSurface9 *surf = 0;
result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL);
if (fromManaged)
{
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
if (SUCCEEDED(result))
{
Image9::copyLockableSurfaces(surf, source);
result = mDevice->UpdateSurface(surf, NULL, dest, NULL);
SafeRelease(surf);
}
}
else
{
endScene();
result = mDevice->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
}
IDirect3DSurface9 *surf = 0;
result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL);
if (FAILED(result))
if (SUCCEEDED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
return false;
Image9::copyLockableSurfaces(surf, source);
result = mDevice->UpdateSurface(surf, NULL, dest, NULL);
SafeRelease(surf);
}
}
else
{
endScene();
result = mDevice->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
}
return true;
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to blit internal texture, result: 0x%X.", result);
}
return gl::Error(GL_NO_ERROR);
}
Image *Renderer9::createImage()
......
......@@ -119,10 +119,10 @@ class Renderer9 : public Renderer
virtual int getMaxSwapInterval() const;
// Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source);
virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level);
......@@ -214,7 +214,7 @@ class Renderer9 : public Renderer
gl::Error getCountingIB(size_t count, StaticIndexBufferInterface **outIB);
bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
gl::Error copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
gl::FramebufferAttachment *getNullColorbuffer(gl::FramebufferAttachment *depthbuffer);
D3DPOOL getBufferPool(DWORD usage) const;
......
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