Devirtualize Register/Unregister and use a wrapper instead.
This commit is contained in:
parent
5a9204dbd7
commit
7ea097e5c2
|
@ -104,7 +104,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Register an object into the cache
|
/// Register an object into the cache
|
||||||
virtual void Register(const T& object) {
|
void Register(const T& object) {
|
||||||
object->SetIsRegistered(true);
|
object->SetIsRegistered(true);
|
||||||
interval_cache.add({GetInterval(object), ObjectSet{object}});
|
interval_cache.add({GetInterval(object), ObjectSet{object}});
|
||||||
map_cache.insert({object->GetAddr(), object});
|
map_cache.insert({object->GetAddr(), object});
|
||||||
|
@ -112,7 +112,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unregisters an object from the cache
|
/// Unregisters an object from the cache
|
||||||
virtual void Unregister(const T& object) {
|
void Unregister(const T& object) {
|
||||||
object->SetIsRegistered(false);
|
object->SetIsRegistered(false);
|
||||||
rasterizer.UpdatePagesCachedCount(object->GetAddr(), object->GetSizeInBytes(), -1);
|
rasterizer.UpdatePagesCachedCount(object->GetAddr(), object->GetSizeInBytes(), -1);
|
||||||
// Only flush if use_accurate_gpu_emulation is enabled, as it incurs a performance hit
|
// Only flush if use_accurate_gpu_emulation is enabled, as it incurs a performance hit
|
||||||
|
|
|
@ -1009,7 +1009,7 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
|
||||||
// If surface parameters changed and we care about keeping the previous data, recreate
|
// If surface parameters changed and we care about keeping the previous data, recreate
|
||||||
// the surface from the old one
|
// the surface from the old one
|
||||||
Surface new_surface{RecreateSurface(surface, params)};
|
Surface new_surface{RecreateSurface(surface, params)};
|
||||||
Unregister(surface);
|
UnregisterSurface(surface);
|
||||||
Register(new_surface);
|
Register(new_surface);
|
||||||
if (new_surface->IsUploaded()) {
|
if (new_surface->IsUploaded()) {
|
||||||
RegisterReinterpretSurface(new_surface);
|
RegisterReinterpretSurface(new_surface);
|
||||||
|
@ -1017,7 +1017,7 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
|
||||||
return new_surface;
|
return new_surface;
|
||||||
} else {
|
} else {
|
||||||
// Delete the old surface before creating a new one to prevent collisions.
|
// Delete the old surface before creating a new one to prevent collisions.
|
||||||
Unregister(surface);
|
UnregisterSurface(surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1368,12 +1368,12 @@ static bool IsReinterpretInvalidSecond(const Surface render_surface,
|
||||||
bool RasterizerCacheOpenGL::PartialReinterpretSurface(Surface triggering_surface,
|
bool RasterizerCacheOpenGL::PartialReinterpretSurface(Surface triggering_surface,
|
||||||
Surface intersect) {
|
Surface intersect) {
|
||||||
if (IsReinterpretInvalid(triggering_surface, intersect)) {
|
if (IsReinterpretInvalid(triggering_surface, intersect)) {
|
||||||
Unregister(intersect);
|
UnregisterSurface(intersect);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!LayerFitReinterpretSurface(*this, triggering_surface, intersect)) {
|
if (!LayerFitReinterpretSurface(*this, triggering_surface, intersect)) {
|
||||||
if (IsReinterpretInvalidSecond(triggering_surface, intersect)) {
|
if (IsReinterpretInvalidSecond(triggering_surface, intersect)) {
|
||||||
Unregister(intersect);
|
UnregisterSurface(intersect);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
FlushObject(intersect);
|
FlushObject(intersect);
|
||||||
|
|
|
@ -544,17 +544,13 @@ private:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Register(const Surface& object) {
|
|
||||||
RasterizerCache<Surface>::Register(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Unregisters an object from the cache
|
/// Unregisters an object from the cache
|
||||||
void Unregister(const Surface& object) {
|
void UnregisterSurface(const Surface& object) {
|
||||||
if (object->IsReinterpreted()) {
|
if (object->IsReinterpreted()) {
|
||||||
auto interval = GetReinterpretInterval(object);
|
auto interval = GetReinterpretInterval(object);
|
||||||
reinterpreted_surfaces.erase(interval);
|
reinterpreted_surfaces.erase(interval);
|
||||||
}
|
}
|
||||||
RasterizerCache<Surface>::Unregister(object);
|
Unregister(object);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in New Issue