Merge pull request #2690 from SciresM/physmem_fixes
Implement MapPhysicalMemory/UnmapPhysicalMemory
This commit is contained in:
		| @@ -31,7 +31,7 @@ u32 FramebufferConfig::BytesPerPixel(PixelFormat format) { | ||||
|  | ||||
| GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} { | ||||
|     auto& rasterizer{renderer.Rasterizer()}; | ||||
|     memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer); | ||||
|     memory_manager = std::make_unique<Tegra::MemoryManager>(system, rasterizer); | ||||
|     dma_pusher = std::make_unique<Tegra::DmaPusher>(*this); | ||||
|     maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager); | ||||
|     fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager); | ||||
|   | ||||
| @@ -5,13 +5,17 @@ | ||||
| #include "common/alignment.h" | ||||
| #include "common/assert.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/vm_manager.h" | ||||
| #include "core/memory.h" | ||||
| #include "video_core/memory_manager.h" | ||||
| #include "video_core/rasterizer_interface.h" | ||||
|  | ||||
| namespace Tegra { | ||||
|  | ||||
| MemoryManager::MemoryManager(VideoCore::RasterizerInterface& rasterizer) : rasterizer{rasterizer} { | ||||
| MemoryManager::MemoryManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer) | ||||
|     : rasterizer{rasterizer}, system{system} { | ||||
|     std::fill(page_table.pointers.begin(), page_table.pointers.end(), nullptr); | ||||
|     std::fill(page_table.attributes.begin(), page_table.attributes.end(), | ||||
|               Common::PageType::Unmapped); | ||||
| @@ -49,6 +53,11 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) { | ||||
|     const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)}; | ||||
|  | ||||
|     MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | ||||
|     ASSERT(system.CurrentProcess() | ||||
|                ->VMManager() | ||||
|                .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | ||||
|                                    Kernel::MemoryAttribute::DeviceMapped) | ||||
|                .IsSuccess()); | ||||
|  | ||||
|     return gpu_addr; | ||||
| } | ||||
| @@ -59,7 +68,11 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size) | ||||
|     const u64 aligned_size{Common::AlignUp(size, page_size)}; | ||||
|  | ||||
|     MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | ||||
|  | ||||
|     ASSERT(system.CurrentProcess() | ||||
|                ->VMManager() | ||||
|                .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | ||||
|                                    Kernel::MemoryAttribute::DeviceMapped) | ||||
|                .IsSuccess()); | ||||
|     return gpu_addr; | ||||
| } | ||||
|  | ||||
| @@ -68,9 +81,16 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) { | ||||
|  | ||||
|     const u64 aligned_size{Common::AlignUp(size, page_size)}; | ||||
|     const CacheAddr cache_addr{ToCacheAddr(GetPointer(gpu_addr))}; | ||||
|     const auto cpu_addr = GpuToCpuAddress(gpu_addr); | ||||
|     ASSERT(cpu_addr); | ||||
|  | ||||
|     rasterizer.FlushAndInvalidateRegion(cache_addr, aligned_size); | ||||
|     UnmapRange(gpu_addr, aligned_size); | ||||
|     ASSERT(system.CurrentProcess() | ||||
|                ->VMManager() | ||||
|                .SetMemoryAttribute(cpu_addr.value(), size, Kernel::MemoryAttribute::DeviceMapped, | ||||
|                                    Kernel::MemoryAttribute::None) | ||||
|                .IsSuccess()); | ||||
|  | ||||
|     return gpu_addr; | ||||
| } | ||||
|   | ||||
| @@ -14,6 +14,10 @@ namespace VideoCore { | ||||
| class RasterizerInterface; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Tegra { | ||||
|  | ||||
| /** | ||||
| @@ -47,7 +51,7 @@ struct VirtualMemoryArea { | ||||
|  | ||||
| class MemoryManager final { | ||||
| public: | ||||
|     explicit MemoryManager(VideoCore::RasterizerInterface& rasterizer); | ||||
|     explicit MemoryManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer); | ||||
|     ~MemoryManager(); | ||||
|  | ||||
|     GPUVAddr AllocateSpace(u64 size, u64 align); | ||||
| @@ -173,6 +177,8 @@ private: | ||||
|     Common::PageTable page_table{page_bits}; | ||||
|     VMAMap vma_map; | ||||
|     VideoCore::RasterizerInterface& rasterizer; | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Tegra | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Fernando Sahmkow
					Fernando Sahmkow