diff options
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 4b3bb7b31..1133bcbaf 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -326,43 +326,45 @@ void RasterizerMarkRegionCached(Tegra::GPUVAddr gpu_addr, u64 size, bool cached) | |||
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { | 328 | void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { |
| 329 | auto& system_instance = Core::System::GetInstance(); | ||
| 330 | |||
| 329 | // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be | 331 | // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be |
| 330 | // null here | 332 | // null here |
| 331 | if (VideoCore::g_renderer == nullptr) { | 333 | if (!system_instance.IsPoweredOn()) { |
| 332 | return; | 334 | return; |
| 333 | } | 335 | } |
| 334 | 336 | ||
| 335 | VAddr end = start + size; | 337 | VAddr end = start + size; |
| 336 | 338 | ||
| 337 | auto CheckRegion = [&](VAddr region_start, VAddr region_end) { | 339 | const auto CheckRegion = [&](VAddr region_start, VAddr region_end) { |
| 338 | if (start >= region_end || end <= region_start) { | 340 | if (start >= region_end || end <= region_start) { |
| 339 | // No overlap with region | 341 | // No overlap with region |
| 340 | return; | 342 | return; |
| 341 | } | 343 | } |
| 342 | 344 | ||
| 343 | VAddr overlap_start = std::max(start, region_start); | 345 | const VAddr overlap_start = std::max(start, region_start); |
| 344 | VAddr overlap_end = std::min(end, region_end); | 346 | const VAddr overlap_end = std::min(end, region_end); |
| 345 | 347 | ||
| 346 | std::vector<Tegra::GPUVAddr> gpu_addresses = | 348 | const std::vector<Tegra::GPUVAddr> gpu_addresses = |
| 347 | Core::System::GetInstance().GPU().memory_manager->CpuToGpuAddress(overlap_start); | 349 | system_instance.GPU().memory_manager->CpuToGpuAddress(overlap_start); |
| 348 | 350 | ||
| 349 | if (gpu_addresses.empty()) { | 351 | if (gpu_addresses.empty()) { |
| 350 | return; | 352 | return; |
| 351 | } | 353 | } |
| 352 | 354 | ||
| 353 | u64 overlap_size = overlap_end - overlap_start; | 355 | const u64 overlap_size = overlap_end - overlap_start; |
| 354 | 356 | ||
| 355 | for (const auto& gpu_address : gpu_addresses) { | 357 | for (const auto& gpu_address : gpu_addresses) { |
| 356 | auto* rasterizer = VideoCore::g_renderer->Rasterizer(); | 358 | auto& rasterizer = system_instance.Renderer().Rasterizer(); |
| 357 | switch (mode) { | 359 | switch (mode) { |
| 358 | case FlushMode::Flush: | 360 | case FlushMode::Flush: |
| 359 | rasterizer->FlushRegion(gpu_address, overlap_size); | 361 | rasterizer.FlushRegion(gpu_address, overlap_size); |
| 360 | break; | 362 | break; |
| 361 | case FlushMode::Invalidate: | 363 | case FlushMode::Invalidate: |
| 362 | rasterizer->InvalidateRegion(gpu_address, overlap_size); | 364 | rasterizer.InvalidateRegion(gpu_address, overlap_size); |
| 363 | break; | 365 | break; |
| 364 | case FlushMode::FlushAndInvalidate: | 366 | case FlushMode::FlushAndInvalidate: |
| 365 | rasterizer->FlushAndInvalidateRegion(gpu_address, overlap_size); | 367 | rasterizer.FlushAndInvalidateRegion(gpu_address, overlap_size); |
| 366 | break; | 368 | break; |
| 367 | } | 369 | } |
| 368 | } | 370 | } |