| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef _TEXTURECACHEBASE_H
 | 
					
						
							|  |  |  | #define _TEXTURECACHEBASE_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 16:43:08 +00:00
										 |  |  | #include "VideoCommon.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | #include "TextureDecoder.h"
 | 
					
						
							|  |  |  | #include "BPMemory.h"
 | 
					
						
							| 
									
										
										
										
											2011-02-05 10:08:06 +00:00
										 |  |  | #include "Thread.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "CommonTypes.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TextureCache | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	struct TCacheEntryBase | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// TODO: organize
 | 
					
						
							|  |  |  | 		u32 addr; | 
					
						
							|  |  |  | 		u32 size_in_bytes; | 
					
						
							|  |  |  | 		u64 hash; | 
					
						
							|  |  |  | 		//u32 paletteHash;
 | 
					
						
							|  |  |  | 		u32 oldpixel; | 
					
						
							|  |  |  | 		u32 format; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		int frameCount; | 
					
						
							| 
									
										
										
										
											2010-10-20 00:39:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		unsigned int realW, realH; // Texture dimensions from the GameCube's point of view
 | 
					
						
							|  |  |  | 		unsigned int virtualW, virtualH; // Texture dimensions from OUR point of view
 | 
					
						
							|  |  |  | 		// Real and virtual dimensions are usually the same, but may be
 | 
					
						
							|  |  |  | 		// different if e.g. we use high-res textures. Then, realW,realH will
 | 
					
						
							|  |  |  | 		// be the dimensions of the original GameCube texture and
 | 
					
						
							|  |  |  | 		// virtualW,virtualH will be the dimensions of the high-res texture.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		unsigned int mipLevels; | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-24 15:16:31 +00:00
										 |  |  | 		bool isRenderTarget; // copied from EFB
 | 
					
						
							|  |  |  | 		bool isDynamic; // Used for hybrid EFB copies to enable checks for CPU modifications
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 		bool isNonPow2;	// doesn't seem to be used anywhere
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//TCacheEntryBase()
 | 
					
						
							|  |  |  | 		//{
 | 
					
						
							|  |  |  | 		//	// TODO: remove these
 | 
					
						
							|  |  |  | 		//	isRenderTarget = 0;
 | 
					
						
							|  |  |  | 		//	hash = 0;
 | 
					
						
							|  |  |  | 		//	//paletteHash = 0;
 | 
					
						
							|  |  |  | 		//	oldpixel = 0;
 | 
					
						
							|  |  |  | 		//	addr = 0;
 | 
					
						
							|  |  |  | 		//	size_in_bytes = 0;
 | 
					
						
							|  |  |  | 		//	frameCount = 0;
 | 
					
						
							|  |  |  | 		//	isNonPow2 = true;
 | 
					
						
							|  |  |  | 		//	w = 0;
 | 
					
						
							|  |  |  | 		//	h = 0;
 | 
					
						
							|  |  |  | 		//	scaledW = 0;
 | 
					
						
							|  |  |  | 		//	scaledH = 0;
 | 
					
						
							|  |  |  | 		//}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		virtual ~TCacheEntryBase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		virtual void Bind(unsigned int stage) = 0; | 
					
						
							|  |  |  | 		virtual bool Save(const char filename[]) = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		virtual void Load(unsigned int width, unsigned int height, | 
					
						
							| 
									
										
										
										
											2010-11-24 19:13:19 +00:00
										 |  |  | 			unsigned int expanded_width, unsigned int level, bool autogen_mips = false) = 0; | 
					
						
							| 
									
										
										
										
											2011-02-26 23:41:02 +00:00
										 |  |  | 		virtual void FromRenderTarget(u32 dstAddr, unsigned int dstFormat, | 
					
						
							|  |  |  | 			unsigned int srcFormat, const EFBRectangle& srcRect, | 
					
						
							|  |  |  | 			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; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual ~TextureCache(); // needs virtual for DX11 dtor
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static void Cleanup(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static void Invalidate(bool shutdown); | 
					
						
							| 
									
										
										
										
											2011-02-08 03:47:59 +00:00
										 |  |  | 	static void InvalidateDefer(); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 	static void InvalidateRange(u32 start_address, u32 size); | 
					
						
							|  |  |  | 	static void MakeRangeDynamic(u32 start_address, u32 size); | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static TCacheEntryBase* Load(unsigned int stage, u32 address, unsigned int width, unsigned int height, | 
					
						
							|  |  |  | 		int format, unsigned int tlutaddr, int tlutfmt, bool UseNativeMips, unsigned int maxlevel); | 
					
						
							| 
									
										
										
										
											2011-02-26 23:41:02 +00:00
										 |  |  | 	static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat, | 
					
						
							|  |  |  | 		const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 03:47:59 +00:00
										 |  |  | 	static bool DeferredInvalidate; | 
					
						
							| 
									
										
										
										
											2011-02-05 10:08:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | protected: | 
					
						
							|  |  |  | 	TextureCache(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 20:35:05 +00:00
										 |  |  | 	static  GC_ALIGNED16(u8 *temp); | 
					
						
							| 
									
										
										
										
											2010-10-19 22:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	typedef std::map<u32, TCacheEntryBase*> TexCache; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static TexCache textures; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern TextureCache *g_texture_cache; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |