summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureCacheBase.h
blob: 1c86e640069d8b4dfd1534dbcdf4df44240f3ba4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

#ifndef _TEXTURECACHEBASE_H
#define _TEXTURECACHEBASE_H

#include <map>

#include "VideoCommon.h"
#include "TextureDecoder.h"
#include "BPMemory.h"
#include "Thread.h"

#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;

		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;

		bool isRenderTarget; // copied from EFB
		bool isDynamic; // Used for hybrid EFB copies to enable checks for CPU modifications
		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,
			unsigned int expanded_width, unsigned int level, bool autogen_mips = false) = 0;
		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;

		int IntersectsMemoryRange(u32 range_address, u32 range_size) const;
	};

	virtual ~TextureCache(); // needs virtual for DX11 dtor

	static void Cleanup();

	static void Invalidate(bool shutdown);
	static void InvalidateDefer();
	static void InvalidateRange(u32 start_address, u32 size);
	static void MakeRangeDynamic(u32 start_address, u32 size);
	static void ClearRenderTargets();	// currently only used by OGL
	static bool Find(u32 start_address, u64 hash);

	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);
	static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat,
		const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf);

	static bool DeferredInvalidate;

protected:
	TextureCache();

	static  GC_ALIGNED16(u8 *temp);

private:
	typedef std::map<u32, TCacheEntryBase*> TexCache;

	static TexCache textures;
};

extern TextureCache *g_texture_cache;

#endif