2010-04-25 00:31:27 +00:00
/*
2009-02-09 21:15:56 +00:00
* Copyright ( C ) 2007 - 2009 Gabest
* http : //www.gabest.org
*
* 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 , or ( at your option )
* any later version .
2010-04-25 00:31:27 +00:00
*
2009-02-09 21:15:56 +00:00
* 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 .
2010-04-25 00:31:27 +00:00
*
2009-02-09 21:15:56 +00:00
* You should have received a copy of the GNU General Public License
* along with GNU Make ; see the file COPYING . If not , write to
2012-09-09 18:16:11 +00:00
* the Free Software Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA USA .
2009-02-09 21:15:56 +00:00
* http : //www.gnu.org/copyleft/gpl.html
*
*/
# pragma once
# include "GSRenderer.h"
class GSTextureCacheSW
{
public :
2011-03-17 02:55:20 +00:00
class Texture
2009-02-09 21:15:56 +00:00
{
public :
GSState * m_state ;
2011-12-23 15:53:53 +00:00
GSOffset * m_offset ;
2009-02-09 21:15:56 +00:00
GIFRegTEX0 m_TEX0 ;
GIFRegTEXA m_TEXA ;
void * m_buff ;
2009-05-14 16:41:52 +00:00
uint32 m_tw ;
uint32 m_age ;
2009-05-07 06:32:10 +00:00
bool m_complete ;
2011-04-25 18:18:21 +00:00
bool m_repeating ;
2011-12-31 15:41:07 +00:00
vector < GSVector2i > * m_p2t ;
2011-12-18 08:13:20 +00:00
uint32 m_valid [ MAX_PAGES ] ;
2012-01-05 02:40:24 +00:00
struct { uint32 bm [ 16 ] ; const uint32 * n ; } m_pages ;
2012-01-13 18:10:05 +00:00
const uint32 * RESTRICT m_sharedbits ;
2009-02-09 21:15:56 +00:00
2011-04-25 18:18:21 +00:00
// m_valid
// fast mode: each uint32 bits map to the 32 blocks of that page
// repeating mode: 1 bpp image of the texture tiles (8x8), also having 512 elements is just a coincidence (worst case: (1024*1024)/(8*8)/(sizeof(uint32)*8))
2011-12-23 15:53:53 +00:00
Texture ( GSState * state , uint32 tw0 , const GIFRegTEX0 & TEX0 , const GIFRegTEXA & TEXA ) ;
2011-03-17 02:55:20 +00:00
virtual ~ Texture ( ) ;
2009-02-09 21:15:56 +00:00
2011-04-25 18:18:21 +00:00
bool Update ( const GSVector4i & r ) ;
2011-03-17 02:55:20 +00:00
bool Save ( const string & fn , bool dds = false ) const ;
2009-02-09 21:15:56 +00:00
} ;
protected :
GSState * m_state ;
2011-03-17 02:55:20 +00:00
hash_set < Texture * > m_textures ;
gsdx tc: use unsigned constant
Help the compiler to generate better code
C code:
uint32 addr = (i >> 3u) % MAX_BLOCKS;
uint32 row = addr >> 5u;
uint32 col = 1 << (addr & 31u);
ASM Before
f48: mov eax,esi
f4a: mov ecx,esi
f4c: mov edx,DWORD PTR [ebp+0x8]
f4f: sar eax,0x1f
f52: sar ecx,0x3
f55: shr eax,0x12
f58: add ecx,eax
f5a: and ecx,0x3fff
f60: sub ecx,eax
f62: mov eax,0x1
f67: shl eax,cl
f69: shr ecx,0x5
f6c: lea edx,[edx+ecx*4]
ASM After
f48: mov ecx,edi
f4a: mov eax,0x1
f4f: sar ecx,0x3
f52: shl eax,cl
f54: shr ecx,0x3
f57: and ecx,0x7fc
f5d: add ecx,DWORD PTR [ebp+0x8]
2017-01-26 17:53:16 +00:00
std : : array < std : : list < Texture * > , MAX_PAGES > m_map ;
2009-02-09 21:15:56 +00:00
public :
GSTextureCacheSW ( GSState * state ) ;
virtual ~ GSTextureCacheSW ( ) ;
2011-12-18 08:13:20 +00:00
Texture * Lookup ( const GIFRegTEX0 & TEX0 , const GIFRegTEXA & TEXA , uint32 tw0 = 0 ) ;
2009-02-09 21:15:56 +00:00
2012-01-05 02:40:24 +00:00
void InvalidatePages ( const uint32 * pages , uint32 psm ) ;
2009-07-22 03:55:28 +00:00
2009-02-09 21:15:56 +00:00
void RemoveAll ( ) ;
void IncAge ( ) ;
} ;