summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-03-23 23:30:48 -0400
committerGravatar GitHub2018-03-23 23:30:48 -0400
commita10baacf9e5ab48af7fb0ccbdc75371c9287d3ba (patch)
tree9ed56f99b9d2564f9250d3754e429eb0c8b43323 /src/core/memory.cpp
parentMerge pull request #255 from Subv/sd_card (diff)
parentgl_rasterizer: Fake render in green, because it's cooler. (diff)
downloadyuzu-a10baacf9e5ab48af7fb0ccbdc75371c9287d3ba.tar.gz
yuzu-a10baacf9e5ab48af7fb0ccbdc75371c9287d3ba.tar.xz
yuzu-a10baacf9e5ab48af7fb0ccbdc75371c9287d3ba.zip
Merge pull request #265 from bunnei/tegra-progress-2
Tegra progress 2
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index a9beccb95..d6469dd3d 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -41,6 +41,9 @@ static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, Pa
41 LOG_DEBUG(HW_Memory, "Mapping %p onto %016" PRIX64 "-%016" PRIX64, memory, base * PAGE_SIZE, 41 LOG_DEBUG(HW_Memory, "Mapping %p onto %016" PRIX64 "-%016" PRIX64, memory, base * PAGE_SIZE,
42 (base + size) * PAGE_SIZE); 42 (base + size) * PAGE_SIZE);
43 43
44 RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE,
45 FlushMode::FlushAndInvalidate);
46
44 VAddr end = base + size; 47 VAddr end = base + size;
45 while (base != end) { 48 while (base != end) {
46 ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %016" PRIX64, base); 49 ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %016" PRIX64, base);
@@ -288,6 +291,43 @@ u8* GetPhysicalPointer(PAddr address) {
288 return target_pointer; 291 return target_pointer;
289} 292}
290 293
294void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
295 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
296 // null here
297 if (VideoCore::g_renderer == nullptr) {
298 return;
299 }
300
301 VAddr end = start + size;
302
303 auto CheckRegion = [&](VAddr region_start, VAddr region_end) {
304 if (start >= region_end || end <= region_start) {
305 // No overlap with region
306 return;
307 }
308
309 VAddr overlap_start = std::max(start, region_start);
310 VAddr overlap_end = std::min(end, region_end);
311 u64 overlap_size = overlap_end - overlap_start;
312
313 auto* rasterizer = VideoCore::g_renderer->Rasterizer();
314 switch (mode) {
315 case FlushMode::Flush:
316 rasterizer->FlushRegion(overlap_start, overlap_size);
317 break;
318 case FlushMode::Invalidate:
319 rasterizer->InvalidateRegion(overlap_start, overlap_size);
320 break;
321 case FlushMode::FlushAndInvalidate:
322 rasterizer->FlushAndInvalidateRegion(overlap_start, overlap_size);
323 break;
324 }
325 };
326
327 CheckRegion(PROCESS_IMAGE_VADDR, PROCESS_IMAGE_VADDR_END);
328 CheckRegion(HEAP_VADDR, HEAP_VADDR_END);
329}
330
291u8 Read8(const VAddr addr) { 331u8 Read8(const VAddr addr) {
292 return Read<u8>(addr); 332 return Read<u8>(addr);
293} 333}