mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-12-23 00:40:58 +01:00
core/memory: Migrate over GetPointer()
With all of the interfaces ready for migration, it's trivial to migrate over GetPointer().
This commit is contained in:
parent
536fc7f0ea
commit
3f08e8d8d4
7 changed files with 53 additions and 25 deletions
|
@ -19,6 +19,7 @@
|
||||||
#include "core/hle/kernel/server_session.h"
|
#include "core/hle/kernel/server_session.h"
|
||||||
#include "core/hle/kernel/session.h"
|
#include "core/hle/kernel/session.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
|
@ -133,7 +134,7 @@ ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread,
|
||||||
// from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or
|
// from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or
|
||||||
// similar.
|
// similar.
|
||||||
Kernel::HLERequestContext context(SharedFrom(this), thread);
|
Kernel::HLERequestContext context(SharedFrom(this), thread);
|
||||||
u32* cmd_buf = (u32*)Memory::GetPointer(thread->GetTLSAddress());
|
u32* cmd_buf = (u32*)memory.GetPointer(thread->GetTLSAddress());
|
||||||
context.PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf);
|
context.PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf);
|
||||||
|
|
||||||
ResultCode result = RESULT_SUCCESS;
|
ResultCode result = RESULT_SUCCESS;
|
||||||
|
|
|
@ -195,6 +195,21 @@ struct Memory::Impl {
|
||||||
return IsValidVirtualAddress(*system.CurrentProcess(), vaddr);
|
return IsValidVirtualAddress(*system.CurrentProcess(), vaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u8* GetPointer(const VAddr vaddr) {
|
||||||
|
u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
|
||||||
|
if (page_pointer != nullptr) {
|
||||||
|
return page_pointer + (vaddr & PAGE_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_page_table->attributes[vaddr >> PAGE_BITS] ==
|
||||||
|
Common::PageType::RasterizerCachedMemory) {
|
||||||
|
return GetPointerFromVMA(vaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maps a region of pages as a specific type.
|
* Maps a region of pages as a specific type.
|
||||||
*
|
*
|
||||||
|
@ -276,6 +291,14 @@ bool Memory::IsValidVirtualAddress(const VAddr vaddr) const {
|
||||||
return impl->IsValidVirtualAddress(vaddr);
|
return impl->IsValidVirtualAddress(vaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u8* Memory::GetPointer(VAddr vaddr) {
|
||||||
|
return impl->GetPointer(vaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
const u8* Memory::GetPointer(VAddr vaddr) const {
|
||||||
|
return impl->GetPointer(vaddr);
|
||||||
|
}
|
||||||
|
|
||||||
void SetCurrentPageTable(Kernel::Process& process) {
|
void SetCurrentPageTable(Kernel::Process& process) {
|
||||||
current_page_table = &process.VMManager().page_table;
|
current_page_table = &process.VMManager().page_table;
|
||||||
|
|
||||||
|
@ -292,21 +315,6 @@ bool IsKernelVirtualAddress(const VAddr vaddr) {
|
||||||
return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END;
|
return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8* GetPointer(const VAddr vaddr) {
|
|
||||||
u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
|
|
||||||
if (page_pointer) {
|
|
||||||
return page_pointer + (vaddr & PAGE_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current_page_table->attributes[vaddr >> PAGE_BITS] ==
|
|
||||||
Common::PageType::RasterizerCachedMemory) {
|
|
||||||
return GetPointerFromVMA(vaddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ReadCString(VAddr vaddr, std::size_t max_length) {
|
std::string ReadCString(VAddr vaddr, std::size_t max_length) {
|
||||||
std::string string;
|
std::string string;
|
||||||
string.reserve(max_length);
|
string.reserve(max_length);
|
||||||
|
|
|
@ -132,6 +132,26 @@ public:
|
||||||
*/
|
*/
|
||||||
bool IsValidVirtualAddress(VAddr vaddr) const;
|
bool IsValidVirtualAddress(VAddr vaddr) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a pointer to the given address.
|
||||||
|
*
|
||||||
|
* @param vaddr Virtual address to retrieve a pointer to.
|
||||||
|
*
|
||||||
|
* @returns The pointer to the given address, if the address is valid.
|
||||||
|
* If the address is not valid, nullptr will be returned.
|
||||||
|
*/
|
||||||
|
u8* GetPointer(VAddr vaddr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a pointer to the given address.
|
||||||
|
*
|
||||||
|
* @param vaddr Virtual address to retrieve a pointer to.
|
||||||
|
*
|
||||||
|
* @returns The pointer to the given address, if the address is valid.
|
||||||
|
* If the address is not valid, nullptr will be returned.
|
||||||
|
*/
|
||||||
|
const u8* GetPointer(VAddr vaddr) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Impl;
|
struct Impl;
|
||||||
std::unique_ptr<Impl> impl;
|
std::unique_ptr<Impl> impl;
|
||||||
|
@ -162,8 +182,6 @@ void WriteBlock(VAddr dest_addr, const void* src_buffer, std::size_t size);
|
||||||
void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size);
|
void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size);
|
||||||
void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size);
|
void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size);
|
||||||
|
|
||||||
u8* GetPointer(VAddr vaddr);
|
|
||||||
|
|
||||||
std::string ReadCString(VAddr vaddr, std::size_t max_length);
|
std::string ReadCString(VAddr vaddr, std::size_t max_length);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -52,7 +52,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) {
|
||||||
const u64 aligned_size{Common::AlignUp(size, page_size)};
|
const u64 aligned_size{Common::AlignUp(size, page_size)};
|
||||||
const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)};
|
const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)};
|
||||||
|
|
||||||
MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr);
|
MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr);
|
||||||
ASSERT(system.CurrentProcess()
|
ASSERT(system.CurrentProcess()
|
||||||
->VMManager()
|
->VMManager()
|
||||||
.SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped,
|
.SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped,
|
||||||
|
@ -67,7 +67,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size)
|
||||||
|
|
||||||
const u64 aligned_size{Common::AlignUp(size, page_size)};
|
const u64 aligned_size{Common::AlignUp(size, page_size)};
|
||||||
|
|
||||||
MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr);
|
MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr);
|
||||||
ASSERT(system.CurrentProcess()
|
ASSERT(system.CurrentProcess()
|
||||||
->VMManager()
|
->VMManager()
|
||||||
.SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped,
|
.SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped,
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "common/scope_exit.h"
|
#include "common/scope_exit.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
|
#include "core/memory.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
#include "video_core/engines/kepler_compute.h"
|
#include "video_core/engines/kepler_compute.h"
|
||||||
#include "video_core/engines/maxwell_3d.h"
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
|
@ -838,7 +839,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config,
|
||||||
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
|
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
|
||||||
|
|
||||||
const auto surface{
|
const auto surface{
|
||||||
texture_cache.TryFindFramebufferSurface(Memory::GetPointer(framebuffer_addr))};
|
texture_cache.TryFindFramebufferSurface(system.Memory().GetPointer(framebuffer_addr))};
|
||||||
if (!surface) {
|
if (!surface) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf
|
||||||
VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)};
|
VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)};
|
||||||
const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)};
|
const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)};
|
||||||
const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel};
|
const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel};
|
||||||
const auto host_ptr{Memory::GetPointer(framebuffer_addr)};
|
u8* const host_ptr{system.Memory().GetPointer(framebuffer_addr)};
|
||||||
rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes);
|
rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes);
|
||||||
|
|
||||||
// TODO(Rodrigo): Read this from HLE
|
// TODO(Rodrigo): Read this from HLE
|
||||||
|
|
|
@ -50,9 +50,9 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme
|
||||||
// TODO: Figure out which size is the best for given games.
|
// TODO: Figure out which size is the best for given games.
|
||||||
cache &= size >= 2048;
|
cache &= size >= 2048;
|
||||||
|
|
||||||
const auto& host_ptr{Memory::GetPointer(*cpu_addr)};
|
u8* const host_ptr{cpu_memory.GetPointer(*cpu_addr)};
|
||||||
if (cache) {
|
if (cache) {
|
||||||
auto entry = TryGet(host_ptr);
|
const auto entry = TryGet(host_ptr);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
if (entry->GetSize() >= size && entry->GetAlignment() == alignment) {
|
if (entry->GetSize() >= size && entry->GetAlignment() == alignment) {
|
||||||
return entry->GetOffset();
|
return entry->GetOffset();
|
||||||
|
@ -64,7 +64,7 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme
|
||||||
AlignBuffer(alignment);
|
AlignBuffer(alignment);
|
||||||
const u64 uploaded_offset = buffer_offset;
|
const u64 uploaded_offset = buffer_offset;
|
||||||
|
|
||||||
if (!host_ptr) {
|
if (host_ptr == nullptr) {
|
||||||
return uploaded_offset;
|
return uploaded_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue