aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/memory_manager.h
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-07-18 21:01:58 +0200
committercrueter <crueter@eden-emu.dev>2026-07-18 21:01:58 +0200
commit89004124a55a5ce8c45a90dcb60afd8a107238c3 (patch)
tree577176212501e88fff5ed798b640244bf8ab4d6d /src/video_core/memory_manager.h
parenteb9280dedfb5e49e17a0bb586c2be87c4b769625 (diff)
[video_core] use bool params for read/writes and cascade them thru the calltree (#4001)
should make codegen a tad bit better and reduce icache pressure for what is otherwise a glorified memcpy Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4001 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/video_core/memory_manager.h')
-rw-r--r--src/video_core/memory_manager.h59
1 files changed, 19 insertions, 40 deletions
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h
index 868198677c..f9fddd177a 100644
--- a/src/video_core/memory_manager.h
+++ b/src/video_core/memory_manager.h
@@ -45,7 +45,7 @@ public:
static constexpr bool HAS_FLUSH_INVALIDATION = true;
- size_t GetID() const {
+ inline size_t GetID() const noexcept {
return unique_identifier;
}
@@ -66,16 +66,15 @@ public:
[[nodiscard]] const u8* GetPointer(GPUVAddr addr) const;
template <typename T>
- [[nodiscard]] T* GetPointer(GPUVAddr addr) {
- const auto address{GpuToCpuAddress(addr)};
- if (!address) {
+ [[nodiscard]] inline T* GetPointer(GPUVAddr addr) noexcept {
+ const auto address = GpuToCpuAddress(addr);
+ if (!address)
return {};
- }
return memory.GetPointer<T>(*address);
}
template <typename T>
- [[nodiscard]] const T* GetPointer(GPUVAddr addr) const {
+ [[nodiscard]] inline const T* GetPointer(GPUVAddr addr) const noexcept {
return GetPointer<T*>(addr);
}
@@ -85,12 +84,9 @@ public:
* in the Host Memory counterpart. Note: This functions cause Host GPU Memory
* Flushes and Invalidations, respectively to each operation.
*/
- void ReadBlock(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size,
- VideoCommon::CacheType which = VideoCommon::CacheType::All) const;
- void WriteBlock(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size,
- VideoCommon::CacheType which = VideoCommon::CacheType::All);
- void CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size,
- VideoCommon::CacheType which = VideoCommon::CacheType::All);
+ void ReadBlock(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size, VideoCommon::CacheType which = VideoCommon::CacheType::All) const;
+ void WriteBlock(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size, VideoCommon::CacheType which = VideoCommon::CacheType::All);
+ void CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size, VideoCommon::CacheType which = VideoCommon::CacheType::All);
/**
* ReadBlockUnsafe and WriteBlockUnsafe are special versions of ReadBlock and
@@ -160,21 +156,14 @@ public:
u8* GetSpan(const GPUVAddr src_addr, const std::size_t size);
private:
- template <bool is_big_pages, typename FuncMapped, typename FuncReserved, typename FuncUnmapped>
- inline void MemoryOperation(GPUVAddr gpu_src_addr, std::size_t size, FuncMapped&& func_mapped,
- FuncReserved&& func_reserved, FuncUnmapped&& func_unmapped) const;
-
- template <bool is_safe>
- void ReadBlockImpl(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size,
- VideoCommon::CacheType which) const;
+ template <typename FuncMapped, typename FuncReserved, typename FuncUnmapped>
+ inline void MemoryOperation(GPUVAddr gpu_src_addr, std::size_t size, bool is_big_page, FuncMapped&& func_mapped, FuncReserved&& func_reserved, FuncUnmapped&& func_unmapped) const;
- template <bool is_safe>
- void WriteBlockImpl(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size,
- VideoCommon::CacheType which);
+ void ReadBlockImpl(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size, VideoCommon::CacheType which, bool unsafe) const;
+ void WriteBlockImpl(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size, VideoCommon::CacheType which, bool unsafe);
- template <bool is_big_page>
- [[nodiscard]] std::size_t PageEntryIndex(GPUVAddr gpu_addr) const {
- if constexpr (is_big_page) {
+ [[nodiscard]] std::size_t PageEntryIndex(GPUVAddr gpu_addr, bool is_big_page) const {
+ if (is_big_page) {
return (gpu_addr >> big_page_bits) & big_page_table_mask;
} else {
return (gpu_addr >> page_bits) & page_table_mask;
@@ -187,9 +176,7 @@ private:
template <bool is_gpu_address>
void GetSubmappedRangeImpl(
GPUVAddr gpu_addr, std::size_t size,
- boost::container::small_vector<
- std::pair<std::conditional_t<is_gpu_address, GPUVAddr, DAddr>, std::size_t>, 32>&
- result) const;
+ boost::container::small_vector<std::pair<std::conditional_t<is_gpu_address, GPUVAddr, DAddr>, std::size_t>, 32>& result) const;
Core::System& system;
MaxwellDeviceMemoryManager& memory;
@@ -219,19 +206,11 @@ private:
std::vector<u64> entries;
std::vector<u64> big_entries;
- template <EntryType entry_type>
- GPUVAddr PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] DAddr dev_addr, size_t size,
- PTEKind kind);
-
- template <EntryType entry_type>
- GPUVAddr BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] DAddr dev_addr, size_t size,
- PTEKind kind);
-
- template <bool is_big_page>
- inline EntryType GetEntry(size_t position) const;
+ GPUVAddr PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] DAddr dev_addr, size_t size, PTEKind kind, EntryType entry_type);
+ GPUVAddr BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] DAddr dev_addr, size_t size, PTEKind kind, EntryType entry_type);
- template <bool is_big_page>
- inline void SetEntry(size_t position, EntryType entry);
+ inline EntryType GetEntry(size_t position, bool is_big_page) const;
+ inline void SetEntry(size_t position, EntryType entry, bool is_big_page);
Common::MultiLevelPageTable<u32> page_table;
Common::RangeMap<GPUVAddr, PTEKind> kind_map;