- Improved organization of texture state cache.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4406 dfc29bdd-3216-0410-991c-e03cc46cb475
master
nadro 2012-12-18 17:01:01 +00:00
parent 165b266bef
commit 9f8f38e16b
3 changed files with 50 additions and 123 deletions

View File

@ -2854,7 +2854,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
const COpenGLTexture* tmpTexture = static_cast<const COpenGLTexture*>(CurrentTexture[i]);
if(resetAllRenderStates)
tmpTexture->setCacheStatus(false);
tmpTexture->getStatesCache().IsCached = false;
#ifdef GL_EXT_texture_lod_bias
if (FeatureAvailable[IRR_EXT_texture_lod_bias] && (resetAllRenderStates || material.TextureLayer[i].LODBias != CacheLODBias[i]))
@ -2870,69 +2870,69 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
CacheLODBias[i] = material.TextureLayer[i].LODBias;
}
#endif
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter())
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
}
if (material.UseMipMaps && CurrentTexture[i]->hasMipMaps())
{
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter() || !tmpTexture->getMipMapsStatus())
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || !tmpTexture->getStatesCache().MipMapStatus)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
GL_NEAREST_MIPMAP_NEAREST);
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
tmpTexture->setMipMapsStatus(true);
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
tmpTexture->getStatesCache().MipMapStatus = true;
}
}
else
{
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter() || tmpTexture->getMipMapsStatus())
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || tmpTexture->getStatesCache().MipMapStatus)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
tmpTexture->setMipMapsStatus(false);
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
tmpTexture->getStatesCache().MipMapStatus = false;
}
}
#ifdef GL_EXT_texture_filter_anisotropic
if (FeatureAvailable[IRR_EXT_texture_filter_anisotropic] &&
(!tmpTexture->getCacheStatus() || material.TextureLayer[i].AnisotropicFilter != tmpTexture->getAnisotropicFilter()))
(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].AnisotropicFilter != tmpTexture->getStatesCache().AnisotropicFilter))
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
material.TextureLayer[i].AnisotropicFilter>1 ? core::min_(MaxAnisotropy, material.TextureLayer[i].AnisotropicFilter) : 1);
tmpTexture->setAnisotropicFilter(material.TextureLayer[i].AnisotropicFilter);
tmpTexture->getStatesCache().AnisotropicFilter = material.TextureLayer[i].AnisotropicFilter;
}
#endif
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].TextureWrapU != tmpTexture->getTextureWrapU())
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].TextureWrapU != tmpTexture->getStatesCache().WrapU)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, getTextureWrapMode(material.TextureLayer[i].TextureWrapU));
tmpTexture->setTextureWrapU(material.TextureLayer[i].TextureWrapU);
tmpTexture->getStatesCache().WrapU = material.TextureLayer[i].TextureWrapU;
}
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].TextureWrapV != tmpTexture->getTextureWrapV())
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].TextureWrapV != tmpTexture->getStatesCache().WrapV)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, getTextureWrapMode(material.TextureLayer[i].TextureWrapV));
tmpTexture->setTextureWrapV(material.TextureLayer[i].TextureWrapV);
tmpTexture->getStatesCache().WrapV = material.TextureLayer[i].TextureWrapV;
}
tmpTexture->setCacheStatus(true);
tmpTexture->getStatesCache().IsCached = true;
}
// fillmode

View File

@ -25,8 +25,7 @@ COpenGLTexture::COpenGLTexture(IImage* origImage, const io::path& name, void* mi
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), MipmapLegacyMode(true),
IsRenderTarget(false), AutomaticMipmapUpdate(false),
ReadOnlyLock(false), KeepImage(true),
WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), Bilinear(true), Trilinear(false), Anisotropic(0), MipMapStatus(true), CacheStatus(false)
ReadOnlyLock(false), KeepImage(true)
{
#ifdef _DEBUG
setDebugName("COpenGLTexture");
@ -63,8 +62,7 @@ COpenGLTexture::COpenGLTexture(const io::path& name, COpenGLDriver* driver)
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), HasMipMaps(true),
MipmapLegacyMode(true), IsRenderTarget(false), AutomaticMipmapUpdate(false),
ReadOnlyLock(false), KeepImage(true),
WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), Bilinear(true), Trilinear(false), Anisotropic(0), MipMapStatus(true), CacheStatus(false)
ReadOnlyLock(false), KeepImage(true)
{
#ifdef _DEBUG
setDebugName("COpenGLTexture");
@ -658,76 +656,11 @@ void COpenGLTexture::unbindRTT()
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, getSize().Width, getSize().Height);
}
//! Cache methods.
u8 COpenGLTexture::getTextureWrapU() const
//! Get an access to texture states cache.
COpenGLTexture::SStatesCache& COpenGLTexture::getStatesCache() const
{
return WrapU;
}
void COpenGLTexture::setTextureWrapU(u8 value) const
{
WrapU = value;
}
u8 COpenGLTexture::getTextureWrapV() const
{
return WrapV;
}
void COpenGLTexture::setTextureWrapV(u8 value) const
{
WrapV = value;
}
bool COpenGLTexture::getBilinearFilter() const
{
return Bilinear;
}
void COpenGLTexture::setBilinearFilter(bool value) const
{
Bilinear = value;
}
bool COpenGLTexture::getTrilinearFilter() const
{
return Trilinear;
}
void COpenGLTexture::setTrilinearFilter(bool value) const
{
Trilinear = value;
}
u8 COpenGLTexture::getAnisotropicFilter() const
{
return Anisotropic;
}
void COpenGLTexture::setAnisotropicFilter(u8 value) const
{
Anisotropic = value;
}
bool COpenGLTexture::getMipMapsStatus() const
{
return MipMapStatus;
}
void COpenGLTexture::setMipMapsStatus(bool value) const
{
MipMapStatus = value;
}
bool COpenGLTexture::getCacheStatus() const
{
return CacheStatus;
}
void COpenGLTexture::setCacheStatus(bool value) const
{
CacheStatus = value;
return StatesCache;
}

View File

@ -7,6 +7,7 @@
#include "ITexture.h"
#include "IImage.h"
#include "SMaterialLayer.h"
#include "IrrCompileConfig.h"
#ifdef _IRR_COMPILE_WITH_OPENGL_
@ -45,11 +46,30 @@ namespace video
{
class COpenGLDriver;
//! OpenGL texture.
class COpenGLTexture : public ITexture
{
public:
//! Cache structure.
struct SStatesCache
{
SStatesCache() : WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), BilinearFilter(true),
TrilinearFilter(false), AnisotropicFilter(0), MipMapStatus(true), IsCached(false)
{
}
u8 WrapU;
u8 WrapV;
bool BilinearFilter;
bool TrilinearFilter;
u8 AnisotropicFilter;
bool MipMapStatus;
bool IsCached;
};
//! constructor
COpenGLTexture(IImage* surface, const io::path& name, void* mipmapData=0, COpenGLDriver* driver=0);
@ -103,28 +123,8 @@ public:
//! sets whether this texture is intended to be used as a render target.
void setIsRenderTarget(bool isTarget);
//! Cache methods.
u8 getTextureWrapU() const;
void setTextureWrapU(u8 value) const;
u8 getTextureWrapV() const;
void setTextureWrapV(u8 value) const;
bool getBilinearFilter() const;
void setBilinearFilter(bool value) const;
bool getTrilinearFilter() const;
void setTrilinearFilter(bool value) const;
u8 getAnisotropicFilter() const;
void setAnisotropicFilter(u8 value) const;
bool getMipMapsStatus() const;
void setMipMapsStatus(bool value) const;
bool getCacheStatus() const;
void setCacheStatus(bool value) const;
//! Get an access to texture states cache.
SStatesCache& getStatesCache() const;
protected:
@ -167,13 +167,7 @@ protected:
bool ReadOnlyLock;
bool KeepImage;
mutable u8 WrapU;
mutable u8 WrapV;
mutable bool Bilinear;
mutable bool Trilinear;
mutable u8 Anisotropic;
mutable bool MipMapStatus;
mutable bool CacheStatus;
mutable SStatesCache StatesCache;
};
//! OpenGL FBO texture.