Rice Video Plugin for GLES1.1
[mupen64plus-pandora.git] / source / rice_gles / src / TextureManager.h
diff --git a/source/rice_gles/src/TextureManager.h b/source/rice_gles/src/TextureManager.h
new file mode 100644 (file)
index 0000000..1a5295b
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+Copyright (C) 2003 Rice1964
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifndef __TEXTUREHANDLER_H__
+#define __TEXTUREHANDLER_H__
+
+#include <exception>
+
+#ifndef SAFE_DELETE
+#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
+#endif
+
+#ifndef SAFE_CHECK
+# define SAFE_CHECK(a)  if( (a) == NULL ) {DebugMessage(M64MSG_ERROR, "Creater out of memory"); throw new std::exception();}
+#endif
+
+#include <string.h>
+
+#include "typedefs.h"
+#include "Texture.h"
+#define absi(x)     ((x)>=0?(x):(-x))
+#define S_FLAG  0
+#define T_FLAG  1
+
+class TxtrInfo
+{
+public:
+    uint32 WidthToCreate;
+    uint32 HeightToCreate;
+
+    uint32 Address;
+    void  *pPhysicalAddress;
+
+    uint32 Format;
+    uint32 Size;
+
+    int  LeftToLoad;
+    int  TopToLoad;
+    uint32 WidthToLoad;
+    uint32 HeightToLoad;
+    uint32 Pitch;
+
+    uchar *PalAddress;
+    uint32 TLutFmt;
+    uint32 Palette;
+    
+    BOOL  bSwapped;
+    
+    uint32 maskS;
+    uint32 maskT;
+
+    BOOL  clampS;
+    BOOL  clampT;
+    BOOL  mirrorS;
+    BOOL  mirrorT;
+
+    int   tileNo;
+
+    inline TxtrInfo& operator = (const TxtrInfo& src)
+    {
+        memcpy(this, &src, sizeof( TxtrInfo ));
+        return *this;
+    }
+
+    inline TxtrInfo& operator = (const Tile& tile)
+    {
+        Format = tile.dwFormat;
+        Size = tile.dwSize;
+        Palette = tile.dwPalette;
+        
+        maskS = tile.dwMaskS;
+        maskT = tile.dwMaskT;
+        mirrorS = tile.bMirrorS;
+        mirrorT = tile.bMirrorT;
+        clampS = tile.bClampS;
+        clampT = tile.bClampT;
+
+        return *this;
+    }
+
+    inline bool operator == ( const TxtrInfo& sec)
+    {
+        return (
+            Address == sec.Address &&
+            WidthToLoad == sec.WidthToLoad &&
+            HeightToLoad == sec.HeightToLoad &&
+            WidthToCreate == sec.WidthToCreate &&
+            HeightToCreate == sec.HeightToCreate &&
+            maskS == sec.maskS &&
+            maskT == sec.maskT &&
+            TLutFmt == sec.TLutFmt &&
+            PalAddress == sec.PalAddress &&
+            Palette == sec.Palette &&
+            LeftToLoad == sec.LeftToLoad &&
+            TopToLoad == sec.TopToLoad &&
+            Format == sec.Format &&
+            Size == sec.Size &&
+            Pitch == sec.Pitch &&
+            bSwapped == sec.bSwapped &&
+            mirrorS == sec.mirrorS &&
+            mirrorT == sec.mirrorT &&
+            clampS == sec.clampS &&
+            clampT == sec.clampT
+            );
+    }
+
+    inline bool isEqual(const TxtrInfo& sec)
+    {
+        return (*this == sec);
+    }
+    
+} ;
+
+
+
+typedef struct TxtrCacheEntry
+{
+    TxtrCacheEntry():
+        pTexture(NULL),pEnhancedTexture(NULL),txtrBufIdx(0) {}
+
+    ~TxtrCacheEntry()
+    {
+        SAFE_DELETE(pTexture);
+        SAFE_DELETE(pEnhancedTexture);
+    }
+    
+    struct TxtrCacheEntry *pNext;       // Must be first element!
+
+    struct TxtrCacheEntry *pNextYoungest;
+    struct TxtrCacheEntry *pLastYoungest;
+
+    TxtrInfo ti;
+    uint32      dwCRC;
+    uint32      dwPalCRC;
+    int         maxCI;
+
+    uint32  dwUses;         // Total times used (for stats)
+    uint32  dwTimeLastUsed; // timeGetTime of time of last usage
+    uint32  FrameLastUsed;  // Frame # that this was last used
+    uint32  FrameLastUpdated;
+
+    CTexture    *pTexture;
+    CTexture    *pEnhancedTexture;
+
+    uint32      dwEnhancementFlag;
+    int         txtrBufIdx;
+    bool        bExternalTxtrChecked;
+
+    TxtrCacheEntry *lastEntry;
+} TxtrCacheEntry;
+
+
+//*****************************************************************************
+// Texture cache implementation
+//*****************************************************************************
+class CTextureManager
+{
+protected:
+    TxtrCacheEntry * CreateNewCacheEntry(uint32 dwAddr, uint32 dwWidth, uint32 dwHeight);
+    void AddTexture(TxtrCacheEntry *pEntry);
+    void RemoveTexture(TxtrCacheEntry * pEntry);
+    void RecycleTexture(TxtrCacheEntry *pEntry);
+    TxtrCacheEntry * ReviveTexture( uint32 width, uint32 height );
+    TxtrCacheEntry * GetTxtrCacheEntry(TxtrInfo * pti);
+    
+    void ConvertTexture(TxtrCacheEntry * pEntry, bool fromTMEM);
+    void ConvertTexture_16(TxtrCacheEntry * pEntry, bool fromTMEM);
+
+    void ClampS32(uint32 *array, uint32 width, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void ClampS16(uint16 *array, uint32 width, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void ClampT32(uint32 *array, uint32 height, uint32 toheight, uint32 arrayWidth, uint32 cols);
+    void ClampT16(uint16 *array, uint32 height, uint32 toheight, uint32 arrayWidth, uint32 cols);
+
+    void MirrorS32(uint32 *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void MirrorS16(uint16 *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void MirrorT32(uint32 *array, uint32 height, uint32 mask, uint32 toheight, uint32 arrayWidth, uint32 cols);
+    void MirrorT16(uint16 *array, uint32 height, uint32 mask, uint32 toheight, uint32 arrayWidth, uint32 cols);
+
+    void WrapS32(uint32 *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void WrapS16(uint16 *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows);
+    void WrapT32(uint32 *array, uint32 height, uint32 mask, uint32 toheight, uint32 arrayWidth, uint32 cols);
+    void WrapT16(uint16 *array, uint32 height, uint32 mask, uint32 toheight, uint32 arrayWidth, uint32 cols);
+
+    void ExpandTextureS(TxtrCacheEntry * pEntry);
+    void ExpandTextureT(TxtrCacheEntry * pEntry);
+    void ExpandTexture(TxtrCacheEntry * pEntry, uint32 sizeOfLoad, uint32 sizeToCreate, uint32 sizeCreated,
+        int arrayWidth, int flag, int mask, int mirror, int clamp, uint32 otherSize);
+
+    uint32 Hash(uint32 dwValue);
+    bool TCacheEntryIsLoaded(TxtrCacheEntry *pEntry);
+
+    void updateColorTexture(CTexture *ptexture, uint32 color);
+    
+public:
+    void Wrap(void *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows, int flag, int size );
+    void Clamp(void *array, uint32 width, uint32 towidth, uint32 arrayWidth, uint32 rows, int flag, int size );
+    void Mirror(void *array, uint32 width, uint32 mask, uint32 towidth, uint32 arrayWidth, uint32 rows, int flag, int size );
+    
+protected:
+    TxtrCacheEntry * m_pHead;
+    TxtrCacheEntry ** m_pCacheTxtrList;
+    uint32 m_numOfCachedTxtrList;
+
+    TxtrCacheEntry m_blackTextureEntry;
+    TxtrCacheEntry m_PrimColorTextureEntry;
+    TxtrCacheEntry m_EnvColorTextureEntry;
+    TxtrCacheEntry m_LODFracTextureEntry;
+    TxtrCacheEntry m_PrimLODFracTextureEntry;
+    TxtrCacheEntry * GetPrimColorTexture(uint32 color);
+    TxtrCacheEntry * GetEnvColorTexture(uint32 color);
+    TxtrCacheEntry * GetLODFracTexture(uint8 fac);
+    TxtrCacheEntry * GetPrimLODFracTexture(uint8 fac);
+
+    void MakeTextureYoungest(TxtrCacheEntry *pEntry);
+    unsigned int m_currentTextureMemUsage;
+    TxtrCacheEntry *m_pYoungestTexture;
+    TxtrCacheEntry *m_pOldestTexture;
+
+public:
+    CTextureManager();
+    ~CTextureManager();
+
+    TxtrCacheEntry * GetBlackTexture(void);
+    TxtrCacheEntry * GetConstantColorTexture(uint32 constant);
+    TxtrCacheEntry * GetTexture(TxtrInfo * pgti, bool fromTMEM, bool doCRCCheck=true, bool AutoExtendTexture = false);
+    
+    void PurgeOldTextures();
+    void RecycleAllTextures();
+    void RecheckHiresForAllTextures();
+    bool CleanUp();
+    
+#ifdef DEBUGGER
+    TxtrCacheEntry * GetCachedTexture(uint32 tex);
+    uint32 GetNumOfCachedTexture();
+#endif
+};
+
+extern CTextureManager gTextureManager;     // The global instance of CTextureManager class
+extern void DumpCachedTexture(TxtrCacheEntry &entry);
+
+#endif
+