Commit 4aa79e11 by Jamie Madill

Reduce code duplication in generateMipmap.

Using the newly introduced image index struct, we can simplify our code somewhat in TextureStorage. BUG=angle:729 Change-Id: Iff274fd1df7a0dc36dd34e0cb31ad42831b4f5d5 Reviewed-on: https://chromium-review.googlesource.com/219836Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent cb83dc16
......@@ -210,6 +210,42 @@ int TextureD3D::mipLevels() const
return gl::log2(std::max(std::max(getBaseLevelWidth(), getBaseLevelHeight()), getBaseLevelDepth())) + 1;
}
void TextureD3D::generateMipmaps()
{
// Set up proper image sizes.
initMipmapsImages();
// We know that all layers have the same dimension, for the texture to be complete
GLint layerCount = static_cast<GLint>(getLayerCount(0));
GLint mipCount = mipLevels();
// The following will create and initialize the storage, or update it if it exists
TextureStorage *storage = getNativeTexture();
bool renderableStorage = (storage && storage->isRenderTarget());
for (GLint layer = 0; layer < layerCount; ++layer)
{
for (GLint mip = 1; mip < mipCount; ++mip)
{
ASSERT(getLayerCount(mip) == layerCount);
gl::ImageIndex sourceIndex = getImageIndex(mip - 1, layer);
gl::ImageIndex destIndex = getImageIndex(mip, layer);
if (renderableStorage)
{
// GPU-side mipmapping
storage->generateMipmap(sourceIndex, destIndex);
}
else
{
// CPU-side mipmapping
mRenderer->generateMipmap(getImage(destIndex), getImage(sourceIndex));
}
}
}
}
TextureD3D_2D::TextureD3D_2D(Renderer *renderer)
: TextureD3D(renderer),
......@@ -489,7 +525,7 @@ void TextureD3D_2D::releaseTexImage()
}
}
void TextureD3D_2D::generateMipmaps()
void TextureD3D_2D::initMipmapsImages()
{
// Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels();
......@@ -499,22 +535,6 @@ void TextureD3D_2D::generateMipmaps()
std::max(getBaseLevelWidth() >> level, 1),
std::max(getBaseLevelHeight() >> level, 1));
}
if (mTexStorage && mTexStorage->isRenderTarget())
{
mTexStorage->generateMipmaps();
for (int level = 1; level < levelCount; level++)
{
mImageArray[level]->markClean();
}
}
else
{
for (int level = 1; level < levelCount; level++)
{
mRenderer->generateMipmap(mImageArray[level], mImageArray[level - 1]);
}
}
}
unsigned int TextureD3D_2D::getRenderTargetSerial(const gl::ImageIndex &index)
......@@ -994,7 +1014,7 @@ void TextureD3D_Cube::releaseTexImage()
}
void TextureD3D_Cube::generateMipmaps()
void TextureD3D_Cube::initMipmapsImages()
{
// Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels();
......@@ -1006,29 +1026,6 @@ void TextureD3D_Cube::generateMipmaps()
redefineImage(faceIndex, level, mImageArray[faceIndex][0]->getInternalFormat(), faceLevelSize, faceLevelSize);
}
}
if (mTexStorage && mTexStorage->isRenderTarget())
{
mTexStorage->generateMipmaps();
for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{
for (int level = 1; level < levelCount; level++)
{
mImageArray[faceIndex][level]->markClean();
}
}
}
else
{
for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{
for (int level = 1; level < levelCount; level++)
{
mRenderer->generateMipmap(mImageArray[faceIndex][level], mImageArray[faceIndex][level - 1]);
}
}
}
}
unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index)
......@@ -1502,7 +1499,7 @@ void TextureD3D_3D::releaseTexImage()
}
void TextureD3D_3D::generateMipmaps()
void TextureD3D_3D::initMipmapsImages()
{
// Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels();
......@@ -1513,23 +1510,6 @@ void TextureD3D_3D::generateMipmaps()
std::max(getBaseLevelHeight() >> level, 1),
std::max(getBaseLevelDepth() >> level, 1));
}
if (mTexStorage && mTexStorage->isRenderTarget())
{
mTexStorage->generateMipmaps();
for (int level = 1; level < levelCount; level++)
{
mImageArray[level]->markClean();
}
}
else
{
for (int level = 1; level < levelCount; level++)
{
mRenderer->generateMipmap(mImageArray[level], mImageArray[level - 1]);
}
}
}
unsigned int TextureD3D_3D::getRenderTargetSerial(const gl::ImageIndex &index)
......@@ -1994,7 +1974,7 @@ void TextureD3D_2DArray::releaseTexImage()
}
void TextureD3D_2DArray::generateMipmaps()
void TextureD3D_2DArray::initMipmapsImages()
{
int baseWidth = getBaseLevelWidth();
int baseHeight = getBaseLevelHeight();
......@@ -2007,29 +1987,6 @@ void TextureD3D_2DArray::generateMipmaps()
{
redefineImage(level, baseFormat, std::max(baseWidth >> level, 1), std::max(baseHeight >> level, 1), baseDepth);
}
if (mTexStorage && mTexStorage->isRenderTarget())
{
mTexStorage->generateMipmaps();
for (int level = 1; level < levelCount; level++)
{
for (int layer = 0; layer < mLayerCounts[level]; layer++)
{
mImageArray[level][layer]->markClean();
}
}
}
else
{
for (int level = 1; level < levelCount; level++)
{
for (int layer = 0; layer < mLayerCounts[level]; layer++)
{
mRenderer->generateMipmap(mImageArray[level][layer], mImageArray[level - 1][layer]);
}
}
}
}
unsigned int TextureD3D_2DArray::getRenderTargetSerial(const gl::ImageIndex &index)
......
......@@ -58,6 +58,8 @@ class TextureD3D : public TextureImpl
// slices of their depth texures, so 3D textures ignore the layer parameter.
virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
virtual void generateMipmaps();
protected:
void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image);
bool subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
......@@ -71,6 +73,7 @@ class TextureD3D : public TextureImpl
GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
int mipLevels() const;
virtual void initMipmapsImages() = 0;
Renderer *mRenderer;
......@@ -117,8 +120,6 @@ class TextureD3D_2D : public TextureD3D
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
......@@ -136,6 +137,7 @@ class TextureD3D_2D : public TextureD3D
bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
......@@ -177,8 +179,6 @@ class TextureD3D_Cube : public TextureD3D
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
......@@ -196,6 +196,7 @@ class TextureD3D_Cube : public TextureD3D
bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidFaceLevel(int faceIndex, int level) const;
bool isFaceLevelComplete(int faceIndex, int level) const;
......@@ -237,8 +238,6 @@ class TextureD3D_3D : public TextureD3D
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
......@@ -256,6 +255,7 @@ class TextureD3D_3D : public TextureD3D
bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
......@@ -296,8 +296,6 @@ class TextureD3D_2DArray : public TextureD3D
virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
......@@ -315,6 +313,7 @@ class TextureD3D_2DArray : public TextureD3D
bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const;
bool isLevelComplete(int level) const;
......
......@@ -36,7 +36,7 @@ class TextureStorage
virtual int getLevelCount() const = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmaps() = 0;
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex) = 0;
unsigned int getRenderTargetSerial(const gl::ImageIndex &index) const;
unsigned int getTextureSerial() const;
......
......@@ -364,8 +364,15 @@ bool TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, unsigned
return false;
}
void TextureStorage11::generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest)
void TextureStorage11::generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex)
{
ASSERT(sourceIndex.layerIndex == destIndex.layerIndex);
invalidateSwizzleCacheLevel(destIndex.mipIndex);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(sourceIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
if (source && dest)
{
ID3D11ShaderResourceView *sourceSRV = source->getShaderResourceView();
......@@ -710,24 +717,6 @@ ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipL
return SRV;
}
void TextureStorage11_2D::generateMipmaps()
{
// Base level must already be defined
for (int level = 1; level < getLevelCount(); level++)
{
invalidateSwizzleCacheLevel(level);
gl::ImageIndex srcIndex = gl::ImageIndex::Make2D(level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::Make2D(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
}
ID3D11Resource *TextureStorage11_2D::getSwizzleTexture()
{
if (!mSwizzleTexture)
......@@ -1116,27 +1105,6 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mi
return SRV;
}
void TextureStorage11_Cube::generateMipmaps()
{
// Base level must already be defined
for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{
for (int level = 1; level < getLevelCount(); level++)
{
invalidateSwizzleCacheLevel(level);
gl::ImageIndex srcIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
}
}
ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture()
{
if (!mSwizzleTexture)
......@@ -1494,24 +1462,6 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
return NULL;
}
void TextureStorage11_3D::generateMipmaps()
{
// Base level must already be defined
for (int level = 1; level < getLevelCount(); level++)
{
invalidateSwizzleCacheLevel(level);
gl::ImageIndex srcIndex = gl::ImageIndex::Make3D(level - 1);
gl::ImageIndex destIndex = gl::ImageIndex::Make3D(level);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
}
ID3D11Resource *TextureStorage11_3D::getSwizzleTexture()
{
if (!mSwizzleTexture)
......@@ -1845,26 +1795,6 @@ RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &in
}
}
void TextureStorage11_2DArray::generateMipmaps()
{
// Base level must already be defined
for (int level = 0; level < getLevelCount(); level++)
{
invalidateSwizzleCacheLevel(level);
for (unsigned int layer = 0; layer < mTextureDepth; layer++)
{
gl::ImageIndex sourceIndex = gl::ImageIndex::Make2DArray(level - 1, layer);
gl::ImageIndex destIndex = gl::ImageIndex::Make2DArray(level, layer);
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(sourceIndex));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex));
generateMipmapLayer(source, dest);
}
}
}
ID3D11Resource *TextureStorage11_2DArray::getSwizzleTexture()
{
if (!mSwizzleTexture)
......
......@@ -45,7 +45,7 @@ class TextureStorage11 : public TextureStorage
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmaps() = 0;
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
virtual int getTopLevel() const;
virtual bool isRenderTarget() const;
......@@ -72,7 +72,6 @@ class TextureStorage11 : public TextureStorage
protected:
TextureStorage11(Renderer *renderer, UINT bindFlags);
void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
int getLevelWidth(int mipLevel) const;
int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const;
......@@ -163,8 +162,6 @@ class TextureStorage11_2D : public TextureStorage11
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
......@@ -199,8 +196,6 @@ class TextureStorage11_Cube : public TextureStorage11
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
......@@ -238,8 +233,6 @@ class TextureStorage11_3D : public TextureStorage11
// Handles both layer and non-layer RTs
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
......@@ -279,8 +272,6 @@ class TextureStorage11_2DArray : public TextureStorage11
virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
......
......@@ -164,23 +164,18 @@ RenderTarget *TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*
return mRenderTarget;
}
void TextureStorage9_2D::generateMipmaps()
void TextureStorage9_2D::generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex)
{
// Base level must already be defined
IDirect3DSurface9 *upper = getSurfaceLevel(sourceIndex.mipIndex, false);
IDirect3DSurface9 *lower = getSurfaceLevel(destIndex.mipIndex, true);
for (int level = 1; level < getLevelCount(); level++)
if (upper != NULL && lower != NULL)
{
IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false);
IDirect3DSurface9 *lower = getSurfaceLevel(level, true);
if (upper != NULL && lower != NULL)
{
mRenderer->boxFilter(upper, lower);
}
SafeRelease(upper);
SafeRelease(lower);
mRenderer->boxFilter(upper, lower);
}
SafeRelease(upper);
SafeRelease(lower);
}
IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const
......@@ -276,26 +271,18 @@ RenderTarget *TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index)
return mRenderTarget[index.layerIndex];
}
void TextureStorage9_Cube::generateMipmaps()
void TextureStorage9_Cube::generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex)
{
// Base level must already be defined
IDirect3DSurface9 *upper = getCubeMapSurface(sourceIndex.type, destIndex.mipIndex, false);
IDirect3DSurface9 *lower = getCubeMapSurface(destIndex.type, destIndex.mipIndex, true);
for (int faceIndex = 0; faceIndex < 6; faceIndex++)
if (upper != NULL && lower != NULL)
{
for (int level = 1; level < getLevelCount(); level++)
{
IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1, false);
IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, true);
if (upper != NULL && lower != NULL)
{
mRenderer->boxFilter(upper, lower);
}
SafeRelease(upper);
SafeRelease(lower);
}
mRenderer->boxFilter(upper, lower);
}
SafeRelease(upper);
SafeRelease(lower);
}
IDirect3DBaseTexture9 *TextureStorage9_Cube::getBaseTexture() const
......
......@@ -35,7 +35,7 @@ class TextureStorage9 : public TextureStorage
virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
virtual void generateMipmaps() = 0;
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex) = 0;
virtual int getTopLevel() const;
virtual bool isRenderTarget() const;
......@@ -67,7 +67,7 @@ class TextureStorage9_2D : public TextureStorage9
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmaps();
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage9_2D);
......@@ -89,7 +89,7 @@ class TextureStorage9_Cube : public TextureStorage9
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmaps();
virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage9_Cube);
......
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