| 
									
										
										
										
											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-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							|  |  |  | #include "Common/Thread.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoCommon/BPMemory.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/TextureDecoder.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/VideoCommon.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-28 11:31:37 +02:00
										 |  |  | struct VideoConfig; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | class TextureCache | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2012-01-29 20:24:23 +01:00
										 |  |  | 	enum TexCacheEntryType | 
					
						
							| 
									
										
										
										
											2011-12-27 00:05:26 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2012-01-29 21:49:50 +01:00
										 |  |  | 		TCET_NORMAL, | 
					
						
							| 
									
										
										
										
											2014-02-16 23:51:41 -05:00
										 |  |  | 		TCET_EC_VRAM,    // EFB copy which sits in VRAM and is ready to be used
 | 
					
						
							|  |  |  | 		TCET_EC_DYNAMIC, // EFB copy which sits in RAM and needs to be decoded before being used
 | 
					
						
							| 
									
										
										
										
											2011-12-27 00:05:26 +01:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	struct TCacheEntryBase | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | #define TEXHASH_INVALID 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 17:35:27 +01:00
										 |  |  | 		// common members
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 		u32 addr; | 
					
						
							|  |  |  | 		u32 size_in_bytes; | 
					
						
							|  |  |  | 		u64 hash; | 
					
						
							| 
									
										
										
										
											2011-12-26 17:35:27 +01:00
										 |  |  | 		//u32 pal_hash;
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 		u32 format; | 
					
						
							| 
									
										
										
										
											2010-10-20 00:39:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-29 20:24:23 +01:00
										 |  |  | 		enum TexCacheEntryType type; | 
					
						
							| 
									
										
										
										
											2010-10-20 00:39:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 17:35:27 +01:00
										 |  |  | 		unsigned int num_mipmaps; | 
					
						
							| 
									
										
										
										
											2014-10-28 14:47:13 +01:00
										 |  |  | 		unsigned int num_layers; | 
					
						
							| 
									
										
										
										
											2011-12-26 17:35:27 +01:00
										 |  |  | 		unsigned int native_width, native_height; // Texture dimensions from the GameCube's point of view
 | 
					
						
							|  |  |  | 		unsigned int virtual_width, virtual_height; // Texture dimensions from OUR point of view - for hires textures or scaled EFB copies
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 18:33:05 +01:00
										 |  |  | 		// used to delete textures which haven't been used for TEXTURE_KILL_THRESHOLD frames
 | 
					
						
							|  |  |  | 		int frameCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-06 11:41:39 +01:00
										 |  |  | 		void SetGeneralParameters(u32 _addr, u32 _size, u32 _format, unsigned int _num_mipmaps, unsigned int _num_layers) | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-01-29 16:40:15 -06:00
										 |  |  | 			addr = _addr; | 
					
						
							|  |  |  | 			size_in_bytes = _size; | 
					
						
							|  |  |  | 			format = _format; | 
					
						
							|  |  |  | 			num_mipmaps = _num_mipmaps; | 
					
						
							| 
									
										
										
										
											2014-11-06 11:41:39 +01:00
										 |  |  | 			num_layers = _num_layers; | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 16:40:15 -06:00
										 |  |  | 		void SetDimensions(unsigned int _native_width, unsigned int _native_height, unsigned int _virtual_width, unsigned int _virtual_height) | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-01-29 16:40:15 -06:00
										 |  |  | 			native_width = _native_width; | 
					
						
							|  |  |  | 			native_height = _native_height; | 
					
						
							|  |  |  | 			virtual_width = _virtual_width; | 
					
						
							|  |  |  | 			virtual_height = _virtual_height; | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 16:40:15 -06:00
										 |  |  | 		void SetHashes(u64 _hash/*, u32 _pal_hash*/) | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-01-29 16:40:15 -06:00
										 |  |  | 			hash = _hash; | 
					
						
							|  |  |  | 			//pal_hash = _pal_hash;
 | 
					
						
							| 
									
										
										
										
											2011-12-26 18:05:01 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		virtual ~TCacheEntryBase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		virtual void Bind(unsigned int stage) = 0; | 
					
						
							| 
									
										
										
										
											2014-02-23 23:03:39 +01:00
										 |  |  | 		virtual bool Save(const std::string& filename, unsigned int level) = 0; | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		virtual void Load(unsigned int width, unsigned int height, | 
					
						
							| 
									
										
										
										
											2012-08-10 13:13:51 +02:00
										 |  |  | 			unsigned int expanded_width, unsigned int level) = 0; | 
					
						
							| 
									
										
										
										
											2011-02-26 23:41:02 +00:00
										 |  |  | 		virtual void FromRenderTarget(u32 dstAddr, unsigned int dstFormat, | 
					
						
							| 
									
										
										
										
											2014-03-23 21:44:23 +01:00
										 |  |  | 			PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect, | 
					
						
							| 
									
										
										
										
											2011-02-26 23:41:02 +00:00
										 |  |  | 			bool isIntensity, bool scaleByHalf, unsigned int cbufid, | 
					
						
							|  |  |  | 			const float *colmat) = 0; | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		int IntersectsMemoryRange(u32 range_address, u32 range_size) const; | 
					
						
							| 
									
										
										
										
											2012-01-29 20:24:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		bool IsEfbCopy() { return (type == TCET_EC_VRAM || type == TCET_EC_DYNAMIC); } | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual ~TextureCache(); // needs virtual for DX11 dtor
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-28 11:31:37 +02:00
										 |  |  | 	static void OnConfigChanged(VideoConfig& config); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	static void Cleanup(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-28 11:37:14 +02:00
										 |  |  | 	static void Invalidate(); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	static void InvalidateRange(u32 start_address, u32 size); | 
					
						
							|  |  |  | 	static void MakeRangeDynamic(u32 start_address, u32 size); | 
					
						
							| 
									
										
										
										
											2014-02-16 23:51:41 -05:00
										 |  |  | 	static void ClearRenderTargets(); // currently only used by OGL
 | 
					
						
							| 
									
										
										
										
											2010-11-06 04:46:44 +00:00
										 |  |  | 	static bool Find(u32 start_address, u64 hash); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	virtual TCacheEntryBase* CreateTexture(unsigned int width, unsigned int height, | 
					
						
							|  |  |  | 		unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt) = 0; | 
					
						
							|  |  |  | 	virtual TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h) = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-04 00:53:14 +01:00
										 |  |  | 	virtual void CompileShaders() = 0; // currently only implemented by OGL
 | 
					
						
							|  |  |  | 	virtual void DeleteShaders() = 0; // currently only implemented by OGL
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	static TCacheEntryBase* Load(unsigned int stage, u32 address, unsigned int width, unsigned int height, | 
					
						
							| 
									
										
										
										
											2012-08-10 13:09:16 +02:00
										 |  |  | 		int format, unsigned int tlutaddr, int tlutfmt, bool use_mipmaps, unsigned int maxlevel, bool from_tmem); | 
					
						
							| 
									
										
										
										
											2014-03-23 21:44:23 +01:00
										 |  |  | 	static void 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 11:28:54 +10:00
										 |  |  | 	static void RequestInvalidateTextureCache(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | protected: | 
					
						
							|  |  |  | 	TextureCache(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 20:35:05 +00:00
										 |  |  | 	static  GC_ALIGNED16(u8 *temp); | 
					
						
							| 
									
										
										
										
											2012-05-13 15:38:56 +02:00
										 |  |  | 	static unsigned int temp_size; | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2012-05-12 14:31:38 +02:00
										 |  |  | 	static bool CheckForCustomTextureLODs(u64 tex_hash, int texformat, unsigned int levels); | 
					
						
							| 
									
										
										
										
											2014-10-02 02:20:46 -04:00
										 |  |  | 	static PC_TexFormat LoadCustomTexture(u64 tex_hash, int texformat, unsigned int level, unsigned int* width, unsigned int* height); | 
					
						
							| 
									
										
										
										
											2012-05-12 13:50:03 +02:00
										 |  |  | 	static void DumpTexture(TCacheEntryBase* entry, unsigned int level); | 
					
						
							| 
									
										
										
										
											2012-05-12 13:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-12 01:04:42 +02:00
										 |  |  | 	static TCacheEntryBase* AllocateRenderTarget(unsigned int width, unsigned int height); | 
					
						
							|  |  |  | 	static void FreeRenderTarget(TCacheEntryBase* entry); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	typedef std::map<u32, TCacheEntryBase*> TexCache; | 
					
						
							| 
									
										
										
										
											2014-06-12 01:04:42 +02:00
										 |  |  | 	typedef std::vector<TCacheEntryBase*> RenderTargetPool; | 
					
						
							| 
									
										
										
										
											2013-11-07 21:16:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	static TexCache textures; | 
					
						
							| 
									
										
										
										
											2014-06-12 01:04:42 +02:00
										 |  |  | 	static RenderTargetPool render_target_pool; | 
					
						
							| 
									
										
										
										
											2012-05-28 11:31:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Backup configuration values
 | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 	static struct BackupConfig | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2012-05-28 11:31:37 +02:00
										 |  |  | 		int s_colorsamples; | 
					
						
							|  |  |  | 		bool s_copy_efb_to_texture; | 
					
						
							|  |  |  | 		bool s_copy_efb_scaled; | 
					
						
							|  |  |  | 		bool s_copy_efb; | 
					
						
							|  |  |  | 		int s_efb_scale; | 
					
						
							|  |  |  | 		bool s_texfmt_overlay; | 
					
						
							|  |  |  | 		bool s_texfmt_overlay_center; | 
					
						
							|  |  |  | 		bool s_hires_textures; | 
					
						
							|  |  |  | 		bool s_copy_cache_enable; | 
					
						
							| 
									
										
										
										
											2014-11-04 00:53:14 +01:00
										 |  |  | 		bool s_stereo_3d; | 
					
						
							| 
									
										
										
										
											2014-11-08 16:19:15 +01:00
										 |  |  | 		bool s_mono_efb_depth; | 
					
						
							| 
									
										
										
										
											2012-05-28 11:31:37 +02:00
										 |  |  | 	} backup_config; | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern TextureCache *g_texture_cache; |