Commit 73b5d06e by Jamie Madill

Refactor texture storage management in the Texture2D.

TRAC #23976 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent 169d1118
...@@ -639,15 +639,11 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -639,15 +639,11 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{ {
delete mTexStorage;
mTexStorage = new rx::TextureStorageInterface2D(mRenderer, levels, internalformat, IsRenderTargetUsage(mUsage), width, height);
mImmutable = true;
for (int level = 0; level < levels; level++) for (int level = 0; level < levels; level++)
{ {
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, width, height, 1, true); GLsizei levelWidth = std::max(1, width >> level);
width = std::max(1, width >> 1); GLsizei levelHeight = std::max(1, height >> level);
height = std::max(1, height >> 1); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, levelWidth, levelHeight, 1, true);
} }
for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
...@@ -655,15 +651,25 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL ...@@ -655,15 +651,25 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true);
} }
if (mTexStorage->isManaged()) mImmutable = true;
{
int levels = levelCount();
for (int level = 0; level < levels; level++) setCompleteTexStorage(new rx::TextureStorageInterface2D(mRenderer, levels, internalformat, IsRenderTargetUsage(mUsage), width, height));
}
void Texture2D::setCompleteTexStorage(rx::TextureStorageInterface2D *newCompleteTexStorage)
{
SafeDelete(mTexStorage);
mTexStorage = newCompleteTexStorage;
if (mTexStorage && mTexStorage->isManaged())
{
for (int level = 0; level < mTexStorage->levelCount(); level++)
{ {
mImageArray[level]->setManagedSurface(mTexStorage, level); mImageArray[level]->setManagedSurface(mTexStorage, level);
} }
} }
mDirtyImages = true;
} }
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85. // Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85.
...@@ -802,30 +808,40 @@ bool Texture2D::isDepth(GLint level) const ...@@ -802,30 +808,40 @@ bool Texture2D::isDepth(GLint level) const
} }
// Constructs a native texture resource from the texture images // Constructs a native texture resource from the texture images
void Texture2D::createTexture() void Texture2D::initializeStorage(bool renderTarget)
{ {
GLsizei width = getBaseLevelWidth(); // Only initialize the first time this texture is used as a render target or shader resource
GLsizei height = getBaseLevelHeight(); if (mTexStorage)
{
return;
}
if (!(width > 0 && height > 0)) // do not attempt to create storage for nonexistant data
return; // do not attempt to create native textures for nonexistant data if (!isLevelComplete(0))
{
return;
}
GLint levels = creationLevels(width, height); bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mUsage));
delete mTexStorage; setCompleteTexStorage(createCompleteStorage(createRenderTarget));
mTexStorage = new rx::TextureStorageInterface2D(mRenderer, levels, getBaseLevelInternalFormat(), IsRenderTargetUsage(mUsage), width, height); ASSERT(mTexStorage);
if (mTexStorage->isManaged())
{
int levels = levelCount();
for (int level = 0; level < levels; level++) // flush image data to the storage
{ updateStorage();
mImageArray[level]->setManagedSurface(mTexStorage, level); }
}
}
mDirtyImages = true; rx::TextureStorageInterface2D *Texture2D::createCompleteStorage(bool renderTarget) const
{
GLsizei width = getBaseLevelWidth();
GLsizei height = getBaseLevelHeight();
ASSERT(width > 0 && height > 0);
// use existing storage level count, when previously specified by TexStorage*D
GLint levels = (mTexStorage ? mTexStorage->levelCount() : creationLevels(width, height));
return new rx::TextureStorageInterface2D(mRenderer, levels, getBaseLevelInternalFormat(), renderTarget, width, height);
} }
void Texture2D::updateStorage() void Texture2D::updateStorage()
...@@ -854,37 +870,25 @@ void Texture2D::updateStorageLevel(int level) ...@@ -854,37 +870,25 @@ void Texture2D::updateStorageLevel(int level)
bool Texture2D::ensureRenderTarget() bool Texture2D::ensureRenderTarget()
{ {
if (mTexStorage && mTexStorage->isRenderTarget()) initializeStorage(true);
{
return true;
}
rx::TextureStorageInterface2D *newTexStorage = NULL; if (getBaseLevelWidth() > 0 && getBaseLevelHeight() > 0)
GLsizei width = getBaseLevelWidth();
GLsizei height = getBaseLevelHeight();
if (width != 0 && height != 0)
{ {
GLint levels = mTexStorage != NULL ? mTexStorage->levelCount() : creationLevels(width, height); ASSERT(mTexStorage);
if (!mTexStorage->isRenderTarget())
newTexStorage = new rx::TextureStorageInterface2D(mRenderer, levels, getBaseLevelInternalFormat(), true, width, height);
if (mTexStorage != NULL)
{ {
if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage)) rx::TextureStorageInterface2D *newRenderTargetStorage = createCompleteStorage(true);
{
delete newTexStorage; if (!mRenderer->copyToRenderTarget(newRenderTargetStorage, mTexStorage))
{
delete newRenderTargetStorage;
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
setCompleteTexStorage(newRenderTargetStorage);
} }
} }
delete mTexStorage;
mTexStorage = newTexStorage;
mDirtyImages = true;
return (mTexStorage && mTexStorage->isRenderTarget()); return (mTexStorage && mTexStorage->isRenderTarget());
} }
...@@ -992,7 +996,7 @@ rx::TextureStorageInterface *Texture2D::getStorage(bool renderTarget) ...@@ -992,7 +996,7 @@ rx::TextureStorageInterface *Texture2D::getStorage(bool renderTarget)
} }
else else
{ {
createTexture(); initializeStorage(false);
} }
} }
...@@ -1272,7 +1276,7 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const ...@@ -1272,7 +1276,7 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const
} }
// Constructs a native texture resource from the texture images, or returns an existing one // Constructs a native texture resource from the texture images, or returns an existing one
void TextureCubeMap::createTexture() void TextureCubeMap::initializeStorage(bool renderTarget)
{ {
GLsizei size = getBaseLevelWidth(); GLsizei size = getBaseLevelWidth();
...@@ -1656,7 +1660,7 @@ rx::TextureStorageInterface *TextureCubeMap::getStorage(bool renderTarget) ...@@ -1656,7 +1660,7 @@ rx::TextureStorageInterface *TextureCubeMap::getStorage(bool renderTarget)
} }
else else
{ {
createTexture(); initializeStorage(false);
} }
} }
...@@ -2009,7 +2013,7 @@ int Texture3D::levelCount() ...@@ -2009,7 +2013,7 @@ int Texture3D::levelCount()
return mTexStorage ? mTexStorage->levelCount() : 0; return mTexStorage ? mTexStorage->levelCount() : 0;
} }
void Texture3D::createTexture() void Texture3D::initializeStorage(bool renderTarget)
{ {
GLsizei width = getBaseLevelWidth(); GLsizei width = getBaseLevelWidth();
GLsizei height = getBaseLevelHeight(); GLsizei height = getBaseLevelHeight();
...@@ -2162,7 +2166,7 @@ rx::TextureStorageInterface *Texture3D::getStorage(bool renderTarget) ...@@ -2162,7 +2166,7 @@ rx::TextureStorageInterface *Texture3D::getStorage(bool renderTarget)
} }
else else
{ {
createTexture(); initializeStorage(false);
} }
} }
...@@ -2580,7 +2584,7 @@ int Texture2DArray::levelCount() ...@@ -2580,7 +2584,7 @@ int Texture2DArray::levelCount()
return mTexStorage ? mTexStorage->levelCount() : 0; return mTexStorage ? mTexStorage->levelCount() : 0;
} }
void Texture2DArray::createTexture() void Texture2DArray::initializeStorage(bool renderTarget)
{ {
GLsizei width = getBaseLevelWidth(); GLsizei width = getBaseLevelWidth();
GLsizei height = getBaseLevelHeight(); GLsizei height = getBaseLevelHeight();
...@@ -2725,7 +2729,7 @@ rx::TextureStorageInterface *Texture2DArray::getStorage(bool renderTarget) ...@@ -2725,7 +2729,7 @@ rx::TextureStorageInterface *Texture2DArray::getStorage(bool renderTarget)
} }
else else
{ {
createTexture(); initializeStorage(false);
} }
} }
......
...@@ -127,7 +127,7 @@ class Texture : public RefCountObject ...@@ -127,7 +127,7 @@ class Texture : public RefCountObject
GLint creationLevels(GLsizei size) const; GLint creationLevels(GLsizei size) const;
int mipLevels() const; int mipLevels() const;
virtual void createTexture() = 0; virtual void initializeStorage(bool renderTarget) = 0;
virtual void updateStorage() = 0; virtual void updateStorage() = 0;
virtual bool ensureRenderTarget() = 0; virtual bool ensureRenderTarget() = 0;
...@@ -196,7 +196,10 @@ class Texture2D : public Texture ...@@ -196,7 +196,10 @@ class Texture2D : public Texture
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture2D); DISALLOW_COPY_AND_ASSIGN(Texture2D);
virtual void createTexture(); virtual void initializeStorage(bool renderTarget);
rx::TextureStorageInterface2D *createCompleteStorage(bool renderTarget) const;
void setCompleteTexStorage(rx::TextureStorageInterface2D *newCompleteTexStorage);
virtual void updateStorage(); virtual void updateStorage();
virtual bool ensureRenderTarget(); virtual bool ensureRenderTarget();
virtual rx::TextureStorageInterface *getStorage(bool renderTarget); virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
...@@ -263,7 +266,7 @@ class TextureCubeMap : public Texture ...@@ -263,7 +266,7 @@ class TextureCubeMap : public Texture
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureCubeMap); DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
virtual void createTexture(); virtual void initializeStorage(bool renderTarget);
virtual void updateStorage(); virtual void updateStorage();
virtual bool ensureRenderTarget(); virtual bool ensureRenderTarget();
virtual rx::TextureStorageInterface *getStorage(bool renderTarget); virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
...@@ -322,7 +325,7 @@ class Texture3D : public Texture ...@@ -322,7 +325,7 @@ class Texture3D : public Texture
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture3D); DISALLOW_COPY_AND_ASSIGN(Texture3D);
virtual void createTexture(); virtual void initializeStorage(bool renderTarget);
virtual void updateStorage(); virtual void updateStorage();
virtual bool ensureRenderTarget(); virtual bool ensureRenderTarget();
...@@ -379,7 +382,7 @@ class Texture2DArray : public Texture ...@@ -379,7 +382,7 @@ class Texture2DArray : public Texture
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture2DArray); DISALLOW_COPY_AND_ASSIGN(Texture2DArray);
virtual void createTexture(); virtual void initializeStorage(bool renderTarget);
virtual void updateStorage(); virtual void updateStorage();
virtual bool ensureRenderTarget(); virtual bool ensureRenderTarget();
......
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