[GPU] TextureCache lockless pre-check
lockless accessors for base_outdated/mips_outdated and skip lock acquisition when textures appear up to date
This commit is contained in:
@@ -693,6 +693,21 @@ void TextureCache::LoadTexturesData(Texture** textures, uint32_t n_textures) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lockless pre-check: count how many textures appear outdated.
|
||||||
|
// If none appear outdated, skip the lock entirely.
|
||||||
|
uint32_t likely_outdated = 0;
|
||||||
|
for (uint32_t i = 0; i < n_textures; ++i) {
|
||||||
|
Texture* current = textures[i];
|
||||||
|
if (current->base_outdated_lockless() ||
|
||||||
|
current->mips_outdated_lockless()) {
|
||||||
|
++likely_outdated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (likely_outdated == 0) {
|
||||||
|
// All textures appear up-to-date, skip lock acquisition
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t index_base_outdated = 0;
|
uint64_t index_base_outdated = 0;
|
||||||
uint64_t index_mips_outdated = 0;
|
uint64_t index_mips_outdated = 0;
|
||||||
uint32_t nkept = 0;
|
uint32_t nkept = 0;
|
||||||
@@ -811,6 +826,13 @@ void TextureCache::LoadTexturesData(Texture** textures, uint32_t n_textures) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool TextureCache::LoadTextureData(Texture& texture) {
|
bool TextureCache::LoadTextureData(Texture& texture) {
|
||||||
|
// Lockless pre-check: if texture appears up-to-date, skip the lock.
|
||||||
|
// This is safe because worst case is a false positive (we acquire lock
|
||||||
|
// unnecessarily), never a false negative.
|
||||||
|
if (!texture.base_outdated_lockless() && !texture.mips_outdated_lockless()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Check what needs to be uploaded.
|
// Check what needs to be uploaded.
|
||||||
bool base_outdated, mips_outdated;
|
bool base_outdated, mips_outdated;
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -276,6 +276,11 @@ class TextureCache {
|
|||||||
bool mips_outdated(const global_unique_lock_type& global_lock) const {
|
bool mips_outdated(const global_unique_lock_type& global_lock) const {
|
||||||
return mips_outdated_;
|
return mips_outdated_;
|
||||||
}
|
}
|
||||||
|
// Lockless accessors for pre-check optimization.
|
||||||
|
// Safe to read without lock - worst case is false positive (outdated when
|
||||||
|
// not).
|
||||||
|
bool base_outdated_lockless() const { return base_outdated_; }
|
||||||
|
bool mips_outdated_lockless() const { return mips_outdated_; }
|
||||||
void MakeUpToDateAndWatch(const global_unique_lock_type& global_lock);
|
void MakeUpToDateAndWatch(const global_unique_lock_type& global_lock);
|
||||||
|
|
||||||
void WatchCallback(const global_unique_lock_type& global_lock, bool is_mip);
|
void WatchCallback(const global_unique_lock_type& global_lock, bool is_mip);
|
||||||
|
|||||||
Reference in New Issue
Block a user