Passes texture storage object to image directly to update its surfaces

TRAC #21910 Signed-off-by: Daniel Koch Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1371 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 25ee7441
......@@ -707,14 +707,9 @@ void Texture2D::commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei wi
if (level < levelCount())
{
IDirect3DSurface9 *destLevel = mTexStorage->getSurfaceLevel(level, true);
if (destLevel)
Image *image = &mImageArray[level];
if (image->updateSurface(mTexStorage, level, xoffset, yoffset, width, height))
{
Image *image = &mImageArray[level];
image->updateSurface(destLevel, xoffset, yoffset, width, height);
destLevel->Release();
image->markClean();
}
}
......@@ -860,8 +855,7 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
for (int level = 0; level < levels; level++)
{
IDirect3DSurface9 *surface = mTexStorage->getSurfaceLevel(level, false);
mImageArray[level].setManagedSurface(surface);
mImageArray[level].setManagedSurface(mTexStorage, level);
}
}
}
......@@ -994,8 +988,7 @@ void Texture2D::createTexture()
for (int level = 0; level < levels; level++)
{
IDirect3DSurface9 *surface = mTexStorage->getSurfaceLevel(level, false);
mImageArray[level].setManagedSurface(surface);
mImageArray[level].setManagedSurface(mTexStorage, level);
}
}
......@@ -1320,17 +1313,9 @@ void TextureCubeMap::commitRect(int face, GLint level, GLint xoffset, GLint yoff
if (level < levelCount())
{
IDirect3DSurface9 *destLevel = mTexStorage->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, true);
ASSERT(destLevel != NULL);
if (destLevel != NULL)
{
Image *image = &mImageArray[face][level];
image->updateSurface(destLevel, xoffset, yoffset, width, height);
destLevel->Release();
Image *image = &mImageArray[face][level];
if (image->updateSurface(mTexStorage, face, level, xoffset, yoffset, width, height))
image->markClean();
}
}
}
......@@ -1481,8 +1466,7 @@ void TextureCubeMap::createTexture()
{
for (int level = 0; level < levels; level++)
{
IDirect3DSurface9 *surface = mTexStorage->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false);
mImageArray[face][level].setManagedSurface(surface);
mImageArray[face][level].setManagedSurface(mTexStorage, face, level);
}
}
}
......@@ -1729,8 +1713,7 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size
{
for (int level = 0; level < levels; level++)
{
IDirect3DSurface9 *surface = mTexStorage->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false);
mImageArray[face][level].setManagedSurface(surface);
mImageArray[face][level].setManagedSurface(mTexStorage, face, level);
}
}
}
......
......@@ -188,6 +188,16 @@ IDirect3DSurface9 *Image::getSurface()
return mSurface;
}
void Image::setManagedSurface(TextureStorage2D *storage, int level)
{
setManagedSurface(storage->getSurfaceLevel(level, false));
}
void Image::setManagedSurface(TextureStorageCubeMap *storage, int face, int level)
{
setManagedSurface(storage->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false));
}
void Image::setManagedSurface(IDirect3DSurface9 *surface)
{
D3DSURFACE_DESC desc;
......@@ -207,8 +217,21 @@ void Image::setManagedSurface(IDirect3DSurface9 *surface)
}
}
void Image::updateSurface(IDirect3DSurface9 *destSurface, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height)
bool Image::updateSurface(TextureStorage2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height)
{
return updateSurface(storage->getSurfaceLevel(level, true), xoffset, yoffset, width, height);
}
bool Image::updateSurface(TextureStorageCubeMap *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height)
{
return updateSurface(storage->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, true), xoffset, yoffset, width, height);
}
bool Image::updateSurface(IDirect3DSurface9 *destSurface, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height)
{
if (!destSurface)
return false;
IDirect3DSurface9 *sourceSurface = getSurface();
if (sourceSurface && sourceSurface != destSurface)
......@@ -245,6 +268,9 @@ void Image::updateSurface(IDirect3DSurface9 *destSurface, GLint xoffset, GLint y
ASSERT(SUCCEEDED(result));
}
}
destSurface->Release();
return true;
}
// Store the pixel rectangle designated by xoffset,yoffset,width,height with pixels stored as format/type at input
......
......@@ -18,6 +18,9 @@
namespace gl
{
class TextureStorage2D;
class TextureStorageCubeMap;
class Image
{
public:
......@@ -40,8 +43,10 @@ class Image
bool isDirty() const {return mSurface && mDirty;}
IDirect3DSurface9 *getSurface();
void setManagedSurface(IDirect3DSurface9 *surface);
void updateSurface(IDirect3DSurface9 *dest, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
void setManagedSurface(TextureStorage2D *storage, int level);
void setManagedSurface(TextureStorageCubeMap *storage, int face, int level);
bool updateSurface(TextureStorage2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
bool updateSurface(TextureStorageCubeMap *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
void loadData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
GLint unpackAlignment, const void *input);
......@@ -97,6 +102,8 @@ class Image
DISALLOW_COPY_AND_ASSIGN(Image);
void createSurface();
void setManagedSurface(IDirect3DSurface9 *surface);
bool updateSurface(IDirect3DSurface9 *dest, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
HRESULT lock(D3DLOCKED_RECT *lockedRect, const RECT *rect);
void unlock();
......
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