citra-emu
/
citra-canary
Archived
1
0
Fork 0

Memory: apply rasterizer cache mark to all page tables and the global marker

This commit is contained in:
Weiyi Wang 2018-12-10 22:21:03 -05:00
parent 88161b8ac6
commit bf2056f12e
1 changed files with 33 additions and 30 deletions

View File

@ -375,18 +375,20 @@ void MemorySystem::RasterizerMarkRegionCached(PAddr start, u32 size, bool cached
for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) { for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) {
for (VAddr vaddr : PhysicalToVirtualAddressForRasterizer(paddr)) { for (VAddr vaddr : PhysicalToVirtualAddressForRasterizer(paddr)) {
PageType& page_type = impl->current_page_table->attributes[vaddr >> PAGE_BITS]; impl->cache_marker.Mark(vaddr, cached);
for (PageTable* page_table : impl->page_table_list) {
PageType& page_type = page_table->attributes[vaddr >> PAGE_BITS];
if (cached) { if (cached) {
// Switch page type to cached if now cached // Switch page type to cached if now cached
switch (page_type) { switch (page_type) {
case PageType::Unmapped: case PageType::Unmapped:
// It is not necessary for a process to have this region mapped into its address // It is not necessary for a process to have this region mapped into its
// space, for example, a system module need not have a VRAM mapping. // address space, for example, a system module need not have a VRAM mapping.
break; break;
case PageType::Memory: case PageType::Memory:
page_type = PageType::RasterizerCachedMemory; page_type = PageType::RasterizerCachedMemory;
impl->current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr; page_table->pointers[vaddr >> PAGE_BITS] = nullptr;
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
@ -395,12 +397,12 @@ void MemorySystem::RasterizerMarkRegionCached(PAddr start, u32 size, bool cached
// Switch page type to uncached if now uncached // Switch page type to uncached if now uncached
switch (page_type) { switch (page_type) {
case PageType::Unmapped: case PageType::Unmapped:
// It is not necessary for a process to have this region mapped into its address // It is not necessary for a process to have this region mapped into its
// space, for example, a system module need not have a VRAM mapping. // address space, for example, a system module need not have a VRAM mapping.
break; break;
case PageType::RasterizerCachedMemory: { case PageType::RasterizerCachedMemory: {
page_type = PageType::Memory; page_type = PageType::Memory;
impl->current_page_table->pointers[vaddr >> PAGE_BITS] = page_table->pointers[vaddr >> PAGE_BITS] =
GetPointerForRasterizerCache(vaddr & ~PAGE_MASK); GetPointerForRasterizerCache(vaddr & ~PAGE_MASK);
break; break;
} }
@ -410,6 +412,7 @@ void MemorySystem::RasterizerMarkRegionCached(PAddr start, u32 size, bool cached
} }
} }
} }
}
} }
void RasterizerFlushRegion(PAddr start, u32 size) { void RasterizerFlushRegion(PAddr start, u32 size) {