Simplified cube face handling and render target conversion.

TRAC #18730 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@852 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent dc82bf91
...@@ -1953,7 +1953,7 @@ void Texture2D::updateTexture() ...@@ -1953,7 +1953,7 @@ void Texture2D::updateTexture()
void Texture2D::convertToRenderTarget() void Texture2D::convertToRenderTarget()
{ {
IDirect3DTexture9 *texture = NULL; TextureStorage2D *newTexture = NULL;
if (mImageArray[0].getWidth() != 0 && mImageArray[0].getHeight() != 0) if (mImageArray[0].getWidth() != 0 && mImageArray[0].getHeight() != 0)
{ {
...@@ -1962,7 +1962,8 @@ void Texture2D::convertToRenderTarget() ...@@ -1962,7 +1962,8 @@ void Texture2D::convertToRenderTarget()
D3DFORMAT format = mImageArray[0].getD3DFormat(); D3DFORMAT format = mImageArray[0].getD3DFormat();
GLint levels = creationLevels(mImageArray[0].getWidth(), mImageArray[0].getHeight()); GLint levels = creationLevels(mImageArray[0].getWidth(), mImageArray[0].getHeight());
HRESULT result = device->CreateTexture(mImageArray[0].getWidth(), mImageArray[0].getHeight(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture, NULL); IDirect3DTexture9 *texture2D = NULL;
HRESULT result = device->CreateTexture(mImageArray[0].getWidth(), mImageArray[0].getHeight(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture2D, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -1970,34 +1971,15 @@ void Texture2D::convertToRenderTarget() ...@@ -1970,34 +1971,15 @@ void Texture2D::convertToRenderTarget()
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
newTexture = new TextureStorage2D(texture2D, true);
if (mTexture != NULL) if (mTexture != NULL)
{ {
int levels = levelCount(); int levels = levelCount();
for (int i = 0; i < levels; i++) for (int i = 0; i < levels; i++)
{ {
IDirect3DSurface9 *source = mTexture->getSurfaceLevel(i); IDirect3DSurface9 *source = mTexture->getSurfaceLevel(i);
IDirect3DSurface9 *dest = newTexture->getSurfaceLevel(i);
if (!source)
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release();
return error(GL_OUT_OF_MEMORY);
}
IDirect3DSurface9 *dest;
result = texture->GetSurfaceLevel(i, &dest);
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release();
source->Release();
return error(GL_OUT_OF_MEMORY);
}
display->endScene(); display->endScene();
result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE); result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
...@@ -2006,7 +1988,7 @@ void Texture2D::convertToRenderTarget() ...@@ -2006,7 +1988,7 @@ void Texture2D::convertToRenderTarget()
{ {
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release(); delete newTexture;
source->Release(); source->Release();
dest->Release(); dest->Release();
...@@ -2020,7 +2002,7 @@ void Texture2D::convertToRenderTarget() ...@@ -2020,7 +2002,7 @@ void Texture2D::convertToRenderTarget()
} }
delete mTexture; delete mTexture;
mTexture = new TextureStorage2D(texture, true); mTexture = newTexture;
mSerial = issueSerial(); mSerial = issueSerial();
mColorbufferProxy.set(NULL); mColorbufferProxy.set(NULL);
mDirtyImages = true; mDirtyImages = true;
...@@ -2129,13 +2111,13 @@ TextureStorageCubeMap::~TextureStorageCubeMap() ...@@ -2129,13 +2111,13 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
mTexture->Release(); mTexture->Release();
} }
IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(int face, int level) IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level)
{ {
IDirect3DSurface9 *surface = NULL; IDirect3DSurface9 *surface = NULL;
if (mTexture) if (mTexture)
{ {
HRESULT result = mTexture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(face), level, &surface); HRESULT result = mTexture->GetCubeMapSurface(es2dx::ConvertCubeFace(faceTarget), level, &surface);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
} }
...@@ -2235,7 +2217,7 @@ void TextureCubeMap::commitRect(int face, GLint level, GLint xoffset, GLint yoff ...@@ -2235,7 +2217,7 @@ void TextureCubeMap::commitRect(int face, GLint level, GLint xoffset, GLint yoff
if (level < levelCount()) if (level < levelCount())
{ {
IDirect3DSurface9 *destLevel = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level); IDirect3DSurface9 *destLevel = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level);
ASSERT(destLevel != NULL); ASSERT(destLevel != NULL);
if (destLevel != NULL) if (destLevel != NULL)
...@@ -2416,7 +2398,7 @@ void TextureCubeMap::updateTexture() ...@@ -2416,7 +2398,7 @@ void TextureCubeMap::updateTexture()
void TextureCubeMap::convertToRenderTarget() void TextureCubeMap::convertToRenderTarget()
{ {
IDirect3DCubeTexture9 *texture = NULL; TextureStorageCubeMap *newTexture = NULL;
if (mImageArray[0][0].getWidth() != 0) if (mImageArray[0][0].getWidth() != 0)
{ {
...@@ -2425,7 +2407,8 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2425,7 +2407,8 @@ void TextureCubeMap::convertToRenderTarget()
D3DFORMAT format = mImageArray[0][0].getD3DFormat(); D3DFORMAT format = mImageArray[0][0].getD3DFormat();
GLint levels = creationLevels(mImageArray[0][0].getWidth(), 0); GLint levels = creationLevels(mImageArray[0][0].getWidth(), 0);
HRESULT result = device->CreateCubeTexture(mImageArray[0][0].getWidth(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture, NULL); IDirect3DCubeTexture9 *cubeTexture = NULL;
HRESULT result = device->CreateCubeTexture(mImageArray[0][0].getWidth(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &cubeTexture, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -2433,6 +2416,8 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2433,6 +2416,8 @@ void TextureCubeMap::convertToRenderTarget()
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
newTexture = new TextureStorageCubeMap(cubeTexture, true);
if (mTexture != NULL) if (mTexture != NULL)
{ {
int levels = levelCount(); int levels = levelCount();
...@@ -2440,29 +2425,8 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2440,29 +2425,8 @@ void TextureCubeMap::convertToRenderTarget()
{ {
for (int i = 0; i < levels; i++) for (int i = 0; i < levels; i++)
{ {
IDirect3DSurface9 *source = mTexture->getCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i); IDirect3DSurface9 *source = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
IDirect3DSurface9 *dest = newTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release();
return error(GL_OUT_OF_MEMORY);
}
IDirect3DSurface9 *dest;
result = texture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i, &dest);
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release();
source->Release();
return error(GL_OUT_OF_MEMORY);
}
display->endScene(); display->endScene();
result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE); result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
...@@ -2471,7 +2435,7 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2471,7 +2435,7 @@ void TextureCubeMap::convertToRenderTarget()
{ {
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
texture->Release(); delete newTexture;
source->Release(); source->Release();
dest->Release(); dest->Release();
...@@ -2486,7 +2450,7 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2486,7 +2450,7 @@ void TextureCubeMap::convertToRenderTarget()
} }
delete mTexture; delete mTexture;
mTexture = new TextureStorageCubeMap(texture, true); mTexture = newTexture;
mSerial = issueSerial(); mSerial = issueSerial();
for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL); for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
mDirtyImages = true; mDirtyImages = true;
...@@ -2571,7 +2535,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -2571,7 +2535,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
GLint destYOffset = transformPixelYOffset(0, height, mImageArray[faceindex][level].getWidth()); GLint destYOffset = transformPixelYOffset(0, height, mImageArray[faceindex][level].getWidth());
IDirect3DSurface9 *dest = getCubeMapSurface(target, level); IDirect3DSurface9 *dest = mTexture->getCubeMapSurface(target, level);
getBlitter()->copy(source->getRenderTarget(), sourceRect, format, 0, destYOffset, dest); getBlitter()->copy(source->getRenderTarget(), sourceRect, format, 0, destYOffset, dest);
dest->Release(); dest->Release();
...@@ -2579,17 +2543,6 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -2579,17 +2543,6 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
} }
} }
IDirect3DSurface9 *TextureCubeMap::getCubeMapSurface(GLenum target, unsigned int level)
{
if (mTexture == NULL)
{
UNREACHABLE();
return NULL;
}
return mTexture->getCubeMapSurface(es2dx::ConvertCubeFace(target), level);
}
void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
{ {
GLsizei size = mImageArray[faceIndex(target)][level].getWidth(); GLsizei size = mImageArray[faceIndex(target)][level].getWidth();
...@@ -2633,7 +2586,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi ...@@ -2633,7 +2586,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
GLint destYOffset = transformPixelYOffset(yoffset, height, mImageArray[faceindex][level].getWidth()); GLint destYOffset = transformPixelYOffset(yoffset, height, mImageArray[faceindex][level].getWidth());
IDirect3DSurface9 *dest = getCubeMapSurface(target, level); IDirect3DSurface9 *dest = mTexture->getCubeMapSurface(target, level);
getBlitter()->copy(source->getRenderTarget(), sourceRect, mImageArray[0][0].getFormat(), xoffset, destYOffset, dest); getBlitter()->copy(source->getRenderTarget(), sourceRect, mImageArray[0][0].getFormat(), xoffset, destYOffset, dest);
dest->Release(); dest->Release();
...@@ -2694,8 +2647,8 @@ void TextureCubeMap::generateMipmaps() ...@@ -2694,8 +2647,8 @@ void TextureCubeMap::generateMipmaps()
{ {
for (unsigned int i = 1; i <= q; i++) for (unsigned int i = 1; i <= q; i++)
{ {
IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i-1); IDirect3DSurface9 *upper = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i-1);
IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i); IDirect3DSurface9 *lower = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
if (upper != NULL && lower != NULL) if (upper != NULL && lower != NULL)
{ {
...@@ -2764,7 +2717,7 @@ IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target) ...@@ -2764,7 +2717,7 @@ IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target)
updateTexture(); updateTexture();
return mTexture->getCubeMapSurface(es2dx::ConvertCubeFace(target), 0); return mTexture->getCubeMapSurface(target, 0);
} }
} }
\ No newline at end of file
...@@ -303,7 +303,7 @@ class TextureStorageCubeMap : public TextureStorage ...@@ -303,7 +303,7 @@ class TextureStorageCubeMap : public TextureStorage
virtual ~TextureStorageCubeMap(); virtual ~TextureStorageCubeMap();
IDirect3DSurface9 *getCubeMapSurface(int face, int level); IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level);
IDirect3DBaseTexture9 *getBaseTexture() const; IDirect3DBaseTexture9 *getBaseTexture() const;
private: private:
...@@ -357,10 +357,6 @@ class TextureCubeMap : public Texture ...@@ -357,10 +357,6 @@ class TextureCubeMap : public Texture
virtual void convertToRenderTarget(); virtual void convertToRenderTarget();
virtual IDirect3DSurface9 *getRenderTarget(GLenum target); virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
// target is one of the GL_TEXTURE_CUBE_MAP_* enumerants.
// Returns NULL if the call underlying Direct3D call fails.
IDirect3DSurface9 *getCubeMapSurface(GLenum target, unsigned int level);
static unsigned int faceIndex(GLenum face); static unsigned int faceIndex(GLenum face);
bool isCubeComplete() const; bool isCubeComplete() const;
...@@ -377,4 +373,4 @@ class TextureCubeMap : public Texture ...@@ -377,4 +373,4 @@ class TextureCubeMap : public Texture
}; };
} }
#endif // LIBGLESV2_TEXTURE_H_ #endif // LIBGLESV2_TEXTURE_H_
\ No newline at end of file
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