summaryrefslogtreecommitdiffstats
path: root/src/video_core/memory_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/memory_manager.h')
-rw-r--r--src/video_core/memory_manager.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h
index 4202c26ff..9b311b9e5 100644
--- a/src/video_core/memory_manager.h
+++ b/src/video_core/memory_manager.h
@@ -15,6 +15,7 @@
#include "common/range_map.h"
#include "common/scratch_buffer.h"
#include "common/virtual_buffer.h"
+#include "core/memory.h"
#include "video_core/cache_types.h"
#include "video_core/pte_kind.h"
@@ -62,6 +63,20 @@ public:
[[nodiscard]] u8* GetPointer(GPUVAddr addr);
[[nodiscard]] const u8* GetPointer(GPUVAddr addr) const;
+ template <typename T>
+ [[nodiscard]] T* GetPointer(GPUVAddr addr) {
+ const auto address{GpuToCpuAddress(addr)};
+ if (!address) {
+ return {};
+ }
+ return memory.GetPointer(*address);
+ }
+
+ template <typename T>
+ [[nodiscard]] const T* GetPointer(GPUVAddr addr) const {
+ return GetPointer<T*>(addr);
+ }
+
/**
* ReadBlock and WriteBlock are full read and write operations over virtual
* GPU Memory. It's important to use these when GPU memory may not be continuous
@@ -139,6 +154,9 @@ public:
void FlushCaching();
+ const u8* GetSpan(const GPUVAddr src_addr, const std::size_t size) const;
+ 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,