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 ...@@ -210,6 +210,42 @@ int TextureD3D::mipLevels() const
return gl::log2(std::max(std::max(getBaseLevelWidth(), getBaseLevelHeight()), getBaseLevelDepth())) + 1; 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_2D::TextureD3D_2D(Renderer *renderer)
: TextureD3D(renderer), : TextureD3D(renderer),
...@@ -489,7 +525,7 @@ void TextureD3D_2D::releaseTexImage() ...@@ -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. // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels(); int levelCount = mipLevels();
...@@ -499,22 +535,6 @@ void TextureD3D_2D::generateMipmaps() ...@@ -499,22 +535,6 @@ void TextureD3D_2D::generateMipmaps()
std::max(getBaseLevelWidth() >> level, 1), std::max(getBaseLevelWidth() >> level, 1),
std::max(getBaseLevelHeight() >> 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) unsigned int TextureD3D_2D::getRenderTargetSerial(const gl::ImageIndex &index)
...@@ -994,7 +1014,7 @@ void TextureD3D_Cube::releaseTexImage() ...@@ -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. // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels(); int levelCount = mipLevels();
...@@ -1006,29 +1026,6 @@ void TextureD3D_Cube::generateMipmaps() ...@@ -1006,29 +1026,6 @@ void TextureD3D_Cube::generateMipmaps()
redefineImage(faceIndex, level, mImageArray[faceIndex][0]->getInternalFormat(), faceLevelSize, faceLevelSize); 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) unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index)
...@@ -1502,7 +1499,7 @@ void TextureD3D_3D::releaseTexImage() ...@@ -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. // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int levelCount = mipLevels(); int levelCount = mipLevels();
...@@ -1513,23 +1510,6 @@ void TextureD3D_3D::generateMipmaps() ...@@ -1513,23 +1510,6 @@ void TextureD3D_3D::generateMipmaps()
std::max(getBaseLevelHeight() >> level, 1), std::max(getBaseLevelHeight() >> level, 1),
std::max(getBaseLevelDepth() >> 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) unsigned int TextureD3D_3D::getRenderTargetSerial(const gl::ImageIndex &index)
...@@ -1994,7 +1974,7 @@ void TextureD3D_2DArray::releaseTexImage() ...@@ -1994,7 +1974,7 @@ void TextureD3D_2DArray::releaseTexImage()
} }
void TextureD3D_2DArray::generateMipmaps() void TextureD3D_2DArray::initMipmapsImages()
{ {
int baseWidth = getBaseLevelWidth(); int baseWidth = getBaseLevelWidth();
int baseHeight = getBaseLevelHeight(); int baseHeight = getBaseLevelHeight();
...@@ -2007,29 +1987,6 @@ void TextureD3D_2DArray::generateMipmaps() ...@@ -2007,29 +1987,6 @@ void TextureD3D_2DArray::generateMipmaps()
{ {
redefineImage(level, baseFormat, std::max(baseWidth >> level, 1), std::max(baseHeight >> level, 1), baseDepth); 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) unsigned int TextureD3D_2DArray::getRenderTargetSerial(const gl::ImageIndex &index)
......
...@@ -58,6 +58,8 @@ class TextureD3D : public TextureImpl ...@@ -58,6 +58,8 @@ class TextureD3D : public TextureImpl
// slices of their depth texures, so 3D textures ignore the layer parameter. // slices of their depth texures, so 3D textures ignore the layer parameter.
virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0; virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
virtual void generateMipmaps();
protected: protected:
void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image); 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, bool subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
...@@ -71,6 +73,7 @@ class TextureD3D : public TextureImpl ...@@ -71,6 +73,7 @@ class TextureD3D : public TextureImpl
GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const; GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
int mipLevels() const; int mipLevels() const;
virtual void initMipmapsImages() = 0;
Renderer *mRenderer; Renderer *mRenderer;
...@@ -117,8 +120,6 @@ class TextureD3D_2D : public TextureD3D ...@@ -117,8 +120,6 @@ class TextureD3D_2D : public TextureD3D
virtual void bindTexImage(egl::Surface *surface); virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage(); virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
...@@ -136,6 +137,7 @@ class TextureD3D_2D : public TextureD3D ...@@ -136,6 +137,7 @@ class TextureD3D_2D : public TextureD3D
bool ensureRenderTarget(); bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage(); virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const; virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const; bool isValidLevel(int level) const;
bool isLevelComplete(int level) const; bool isLevelComplete(int level) const;
...@@ -177,8 +179,6 @@ class TextureD3D_Cube : public TextureD3D ...@@ -177,8 +179,6 @@ class TextureD3D_Cube : public TextureD3D
virtual void bindTexImage(egl::Surface *surface); virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage(); virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
...@@ -196,6 +196,7 @@ class TextureD3D_Cube : public TextureD3D ...@@ -196,6 +196,7 @@ class TextureD3D_Cube : public TextureD3D
bool ensureRenderTarget(); bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage(); virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const; virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidFaceLevel(int faceIndex, int level) const; bool isValidFaceLevel(int faceIndex, int level) const;
bool isFaceLevelComplete(int faceIndex, int level) const; bool isFaceLevelComplete(int faceIndex, int level) const;
...@@ -237,8 +238,6 @@ class TextureD3D_3D : public TextureD3D ...@@ -237,8 +238,6 @@ class TextureD3D_3D : public TextureD3D
virtual void bindTexImage(egl::Surface *surface); virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage(); virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
...@@ -256,6 +255,7 @@ class TextureD3D_3D : public TextureD3D ...@@ -256,6 +255,7 @@ class TextureD3D_3D : public TextureD3D
bool ensureRenderTarget(); bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage(); virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const; virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const; bool isValidLevel(int level) const;
bool isLevelComplete(int level) const; bool isLevelComplete(int level) const;
...@@ -296,8 +296,6 @@ class TextureD3D_2DArray : public TextureD3D ...@@ -296,8 +296,6 @@ class TextureD3D_2DArray : public TextureD3D
virtual void bindTexImage(egl::Surface *surface); virtual void bindTexImage(egl::Surface *surface);
virtual void releaseTexImage(); virtual void releaseTexImage();
virtual void generateMipmaps();
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
...@@ -315,6 +313,7 @@ class TextureD3D_2DArray : public TextureD3D ...@@ -315,6 +313,7 @@ class TextureD3D_2DArray : public TextureD3D
bool ensureRenderTarget(); bool ensureRenderTarget();
virtual TextureStorage *getBaseLevelStorage(); virtual TextureStorage *getBaseLevelStorage();
virtual const ImageD3D *getBaseLevelImage() const; virtual const ImageD3D *getBaseLevelImage() const;
virtual void initMipmapsImages();
bool isValidLevel(int level) const; bool isValidLevel(int level) const;
bool isLevelComplete(int level) const; bool isLevelComplete(int level) const;
......
...@@ -36,7 +36,7 @@ class TextureStorage ...@@ -36,7 +36,7 @@ class TextureStorage
virtual int getLevelCount() const = 0; virtual int getLevelCount() const = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 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 getRenderTargetSerial(const gl::ImageIndex &index) const;
unsigned int getTextureSerial() const; unsigned int getTextureSerial() const;
......
...@@ -364,8 +364,15 @@ bool TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, unsigned ...@@ -364,8 +364,15 @@ bool TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, unsigned
return false; 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) if (source && dest)
{ {
ID3D11ShaderResourceView *sourceSRV = source->getShaderResourceView(); ID3D11ShaderResourceView *sourceSRV = source->getShaderResourceView();
...@@ -710,24 +717,6 @@ ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipL ...@@ -710,24 +717,6 @@ ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipL
return SRV; 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() ID3D11Resource *TextureStorage11_2D::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
...@@ -1116,27 +1105,6 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mi ...@@ -1116,27 +1105,6 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mi
return SRV; 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() ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
...@@ -1494,24 +1462,6 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index) ...@@ -1494,24 +1462,6 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index)
return NULL; 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() ID3D11Resource *TextureStorage11_3D::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
...@@ -1845,26 +1795,6 @@ RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &in ...@@ -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() ID3D11Resource *TextureStorage11_2DArray::getSwizzleTexture()
{ {
if (!mSwizzleTexture) if (!mSwizzleTexture)
......
...@@ -45,7 +45,7 @@ class TextureStorage11 : public TextureStorage ...@@ -45,7 +45,7 @@ class TextureStorage11 : public TextureStorage
virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState); virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; 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 int getTopLevel() const;
virtual bool isRenderTarget() const; virtual bool isRenderTarget() const;
...@@ -72,7 +72,6 @@ class TextureStorage11 : public TextureStorage ...@@ -72,7 +72,6 @@ class TextureStorage11 : public TextureStorage
protected: protected:
TextureStorage11(Renderer *renderer, UINT bindFlags); TextureStorage11(Renderer *renderer, UINT bindFlags);
void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
int getLevelWidth(int mipLevel) const; int getLevelWidth(int mipLevel) const;
int getLevelHeight(int mipLevel) const; int getLevelHeight(int mipLevel) const;
int getLevelDepth(int mipLevel) const; int getLevelDepth(int mipLevel) const;
...@@ -163,8 +162,6 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -163,8 +162,6 @@ class TextureStorage11_2D : public TextureStorage11
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget); virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage); virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
...@@ -199,8 +196,6 @@ class TextureStorage11_Cube : public TextureStorage11 ...@@ -199,8 +196,6 @@ class TextureStorage11_Cube : public TextureStorage11
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget); virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage); virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
...@@ -238,8 +233,6 @@ class TextureStorage11_3D : public TextureStorage11 ...@@ -238,8 +233,6 @@ class TextureStorage11_3D : public TextureStorage11
// Handles both layer and non-layer RTs // Handles both layer and non-layer RTs
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget); virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage); virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
...@@ -279,8 +272,6 @@ class TextureStorage11_2DArray : public TextureStorage11 ...@@ -279,8 +272,6 @@ class TextureStorage11_2DArray : public TextureStorage11
virtual ID3D11Resource *getResource() const; virtual ID3D11Resource *getResource() const;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual void generateMipmaps();
virtual void associateImage(Image11* image, int level, int layerTarget); virtual void associateImage(Image11* image, int level, int layerTarget);
virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
virtual bool isAssociatedImageValid(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* ...@@ -164,23 +164,18 @@ RenderTarget *TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*
return mRenderTarget; 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); mRenderer->boxFilter(upper, lower);
IDirect3DSurface9 *lower = getSurfaceLevel(level, true);
if (upper != NULL && lower != NULL)
{
mRenderer->boxFilter(upper, lower);
}
SafeRelease(upper);
SafeRelease(lower);
} }
SafeRelease(upper);
SafeRelease(lower);
} }
IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const
...@@ -276,26 +271,18 @@ RenderTarget *TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index) ...@@ -276,26 +271,18 @@ RenderTarget *TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index)
return mRenderTarget[index.layerIndex]; 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++) mRenderer->boxFilter(upper, lower);
{
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);
}
} }
SafeRelease(upper);
SafeRelease(lower);
} }
IDirect3DBaseTexture9 *TextureStorage9_Cube::getBaseTexture() const IDirect3DBaseTexture9 *TextureStorage9_Cube::getBaseTexture() const
......
...@@ -35,7 +35,7 @@ class TextureStorage9 : public TextureStorage ...@@ -35,7 +35,7 @@ class TextureStorage9 : public TextureStorage
virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0; virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0;
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 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 int getTopLevel() const;
virtual bool isRenderTarget() const; virtual bool isRenderTarget() const;
...@@ -67,7 +67,7 @@ class TextureStorage9_2D : public TextureStorage9 ...@@ -67,7 +67,7 @@ class TextureStorage9_2D : public TextureStorage9
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty); IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmaps(); virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage9_2D); DISALLOW_COPY_AND_ASSIGN(TextureStorage9_2D);
...@@ -89,7 +89,7 @@ class TextureStorage9_Cube : public TextureStorage9 ...@@ -89,7 +89,7 @@ class TextureStorage9_Cube : public TextureStorage9
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty); IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
virtual void generateMipmaps(); virtual void generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage9_Cube); 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