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 ...@@ -170,10 +170,10 @@ class Renderer
virtual int getMaxSwapInterval() const = 0; virtual int getMaxSwapInterval() const = 0;
// Pixel operations // Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) = 0; virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) = 0; virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) = 0; virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) = 0;
virtual bool copyToRenderTarget2DArray(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, virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) = 0; GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) = 0;
......
...@@ -664,7 +664,7 @@ bool TextureD3D_2D::ensureRenderTarget() ...@@ -664,7 +664,7 @@ bool TextureD3D_2D::ensureRenderTarget()
{ {
TextureStorage *newRenderTargetStorage = createCompleteStorage(true); TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget2D(newRenderTargetStorage, mTexStorage)) if (mRenderer->copyToRenderTarget2D(newRenderTargetStorage, mTexStorage).isError())
{ {
delete newRenderTargetStorage; delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
...@@ -1121,7 +1121,7 @@ bool TextureD3D_Cube::ensureRenderTarget() ...@@ -1121,7 +1121,7 @@ bool TextureD3D_Cube::ensureRenderTarget()
{ {
TextureStorage *newRenderTargetStorage = createCompleteStorage(true); TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTargetCube(newRenderTargetStorage, mTexStorage)) if (mRenderer->copyToRenderTargetCube(newRenderTargetStorage, mTexStorage).isError())
{ {
delete newRenderTargetStorage; delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
...@@ -1609,7 +1609,7 @@ bool TextureD3D_3D::ensureRenderTarget() ...@@ -1609,7 +1609,7 @@ bool TextureD3D_3D::ensureRenderTarget()
{ {
TextureStorage *newRenderTargetStorage = createCompleteStorage(true); TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget3D(newRenderTargetStorage, mTexStorage)) if (mRenderer->copyToRenderTarget3D(newRenderTargetStorage, mTexStorage).isError())
{ {
delete newRenderTargetStorage; delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
...@@ -2090,7 +2090,7 @@ bool TextureD3D_2DArray::ensureRenderTarget() ...@@ -2090,7 +2090,7 @@ bool TextureD3D_2DArray::ensureRenderTarget()
{ {
TextureStorage *newRenderTargetStorage = createCompleteStorage(true); TextureStorage *newRenderTargetStorage = createCompleteStorage(true);
if (!mRenderer->copyToRenderTarget2DArray(newRenderTargetStorage, mTexStorage)) if (mRenderer->copyToRenderTarget2DArray(newRenderTargetStorage, mTexStorage).isError())
{ {
delete newRenderTargetStorage; delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
......
...@@ -1879,72 +1879,60 @@ int Renderer11::getMaxSwapInterval() const ...@@ -1879,72 +1879,60 @@ int Renderer11::getMaxSwapInterval() const
return 4; return 4;
} }
bool Renderer11::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) gl::Error Renderer11::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source)
{ {
if (source && dest) ASSERT(source && dest);
{
TextureStorage11_2D *source11 = TextureStorage11_2D::makeTextureStorage11_2D(source);
TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(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) ASSERT(source && dest);
{
TextureStorage11_Cube *source11 = TextureStorage11_Cube::makeTextureStorage11_Cube(source);
TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(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) ASSERT(source && dest);
{
TextureStorage11_3D *source11 = TextureStorage11_3D::makeTextureStorage11_3D(source);
TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(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) ASSERT(source && dest);
{
TextureStorage11_2DArray *source11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(source);
TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(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, gl::Error Renderer11::copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
......
...@@ -115,10 +115,10 @@ class Renderer11 : public Renderer ...@@ -115,10 +115,10 @@ class Renderer11 : public Renderer
virtual int getMaxSwapInterval() const; virtual int getMaxSwapInterval() const;
// Pixel operations // Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget2DArray(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, virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level); GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level);
......
...@@ -2336,80 +2336,74 @@ int Renderer9::getMaxSwapInterval() const ...@@ -2336,80 +2336,74 @@ int Renderer9::getMaxSwapInterval() const
return mMaxSwapInterval; 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(); int levels = source9->getLevelCount();
for (int i = 0; i < levels; ++i) for (int i = 0; i < levels; ++i)
{ {
IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false); IDirect3DSurface9 *srcSurf = source9->getSurfaceLevel(i, false);
IDirect3DSurface9 *dstSurf = dest9->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(srcSurf);
SafeRelease(dstSurf); SafeRelease(dstSurf);
if (!result) if (error.isError())
{ {
return false; 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); for (int i = 0; i < levels; i++)
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++) 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(srcSurf);
SafeRelease(dstSurf); SafeRelease(dstSurf);
if (!result) if (error.isError())
{ {
return false; 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. // 3D textures are not available in the D3D9 backend.
UNREACHABLE(); 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. // 2D array textures are not supported by the D3D9 backend.
UNREACHABLE(); UNREACHABLE();
return false; return gl::Error(GL_INVALID_OPERATION);
} }
D3DPOOL Renderer9::getBufferPool(DWORD usage) const D3DPOOL Renderer9::getBufferPool(DWORD usage) const
...@@ -2995,41 +2989,40 @@ D3DPOOL Renderer9::getTexturePool(DWORD usage) const ...@@ -2995,41 +2989,40 @@ D3DPOOL Renderer9::getTexturePool(DWORD usage) const
return D3DPOOL_DEFAULT; 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) ASSERT(source && dest);
{
HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
if (fromManaged) HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
{
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
IDirect3DSurface9 *surf = 0; if (fromManaged)
result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL); {
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
if (SUCCEEDED(result)) IDirect3DSurface9 *surf = 0;
{ result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL);
Image9::copyLockableSurfaces(surf, source);
result = mDevice->UpdateSurface(surf, NULL, dest, NULL);
SafeRelease(surf);
}
}
else
{
endScene();
result = mDevice->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
}
if (FAILED(result)) if (SUCCEEDED(result))
{ {
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); Image9::copyLockableSurfaces(surf, source);
return false; 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() Image *Renderer9::createImage()
......
...@@ -119,10 +119,10 @@ class Renderer9 : public Renderer ...@@ -119,10 +119,10 @@ class Renderer9 : public Renderer
virtual int getMaxSwapInterval() const; virtual int getMaxSwapInterval() const;
// Pixel operations // Pixel operations
virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source); virtual gl::Error copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source);
virtual bool copyToRenderTarget2DArray(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, virtual gl::Error copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level); GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level);
...@@ -214,7 +214,7 @@ class Renderer9 : public Renderer ...@@ -214,7 +214,7 @@ class Renderer9 : public Renderer
gl::Error getCountingIB(size_t count, StaticIndexBufferInterface **outIB); 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); gl::FramebufferAttachment *getNullColorbuffer(gl::FramebufferAttachment *depthbuffer);
D3DPOOL getBufferPool(DWORD usage) const; 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