2013-04-17 23:09:55 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Copyright 2013 Dolphin Emulator Project
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Licensed under GPLv2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Refer to the license.txt file included.
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-02 22:47:04 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <algorithm> 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-03 01:08:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <string> 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-02 22:47:04 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "Common/FileUtil.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Common/MemoryUtil.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-03 01:08:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "Common/StringUtil.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "Core/ConfigManager.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Core/HW/Memmap.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/Debugger.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 15:03:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/FramebufferManagerBase.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/HiresTextures.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/RenderBase.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/Statistics.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/TextureCacheBase.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VideoCommon/VideoConfig.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:27:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  const  u64  TEXHASH_INVALID  =  0 ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  const  int  TEXTURE_KILL_THRESHOLD  =  10 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  const  int  TEXTURE_POOL_KILL_THRESHOLD  =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  const  u64  FRAMECOUNT_INVALID  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								TextureCache  * g_texture_cache ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-09 21:14:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GC_ALIGNED16 ( u8  * TextureCache : : temp )  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								size_t  TextureCache : : temp_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 10:08:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								TextureCache : : TexCache  TextureCache : : textures ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								TextureCache : : TexPool  TextureCache : : texture_pool ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								TextureCache : : TCacheEntryBase *  TextureCache : : bound_textures [ 8 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								TextureCache : : BackupConfig  TextureCache : : backup_config ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-08 15:58:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  bool  invalidate_texture_cache_requested ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								TextureCache : : TCacheEntryBase : : ~ TCacheEntryBase ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : CheckTempSize ( size_t  required_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( required_size  < =  temp_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									temp_size  =  required_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									FreeAlignedMemory ( temp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									temp  =  ( u8 * ) AllocateAlignedMemory ( temp_size ,  16 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								TextureCache : : TextureCache ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-13 15:38:56 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									temp_size  =  2048  *  2048  *  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 10:08:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! temp ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-13 15:38:56 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										temp  =  ( u8 * ) AllocateAlignedMemory ( temp_size ,  16 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									TexDecoder_SetTexFmtOverlayOptions ( g_ActiveConfig . bTexFmtOverlayEnable ,  g_ActiveConfig . bTexFmtOverlayCenter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bHiresTextures  & &  ! g_ActiveConfig . bDumpTextures ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										HiresTexture : : Init ( SConfig : : GetInstance ( ) . m_LocalCoreStartupParameter . m_strUniqueID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:35:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SetHash64Function ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-08 11:28:54 +10:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									invalidate_texture_cache_requested  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  TextureCache : : RequestInvalidateTextureCache ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									invalidate_texture_cache_requested  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:37:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : Invalidate ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									UnbindTextures ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-03 06:25:15 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( auto &  tex  :  textures ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										delete  tex . second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									textures . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( auto &  rt  :  texture_pool ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										delete  rt . second ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									texture_pool . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								TextureCache : : ~ TextureCache ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-27 20:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									Invalidate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-23 23:03:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									FreeAlignedMemory ( temp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-09 21:14:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									temp  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : OnConfigChanged ( VideoConfig &  config ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_texture_cache ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:37:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// TODO: Invalidating texcache is really stupid in some of these cases
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( config . iSafeTextureCache_ColorSamples  ! =  backup_config . s_colorsamples  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											config . bTexFmtOverlayEnable  ! =  backup_config . s_texfmt_overlay  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											config . bTexFmtOverlayCenter  ! =  backup_config . s_texfmt_overlay_center  | | 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-08 11:28:54 +10:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											config . bHiresTextures  ! =  backup_config . s_hires_textures  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											invalidate_texture_cache_requested ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_texture_cache - > Invalidate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:37:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( g_ActiveConfig . bHiresTextures ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												HiresTexture : : Init ( SConfig : : GetInstance ( ) . m_LocalCoreStartupParameter . m_strUniqueID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:37:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											TexDecoder_SetTexFmtOverlayOptions ( g_ActiveConfig . bTexFmtOverlayEnable ,  g_ActiveConfig . bTexFmtOverlayCenter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-08 11:28:54 +10:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											invalidate_texture_cache_requested  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-08 16:19:15 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ( config . iStereoMode  >  0 )  ! =  backup_config . s_stereo_3d  | | 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-24 23:06:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											config . bStereoEFBMonoDepth  ! =  backup_config . s_efb_mono_depth ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 00:53:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_texture_cache - > DeleteShaders ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_texture_cache - > CompileShaders ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									backup_config . s_colorsamples  =  config . iSafeTextureCache_ColorSamples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									backup_config . s_texfmt_overlay  =  config . bTexFmtOverlayEnable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									backup_config . s_texfmt_overlay_center  =  config . bTexFmtOverlayCenter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									backup_config . s_hires_textures  =  config . bHiresTextures ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 00:53:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									backup_config . s_stereo_3d  =  config . iStereoMode  >  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-24 23:06:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									backup_config . s_efb_mono_depth  =  config . bStereoEFBMonoDepth ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 11:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : Cleanup ( int  _frameCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 18:45:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexCache : : iterator  iter  =  textures . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TexCache : : iterator  tcend  =  textures . end ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									while  ( iter  ! =  tcend ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if ( iter - > second - > frameCount  = =  FRAMECOUNT_INVALID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											iter - > second - > frameCount  =  _frameCount ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( _frameCount  >  TEXTURE_KILL_THRESHOLD  +  iter - > second - > frameCount  & & 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-07 21:48:59 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										    // EFB copies living on the host GPU are unrecoverable and thus shouldn't be deleted
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										    ! iter - > second - > IsEfbCopy ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											FreeTexture ( iter - > second ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-31 12:40:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											iter  =  textures . erase ( iter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											+ + iter ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexPool : : iterator  iter2  =  texture_pool . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TexPool : : iterator  tcend2  =  texture_pool . end ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									while  ( iter2  ! =  tcend2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if ( iter2 - > second - > frameCount  = =  FRAMECOUNT_INVALID ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											iter2 - > second - > frameCount  =  _frameCount ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( _frameCount  >  TEXTURE_POOL_KILL_THRESHOLD  +  iter2 - > second - > frameCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											delete  iter2 - > second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											iter2  =  texture_pool . erase ( iter2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											+ + iter2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : MakeRangeDynamic ( u32  start_address ,  u32  size ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TexCache : : iterator 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										iter  =  textures . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									while  ( iter  ! =  textures . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 21:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( iter - > second - > OverlapsMemoryRange ( start_address ,  size ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											FreeTexture ( iter - > second ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											iter  =  textures . erase ( iter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											+ + iter ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 21:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  TextureCache : : TCacheEntryBase : : OverlapsMemoryRange ( u32  range_address ,  u32  range_size )  const 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( addr  +  size_in_bytes  < =  range_address ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-16 21:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( addr  > =  range_address  +  range_size ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-20 22:36:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : DumpTexture ( TCacheEntryBase *  entry ,  std : : string  basename ,  unsigned  int  level ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:25:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:31:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : string  szDir  =  File : : GetUserPath ( D_DUMPTEXTURES_IDX )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SConfig : : GetInstance ( ) . m_LocalCoreStartupParameter . m_strUniqueID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// make sure that the directory exists
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-12 15:33:41 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! File : : Exists ( szDir )  | |  ! File : : IsDirectory ( szDir ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										File : : CreateDir ( szDir ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:31:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( level  >  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:50:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										basename  + =  StringFromFormat ( " _mip%i " ,  level ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:50:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : string  filename  =  szDir  +  " / "  +  basename  +  " .png " ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:31:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-17 11:12:07 +13:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! File : : Exists ( filename ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										entry - > Save ( filename ,  level ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:31:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  u32  CalculateLevelSize ( u32  level_0_size ,  u32  level ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  ( level_0_size  +  ( ( 1  < <  level )  -  1 ) )  > >  level ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Used by TextureCache::Load
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								TextureCache : : TCacheEntryBase *  TextureCache : : ReturnEntry ( unsigned  int  stage ,  TCacheEntryBase *  entry ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > frameCount  =  FRAMECOUNT_INVALID ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bound_textures [ stage ]  =  entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GFX_DEBUGGER_PAUSE_AT ( NEXT_TEXTURE_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : BindTextures ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( bound_textures [ i ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											bound_textures [ i ] - > Bind ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  TextureCache : : UnbindTextures ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									std : : fill ( std : : begin ( bound_textures ) ,  std : : end ( bound_textures ) ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 12:48:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								TextureCache : : TCacheEntryBase *  TextureCache : : Load ( const  u32  stage ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 12:48:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  FourTexUnits  & tex  =  bpmem . tex [ stage  > >  2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  u32  id  =  stage  &  3 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  u32  address  =  ( tex . texImage3 [ id ] . image_base /* & 0x1FFFFF*/ )  < <  5 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									u32  width  =  tex . texImage0 [ id ] . width  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									u32  height  =  tex . texImage0 [ id ] . height  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  int  texformat  =  tex . texImage0 [ id ] . format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  u32  tlutaddr  =  tex . texTlut [ id ] . tmem_offset  < <  9 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  u32  tlutfmt  =  tex . texTlut [ id ] . tlut_format ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 12:58:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									u32  tex_levels  =  ( tex . texMode1 [ id ] . max_lod  +  0xf )  /  0x10  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 21:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  bool  use_mipmaps  =  ( tex . texMode0 [ id ] . min_filter  &  3 )  ! =  0  & &  tex_levels  >  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 12:48:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  bool  from_tmem  =  tex . texImage1 [ id ] . image_type  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  ( 0  = =  address ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-09 21:14:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TexelSizeInNibbles(format) * width * height / 16;
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									const  unsigned  int  bsw  =  TexDecoder_GetBlockWidthInTexels ( texformat )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  unsigned  int  bsh  =  TexDecoder_GetBlockHeightInTexels ( texformat )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									unsigned  int  expandedWidth   =  ( width   +  bsw )  &  ( ~ bsw ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									unsigned  int  expandedHeight  =  ( height  +  bsh )  &  ( ~ bsh ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-20 00:12:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  unsigned  int  nativeW  =  width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  unsigned  int  nativeH  =  height ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Hash assigned to texcache entry (also used to generate filenames used for texture dumping and custom texture lookup)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									u64  tex_hash  =  TEXHASH_INVALID ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 21:37:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									u32  full_format  =  texformat ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 10:08:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  bool  isPaletteTexture  =  ( texformat  = =  GX_TF_C4  | |  texformat  = =  GX_TF_C8  | |  texformat  = =  GX_TF_C14X2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Reject invalid tlut format.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( isPaletteTexture  & &  tlutfmt  >  GX_TL_RGB5A3 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 10:08:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( isPaletteTexture ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										full_format  =  texformat  |  ( tlutfmt  < <  16 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  u32  texture_size  =  TexDecoder_GetTextureSizeInBytes ( expandedWidth ,  expandedHeight ,  texformat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-18 17:14:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  u8 *  src_data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( from_tmem ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										src_data  =  & texMem [ bpmem . tex [ stage  /  4 ] . texImage1 [ stage  %  4 ] . tmem_even  *  TMEM_LINE_SIZE ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										src_data  =  Memory : : GetPointer ( address ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-10 15:12:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// TODO: This doesn't hash GB tiles for preloaded RGBA8 textures (instead, it's hashing more data from the low tmem bank than it should)
 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-29 21:49:50 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									tex_hash  =  GetHash64 ( src_data ,  texture_size ,  g_ActiveConfig . iSafeTextureCache_ColorSamples ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									u32  palette_size  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									u64  tlut_hash  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 22:04:59 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( isPaletteTexture ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										palette_size  =  TexDecoder_GetPaletteSize ( texformat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										tlut_hash  =  GetHash64 ( & texMem [ tlutaddr ] ,  palette_size ,  g_ActiveConfig . iSafeTextureCache_ColorSamples ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 21:11:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-24 15:16:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 15:15:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// GPUs don't like when the specified mipmap count would require more than one 1x1-sized LOD in the mipmap chain
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// e.g. 64x64 with 7 LODs would have the mipmap chain 64x64,32x32,16x16,8x8,4x4,2x2,1x1,0x0, so we limit the mipmap count to 6 there
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									tex_levels  =  std : : min < u32 > ( IntLog2 ( std : : max ( width ,  height ) )  +  1 ,  tex_levels ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-18 17:14:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Find all texture cache entries for the current texture address, and decide whether to use one of
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// them, or to create a new one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// In most cases, the fastest way is to use only one texture cache entry for the same address. Usually,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// when a texture changes, the old version of the texture is unlikely to be used again. If there were
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// new cache entries created for normal texture updates, there would be a slowdown due to a huge amount
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// of unused cache entries. Also thanks to texture pooling, overwriting an existing cache entry is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// faster than creating a new one from scratch.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Some games use the same address for different textures though. If the same cache entry was used in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// this case, it would be constantly overwritten, and effectively there wouldn't be any caching for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// those textures. Examples for this are Metroid Prime and Castlevania 3. Metroid Prime has multiple
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// sets of fonts on each other stored in a single texture and uses the palette to make different
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// characters visible or invisible. In Castlevania 3 some textures are used for 2 different things or
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// at least in 2 different ways(size 1024x1024 vs 1024x256).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// To determine whether to use multiple cache entries or a single entry, use the following heuristic:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// If the same texture address is used several times during the same frame, assume the address is used
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// for different purposes and allow creating an additional cache entry. If there's at least one entry
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// that hasn't been used for the same frame, then overwrite it, in order to keep the cache as small as
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// possible. If the current texture is found in the cache, use that entry.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// For efb copies, the entry created in CopyRenderTargetToTexture always has to be used, or else it was
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// done in vain.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : pair  < TexCache : : iterator ,  TexCache : : iterator >  iter_range  =  textures . equal_range ( address ) ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexCache : : iterator  iter  =  iter_range . first ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TexCache : : iterator  oldest_entry  =  iter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									int  temp_frameCount  =  0x7fffffff ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexCache : : iterator  unconverted_copy  =  textures . end ( ) ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									while  ( iter  ! =  iter_range . second ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 21:11:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										TCacheEntryBase *  entry  =  iter - > second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( entry - > IsEfbCopy ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// EFB copies have slightly different rules: the hash doesn't need to match
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// in EFB2Tex mode, and EFB copy formats have different meanings from texture
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// formats.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ( g_ActiveConfig . bCopyEFBToTexture  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												( tex_hash  = =  entry - > hash  & &  ( ! isPaletteTexture  | |  g_Config . backend_info . bSupportsPaletteConversion ) ) ) 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												// TODO: We should check format/width/height/levels for EFB copies. Checking
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// format is complicated because EFB copy formats don't exactly match
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// texture formats. I'm not sure what effect checking width/height/levels
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// would have.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  ( ! isPaletteTexture  | |  ! g_Config . backend_info . bSupportsPaletteConversion ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													return  ReturnEntry ( stage ,  entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// Note that we found an unconverted EFB copy, then continue.  We'll
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// perform the conversion later.  Currently, we only convert EFB copies to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// palette textures; we could do other conversions if it proved to be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// beneficial.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												unconverted_copy  =  iter ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												// Aggressively prune EFB copies: if it isn't useful here, it will probably
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// never be useful again.  It's theoretically possible for a game to do
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// something weird where the copy could become useful in the future, but in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												// practice it doesn't happen.
 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												FreeTexture ( entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												iter  =  textures . erase ( iter ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											// For normal textures, all texture parameters need to match
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ( entry - > hash  = =  ( tex_hash  ^  tlut_hash )  & &  entry - > format  = =  full_format  & &  entry - > native_levels  > =  tex_levels  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												entry - > native_width  = =  nativeW  & &  entry - > native_height  = =  nativeH ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return  ReturnEntry ( stage ,  entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 19:45:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// Find the entry which hasn't been used for the longest time
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( entry - > frameCount  ! =  FRAMECOUNT_INVALID  & &  entry - > frameCount  <  temp_frameCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 19:45:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											temp_frameCount  =  entry - > frameCount ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											oldest_entry  =  iter ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 19:45:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										+ + iter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 19:45:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( unconverted_copy  ! =  textures . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Perform palette decoding.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										TCacheEntryBase  * entry  =  unconverted_copy - > second ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:53:52 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										TCacheEntryConfig  config ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										config . rendertarget  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										config . width  =  entry - > config . width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										config . height  =  entry - > config . height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										config . layers  =  FramebufferManagerBase : : GetEFBLayers ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										TCacheEntryBase  * decoded_entry  =  AllocateTexture ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										decoded_entry - > SetGeneralParameters ( address ,  texture_size ,  full_format ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										decoded_entry - > SetDimensions ( entry - > native_width ,  entry - > native_height ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										decoded_entry - > SetHashes ( tex_hash  ^  tlut_hash ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										decoded_entry - > frameCount  =  FRAMECOUNT_INVALID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										decoded_entry - > is_efb_copy  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										g_texture_cache - > ConvertTexture ( decoded_entry ,  entry ,  & texMem [ tlutaddr ] ,  ( TlutFormat ) tlutfmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										textures . insert ( TexCache : : value_type ( address ,  decoded_entry ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  ReturnEntry ( stage ,  decoded_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// If at least one entry was not used for the same frame, overwrite the oldest one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( temp_frameCount  ! =  0x7fffffff ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// pool this texture and make a new one later
 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										FreeTexture ( oldest_entry - > second ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										textures . erase ( oldest_entry ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 19:17:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : unique_ptr < HiresTexture >  hires_tex ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bHiresTextures ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										hires_tex . reset ( HiresTexture : : Search ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											src_data ,  texture_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											& texMem [ tlutaddr ] ,  palette_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											width ,  height , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 21:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											texformat ,  use_mipmaps 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( hires_tex ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											auto &  l  =  hires_tex - > m_levels [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ( l . width  ! =  width  | |  l . height  ! =  height ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 16:55:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												width  =  l . width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												height  =  l . height ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 16:55:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											expandedWidth  =  l . width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											expandedHeight  =  l . height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											CheckTempSize ( l . data_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											memcpy ( temp ,  l . data ,  l . data_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! hires_tex ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-10 15:12:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( ! ( texformat  = =  GX_TF_RGBA8  & &  from_tmem ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-10 15:28:42 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											const  u8 *  tlut  =  & texMem [ tlutaddr ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											TexDecoder_Decode ( temp ,  src_data ,  expandedWidth ,  expandedHeight ,  texformat ,  tlut ,  ( TlutFormat )  tlutfmt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-10 15:12:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											u8 *  src_data_gb  =  & texMem [ bpmem . tex [ stage / 4 ] . texImage2 [ stage % 4 ] . tmem_odd  *  TMEM_LINE_SIZE ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											TexDecoder_DecodeRGBA8FromTmem ( temp ,  src_data ,  src_data_gb ,  expandedWidth ,  expandedHeight ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-10 15:12:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 12:58:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									u32  texLevels  =  use_mipmaps  ?  tex_levels  :  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  bool  using_custom_lods  =  hires_tex  & &  hires_tex - > m_levels . size ( )  > =  texLevels ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Only load native mips if their dimensions fit to our virtual texture dimensions
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  bool  use_native_mips  =  use_mipmaps  & &  ! using_custom_lods  & &  ( width  = =  nativeW  & &  height  = =  nativeH ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-18 17:14:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									texLevels  =  ( use_native_mips  | |  using_custom_lods )  ?  texLevels  :  1 ;  // TODO: Should be forced to 1 for non-pow2 textures (e.g. efb copies with automatically adjusted IR)
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// create the entry/texture
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TCacheEntryConfig  config ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . width  =  width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . height  =  height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . levels  =  texLevels ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TCacheEntryBase *  entry  =  AllocateTexture ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GFX_DEBUGGER_PAUSE_AT ( NEXT_NEW_TEXTURE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									textures . insert ( TexCache : : value_type ( address ,  entry ) ) ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > SetGeneralParameters ( address ,  texture_size ,  full_format ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-11 22:41:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > SetDimensions ( nativeW ,  nativeH ,  tex_levels ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 15:33:23 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > hash  =  tex_hash  ^  tlut_hash ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > is_efb_copy  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 22:35:53 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// load texture
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									entry - > Load ( width ,  height ,  expandedWidth ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : string  basename  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 12:53:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bDumpTextures  & &  ! hires_tex ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										basename  =  HiresTexture : : GenBaseName ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											src_data ,  texture_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											& texMem [ tlutaddr ] ,  palette_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											width ,  height , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 21:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											texformat ,  use_mipmaps , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											true 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-22 22:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										DumpTexture ( entry ,  basename ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:50:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									u32  level  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-29 21:49:50 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// load mips - TODO: Loading mipmaps from tmem is untested!
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( use_native_mips ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										src_data  + =  texture_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										const  u8 *  ptr_even  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										const  u8 *  ptr_odd  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( from_tmem ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-29 21:49:50 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ptr_even  =  & texMem [ bpmem . tex [ stage / 4 ] . texImage1 [ stage % 4 ] . tmem_even  *  TMEM_LINE_SIZE  +  texture_size ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ptr_odd  =  & texMem [ bpmem . tex [ stage / 4 ] . texImage2 [ stage % 4 ] . tmem_odd  *  TMEM_LINE_SIZE ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										for  ( ;  level  ! =  texLevels ;  + + level ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u32  mip_width  =  CalculateLevelSize ( width ,  level ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u32  mip_height  =  CalculateLevelSize ( height ,  level ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u32  expanded_mip_width  =  ( mip_width  +  bsw )  &  ( ~ bsw ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u32  expanded_mip_height  =  ( mip_height  +  bsh )  &  ( ~ bsh ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u8 * &  mip_src_data  =  from_tmem 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												?  ( ( level  %  2 )  ?  ptr_odd  :  ptr_even ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												:  src_data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  u8 *  tlut  =  & texMem [ tlutaddr ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											TexDecoder_Decode ( temp ,  mip_src_data ,  expanded_mip_width ,  expanded_mip_height ,  texformat ,  tlut ,  ( TlutFormat )  tlutfmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											mip_src_data  + =  TexDecoder_GetTextureSizeInBytes ( expanded_mip_width ,  expanded_mip_height ,  texformat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:50:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											entry - > Load ( mip_width ,  mip_height ,  expanded_mip_width ,  level ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ( g_ActiveConfig . bDumpTextures ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												DumpTexture ( entry ,  basename ,  level ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else  if  ( using_custom_lods ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										for  ( ;  level  ! =  texLevels ;  + + level ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 14:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 09:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											auto &  l  =  hires_tex - > m_levels [ level ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											CheckTempSize ( l . data_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											memcpy ( temp ,  l . data ,  l . data_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											entry - > Load ( l . width ,  l . height ,  l . width ,  level ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 14:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									INCSTAT ( stats . numTexturesUploaded ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									SETSTAT ( stats . numTexturesAlive ,  textures . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-15 20:46:03 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  ReturnEntry ( stage ,  entry ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-23 21:44:23 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : CopyRenderTargetToTexture ( u32  dstAddr ,  unsigned  int  dstFormat ,  PEControl : : PixelFormat  srcFormat , 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  EFBRectangle &  srcRect ,  bool  isIntensity ,  bool  scaleByHalf ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Emulation methods:
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// - EFB to RAM:
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-16 23:51:41 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//      Encodes the requested EFB data at its native resolution to the emulated RAM using shaders.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Load() decodes the data from there again (using TextureDecoder) if the EFB copy is being used as a texture again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Advantage: CPU can read data from the EFB copy and we don't lose any important updates to the texture
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Disadvantage: Encoding+decoding steps often are redundant because only some games read or modify EFB copies before using them as textures.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// - EFB to texture:
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-16 23:51:41 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//      Copies the requested EFB data to a texture object in VRAM, performing any color conversion using shaders.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Advantage: Works for many games, since in most cases EFB copies aren't read or modified at all before being used as a texture again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//                 Since we don't do any further encoding or decoding here, this method is much faster.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//                 It also allows enhancing the visual quality by doing scaled EFB copies.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// - Hybrid EFB copies:
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-16 23:51:41 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//      1a) Whenever this function gets called, encode the requested EFB data to RAM (like EFB to RAM)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      1b) Set type to TCET_EC_DYNAMIC for all texture cache entries in the destination address range.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          If EFB copy caching is enabled, further checks will (try to) prevent redundant EFB copies.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      2) Check if a texture cache entry for the specified dstAddr already exists (i.e. if an EFB copy was triggered to that address before):
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      2a) Entry doesn't exist:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Also copy the requested EFB data to a texture object in VRAM (like EFB to texture)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Create a texture cache entry for the target (type = TCET_EC_VRAM)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Store a hash of the encoded RAM data in the texcache entry.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      2b) Entry exists AND type is TCET_EC_VRAM:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Like case 2a, but reuse the old texcache entry instead of creating a new one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      2c) Entry exists AND type is TCET_EC_DYNAMIC:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Only encode the texture to RAM (like EFB to RAM) and store a hash of the encoded data in the existing texcache entry.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          - Do NOT copy the requested EFB data to a VRAM object. Reason: the texture is dynamic, i.e. the CPU is modifying it. Storing a VRAM copy is useless, because we'd always end up deleting it and reloading the data from RAM anyway.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      3) If the EFB copy gets used as a texture, compare the source RAM hash with the hash you stored when encoding the EFB data to RAM.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      3a) If the two hashes match AND type is TCET_EC_VRAM, reuse the VRAM copy you created
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      3b) If the two hashes differ AND type is TCET_EC_VRAM, screw your existing VRAM copy. Set type to TCET_EC_DYNAMIC.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//          Redecode the source RAM data to a VRAM object. The entry basically behaves like a normal texture now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      3c) If type is TCET_EC_DYNAMIC, treat the EFB copy like a normal texture.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Advantage: Non-dynamic EFB copies can be visually enhanced like with EFB to texture.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//                 Compatibility is as good as EFB to RAM.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//      Disadvantage: Slower than EFB to texture and often even slower than EFB to RAM.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									//                    EFB copy cache depends on accurate texture hashing being enabled. However, with accurate hashing you end up being as slow as without a copy cache anyway.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// Disadvantage of all methods: Calling this function requires the GPU to perform a pipeline flush which stalls any further CPU processing.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-24 16:38:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									//
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// For historical reasons, Dolphin doesn't actually implement "pure" EFB to RAM emulation, but only EFB to texture and hybrid EFB copies.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 23:14:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									float  colmat [ 28 ]  =  { 0 } ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									float  * const  fConstAdd  =  colmat  +  16 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									float  * const  ColorMask  =  colmat  +  20 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 16:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ColorMask [ 0 ]  =  ColorMask [ 1 ]  =  ColorMask [ 2 ]  =  ColorMask [ 3 ]  =  255.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ColorMask [ 4 ]  =  ColorMask [ 5 ]  =  ColorMask [ 6 ]  =  ColorMask [ 7 ]  =  1.0f  /  255.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									unsigned  int  cbufid  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-23 21:44:23 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bool  efbHasAlpha  =  bpmem . zcontrol . pixel_format  = =  PEControl : : RGBA6_Z24 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-23 21:44:23 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( srcFormat  = =  PEControl : : Z24 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										switch  ( dstFormat ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 16:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  0 :  // Z4
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 3 ]  =  colmat [ 7 ]  =  colmat [ 11 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											cbufid  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  1 :  // Z8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  8 :  // Z8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 12 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											cbufid  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 16:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  3 :  // Z16
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 1 ]  =  colmat [ 5 ]  =  colmat [ 9 ]  =  colmat [ 12 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  11 :  // Z16 (reverse order)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 13 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  6 :  // Z24X8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  9 :  // Z8M
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 1 ]  =  colmat [ 5 ]  =  colmat [ 9 ]  =  colmat [ 13 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  5 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  10 :  // Z8L
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 2 ]  =  colmat [ 6 ]  =  colmat [ 10 ]  =  colmat [ 14 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  6 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 18:05:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  12 :  // Z16L - copy lower 16 depth bits
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// expected to be used as an IA8 texture (upper 8 bits stored as intensity, lower 8 bits stored as alpha)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// Used e.g. in Zelda: Skyward Sword
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 16:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 1 ]  =  colmat [ 5 ]  =  colmat [ 9 ]  =  colmat [ 14 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  7 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Unknown copy zbuf format: 0x%x " ,  dstFormat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 2 ]  =  colmat [ 5 ]  =  colmat [ 8 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  8 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									else  if  ( isIntensity ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										fConstAdd [ 0 ]  =  fConstAdd [ 1 ]  =  fConstAdd [ 2 ]  =  16.0f / 255.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										switch  ( dstFormat ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  0 :  // I4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  1 :  // I8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  2 :  // IA4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  3 :  // IA8
 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-18 18:23:22 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  8 :  // I8
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											// TODO - verify these coefficients
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  0.257f ;  colmat [ 1 ]  =  0.504f ;  colmat [ 2 ]  =  0.098f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 4 ]  =  0.257f ;  colmat [ 5 ]  =  0.504f ;  colmat [ 6 ]  =  0.098f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 8 ]  =  0.257f ;  colmat [ 9 ]  =  0.504f ;  colmat [ 10 ]  =  0.098f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( dstFormat  <  2  | |  dstFormat  = =  8 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												colmat [ 12 ]  =  0.257f ;  colmat [ 13 ]  =  0.504f ;  colmat [ 14 ]  =  0.098f ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  16.0f / 255.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  ( dstFormat  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													ColorMask [ 0 ]  =  ColorMask [ 1 ]  =  ColorMask [ 2 ]  =  15.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													ColorMask [ 4 ]  =  ColorMask [ 5 ]  =  ColorMask [ 6 ]  =  1.0f  /  15.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													cbufid  =  9 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													cbufid  =  10 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											else // alpha
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												colmat [ 15 ]  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												if  ( dstFormat  = =  2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													ColorMask [ 0 ]  =  ColorMask [ 1 ]  =  ColorMask [ 2 ]  =  ColorMask [ 3 ]  =  15.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													ColorMask [ 4 ]  =  ColorMask [ 5 ]  =  ColorMask [ 6 ]  =  ColorMask [ 7 ]  =  1.0f  /  15.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													cbufid  =  11 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
													cbufid  =  12 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Unknown copy intensity format: 0x%x " ,  dstFormat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  13 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										switch  ( dstFormat ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  0 :  // R4
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 12 ]  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 0 ]  =  15.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 4 ]  =  1.0f  /  15.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  14 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-18 18:23:22 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										case  1 :  // R8
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										case  8 :  // R8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 12 ]  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  15 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  2 :  // RA4
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 0 ]  =  ColorMask [ 3 ]  =  15.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 4 ]  =  ColorMask [ 7 ]  =  1.0f  /  15.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-29 11:05:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  16 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-30 16:51:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( ! efbHasAlpha ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												ColorMask [ 3 ]  =  0.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												cbufid  =  17 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										case  3 :  // RA8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-29 11:05:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  18 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-30 16:51:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( ! efbHasAlpha ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												ColorMask [ 3 ]  =  0.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												cbufid  =  19 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  7 :  // A8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 3 ]  =  colmat [ 7 ]  =  colmat [ 11 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-29 11:05:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  20 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-30 16:51:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( ! efbHasAlpha ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												ColorMask [ 3 ]  =  0.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 0 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 1 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 2 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												cbufid  =  21 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  9 :  // G8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 1 ]  =  colmat [ 5 ]  =  colmat [ 9 ]  =  colmat [ 13 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  22 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  10 :  // B8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 2 ]  =  colmat [ 6 ]  =  colmat [ 10 ]  =  colmat [ 14 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  23 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  11 :  // RG8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 4 ]  =  colmat [ 8 ]  =  colmat [ 13 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  24 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  12 :  // GB8
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 1 ]  =  colmat [ 5 ]  =  colmat [ 9 ]  =  colmat [ 14 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  25 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  4 :  // RGB565
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 0 ]  =  ColorMask [ 2 ]  =  31.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 4 ]  =  ColorMask [ 6 ]  =  1.0f  /  31.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 1 ]  =  63.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 5 ]  =  1.0f  /  63.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											fConstAdd [ 3 ]  =  1.0f ;  // set alpha to 1
 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  26 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										case  5 :  // RGB5A3
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 0 ]  =  ColorMask [ 1 ]  =  ColorMask [ 2 ]  =  31.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 4 ]  =  ColorMask [ 5 ]  =  ColorMask [ 6 ]  =  1.0f  /  31.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 3 ]  =  7.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ColorMask [ 7 ]  =  1.0f  /  7.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-29 11:05:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  27 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-30 16:51:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( ! efbHasAlpha ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												ColorMask [ 3 ]  =  0.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												cbufid  =  28 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										case  6 :  // RGBA8
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-29 11:05:44 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  29 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-30 16:51:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											if  ( ! efbHasAlpha ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												ColorMask [ 3 ]  =  0.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												fConstAdd [ 3 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												cbufid  =  30 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-06 22:19:37 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Unknown copy color format: 0x%x " ,  dstFormat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											colmat [ 0 ]  =  colmat [ 5 ]  =  colmat [ 10 ]  =  colmat [ 15 ]  =  1.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-24 04:43:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											cbufid  =  31 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  unsigned  int  tex_w  =  scaleByHalf  ?  srcRect . GetWidth ( ) / 2  :  srcRect . GetWidth ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  unsigned  int  tex_h  =  scaleByHalf  ?  srcRect . GetHeight ( ) / 2  :  srcRect . GetHeight ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-10 15:54:14 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									unsigned  int  scaled_tex_w  =  g_ActiveConfig . bCopyEFBScaled  ?  Renderer : : EFBToScaledX ( tex_w )  :  tex_w ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									unsigned  int  scaled_tex_h  =  g_ActiveConfig . bCopyEFBScaled  ?  Renderer : : EFBToScaledY ( tex_h )  :  tex_h ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// remove all texture cache entries at dstAddr
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									std : : pair  < TexCache : : iterator ,  TexCache : : iterator >  iter_range  =  textures . equal_range ( dstAddr ) ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexCache : : iterator  iter  =  iter_range . first ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									while  ( iter  ! =  iter_range . second ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										FreeTexture ( iter - > second ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										iter  =  textures . erase ( iter ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// create the texture
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									TCacheEntryConfig  config ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . rendertarget  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . width  =  scaled_tex_w ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . height  =  scaled_tex_h ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									config . layers  =  FramebufferManagerBase : : GetEFBLayers ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TCacheEntryBase *  entry  =  AllocateTexture ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// TODO: Using the wrong dstFormat, dumb...
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > SetGeneralParameters ( dstAddr ,  0 ,  dstFormat ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 11:18:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > SetDimensions ( tex_w ,  tex_h ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									entry - > SetHashes ( TEXHASH_INVALID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-19 18:31:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > frameCount  =  FRAMECOUNT_INVALID ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > is_efb_copy  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-19 22:24:27 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-26 23:41:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > FromRenderTarget ( dstAddr ,  dstFormat ,  srcFormat ,  srcRect ,  isIntensity ,  scaleByHalf ,  cbufid ,  colmat ) ; 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												Allow multiple texture cache entries for textures at the same address
This is the same trick which is used for Metroid's fonts/texts, but for all textures. If 2 different textures at the same address are loaded during the same frame, create a 2nd entry instead of overwriting the existing one. If the entry was overwritten in this case, there wouldn't be any caching, which results in a big performance drop.
The restriction to textures, which are loaded during the same frame, prevents creating lots of textures when textures are used in the regular way. This restriction is new. Overwriting textures, instead of creating new ones is faster, if the old ones are unlikely to be used again.
Since this would break efb copies, don't do it for efb copies.
Castlevania 3 goes from 80 fps to 115 fps for me.
There might be games that need a higher texture cache accuracy with this, but those games should also see a performance boost from this PR.
Some games, which use paletted textures, which are not efb copies, might be faster now. And also not require a higher texture cache accuracy anymore. (similar sitation as PR https://github.com/dolphin-emu/dolphin/pull/1916)
											 
										 
										
											2015-02-01 15:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 15:19:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									textures . insert ( TexCache : : value_type ( dstAddr ,  entry ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-27 22:17:19 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								TextureCache : : TCacheEntryBase *  TextureCache : : AllocateTexture ( const  TCacheEntryConfig &  config ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									TexPool : : iterator  iter  =  texture_pool . find ( config ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( iter  ! =  texture_pool . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										TextureCache : : TCacheEntryBase *  entry  =  iter - > second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										texture_pool . erase ( iter ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									INCSTAT ( stats . numTexturesCreated ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:01:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  g_texture_cache - > CreateTexture ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:29:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  TextureCache : : FreeTexture ( TCacheEntryBase *  entry ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-17 10:57:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry - > frameCount  =  FRAMECOUNT_INVALID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									texture_pool . insert ( TexPool : : value_type ( entry - > config ,  entry ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 01:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}