mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-22 21:40:06 +00:00
rasterizer_cache: Proper surface unregister
This commit is contained in:
parent
ba9f1f8ae9
commit
8421be7ebf
@ -1300,11 +1300,6 @@ void RasterizerCache<T>::InvalidateRegion(PAddr addr, u32 size, SurfaceId region
|
|||||||
|
|
||||||
for (const SurfaceId surface_id : remove_surfaces) {
|
for (const SurfaceId surface_id : remove_surfaces) {
|
||||||
UnregisterSurface(surface_id);
|
UnregisterSurface(surface_id);
|
||||||
if (slot_surfaces[surface_id].type != SurfaceType::Fill) {
|
|
||||||
sentenced.emplace_back(surface_id, frame_tick);
|
|
||||||
} else {
|
|
||||||
slot_surfaces.erase(surface_id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1365,7 +1360,13 @@ void RasterizerCache<T>::UnregisterSurface(SurfaceId surface_id) {
|
|||||||
surfaces.erase(vector_it);
|
surfaces.erase(vector_it);
|
||||||
});
|
});
|
||||||
|
|
||||||
RemoveTextureCubeFace(surface_id);
|
if (surface.type != SurfaceType::Fill) {
|
||||||
|
RemoveTextureCubeFace(surface_id);
|
||||||
|
sentenced.emplace_back(surface_id, frame_tick);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
slot_surfaces.erase(surface_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@ -1376,7 +1377,9 @@ void RasterizerCache<T>::UnregisterAll() {
|
|||||||
UnregisterSurface(surfaces.back());
|
UnregisterSurface(surfaces.back());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
texture_cube_cache.clear();
|
runtime.Finish();
|
||||||
|
frame_tick += runtime.RemoveThreshold();
|
||||||
|
RunGarbageCollector();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
@ -45,6 +45,9 @@ public:
|
|||||||
/// Returns the removal threshold ticks for the garbage collector
|
/// Returns the removal threshold ticks for the garbage collector
|
||||||
u32 RemoveThreshold();
|
u32 RemoveThreshold();
|
||||||
|
|
||||||
|
/// Submits and waits for current GPU work.
|
||||||
|
void Finish() {}
|
||||||
|
|
||||||
/// Returns true if the provided pixel format cannot be used natively by the runtime.
|
/// Returns true if the provided pixel format cannot be used natively by the runtime.
|
||||||
bool NeedsConversion(VideoCore::PixelFormat pixel_format) const;
|
bool NeedsConversion(VideoCore::PixelFormat pixel_format) const;
|
||||||
|
|
||||||
|
@ -278,6 +278,10 @@ u32 TextureRuntime::RemoveThreshold() {
|
|||||||
return num_swapchain_images + 2;
|
return num_swapchain_images + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextureRuntime::Finish() {
|
||||||
|
scheduler.Finish();
|
||||||
|
}
|
||||||
|
|
||||||
bool TextureRuntime::Reinterpret(Surface& source, Surface& dest,
|
bool TextureRuntime::Reinterpret(Surface& source, Surface& dest,
|
||||||
const VideoCore::TextureBlit& blit) {
|
const VideoCore::TextureBlit& blit) {
|
||||||
const PixelFormat src_format = source.pixel_format;
|
const PixelFormat src_format = source.pixel_format;
|
||||||
|
@ -61,6 +61,9 @@ public:
|
|||||||
/// Returns the removal threshold ticks for the garbage collector
|
/// Returns the removal threshold ticks for the garbage collector
|
||||||
u32 RemoveThreshold();
|
u32 RemoveThreshold();
|
||||||
|
|
||||||
|
/// Submits and waits for current GPU work.
|
||||||
|
void Finish();
|
||||||
|
|
||||||
/// Maps an internal staging buffer of the provided size for pixel uploads/downloads
|
/// Maps an internal staging buffer of the provided size for pixel uploads/downloads
|
||||||
VideoCore::StagingData FindStaging(u32 size, bool upload);
|
VideoCore::StagingData FindStaging(u32 size, bool upload);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user