diff options
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 3 | ||||
| -rw-r--r-- | src/core/memory.cpp | 38 | ||||
| -rw-r--r-- | src/core/memory.h | 22 | ||||
| -rw-r--r-- | src/video_core/memory_manager.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 6 |
7 files changed, 53 insertions, 25 deletions
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 57878514d..1198c7a97 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "core/hle/kernel/server_session.h" | 19 | #include "core/hle/kernel/server_session.h" |
| 20 | #include "core/hle/kernel/session.h" | 20 | #include "core/hle/kernel/session.h" |
| 21 | #include "core/hle/kernel/thread.h" | 21 | #include "core/hle/kernel/thread.h" |
| 22 | #include "core/memory.h" | ||
| 22 | 23 | ||
| 23 | namespace Kernel { | 24 | namespace Kernel { |
| 24 | 25 | ||
| @@ -133,7 +134,7 @@ ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread, | |||
| 133 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or | 134 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or |
| 134 | // similar. | 135 | // similar. |
| 135 | Kernel::HLERequestContext context(SharedFrom(this), thread); | 136 | Kernel::HLERequestContext context(SharedFrom(this), thread); |
| 136 | u32* cmd_buf = (u32*)Memory::GetPointer(thread->GetTLSAddress()); | 137 | u32* cmd_buf = (u32*)memory.GetPointer(thread->GetTLSAddress()); |
| 137 | context.PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf); | 138 | context.PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf); |
| 138 | 139 | ||
| 139 | ResultCode result = RESULT_SUCCESS; | 140 | ResultCode result = RESULT_SUCCESS; |
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 017033613..93cd67e39 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -195,6 +195,21 @@ struct Memory::Impl { | |||
| 195 | return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); | 195 | return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | u8* GetPointer(const VAddr vaddr) { | ||
| 199 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||
| 200 | if (page_pointer != nullptr) { | ||
| 201 | return page_pointer + (vaddr & PAGE_MASK); | ||
| 202 | } | ||
| 203 | |||
| 204 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == | ||
| 205 | Common::PageType::RasterizerCachedMemory) { | ||
| 206 | return GetPointerFromVMA(vaddr); | ||
| 207 | } | ||
| 208 | |||
| 209 | LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); | ||
| 210 | return nullptr; | ||
| 211 | } | ||
| 212 | |||
| 198 | /** | 213 | /** |
| 199 | * Maps a region of pages as a specific type. | 214 | * Maps a region of pages as a specific type. |
| 200 | * | 215 | * |
| @@ -276,6 +291,14 @@ bool Memory::IsValidVirtualAddress(const VAddr vaddr) const { | |||
| 276 | return impl->IsValidVirtualAddress(vaddr); | 291 | return impl->IsValidVirtualAddress(vaddr); |
| 277 | } | 292 | } |
| 278 | 293 | ||
| 294 | u8* Memory::GetPointer(VAddr vaddr) { | ||
| 295 | return impl->GetPointer(vaddr); | ||
| 296 | } | ||
| 297 | |||
| 298 | const u8* Memory::GetPointer(VAddr vaddr) const { | ||
| 299 | return impl->GetPointer(vaddr); | ||
| 300 | } | ||
| 301 | |||
| 279 | void SetCurrentPageTable(Kernel::Process& process) { | 302 | void SetCurrentPageTable(Kernel::Process& process) { |
| 280 | current_page_table = &process.VMManager().page_table; | 303 | current_page_table = &process.VMManager().page_table; |
| 281 | 304 | ||
| @@ -292,21 +315,6 @@ bool IsKernelVirtualAddress(const VAddr vaddr) { | |||
| 292 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; | 315 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
| 293 | } | 316 | } |
| 294 | 317 | ||
| 295 | u8* GetPointer(const VAddr vaddr) { | ||
| 296 | u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||
| 297 | if (page_pointer) { | ||
| 298 | return page_pointer + (vaddr & PAGE_MASK); | ||
| 299 | } | ||
| 300 | |||
| 301 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == | ||
| 302 | Common::PageType::RasterizerCachedMemory) { | ||
| 303 | return GetPointerFromVMA(vaddr); | ||
| 304 | } | ||
| 305 | |||
| 306 | LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); | ||
| 307 | return nullptr; | ||
| 308 | } | ||
| 309 | |||
| 310 | std::string ReadCString(VAddr vaddr, std::size_t max_length) { | 318 | std::string ReadCString(VAddr vaddr, std::size_t max_length) { |
| 311 | std::string string; | 319 | std::string string; |
| 312 | string.reserve(max_length); | 320 | string.reserve(max_length); |
diff --git a/src/core/memory.h b/src/core/memory.h index cacf4fb1a..59b9ce2bb 100644 --- a/src/core/memory.h +++ b/src/core/memory.h | |||
| @@ -132,6 +132,26 @@ public: | |||
| 132 | */ | 132 | */ |
| 133 | bool IsValidVirtualAddress(VAddr vaddr) const; | 133 | bool IsValidVirtualAddress(VAddr vaddr) const; |
| 134 | 134 | ||
| 135 | /** | ||
| 136 | * Gets a pointer to the given address. | ||
| 137 | * | ||
| 138 | * @param vaddr Virtual address to retrieve a pointer to. | ||
| 139 | * | ||
| 140 | * @returns The pointer to the given address, if the address is valid. | ||
| 141 | * If the address is not valid, nullptr will be returned. | ||
| 142 | */ | ||
| 143 | u8* GetPointer(VAddr vaddr); | ||
| 144 | |||
| 145 | /** | ||
| 146 | * Gets a pointer to the given address. | ||
| 147 | * | ||
| 148 | * @param vaddr Virtual address to retrieve a pointer to. | ||
| 149 | * | ||
| 150 | * @returns The pointer to the given address, if the address is valid. | ||
| 151 | * If the address is not valid, nullptr will be returned. | ||
| 152 | */ | ||
| 153 | const u8* GetPointer(VAddr vaddr) const; | ||
| 154 | |||
| 135 | private: | 155 | private: |
| 136 | struct Impl; | 156 | struct Impl; |
| 137 | std::unique_ptr<Impl> impl; | 157 | std::unique_ptr<Impl> impl; |
| @@ -162,8 +182,6 @@ void WriteBlock(VAddr dest_addr, const void* src_buffer, std::size_t size); | |||
| 162 | void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size); | 182 | void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size); |
| 163 | void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size); | 183 | void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size); |
| 164 | 184 | ||
| 165 | u8* GetPointer(VAddr vaddr); | ||
| 166 | |||
| 167 | std::string ReadCString(VAddr vaddr, std::size_t max_length); | 185 | std::string ReadCString(VAddr vaddr, std::size_t max_length); |
| 168 | 186 | ||
| 169 | /** | 187 | /** |
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index bffae940c..11848fbce 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -52,7 +52,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) { | |||
| 52 | const u64 aligned_size{Common::AlignUp(size, page_size)}; | 52 | const u64 aligned_size{Common::AlignUp(size, page_size)}; |
| 53 | const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)}; | 53 | const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)}; |
| 54 | 54 | ||
| 55 | MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | 55 | MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr); |
| 56 | ASSERT(system.CurrentProcess() | 56 | ASSERT(system.CurrentProcess() |
| 57 | ->VMManager() | 57 | ->VMManager() |
| 58 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | 58 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, |
| @@ -67,7 +67,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size) | |||
| 67 | 67 | ||
| 68 | const u64 aligned_size{Common::AlignUp(size, page_size)}; | 68 | const u64 aligned_size{Common::AlignUp(size, page_size)}; |
| 69 | 69 | ||
| 70 | MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | 70 | MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr); |
| 71 | ASSERT(system.CurrentProcess() | 71 | ASSERT(system.CurrentProcess() |
| 72 | ->VMManager() | 72 | ->VMManager() |
| 73 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | 73 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 85f05544c..a568a4343 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "common/scope_exit.h" | 19 | #include "common/scope_exit.h" |
| 20 | #include "core/core.h" | 20 | #include "core/core.h" |
| 21 | #include "core/hle/kernel/process.h" | 21 | #include "core/hle/kernel/process.h" |
| 22 | #include "core/memory.h" | ||
| 22 | #include "core/settings.h" | 23 | #include "core/settings.h" |
| 23 | #include "video_core/engines/kepler_compute.h" | 24 | #include "video_core/engines/kepler_compute.h" |
| 24 | #include "video_core/engines/maxwell_3d.h" | 25 | #include "video_core/engines/maxwell_3d.h" |
| @@ -838,7 +839,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config, | |||
| 838 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 839 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 839 | 840 | ||
| 840 | const auto surface{ | 841 | const auto surface{ |
| 841 | texture_cache.TryFindFramebufferSurface(Memory::GetPointer(framebuffer_addr))}; | 842 | texture_cache.TryFindFramebufferSurface(system.Memory().GetPointer(framebuffer_addr))}; |
| 842 | if (!surface) { | 843 | if (!surface) { |
| 843 | return {}; | 844 | return {}; |
| 844 | } | 845 | } |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 7646cbb0e..a57a564f7 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -158,7 +158,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf | |||
| 158 | VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)}; | 158 | VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)}; |
| 159 | const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)}; | 159 | const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)}; |
| 160 | const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel}; | 160 | const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel}; |
| 161 | const auto host_ptr{Memory::GetPointer(framebuffer_addr)}; | 161 | u8* const host_ptr{system.Memory().GetPointer(framebuffer_addr)}; |
| 162 | rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes); | 162 | rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes); |
| 163 | 163 | ||
| 164 | // TODO(Rodrigo): Read this from HLE | 164 | // TODO(Rodrigo): Read this from HLE |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 959638747..46da81aaa 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -50,9 +50,9 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme | |||
| 50 | // TODO: Figure out which size is the best for given games. | 50 | // TODO: Figure out which size is the best for given games. |
| 51 | cache &= size >= 2048; | 51 | cache &= size >= 2048; |
| 52 | 52 | ||
| 53 | const auto& host_ptr{Memory::GetPointer(*cpu_addr)}; | 53 | u8* const host_ptr{cpu_memory.GetPointer(*cpu_addr)}; |
| 54 | if (cache) { | 54 | if (cache) { |
| 55 | auto entry = TryGet(host_ptr); | 55 | const auto entry = TryGet(host_ptr); |
| 56 | if (entry) { | 56 | if (entry) { |
| 57 | if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { | 57 | if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { |
| 58 | return entry->GetOffset(); | 58 | return entry->GetOffset(); |
| @@ -64,7 +64,7 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme | |||
| 64 | AlignBuffer(alignment); | 64 | AlignBuffer(alignment); |
| 65 | const u64 uploaded_offset = buffer_offset; | 65 | const u64 uploaded_offset = buffer_offset; |
| 66 | 66 | ||
| 67 | if (!host_ptr) { | 67 | if (host_ptr == nullptr) { |
| 68 | return uploaded_offset; | 68 | return uploaded_offset; |
| 69 | } | 69 | } |
| 70 | 70 | ||