- Improved organization of texture state cache.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4406 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
165b266bef
commit
9f8f38e16b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue