Moves copyToRenderTarget to Renderer

TRAC #22000 Signed-off-by: Daniel Koch Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1409 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent ea32d48b
...@@ -782,7 +782,7 @@ void Texture2D::convertToRenderTarget() ...@@ -782,7 +782,7 @@ void Texture2D::convertToRenderTarget()
if (mTexStorage != NULL) if (mTexStorage != NULL)
{ {
if (!TextureStorage2D::copyToRenderTarget(newTexStorage, mTexStorage)) if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
{ {
delete newTexStorage; delete newTexStorage;
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
...@@ -1240,7 +1240,7 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -1240,7 +1240,7 @@ void TextureCubeMap::convertToRenderTarget()
if (mTexStorage != NULL) if (mTexStorage != NULL)
{ {
if (!TextureStorageCubeMap::copyToRenderTarget(newTexStorage, mTexStorage)) if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
{ {
delete newTexStorage; delete newTexStorage;
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
......
...@@ -37,6 +37,12 @@ namespace egl ...@@ -37,6 +37,12 @@ namespace egl
class Display; class Display;
} }
namespace gl
{
class TextureStorage2D;
class TextureStorageCubeMap;
}
namespace rx namespace rx
{ {
...@@ -106,6 +112,9 @@ class Renderer ...@@ -106,6 +112,9 @@ class Renderer
virtual GLsizei getMaxSupportedSamples() const = 0; virtual GLsizei getMaxSupportedSamples() const = 0;
virtual bool copyToRenderTarget(gl::TextureStorage2D *dest, gl::TextureStorage2D *source) = 0;
virtual bool copyToRenderTarget(gl::TextureStorageCubeMap *dest, gl::TextureStorageCubeMap *source) = 0;
protected: protected:
egl::Display *mDisplay; egl::Display *mDisplay;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "libGLESv2/renderer/Renderer9.h" #include "libGLESv2/renderer/Renderer9.h"
#include "libGLESv2/renderer/renderer9_utils.h" #include "libGLESv2/renderer/renderer9_utils.h"
#include "libGLESv2/renderer/TextureStorage.h" #include "libGLESv2/renderer/TextureStorage.h"
#include "libGLESv2/renderer/Image.h"
#include "libEGL/Config.h" #include "libEGL/Config.h"
#include "libEGL/Display.h" #include "libEGL/Display.h"
...@@ -1052,6 +1053,59 @@ D3DFORMAT Renderer9::ConvertTextureInternalFormat(GLint internalformat) ...@@ -1052,6 +1053,59 @@ D3DFORMAT Renderer9::ConvertTextureInternalFormat(GLint internalformat)
return D3DFMT_A8R8G8B8; return D3DFMT_A8R8G8B8;
} }
bool Renderer9::copyToRenderTarget(gl::TextureStorage2D *dest, gl::TextureStorage2D *source)
{
bool result = false;
if (source && dest)
{
int levels = source->levelCount();
for (int i = 0; i < levels; ++i)
{
IDirect3DSurface9 *srcSurf = source->getSurfaceLevel(i, false);
IDirect3DSurface9 *dstSurf = dest->getSurfaceLevel(i, false);
result = copyToRenderTarget(dstSurf, srcSurf, source->isManaged());
if (srcSurf) srcSurf->Release();
if (dstSurf) dstSurf->Release();
if (!result)
return false;
}
}
return result;
}
bool Renderer9::copyToRenderTarget(gl::TextureStorageCubeMap *dest, gl::TextureStorageCubeMap *source)
{
bool result = false;
if (source && dest)
{
int levels = source->levelCount();
for (int f = 0; f < 6; f++)
{
for (int i = 0; i < levels; i++)
{
IDirect3DSurface9 *srcSurf = source->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false);
IDirect3DSurface9 *dstSurf = dest->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true);
result = copyToRenderTarget(dstSurf, srcSurf, source->isManaged());
if (srcSurf) srcSurf->Release();
if (dstSurf) dstSurf->Release();
if (!result)
return false;
}
}
}
return result;
}
D3DPOOL Renderer9::getBufferPool(DWORD usage) const D3DPOOL Renderer9::getBufferPool(DWORD usage) const
{ {
if (mD3d9Ex != NULL) if (mD3d9Ex != NULL)
...@@ -1086,4 +1140,42 @@ D3DPOOL Renderer9::getTexturePool(DWORD usage) const ...@@ -1086,4 +1140,42 @@ D3DPOOL Renderer9::getTexturePool(DWORD usage) const
return D3DPOOL_DEFAULT; return D3DPOOL_DEFAULT;
} }
bool Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged)
{
if (source && dest)
{
HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
IDirect3DDevice9 *device = getDevice(); // D3D9_REPLACE
if (fromManaged)
{
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
IDirect3DSurface9 *surf = 0;
result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL);
if (SUCCEEDED(result))
{
gl::Image::CopyLockableSurfaces(surf, source);
result = device->UpdateSurface(surf, NULL, dest, NULL);
surf->Release();
}
}
else
{
endScene();
result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
}
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
return false;
}
}
return true;
}
} }
\ No newline at end of file
...@@ -110,12 +110,17 @@ class Renderer9 : public Renderer ...@@ -110,12 +110,17 @@ class Renderer9 : public Renderer
int getNearestSupportedSamples(D3DFORMAT format, int requested) const; int getNearestSupportedSamples(D3DFORMAT format, int requested) const;
D3DFORMAT ConvertTextureInternalFormat(GLint internalformat); D3DFORMAT ConvertTextureInternalFormat(GLint internalformat);
virtual bool copyToRenderTarget(gl::TextureStorage2D *dest, gl::TextureStorage2D *source);
virtual bool copyToRenderTarget(gl::TextureStorageCubeMap *dest, gl::TextureStorageCubeMap *source);
D3DPOOL getTexturePool(DWORD usage) const; D3DPOOL getTexturePool(DWORD usage) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(Renderer9); DISALLOW_COPY_AND_ASSIGN(Renderer9);
void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray);
bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
D3DPOOL getBufferPool(DWORD usage) const; D3DPOOL getBufferPool(DWORD usage) const;
......
...@@ -121,45 +121,6 @@ int TextureStorage::levelCount() ...@@ -121,45 +121,6 @@ int TextureStorage::levelCount()
return getBaseTexture() ? getBaseTexture()->GetLevelCount() - getLodOffset() : 0; return getBaseTexture() ? getBaseTexture()->GetLevelCount() - getLodOffset() : 0;
} }
bool TextureStorage::copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged)
{
if (source && dest)
{
HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
rx::Renderer9 *renderer = getDisplay()->getRenderer9();
IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
if (fromManaged)
{
D3DSURFACE_DESC desc;
source->GetDesc(&desc);
IDirect3DSurface9 *surf = 0;
result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surf, NULL);
if (SUCCEEDED(result))
{
Image::CopyLockableSurfaces(surf, source);
result = device->UpdateSurface(surf, NULL, dest, NULL);
surf->Release();
}
}
else
{
renderer->endScene();
result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
}
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
return false;
}
}
return true;
}
TextureStorage2D::TextureStorage2D(rx::Renderer9 *renderer, rx::SwapChain *swapchain) : TextureStorage(renderer, D3DUSAGE_RENDERTARGET), mRenderTargetSerial(RenderbufferStorage::issueSerial()) TextureStorage2D::TextureStorage2D(rx::Renderer9 *renderer, rx::SwapChain *swapchain) : TextureStorage(renderer, D3DUSAGE_RENDERTARGET), mRenderTargetSerial(RenderbufferStorage::issueSerial())
{ {
IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
...@@ -196,31 +157,6 @@ TextureStorage2D::~TextureStorage2D() ...@@ -196,31 +157,6 @@ TextureStorage2D::~TextureStorage2D()
} }
} }
bool TextureStorage2D::copyToRenderTarget(TextureStorage2D *dest, TextureStorage2D *source)
{
bool result = false;
if (source && dest)
{
int levels = source->levelCount();
for (int i = 0; i < levels; ++i)
{
IDirect3DSurface9 *srcSurf = source->getSurfaceLevel(i, false);
IDirect3DSurface9 *dstSurf = dest->getSurfaceLevel(i, false);
result = TextureStorage::copyToRenderTarget(dstSurf, srcSurf, source->isManaged());
if (srcSurf) srcSurf->Release();
if (dstSurf) dstSurf->Release();
if (!result)
return false;
}
}
return result;
}
// Increments refcount on surface. // Increments refcount on surface.
// caller must Release() the returned surface // caller must Release() the returned surface
IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level, bool dirty) IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level, bool dirty)
...@@ -297,34 +233,6 @@ TextureStorageCubeMap::~TextureStorageCubeMap() ...@@ -297,34 +233,6 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
} }
} }
bool TextureStorageCubeMap::copyToRenderTarget(TextureStorageCubeMap *dest, TextureStorageCubeMap *source)
{
bool result = false;
if (source && dest)
{
int levels = source->levelCount();
for (int f = 0; f < 6; f++)
{
for (int i = 0; i < levels; i++)
{
IDirect3DSurface9 *srcSurf = source->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false);
IDirect3DSurface9 *dstSurf = dest->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true);
result = TextureStorage::copyToRenderTarget(dstSurf, srcSurf, source->isManaged());
if (srcSurf) srcSurf->Release();
if (dstSurf) dstSurf->Release();
if (!result)
return false;
}
}
}
return result;
}
// Increments refcount on surface. // Increments refcount on surface.
// caller must Release() the returned surface // caller must Release() the returned surface
IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level, bool dirty) IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level, bool dirty)
......
...@@ -49,8 +49,6 @@ class TextureStorage ...@@ -49,8 +49,6 @@ class TextureStorage
int levelCount(); int levelCount();
protected: protected:
static bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
int mLodOffset; int mLodOffset;
private: private:
...@@ -75,8 +73,6 @@ class TextureStorage2D : public TextureStorage ...@@ -75,8 +73,6 @@ class TextureStorage2D : public TextureStorage
virtual ~TextureStorage2D(); virtual ~TextureStorage2D();
static bool copyToRenderTarget(TextureStorage2D *dest, TextureStorage2D *source);
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty); IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int level); void generateMipmap(int level);
...@@ -97,8 +93,6 @@ class TextureStorageCubeMap : public TextureStorage ...@@ -97,8 +93,6 @@ class TextureStorageCubeMap : public TextureStorage
virtual ~TextureStorageCubeMap(); virtual ~TextureStorageCubeMap();
static bool copyToRenderTarget(TextureStorageCubeMap *dest, TextureStorageCubeMap *source);
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty); IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int face, int level); void generateMipmap(int face, int level);
......
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