mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-23 13:01:50 +01:00
Don't entirely wipe out per-index TIC cache efter each execution
Keep a copy of the old TIC entry and view even after purge caches and use the execution number to check validity instead, if that doesn't match then just memcmp can be used as opposed to a full hash and map lookup.
This commit is contained in:
parent
98c0cc3e7f
commit
a3369637a9
@ -28,7 +28,6 @@ namespace skyline::gpu::interconnect::maxwell3d {
|
||||
|
||||
void Textures::MarkAllDirty() {
|
||||
texturePool.MarkDirty(true);
|
||||
std::fill(textureHeaderCache.begin(), textureHeaderCache.end(), nullptr);
|
||||
}
|
||||
|
||||
static texture::Format ConvertTicFormat(TextureImageControl::FormatWord format, bool srgb) {
|
||||
@ -182,9 +181,15 @@ namespace skyline::gpu::interconnect::maxwell3d {
|
||||
auto textureHeaders{texturePool.UpdateGet(ctx).textureHeaders};
|
||||
if (textureHeaderCache.size() != textureHeaders.size()) {
|
||||
textureHeaderCache.resize(textureHeaders.size());
|
||||
std::fill(textureHeaderCache.begin(), textureHeaderCache.end(), nullptr);
|
||||
} else if (auto cached{textureHeaderCache[index]}) {
|
||||
return cached;
|
||||
std::fill(textureHeaderCache.begin(), textureHeaderCache.end(), CacheEntry{});
|
||||
} else if (auto &cached{textureHeaderCache[index]}; cached.view) {
|
||||
if (cached.executionNumber == ctx.executor.executionNumber)
|
||||
return cached.view;
|
||||
|
||||
if (cached.tic == textureHeaders[index]) {
|
||||
cached.executionNumber = ctx.executor.executionNumber;
|
||||
return cached.view;
|
||||
}
|
||||
}
|
||||
|
||||
TextureImageControl &textureHeader{textureHeaders[index]};
|
||||
@ -310,7 +315,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
|
||||
texture = ctx.executor.AcquireTextureManager().FindOrCreate(guest, ctx.executor.tag);
|
||||
}
|
||||
|
||||
textureHeaderCache[index] = texture.get();
|
||||
textureHeaderCache[index] = {textureHeader, texture.get(), ctx.executor.executionNumber};
|
||||
return texture.get();
|
||||
}
|
||||
}
|
@ -36,7 +36,12 @@ namespace skyline::gpu::interconnect::maxwell3d {
|
||||
|
||||
tsl::robin_map<TextureImageControl, std::shared_ptr<TextureView>, util::ObjectHash<TextureImageControl>> textureHeaderStore;
|
||||
|
||||
std::vector<TextureView *> textureHeaderCache;
|
||||
struct CacheEntry {
|
||||
TextureImageControl tic;
|
||||
TextureView *view;
|
||||
u32 executionNumber;
|
||||
};
|
||||
std::vector<CacheEntry> textureHeaderCache;
|
||||
|
||||
public:
|
||||
Textures(DirtyManager &manager, const TexturePoolState::EngineRegisters &engine);
|
||||
@ -44,5 +49,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
|
||||
void MarkAllDirty();
|
||||
|
||||
TextureView *GetTexture(InterconnectContext &ctx, u32 index, Shader::TextureType shaderType);
|
||||
|
||||
Shader::TextureType GetTextureType(InterconnectContext &ctx, u32 index);
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user