summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/TextureCacheBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/TextureCacheBase.h')
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.h109
1 files changed, 58 insertions, 51 deletions
diff --git a/Source/Core/VideoCommon/TextureCacheBase.h b/Source/Core/VideoCommon/TextureCacheBase.h
index fc9c49311b..bd3ceab046 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.h
+++ b/Source/Core/VideoCommon/TextureCacheBase.h
@@ -23,6 +23,7 @@
#include "VideoCommon/VideoCommon.h"
struct VideoConfig;
+class AbstractFramebuffer;
class AbstractStagingTexture;
struct TextureAndTLUTFormat
@@ -68,6 +69,14 @@ struct EFBCopyParams
bool copy_filter;
};
+// Reduced version of the full coefficient array, with a single value for each row.
+struct EFBCopyFilterCoefficients
+{
+ float upper;
+ float middle;
+ float lower;
+};
+
struct TextureLookupInformation
{
u32 address;
@@ -110,13 +119,11 @@ private:
static const int FRAMECOUNT_INVALID = 0;
public:
- // Reduced version of the full coefficient array, reduced to a single value for each row.
- using CopyFilterCoefficientArray = std::array<float, 3>;
-
struct TCacheEntry
{
// common members
std::unique_ptr<AbstractTexture> texture;
+ std::unique_ptr<AbstractFramebuffer> framebuffer;
u32 addr;
u32 size_in_bytes;
u64 base_hash;
@@ -157,7 +164,8 @@ public:
u32 pending_efb_copy_height = 0;
bool pending_efb_copy_invalidated = false;
- explicit TCacheEntry(std::unique_ptr<AbstractTexture> tex);
+ explicit TCacheEntry(std::unique_ptr<AbstractTexture> tex,
+ std::unique_ptr<AbstractFramebuffer> fb);
~TCacheEntry();
@@ -214,7 +222,10 @@ public:
AbstractTextureFormat GetFormat() const { return texture->GetConfig().format; }
};
- virtual ~TextureCacheBase(); // needs virtual for DX11 dtor
+ TextureCacheBase();
+ virtual ~TextureCacheBase();
+
+ bool Initialize();
void OnConfigChanged(VideoConfig& config);
@@ -224,15 +235,6 @@ public:
void Invalidate();
- virtual void CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params, u32 native_width,
- u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
- const EFBRectangle& src_rect, bool scale_by_half, float y_scale, float gamma,
- bool clamp_top, bool clamp_bottom,
- const CopyFilterCoefficientArray& filter_coefficients) = 0;
-
- virtual bool CompileShaders() = 0;
- virtual void DeleteShaders() = 0;
-
TCacheEntry* Load(const u32 stage);
static void InvalidateAllBindPoints() { valid_bind_points.reset(); }
static bool IsValidBindPoint(u32 i) { return valid_bind_points.test(i); }
@@ -262,39 +264,39 @@ public:
bool clamp_top, bool clamp_bottom,
const CopyFilterCoefficients::Values& filter_coefficients);
- virtual void ConvertTexture(TCacheEntry* entry, TCacheEntry* unconverted, const void* palette,
- TLUTFormat format) = 0;
-
- // Returns true if the texture data and palette formats are supported by the GPU decoder.
- virtual bool SupportsGPUTextureDecode(TextureFormat format, TLUTFormat palette_format)
- {
- return false;
- }
-
- // Decodes the specified data to the GPU texture specified by entry.
- // width, height are the size of the image in pixels.
- // aligned_width, aligned_height are the size of the image in pixels, aligned to the block size.
- // row_stride is the number of bytes for a row of blocks, not pixels.
- virtual void DecodeTextureOnGPU(TCacheEntry* entry, u32 dst_level, const u8* data,
- size_t data_size, TextureFormat format, u32 width, u32 height,
- u32 aligned_width, u32 aligned_height, u32 row_stride,
- const u8* palette, TLUTFormat palette_format)
- {
- }
-
void ScaleTextureCacheEntryTo(TCacheEntry* entry, u32 new_width, u32 new_height);
// Flushes all pending EFB copies to emulated RAM.
void FlushEFBCopies();
- // Returns a texture config suitable for drawing a RAM EFB copy into.
- static TextureConfig GetEncodingTextureConfig();
+ // Returns false if the top/bottom row coefficients are zero.
+ static bool NeedsCopyFilterInShader(const EFBCopyFilterCoefficients& coefficients);
protected:
- TextureCacheBase();
+ // Applies a palette to an EFB copy/texture.
+ bool ConvertTexture(TCacheEntry* entry, TCacheEntry* unconverted, const void* palette,
+ TLUTFormat format);
- // Returns false if the top/bottom row coefficients are zero.
- bool NeedsCopyFilterInShader(const CopyFilterCoefficientArray& coefficients) const;
+ // Decodes the specified data to the GPU texture specified by entry.
+ // Returns false if the configuration is not supported.
+ // width, height are the size of the image in pixels.
+ // aligned_width, aligned_height are the size of the image in pixels, aligned to the block size.
+ // row_stride is the number of bytes for a row of blocks, not pixels.
+ bool DecodeTextureOnGPU(TCacheEntry* entry, u32 dst_level, const u8* data, u32 data_size,
+ TextureFormat format, u32 width, u32 height, u32 aligned_width,
+ u32 aligned_height, u32 row_stride, const u8* palette,
+ TLUTFormat palette_format);
+
+ virtual void CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params, u32 native_width,
+ u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
+ const EFBRectangle& src_rect, bool scale_by_half, float y_scale, float gamma,
+ bool clamp_top, bool clamp_bottom,
+ const EFBCopyFilterCoefficients& filter_coefficients);
+ virtual void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
+ const EFBRectangle& src_rect, bool scale_by_half,
+ EFBCopyFormat dst_format, bool is_intensity, float gamma,
+ bool clamp_top, bool clamp_bottom,
+ const EFBCopyFilterCoefficients& filter_coefficients);
alignas(16) u8* temp = nullptr;
size_t temp_size = 0;
@@ -307,13 +309,17 @@ private:
struct TexPoolEntry
{
std::unique_ptr<AbstractTexture> texture;
+ std::unique_ptr<AbstractFramebuffer> framebuffer;
int frameCount = FRAMECOUNT_INVALID;
- TexPoolEntry(std::unique_ptr<AbstractTexture> tex) : texture(std::move(tex)) {}
+
+ TexPoolEntry(std::unique_ptr<AbstractTexture> tex, std::unique_ptr<AbstractFramebuffer> fb);
};
using TexAddrCache = std::multimap<u32, TCacheEntry*>;
using TexHashCache = std::multimap<u64, TCacheEntry*>;
using TexPool = std::unordered_multimap<TextureConfig, TexPoolEntry>;
+ bool CreateUtilityTextures();
+
void SetBackupConfig(const VideoConfig& config);
TCacheEntry* ApplyPaletteToEntry(TCacheEntry* entry, u8* palette, TLUTFormat tlutfmt);
@@ -325,7 +331,7 @@ private:
void CheckTempSize(size_t required_size);
TCacheEntry* AllocateCacheEntry(const TextureConfig& config);
- std::unique_ptr<AbstractTexture> AllocateTexture(const TextureConfig& config);
+ std::optional<TexPoolEntry> AllocateTexture(const TextureConfig& config);
TexPool::iterator FindMatchingTextureFromPool(const TextureConfig& config);
TexAddrCache::iterator GetTexCacheIter(TCacheEntry* entry);
@@ -334,12 +340,6 @@ private:
std::pair<TexAddrCache::iterator, TexAddrCache::iterator>
FindOverlappingTextures(u32 addr, u32 size_in_bytes);
- virtual void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
- const EFBRectangle& src_rect, bool scale_by_half,
- EFBCopyFormat dst_format, bool is_intensity, float gamma,
- bool clamp_top, bool clamp_bottom,
- const CopyFilterCoefficientArray& filter_coefficients) = 0;
-
// Removes and unlinks texture from texture cache and returns it to the pool
TexAddrCache::iterator InvalidateTexture(TexAddrCache::iterator t_iter,
bool discard_pending_efb_copy = false);
@@ -347,10 +347,10 @@ private:
void UninitializeXFBMemory(u8* dst, u32 stride, u32 bytes_per_row, u32 num_blocks_y);
// Precomputing the coefficients for the previous, current, and next lines for the copy filter.
- CopyFilterCoefficientArray
- GetRAMCopyFilterCoefficients(const CopyFilterCoefficients::Values& coefficients) const;
- CopyFilterCoefficientArray
- GetVRAMCopyFilterCoefficients(const CopyFilterCoefficients::Values& coefficients) const;
+ static EFBCopyFilterCoefficients
+ GetRAMCopyFilterCoefficients(const CopyFilterCoefficients::Values& coefficients);
+ static EFBCopyFilterCoefficients
+ GetVRAMCopyFilterCoefficients(const CopyFilterCoefficients::Values& coefficients);
// Flushes a pending EFB copy to RAM from the host to the guest RAM.
void WriteEFBCopyToRAM(u8* dst_ptr, u32 width, u32 height, u32 stride,
@@ -385,6 +385,13 @@ private:
};
BackupConfig backup_config = {};
+ // Encoding texture used for EFB copies to RAM.
+ std::unique_ptr<AbstractTexture> m_efb_encoding_texture;
+ std::unique_ptr<AbstractFramebuffer> m_efb_encoding_framebuffer;
+
+ // Decoding texture used for GPU texture decoding.
+ std::unique_ptr<AbstractTexture> m_decoding_texture;
+
// Pool of readback textures used for deferred EFB copies.
std::vector<std::unique_ptr<AbstractStagingTexture>> m_efb_copy_staging_texture_pool;