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
2018-11-16 18:41:37 +00:00
# include "Renderers/Common/GSRenderer.h"
# include "Renderers/Common/GSFastList.h"
2009-02-09 21:15:56 +00:00
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 ;
2017-08-04 17:52:18 +00:00
std : : vector < GSVector2i > * m_p2t ;
2011-12-18 08:13:20 +00:00
uint32 m_valid [ MAX_PAGES ] ;
2017-08-04 17:52:18 +00:00
std : : array < uint16 , MAX_PAGES > m_erase_it ;
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 ) ;
2017-05-26 15:26:46 +00:00
bool Save ( const std : : string & fn , bool dds = false ) const ;
2009-02-09 21:15:56 +00:00
} ;
protected :
GSState * m_state ;
2017-05-26 15:41:52 +00:00
std : : unordered_set < Texture * > m_textures ;
2017-08-04 17:52:18 +00:00
std : : array < FastList < 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 ( ) ;
} ;