- 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]);
|
const COpenGLTexture* tmpTexture = static_cast<const COpenGLTexture*>(CurrentTexture[i]);
|
||||||
|
|
||||||
if(resetAllRenderStates)
|
if(resetAllRenderStates)
|
||||||
tmpTexture->setCacheStatus(false);
|
tmpTexture->getStatesCache().IsCached = false;
|
||||||
|
|
||||||
#ifdef GL_EXT_texture_lod_bias
|
#ifdef GL_EXT_texture_lod_bias
|
||||||
if (FeatureAvailable[IRR_EXT_texture_lod_bias] && (resetAllRenderStates || material.TextureLayer[i].LODBias != CacheLODBias[i]))
|
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;
|
CacheLODBias[i] = material.TextureLayer[i].LODBias;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
|
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter())
|
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter)
|
||||||
{
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||||
|
|
||||||
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
|
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||||
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
|
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (material.UseMipMaps && CurrentTexture[i]->hasMipMaps())
|
if (material.UseMipMaps && CurrentTexture[i]->hasMipMaps())
|
||||||
{
|
{
|
||||||
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
|
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter() || !tmpTexture->getMipMapsStatus())
|
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || !tmpTexture->getStatesCache().MipMapStatus)
|
||||||
{
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||||
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
||||||
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
||||||
GL_NEAREST_MIPMAP_NEAREST);
|
GL_NEAREST_MIPMAP_NEAREST);
|
||||||
|
|
||||||
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
|
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||||
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
|
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||||
tmpTexture->setMipMapsStatus(true);
|
tmpTexture->getStatesCache().MipMapStatus = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!tmpTexture->getCacheStatus() || material.TextureLayer[i].BilinearFilter != tmpTexture->getBilinearFilter() ||
|
if(!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getTrilinearFilter() || tmpTexture->getMipMapsStatus())
|
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || tmpTexture->getStatesCache().MipMapStatus)
|
||||||
{
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||||
|
|
||||||
tmpTexture->setBilinearFilter(material.TextureLayer[i].BilinearFilter);
|
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||||
tmpTexture->setTrilinearFilter(material.TextureLayer[i].TrilinearFilter);
|
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||||
tmpTexture->setMipMapsStatus(false);
|
tmpTexture->getStatesCache().MipMapStatus = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GL_EXT_texture_filter_anisotropic
|
#ifdef GL_EXT_texture_filter_anisotropic
|
||||||
if (FeatureAvailable[IRR_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,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||||
material.TextureLayer[i].AnisotropicFilter>1 ? core::min_(MaxAnisotropy, material.TextureLayer[i].AnisotropicFilter) : 1);
|
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
|
#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));
|
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));
|
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
|
// fillmode
|
||||||
|
|
|
@ -25,8 +25,7 @@ COpenGLTexture::COpenGLTexture(IImage* origImage, const io::path& name, void* mi
|
||||||
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
|
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
|
||||||
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), MipmapLegacyMode(true),
|
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), MipmapLegacyMode(true),
|
||||||
IsRenderTarget(false), AutomaticMipmapUpdate(false),
|
IsRenderTarget(false), AutomaticMipmapUpdate(false),
|
||||||
ReadOnlyLock(false), KeepImage(true),
|
ReadOnlyLock(false), KeepImage(true)
|
||||||
WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), Bilinear(true), Trilinear(false), Anisotropic(0), MipMapStatus(true), CacheStatus(false)
|
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("COpenGLTexture");
|
setDebugName("COpenGLTexture");
|
||||||
|
@ -63,8 +62,7 @@ COpenGLTexture::COpenGLTexture(const io::path& name, COpenGLDriver* driver)
|
||||||
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
|
TextureName(0), InternalFormat(GL_RGBA), PixelFormat(GL_BGRA_EXT),
|
||||||
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), HasMipMaps(true),
|
PixelType(GL_UNSIGNED_BYTE), MipLevelStored(0), HasMipMaps(true),
|
||||||
MipmapLegacyMode(true), IsRenderTarget(false), AutomaticMipmapUpdate(false),
|
MipmapLegacyMode(true), IsRenderTarget(false), AutomaticMipmapUpdate(false),
|
||||||
ReadOnlyLock(false), KeepImage(true),
|
ReadOnlyLock(false), KeepImage(true)
|
||||||
WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), Bilinear(true), Trilinear(false), Anisotropic(0), MipMapStatus(true), CacheStatus(false)
|
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
setDebugName("COpenGLTexture");
|
setDebugName("COpenGLTexture");
|
||||||
|
@ -658,76 +656,11 @@ void COpenGLTexture::unbindRTT()
|
||||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, getSize().Width, getSize().Height);
|
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;
|
return StatesCache;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "ITexture.h"
|
#include "ITexture.h"
|
||||||
#include "IImage.h"
|
#include "IImage.h"
|
||||||
|
#include "SMaterialLayer.h"
|
||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
#include "IrrCompileConfig.h"
|
||||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||||
|
@ -45,11 +46,30 @@ namespace video
|
||||||
{
|
{
|
||||||
|
|
||||||
class COpenGLDriver;
|
class COpenGLDriver;
|
||||||
|
|
||||||
//! OpenGL texture.
|
//! OpenGL texture.
|
||||||
class COpenGLTexture : public ITexture
|
class COpenGLTexture : public ITexture
|
||||||
{
|
{
|
||||||
public:
|
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
|
//! constructor
|
||||||
COpenGLTexture(IImage* surface, const io::path& name, void* mipmapData=0, COpenGLDriver* driver=0);
|
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.
|
//! sets whether this texture is intended to be used as a render target.
|
||||||
void setIsRenderTarget(bool isTarget);
|
void setIsRenderTarget(bool isTarget);
|
||||||
|
|
||||||
//! Cache methods.
|
//! Get an access to texture states cache.
|
||||||
|
SStatesCache& getStatesCache() const;
|
||||||
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;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -167,13 +167,7 @@ protected:
|
||||||
bool ReadOnlyLock;
|
bool ReadOnlyLock;
|
||||||
bool KeepImage;
|
bool KeepImage;
|
||||||
|
|
||||||
mutable u8 WrapU;
|
mutable SStatesCache StatesCache;
|
||||||
mutable u8 WrapV;
|
|
||||||
mutable bool Bilinear;
|
|
||||||
mutable bool Trilinear;
|
|
||||||
mutable u8 Anisotropic;
|
|
||||||
mutable bool MipMapStatus;
|
|
||||||
mutable bool CacheStatus;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//! OpenGL FBO texture.
|
//! OpenGL FBO texture.
|
||||||
|
|
Loading…
Reference in New Issue