summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorGravatar Lioncash2018-08-03 12:55:58 -0400
committerGravatar Lioncash2018-08-04 02:36:57 -0400
commit6030c5ce412e44ddcfe0a31c6747a017166bf33d (patch)
tree2b79fa019f07e601b5170e92e93b69788ffde949 /src/core/memory.cpp
parentMerge pull request #911 from lioncash/prototype (diff)
downloadyuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.tar.gz
yuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.tar.xz
yuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.zip
video_core: Eliminate the g_renderer global variable
We move the initialization of the renderer to the core class, while keeping the creation of it and any other specifics in video_core. This way we can ensure that the renderer is initialized and doesn't give unfettered access to the renderer. This also makes dependencies on types more explicit. For example, the GPU class doesn't need to depend on the existence of a renderer, it only needs to care about whether or not it has a rasterizer, but since it was accessing the global variable, it was also making the renderer a part of its dependency chain. By adjusting the interface, we can get rid of this dependency.
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 4b3bb7b31..a8f08e1da 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -326,34 +326,36 @@ void RasterizerMarkRegionCached(Tegra::GPUVAddr gpu_addr, u64 size, bool cached)
326} 326}
327 327
328void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { 328void 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);