summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar bunnei2019-11-28 11:43:17 -0500
committerGravatar GitHub2019-11-28 11:43:17 -0500
commite3ee017e91ef4d713f1af8cb60c5157e40d43f18 (patch)
treee0a5b47cac1d548599b8ceba7f71b40746fe6b48 /src/video_core
parentMerge pull request #3171 from lioncash/internal-link (diff)
parentcore/memory; Migrate over SetCurrentPageTable() to the Memory class (diff)
downloadyuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.tar.gz
yuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.tar.xz
yuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.zip
Merge pull request #3169 from lioncash/memory
core/memory: Deglobalize memory management code
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/memory_manager.cpp4
-rw-r--r--src/video_core/rasterizer_accelerated.cpp7
-rw-r--r--src/video_core/rasterizer_accelerated.h9
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp8
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp10
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h7
7 files changed, 31 insertions, 16 deletions
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/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp
index b230dcc18..fc6ecb899 100644
--- a/src/video_core/rasterizer_accelerated.cpp
+++ b/src/video_core/rasterizer_accelerated.cpp
@@ -22,7 +22,8 @@ constexpr auto RangeFromInterval(Map& map, const Interval& interval) {
22 22
23} // Anonymous namespace 23} // Anonymous namespace
24 24
25RasterizerAccelerated::RasterizerAccelerated() = default; 25RasterizerAccelerated::RasterizerAccelerated(Memory::Memory& cpu_memory_)
26 : cpu_memory{cpu_memory_} {}
26 27
27RasterizerAccelerated::~RasterizerAccelerated() = default; 28RasterizerAccelerated::~RasterizerAccelerated() = default;
28 29
@@ -47,9 +48,9 @@ void RasterizerAccelerated::UpdatePagesCachedCount(VAddr addr, u64 size, int del
47 const u64 interval_size = interval_end_addr - interval_start_addr; 48 const u64 interval_size = interval_end_addr - interval_start_addr;
48 49
49 if (delta > 0 && count == delta) { 50 if (delta > 0 && count == delta) {
50 Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, true); 51 cpu_memory.RasterizerMarkRegionCached(interval_start_addr, interval_size, true);
51 } else if (delta < 0 && count == -delta) { 52 } else if (delta < 0 && count == -delta) {
52 Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, false); 53 cpu_memory.RasterizerMarkRegionCached(interval_start_addr, interval_size, false);
53 } else { 54 } else {
54 ASSERT(count >= 0); 55 ASSERT(count >= 0);
55 } 56 }
diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h
index 8f7e3547e..315798e7c 100644
--- a/src/video_core/rasterizer_accelerated.h
+++ b/src/video_core/rasterizer_accelerated.h
@@ -11,12 +11,16 @@
11#include "common/common_types.h" 11#include "common/common_types.h"
12#include "video_core/rasterizer_interface.h" 12#include "video_core/rasterizer_interface.h"
13 13
14namespace Memory {
15class Memory;
16}
17
14namespace VideoCore { 18namespace VideoCore {
15 19
16/// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. 20/// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface.
17class RasterizerAccelerated : public RasterizerInterface { 21class RasterizerAccelerated : public RasterizerInterface {
18public: 22public:
19 explicit RasterizerAccelerated(); 23 explicit RasterizerAccelerated(Memory::Memory& cpu_memory_);
20 ~RasterizerAccelerated() override; 24 ~RasterizerAccelerated() override;
21 25
22 void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; 26 void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override;
@@ -24,8 +28,9 @@ public:
24private: 28private:
25 using CachedPageMap = boost::icl::interval_map<u64, int>; 29 using CachedPageMap = boost::icl::interval_map<u64, int>;
26 CachedPageMap cached_pages; 30 CachedPageMap cached_pages;
27
28 std::mutex pages_mutex; 31 std::mutex pages_mutex;
32
33 Memory::Memory& cpu_memory;
29}; 34};
30 35
31} // namespace VideoCore 36} // namespace VideoCore
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index f97ec06f0..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"
@@ -86,8 +87,9 @@ std::size_t GetConstBufferSize(const Tegra::Engines::ConstBufferInfo& buffer,
86 87
87RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, 88RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window,
88 ScreenInfo& info) 89 ScreenInfo& info)
89 : texture_cache{system, *this, device}, shader_cache{*this, system, emu_window, device}, 90 : RasterizerAccelerated{system.Memory()}, texture_cache{system, *this, device},
90 system{system}, screen_info{info}, buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} { 91 shader_cache{*this, system, emu_window, device}, system{system}, screen_info{info},
92 buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} {
91 shader_program_manager = std::make_unique<GLShader::ProgramManager>(); 93 shader_program_manager = std::make_unique<GLShader::ProgramManager>();
92 state.draw.shader_program = 0; 94 state.draw.shader_program = 0;
93 state.Apply(); 95 state.Apply();
@@ -837,7 +839,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config,
837 MICROPROFILE_SCOPE(OpenGL_CacheManagement); 839 MICROPROFILE_SCOPE(OpenGL_CacheManagement);
838 840
839 const auto surface{ 841 const auto surface{
840 texture_cache.TryFindFramebufferSurface(Memory::GetPointer(framebuffer_addr))}; 842 texture_cache.TryFindFramebufferSurface(system.Memory().GetPointer(framebuffer_addr))};
841 if (!surface) { 843 if (!surface) {
842 return {}; 844 return {};
843 } 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 d2e9f4031..46da81aaa 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -24,9 +24,11 @@ CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, std::size_t size, u64 offse
24 alignment{alignment} {} 24 alignment{alignment} {}
25 25
26VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, 26VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager,
27 Memory::Memory& cpu_memory_,
27 VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, 28 VideoCore::RasterizerInterface& rasterizer, const VKDevice& device,
28 VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) 29 VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size)
29 : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager} { 30 : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager}, cpu_memory{
31 cpu_memory_} {
30 const auto usage = vk::BufferUsageFlagBits::eVertexBuffer | 32 const auto usage = vk::BufferUsageFlagBits::eVertexBuffer |
31 vk::BufferUsageFlagBits::eIndexBuffer | 33 vk::BufferUsageFlagBits::eIndexBuffer |
32 vk::BufferUsageFlagBits::eUniformBuffer; 34 vk::BufferUsageFlagBits::eUniformBuffer;
@@ -48,9 +50,9 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme
48 // TODO: Figure out which size is the best for given games. 50 // TODO: Figure out which size is the best for given games.
49 cache &= size >= 2048; 51 cache &= size >= 2048;
50 52
51 const auto& host_ptr{Memory::GetPointer(*cpu_addr)}; 53 u8* const host_ptr{cpu_memory.GetPointer(*cpu_addr)};
52 if (cache) { 54 if (cache) {
53 auto entry = TryGet(host_ptr); 55 const auto entry = TryGet(host_ptr);
54 if (entry) { 56 if (entry) {
55 if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { 57 if (entry->GetSize() >= size && entry->GetAlignment() == alignment) {
56 return entry->GetOffset(); 58 return entry->GetOffset();
@@ -62,7 +64,7 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme
62 AlignBuffer(alignment); 64 AlignBuffer(alignment);
63 const u64 uploaded_offset = buffer_offset; 65 const u64 uploaded_offset = buffer_offset;
64 66
65 if (!host_ptr) { 67 if (host_ptr == nullptr) {
66 return uploaded_offset; 68 return uploaded_offset;
67 } 69 }
68 70
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index 49f13bcdc..daa8ccf66 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -13,6 +13,10 @@
13#include "video_core/renderer_vulkan/declarations.h" 13#include "video_core/renderer_vulkan/declarations.h"
14#include "video_core/renderer_vulkan/vk_scheduler.h" 14#include "video_core/renderer_vulkan/vk_scheduler.h"
15 15
16namespace Memory {
17class Memory;
18}
19
16namespace Tegra { 20namespace Tegra {
17class MemoryManager; 21class MemoryManager;
18} 22}
@@ -58,7 +62,7 @@ private:
58 62
59class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { 63class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> {
60public: 64public:
61 explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, 65 explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, Memory::Memory& cpu_memory_,
62 VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, 66 VideoCore::RasterizerInterface& rasterizer, const VKDevice& device,
63 VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size); 67 VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size);
64 ~VKBufferCache(); 68 ~VKBufferCache();
@@ -92,6 +96,7 @@ private:
92 void AlignBuffer(std::size_t alignment); 96 void AlignBuffer(std::size_t alignment);
93 97
94 Tegra::MemoryManager& tegra_memory_manager; 98 Tegra::MemoryManager& tegra_memory_manager;
99 Memory::Memory& cpu_memory;
95 100
96 std::unique_ptr<VKStreamBuffer> stream_buffer; 101 std::unique_ptr<VKStreamBuffer> stream_buffer;
97 vk::Buffer buffer_handle; 102 vk::Buffer buffer_handle;