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