summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-11-26 15:19:15 -0500
committerGravatar Lioncash2019-11-26 21:55:38 -0500
commit3f08e8d8d4ef16cf2468620fbfbdac46e43dcaef (patch)
tree0e13cc5e2595d7019f8e9e80fe0279dc6a2b1d4c
parentcore: Prepare various classes for memory read/write migration (diff)
downloadyuzu-3f08e8d8d4ef16cf2468620fbfbdac46e43dcaef.tar.gz
yuzu-3f08e8d8d4ef16cf2468620fbfbdac46e43dcaef.tar.xz
yuzu-3f08e8d8d4ef16cf2468620fbfbdac46e43dcaef.zip
core/memory: Migrate over GetPointer()
With all of the interfaces ready for migration, it's trivial to migrate over GetPointer().
-rw-r--r--src/core/hle/kernel/server_session.cpp3
-rw-r--r--src/core/memory.cpp38
-rw-r--r--src/core/memory.h22
-rw-r--r--src/video_core/memory_manager.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp3
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp6
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
23namespace Kernel { 24namespace 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
294u8* Memory::GetPointer(VAddr vaddr) {
295 return impl->GetPointer(vaddr);
296}
297
298const u8* Memory::GetPointer(VAddr vaddr) const {
299 return impl->GetPointer(vaddr);
300}
301
279void SetCurrentPageTable(Kernel::Process& process) { 302void 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
295u8* 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
310std::string ReadCString(VAddr vaddr, std::size_t max_length) { 318std::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
135private: 155private:
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);
162void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size); 182void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size);
163void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size); 183void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size);
164 184
165u8* GetPointer(VAddr vaddr);
166
167std::string ReadCString(VAddr vaddr, std::size_t max_length); 185std::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