From 9f8f38e16bbb1990045a9a881ec45aa45cd129ac Mon Sep 17 00:00:00 2001 From: nadro Date: Tue, 18 Dec 2012 17:01:01 +0000 Subject: [PATCH] - Improved organization of texture state cache. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4406 dfc29bdd-3216-0410-991c-e03cc46cb475 --- source/Irrlicht/COpenGLDriver.cpp | 44 ++++++++--------- source/Irrlicht/COpenGLTexture.cpp | 77 ++---------------------------- source/Irrlicht/COpenGLTexture.h | 52 +++++++++----------- 3 files changed, 50 insertions(+), 123 deletions(-) diff --git a/source/Irrlicht/COpenGLDriver.cpp b/source/Irrlicht/COpenGLDriver.cpp index 562a6ece..ed9c1332 100644 --- a/source/Irrlicht/COpenGLDriver.cpp +++ b/source/Irrlicht/COpenGLDriver.cpp @@ -2854,7 +2854,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater const COpenGLTexture* tmpTexture = static_cast(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 diff --git a/source/Irrlicht/COpenGLTexture.cpp b/source/Irrlicht/COpenGLTexture.cpp index e97b7a12..7ddd8f50 100644 --- a/source/Irrlicht/COpenGLTexture.cpp +++ b/source/Irrlicht/COpenGLTexture.cpp @@ -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; } diff --git a/source/Irrlicht/COpenGLTexture.h b/source/Irrlicht/COpenGLTexture.h index 7a2e6cd3..56a7dcff 100644 --- a/source/Irrlicht/COpenGLTexture.h +++ b/source/Irrlicht/COpenGLTexture.h @@ -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.